|
基于單片機的穩(wěn)壓電源設(shè)計,內(nèi)含程序和電路仿真。
0.png (51.49 KB, 下載次數(shù): 56)
下載附件
2017-11-3 01:54 上傳
4.1 電路分析
穩(wěn)壓電路見圖4-1所示。三極管射極電壓是穩(wěn)壓電源的輸出電壓,可以接用電器或負載,這個電壓值通過TLC549(A/D,同TLC548)數(shù)據(jù)轉(zhuǎn)換后,送往單片機處理并顯示。調(diào)整按鍵可以改變輸入TLC5615(D/A,同TLC5616)的數(shù)據(jù)。TLC5615的輸出電壓通過運算放大器與實際輸出取樣電壓比較,控制三極管的電壓輸出。穩(wěn)壓電路的電壓輸出接受單片機檢測,同時又受單片機的控制。電路在仿真時,各點的電壓都連接有電壓表顯示。
51hei.gif (119.2 KB, 下載次數(shù): 25)
下載附件
2021-10-30 20:29 上傳
QQ圖片20171103015555.png (43.63 KB, 下載次數(shù): 63)
下載附件
2017-11-3 01:56 上傳
圖 1 穩(wěn)壓電路
4.2 電路模塊
一、A/D轉(zhuǎn)換部分
TLC549 對輸出電壓進行采集,其操作如下:
(1)cs先為高電平。(cs為片選信號,為1時,輸入脈 i/o clock不起作用);
(2)clock = 0
(3)cs = 0; cs置底電平。 同時date_out為高。(=1);
(4)延時1.4us。(setup time,cs low before first clock);
(5)開始轉(zhuǎn)化數(shù)據(jù)。因為TLC549是8位串行模數(shù)轉(zhuǎn)換器。需將8 位數(shù)據(jù)依次串行輸出。期間,clock高低電平轉(zhuǎn)化一次;
(6)8次數(shù)據(jù)轉(zhuǎn)化之后。cs置1,片選無效。等待17us后讀出數(shù)據(jù)。
二、D/A轉(zhuǎn)換部分
TLC5615為10位D/A轉(zhuǎn)換電路,其原理TLC5615的PDF文件。輸出電壓 = (轉(zhuǎn)
換數(shù)值/1024)*2*基準(zhǔn)電壓
三、顯示
采用數(shù)碼管對A/D轉(zhuǎn)換后的數(shù)據(jù)進行顯示,因為TLC549 是8位A/D,程序中需要對轉(zhuǎn)化的數(shù)據(jù)進行處理后才能在七段數(shù)碼管上動態(tài)顯示。TLC549的檢測電壓值范圍為0~5V,A/D轉(zhuǎn)換后數(shù)據(jù)位0~255,應(yīng)該顯示0~5,并且包含小數(shù)點部分。
四、按鍵操作部分
四個獨立的按鍵主要是對DA 的輸入數(shù)據(jù)進行操作的,ADD按鍵,SUB 按鍵 這些按鍵在安下一次松開后便進行加1 的操作,若按鍵超過一定的時間則增加步長,使其數(shù)值能夠快速增加,這樣就不必要達到一個電壓時,一直按幾百次。SUB按鍵也是如此。至于那個預(yù)讀取按鍵,主要是用于保存你要常用的電壓值,這樣一來你就可以在使用此電源時,不必要每次都要按鍵調(diào)整,可以通過讀取AT24C04的值進行電壓預(yù)置,保存按鍵,是用于保存你長使用的電壓值,通過此次的電壓值保存,使你可以快速達到你所要求的電壓值。
4.3 編程思路
程序分為鍵盤處理、D/A、A/D和存儲四個模塊。運用掃描法,對鍵盤進行掃描,有按鍵就更改輸入TLC5615 的數(shù)值,ADD按鍵是對數(shù)據(jù)進行加以操做,長按的話使步進值增大,實現(xiàn)快加,SUB按鍵與ADD按鍵同,預(yù)讀取按鍵用于讀取 AT24C04 中預(yù)置的數(shù)值,保存按鍵用于保存當(dāng)前電壓值;顯示部分主要是對TLC549采集回來的電壓進行處理顯示,它主要是在定時器0的中斷服務(wù)程序中顯示,100ms刷新顯示一次;TLC5615 模塊,通過對dA的串行數(shù)據(jù)輸入,使其在輸出電壓時可控,輸出電壓后經(jīng)lm324,三極管,加上負載輸出電壓,輸出電壓后,用TLC549芯片100ms采集一次,送數(shù)碼管顯示。
4.5 程序清單
單片機源程序如下:
- #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 }; //各個數(shù)碼管對應(yīng)的位選數(shù)據(jù)
- sbit DIO = P1^0; //數(shù)據(jù)線
- sbit CS = P1^1; //片選
- sbit CLK = P1^2; //io口時鐘
- 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ù)碼管的 千,百,十,個 等四位的顯示
- uint val,num; //val 是用于輸入DA 的數(shù)據(jù),num是用于判斷是不是長按的
- uint cp; //計數(shù)的變量
- uchar key_stat;
- uchar add_stat,sub_stat;
- uchar st_flag,pre_flag;
- void delay(uint x) //微妙級是延時函數(shù)
- {
- while(x--)
- _nop_();
- }
- /**********************************************
- 函數(shù)名稱:deal
- 函數(shù)作用:處理AD的返回值
- 函數(shù)參數(shù):無
- 函數(shù)返回值:無
- **********************************************/
- void deal(uint num) //顯示程序
- {
- qian=num/1000; //千,百,十,個處理
- bai=num/100%10;
- shi=num/10%10;
- ge=num%10;
- }
- /**********************************************
- 函數(shù)名稱:TL549_AD()
- 函數(shù)作用:返回AD的返回值
- 函數(shù)參數(shù):無
- 函數(shù)返回值:data_ad
- **********************************************/
- uint TL549_AD() //TLC549處理
- {
- uchar i;
- uint data_ad = 0;
- CS = 1; //初始化,啟動
- 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ù)名稱:TLC5615_DA(uint da)
- 函數(shù)作用:TLC5615_DA 將da轉(zhuǎn)換后模擬輸出
- 函數(shù)參數(shù):da
- 函數(shù)返回值:無
- **********************************************/
- 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ù)名稱:key_scan()
- 函數(shù)作用:處理那些獨立鍵盤
- 函數(shù)參數(shù):無
- 函數(shù)返回值:無
- **********************************************/
- void key_scan()
- {
- if (ADD == 0) // ADD 按鍵的鍵盤處理函數(shù)
- {
- delay(10);
- if (ADD == 0)
- {
- add_stat = 1;
- num ++;
- }
- else
- {
- add_stat = 0;
- num = 0;
- }
- //此處判斷是不是長按,長按的話 使其步進值 加大
- 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 按鍵的鍵盤處理函數(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ù)的 鍵盤處理函數(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ù)存儲的數(shù)據(jù)
- }
- }
- if (Store == 0) //保存數(shù)值 按鍵的鍵盤處理函數(shù)
- {
- delay(100);
- if (Store == 0)
- {
- st_flag = 1;
- }
- if (Store == 1 && st_flag == 1)
- {
- st_flag = 0;
- write_24C04(20,val); //向AT24C04中的地址20 寫入存儲的數(shù)據(jù)
- }
- }
- }
- /**********************************************
- 函數(shù)名稱:timer0_init (void)
- 函數(shù)作用:初始化定時器0,并設(shè)置
- 函數(shù)參數(shù):無
- 函數(shù)返回值:無
- **********************************************/
- void timer0_init (void) // timer0中斷初始化函數(shù)
- {
- EA = 0;
- TMOD = 0x01;
- TR0 = 0;
- TL0 = (65536-5000)%256; //設(shè)置計數(shù)器初值
- TH0 = (65536-5000)/256;
- PT0 = 1;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- /**********************************************
- 函數(shù)名稱:main(void)
- 函數(shù)作用:main主函數(shù)入口
- 函數(shù)參數(shù):無
- 函數(shù)返回值:無
- **********************************************/
- void main(void) //主程序
- {
- timer0_init(); //初始化定時器0
- init_24C04(); //初始化AT24C04
- while(1)
- {
- key_scan(); //調(diào)用鍵盤掃描函數(shù)
- TLC5615_DA(val); //處理鍵盤發(fā)送過來的值
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
項目4-基于單片機的穩(wěn)壓電源設(shè)計.zip
(118.36 KB, 下載次數(shù): 158)
2017-11-2 22:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|