程序附上,大家可以進(jìn)來(lái)一觀,工程文件電路圖和keil文件在附件里。
基于單片機(jī)和TLC的穩(wěn)壓電源設(shè)計(jì)
完整資料下載:
項(xiàng)目4-基于單片機(jī)的穩(wěn)壓電源設(shè)計(jì).zip
(120.38 KB, 下載次數(shù): 84)
2017-5-6 14:04 上傳
點(diǎn)擊文件名下載附件
程序仿真電路包
單片機(jī)源程序:
- #include <REG51.H>
- #include "intrins.h"
- #include "AT24C04.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar code LED[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar code Bit_sel[4] = {0x08,0x04,0x02,0x01 }; //各個(gè)數(shù)碼管對(duì)應(yīng)的位選數(shù)據(jù)
- sbit DIO = P1^0; //數(shù)據(jù)線(xiàn)
- sbit CS = P1^1; //片選
- sbit CLK = P1^2; //io口時(shí)鐘
- sbit SCS = P1^4;
- sbit SDATA = P1^5;
- sbit SCLK = P1^3;
- sbit ADD = P3^0;
- sbit SUB = P3^1;
- sbit Pre_read = P3^2;
- sbit Store = P3^3;
- uint qian,bai,shi,ge; //用于顯示數(shù)碼管的 千,百,十,個(gè) 等四位的顯示
- uint val,num; //val 是用于輸入DA 的數(shù)據(jù),num是用于判斷是不是長(zhǎng)按的
- uint cp; //計(jì)數(shù)的變量
- uchar key_stat;
- uchar add_stat,sub_stat;
- uchar st_flag,pre_flag;
- void delay(uint x) //微妙級(jí)是延時(shí)函數(shù)
- {
- while(x--)
- _nop_();
- }
- /**********************************************
- 函數(shù)名稱(chēng):deal
- 函數(shù)作用:處理AD的返回值
- 函數(shù)參數(shù):無(wú)
- 函數(shù)返回值:無(wú)
- **********************************************/
- void deal(uint num) //顯示程序
- {
- qian=num/1000; //千,百,十,個(gè)處理
- bai=num/100%10;
- shi=num/10%10;
- ge=num%10;
- }
- /**********************************************
- 函數(shù)名稱(chēng):TL549_AD()
- 函數(shù)作用:返回AD的返回值
- 函數(shù)參數(shù):無(wú)
- 函數(shù)返回值:data_ad
- **********************************************/
- uint TL549_AD() //TLC549處理
- {
- uchar i;
- uint data_ad = 0;
- CS = 1; //初始化,啟動(dòng)
- CLK = 0;
- CS = 0;
- _nop_();
- for(i = 0;i < 8;i++) //讀取采集數(shù)據(jù),讀取的是上一次采集數(shù)據(jù)
- {
- CLK = 1;
- if(DIO)data_ad |= 0x01;
- CLK = 0;
- data_ad = data_ad << 1;
- }
- CS = 1;
- data_ad = data_ad * (500/ 256);
- return(data_ad);
- }
- /**********************************************
- 函數(shù)名稱(chēng):TLC5615_DA(uint da)
- 函數(shù)作用:TLC5615_DA 將da轉(zhuǎn)換后模擬輸出
- 函數(shù)參數(shù):da
- 函數(shù)返回值:無(wú)
- **********************************************/
- void TLC5615_DA(uint da) // TLC5615 的DA 轉(zhuǎn)換函數(shù)
- {
- uchar i;
- da<<=6;
- SCS=0;
- SCLK=0;
- for (i=0;i<12;i++)
- {
- SDATA=(bit)(da&0x8000);
- SCLK=1;
- da<<=1;
- SCLK=0;
- }
- SCS=1;
- SCLK=0;
- for (i=0;i<12;i++);
- }
- /**********************************************
- 函數(shù)名稱(chēng):key_scan()
- 函數(shù)作用:處理那些獨(dú)立鍵盤(pán)
- 函數(shù)參數(shù):無(wú)
- 函數(shù)返回值:無(wú)
- **********************************************/
- void key_scan()
- {
- if (ADD == 0) // ADD 按鍵的鍵盤(pán)處理函數(shù)
- {
- delay(10);
- if (ADD == 0)
- {
- add_stat = 1;
- num ++;
- }
- else
- {
- add_stat = 0;
- num = 0;
- }
- //此處判斷是不是長(zhǎng)按,長(zhǎng)按的話(huà) 使其步進(jìn)值 加大
- if (ADD == 0 && add_stat == 1 && num >= 300)
- {
- val += 5;
- num = 0;
- }
- if (ADD == 1 && add_stat == 1)
- {
- val ++;
- num = 0;
- add_stat = 0;
- }
- if (val >= 1024)
- {
- val = 1023;
- }
- }
- if (SUB == 0) //SUB 按鍵的鍵盤(pán)處理函數(shù)
- {
- delay(10);
- if (SUB == 0)
- {
- sub_stat = 1;
- num ++;
- }
- if (SUB == 0 && sub_stat == 1 && num >= 300)
- {
- val -= 5;
- num = 0;
- }
- if (SUB == 1 && sub_stat == 1)
- {
- val --;
- num = 0;
- sub_stat = 0;
- }
- if (val <= 0)
- val = 0;
- }
-
- if (Pre_read == 0) //預(yù)讀數(shù)據(jù)的 鍵盤(pán)處理函數(shù)
- {
- delay(100);
- if (Pre_read == 0)
- {
- pre_flag = 1;
- }
- if (Pre_read == 1 &&pre_flag == 1 )
- {
- pre_flag = 0;
- val = read_24C04(20); //從AT24C04中的地址20 中讀出預(yù)存儲(chǔ)的數(shù)據(jù)
- }
- }
- if (Store == 0) //保存數(shù)值 按鍵的鍵盤(pán)處理函數(shù)
- {
- delay(100);
- if (Store == 0)
- {
- st_flag = 1;
- }
- if (Store == 1 && st_flag == 1)
- {
- st_flag = 0;
- write_24C04(20,val); //向AT24C04中的地址20 寫(xiě)入存儲(chǔ)的數(shù)據(jù)
- }
- }
- }
- /**********************************************
- 函數(shù)名稱(chēng):timer0_init (void)
- 函數(shù)作用:初始化定時(shí)器0,并設(shè)置
- 函數(shù)參數(shù):無(wú)
- 函數(shù)返回值:無(wú)
- **********************************************/
- void timer0_init (void) // timer0中斷初始化函數(shù)
- {
- EA = 0;
- TMOD = 0x01;
- TR0 = 0;
- TL0 = (65536-5000)%256; //設(shè)置計(jì)數(shù)器初值
- TH0 = (65536-5000)/256;
- PT0 = 1;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- /**********************************************
- 函數(shù)名稱(chēng):main(void)
- 函數(shù)作用:main主函數(shù)入口
- 函數(shù)參數(shù):無(wú)
- 函數(shù)返回值:無(wú)
- **********************************************/
- void main(void) //主程序
- {
- timer0_init(); //初始化定時(shí)器0
- init_24C04(); //初始化AT24C04
- while(1)
- {
- key_scan(); //調(diào)用鍵盤(pán)掃描函數(shù)
- TLC5615_DA(val); //處理鍵盤(pán)發(fā)送過(guò)來(lái)的值
- }
- }
- /**********************************************
- 函數(shù)名稱(chēng):timer0_isr(void) interrupt 1
- 函數(shù)作用:定時(shí)器0,方式1,的中斷服務(wù)子程序
- 函數(shù)參數(shù):無(wú)
- 函數(shù)返回值:無(wú)
- **********************************************/
- void timer0_isr(void) interrupt 1 // timer0中斷服務(wù)函數(shù)
- {
- //數(shù)碼管的位選變量
- TR0 = 0; //停止計(jì)數(shù)
- TL0 = (65536-5000)%256; //重新載入計(jì)數(shù)器初值
- TH0 = (65536-5000)/256;
- cp++; //位循環(huán)變量加1
- if(cp >= 4)
- cp = 0;
- deal(TL549_AD()); //循環(huán)顯示1次,j清零
- TR0 = 1;
- P0=0xff; //與j對(duì)應(yīng),P2輸出數(shù)碼管的位選信號(hào)
- switch(cp)
- {
- case 0: P0 = LED[ge]; break;
- case 1: P0 = LED[shi]; break;
- case 2: P0 = LED[bai]&0x7f; break;
- case 3: P0 = LED[qian]; break;
- }
- P2 = Bit_sel[cp];
- }
復(fù)制代碼 |