仿真版本:proteus 7.8
程序編譯器:keil 4/keil 5
編程語言:C語言
設(shè)計(jì)編號(hào):S0005
功能說明
1、以單片機(jī)為控制核心設(shè)計(jì)數(shù)字電壓表;
2、可以測量0~5V輸入電壓值;
3、LED數(shù)碼管顯示;
4、最小分辨率為0.01V,測量誤差約為±0.01V。
設(shè)計(jì)要求
本課題是利用單片機(jī)設(shè)計(jì)一個(gè)數(shù)字電壓表,能夠測量0-5V之間的直流電壓值,四位數(shù)碼管顯示,使用的元器件數(shù)目較少。外界電壓模擬量輸入到A/D轉(zhuǎn)換部分的輸入端,通過ADC0809轉(zhuǎn)換變?yōu)?a class="article-link" target="_blank" href="/baike/1546930.html">數(shù)字信號(hào),輸送給單片機(jī)。然后由單片機(jī)給數(shù)碼管數(shù)字信號(hào),控制其發(fā)光,從而顯示數(shù)字。
選擇AT89C51作為單片機(jī)芯片,選用四位8段共陰極LED數(shù)碼管實(shí)現(xiàn)電壓顯示,利用ADC0809作為數(shù)模轉(zhuǎn)換芯片。將數(shù)據(jù)采集接口電路輸入電壓傳入ADC0809數(shù)模轉(zhuǎn)換元件,經(jīng)轉(zhuǎn)換后通過D0至D7與單片機(jī)P0口連接,把轉(zhuǎn)換完的模擬信號(hào)以數(shù)字信號(hào)的信號(hào)的形式傳給單片機(jī),信號(hào)經(jīng)過單片機(jī)處理從LED數(shù)碼顯示管顯示。P2口接數(shù)碼管位選,P1接數(shù)碼管,實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)顯示,
仿真圖
原理圖
PCB
程序(提供源文件)
系統(tǒng)上電后,配置數(shù)碼管個(gè)引腳,然后對(duì)其進(jìn)行初始化,再調(diào)用的讀寫函數(shù),可將采集處理后的電壓數(shù)值實(shí)時(shí)顯示。其程序流程圖如圖所示。
? 由于ADC0809在進(jìn)行A/D轉(zhuǎn)換時(shí)需要有CLK信號(hào),而此時(shí)的ADC0809的CLK是連接在AT89C51單片機(jī)的40管腳,也就是要求從40管腳輸出CLK信號(hào)供ADC0809使用。因此產(chǎn)生CLK信號(hào)的方法就等于從軟件產(chǎn)生。電壓表系統(tǒng)有主程序,A/D轉(zhuǎn)換子程序、按鍵子程序和顯示子程序。
顯示函數(shù)
code unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char i;
void display0()
{
P0 = 0xff;
switch(i)
{
case 0:P2 = 0x10;P0 = seven_seg[shuju / 1000 % 10];break;
case 1:P2 = 0x20;P0 = seven_seg[shuju / 100 % 10]&0x7f;break;
case 2:P2 = 0x40;P0 = seven_seg[shuju / 10 % 10];break;
case 3:P2 = 0x80;P0 = seven_seg[shuju % 10];break;
case 4:P2 = 0x01;P0 = seven_seg[1];break;
case 5:P2 = 0x02;P0 = seven_seg[2];break;
case 6:P2 = 0x04;P0 = 0xff;break;
case 7:P2 = 0x08;P0 = seven_seg[shuju / 10000 % 10];break;
}
i++;if(i >= 8)i = 0;
}