单片机 数字电压表(ADC0809)
單片機 數(shù)字電壓表(ADC0809)
一、簡述
????采用模數(shù)轉(zhuǎn)換的芯片ADC0809實現(xiàn)設(shè)計數(shù)字電壓表。例子中設(shè)計的數(shù)字電壓表可以測量0~5V范圍內(nèi)的輸入電壓值,并且通過4位LED數(shù)碼管顯示采集的電壓值,例子測量三個模擬值:4.995、2.5、0.005。
????ADC0809是可以將我們要測量的模擬電壓信號量轉(zhuǎn)換為數(shù)字量從而可以進行存儲或顯示的一種轉(zhuǎn)換器件。
? ?文件打包:鏈接: https://pan.baidu.com/s/1F2E135Jw7TG3EmUVx3xKGg 提取碼: 5ttz
二、效果
三、工程文件
1、Keil工程
2、仿真電路圖
四、源文件
#include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管顯示0-9的電平碼 uint volt,vtime; //電壓值測定值 uchar addr;//測量地址位 sbit LW1=P2^3; //對應第4個數(shù)碼管 sbit LW2=P2^2; //對應第3個數(shù)碼管 sbit LW3=P2^1; //對應第2個數(shù)碼管 sbit LW4=P2^0; //對應第1個數(shù)碼管 sbit LW5=P1^4;//指示當前顯示的是第幾個轉(zhuǎn)換值 sbit CLK=P2^4; //時鐘信號 sbit START=P2^5; //轉(zhuǎn)換啟動開關(guān) sbit EOC=P2^6; //轉(zhuǎn)換結(jié)束標志 sbit OE=P2^7;//定義ADC0809各腳 /**********************************************************/ //函數(shù)名:delay(uint x) //功能:延時程序 改變測量地址 //調(diào)用函數(shù): //輸入?yún)?shù):x //輸出參數(shù): //說明:程序的延時時間為x乘以0.5ms 每5s改變測量地址位 /**********************************************************/ void delay(uint x) {uchar y,z;for(y=x;y>0;y--)for(z=250;z>0;z--);//該步運行時間約為0.5msvtime++;if(vtime==1000){vtime=0;addr++;if(addr==3) //本例子一共有3個測量輸入值,輪流讀取這3個值并轉(zhuǎn)換顯示addr=0;//以上語句實現(xiàn)測量地址位的改變 } } /**********************************************************/ //函數(shù)名:ADC() //功能:數(shù)模轉(zhuǎn)換程序 //調(diào)用函數(shù): //輸入?yún)?shù): //輸出參數(shù): //說明:將轉(zhuǎn)換好的測定值保存在變量volt中 /**********************************************************/ void ADC() {EA=1;//開中斷//確保進入正常AD轉(zhuǎn)換狀態(tài)?START=0;START=1;START=0;//ad開始轉(zhuǎn)換 while(EOC==0); //等待轉(zhuǎn)換結(jié)束OE=1; //輸出數(shù)據(jù)標志為真EA=0;//關(guān)中斷volt=P3;//獲取轉(zhuǎn)換值保存到volt中,(P3為轉(zhuǎn)換后數(shù)據(jù))volt=volt*196;//轉(zhuǎn)換值處理 (例子的滿量程為5V,轉(zhuǎn)換分辯率為8位即最大值是255,5/255=196mV,即1代表196mV)OE=0;//輸出轉(zhuǎn)換結(jié)束 (要在獲取轉(zhuǎn)換值之后) } /**********************************************************/ //函數(shù)名:display() //功能:4位數(shù)碼管顯示 //調(diào)用函數(shù):delay(uint x) //輸入?yún)?shù): //輸出參數(shù): //說明:將處理后的電壓值顯示在4位數(shù)碼管上 /**********************************************************/ void display() {P0=0xff;//消隱 (相當于全部滅燈,清除上次顯示效果)LW1=0;P0=~led[volt/10000]&0x7f;//帶小數(shù)點1伏顯示位delay(2);P0=0xff;LW1=1;LW2=0;P0=~led[(volt/1000)%10];//100毫伏顯示位delay(2);P0=0xff;LW2=1; LW3=0;P0=~led[(volt/100)%10];//10毫伏顯示位delay(2);P0=0xff;LW3=1;LW4=0;P0=~led[(volt/10)%10];//1毫伏顯示位delay(2);P0=0xff;LW4=1;LW5=0;P0=~led[addr+1];//顯示電壓測量位delay(2);LW5=1;//指示當前顯示的是第幾個轉(zhuǎn)換值 } /**********************************************************/ //主程序 /**********************************************************/ void main() {EA=1;//開總中斷 TMOD=0x01;//設(shè)定定時計數(shù)工作方式//為定時器初賦值TH0=0XFF;TL0=0XB4;ET0=1;//開定時器0中斷 TR0=1;//開啟定時器0while(1){P1=addr;//裝入測量地址LW5=1;ADC();//調(diào)用模數(shù)轉(zhuǎn)換程序display();//調(diào)用顯示程序} } /**********************************************************/ //函數(shù)名:timer() interrupt 1 //功能:定時中斷0響應程序 //調(diào)用函數(shù): //輸入?yún)?shù): //輸出參數(shù): //說明:為ADC提供時鐘信號 /**********************************************************/ void timer() interrupt 1 {//初值重置TH0=0XFF;TL0=0XF0;CLK=~CLK;//取反 產(chǎn)生時鐘信號 }五、總結(jié)
????ADC0809是一種有8路模擬輸入、8位并行數(shù)字輸出的逐次逼近式A/D器件。
1、主要技術(shù)指標和特性
????(1) 分辨率:8位;
????(2) 轉(zhuǎn)換時間:取決于芯片的時鐘頻率,轉(zhuǎn)換1次所需時間;
????(3) 單一電源:+5V;
????(4) 模擬輸入電壓范圍:單級性為0~+5V。
2、引腳介紹
管腳功能說明:
IN0-IN7:模擬量輸入通道。就是說它可以分時地分別對八個模擬量進行測量轉(zhuǎn)換。
ADDA-C:地址線。也就是通過這三根地址線的不同編碼來選擇對哪個模擬量進行測量轉(zhuǎn)換。
ALE:地址鎖存允許信號。在低電平時向ADDA-C寫地址,當ALE跳至高電平后ADDA-C上的數(shù)據(jù)被鎖存
START:啟動轉(zhuǎn)換信號。當它為上升沿后,將內(nèi)部寄存器清0。當它為下降沿后,開始A/D轉(zhuǎn)換。
D0-D7:數(shù)據(jù)輸出口。轉(zhuǎn)換后的數(shù)字數(shù)據(jù)量就是從這輸出給S52的。
OE:輸出允許信號,是對D0-D7的輸出控制端,OE=0,輸出端呈高阻態(tài),OE=1,輸出轉(zhuǎn)換得到的數(shù)據(jù)。
CLOCK:時種信號。ADC0809內(nèi)部沒有時鐘電路,需由外部提供時鐘脈沖信號。
EOC:轉(zhuǎn)換結(jié)束狀態(tài)信號。EOC=0,正在進行轉(zhuǎn)換。EOC=1,轉(zhuǎn)換結(jié)束,可以進行下一步輸出操作
Vref(+)、Vref(-):參考電壓。參考電壓用來與輸入的模擬量進行比較,作為測量的基準。一般Vref(+)=5v ,Vref(-)=0V。
3、時序圖與工作過程
? ? 時序圖:
工作過程:
?①在IN0-IN7上可分別接上要測量轉(zhuǎn)換的8路模擬量信號。可只接一路。
?②將ADDA-ADDC端給上代表選擇測量通道的代碼。如000(B)則代表通道0;001(B)代表通道1;111則代表通道7。
?③將ALE由低電平置為高電平,從而將ADDA-ADDC送進的通道代碼鎖存,經(jīng)譯碼后被選中的通道的模擬量送給內(nèi)部轉(zhuǎn)換單元。
?④給START一個正脈沖。當上升沿時,所有內(nèi)部寄存器清零。下降沿時,開始進行A/D轉(zhuǎn)換;在轉(zhuǎn)換期間,START保持低電平。
?⑤EOC為轉(zhuǎn)換結(jié)束信號。在上述的A/D轉(zhuǎn)換期間,可以對EOC進行不斷測量,當EOC為高電平時,表明轉(zhuǎn)換工作結(jié)束。否則,表明正在進行A/D轉(zhuǎn)換。
?⑥當A/D轉(zhuǎn)換結(jié)束后,將OE設(shè)置為1,這時D0-D7的數(shù)據(jù)便可以讀取了。OE=0,D0-D7輸出端為高阻態(tài),OE=1,D0-D7端輸出轉(zhuǎn)換的數(shù)據(jù)。
????說明:ADC0809的轉(zhuǎn)換工作是在時鐘脈沖的條件下完成的,因此首先要在CLOCK端給它一個時鐘信號,說明書上給出了可以接入的脈沖信號頻率是在10KHz-1280KHz,典型值是640KHz。我們這里取值50KHz。
? 時序圖上的teoc時長為:從START上升沿開始后的8個時鐘同期再加2微秒。這一點得注意,因為當START脈沖剛結(jié)束進入轉(zhuǎn)換工作時,EOC還沒有立即變?yōu)榈碗娖蕉沁^了8個時鐘周期后才進入低電平的,所以再給出START脈沖后最好延時一會再進行EOC的檢測。
? 一個通道的轉(zhuǎn)換時間一般為64個時鐘周期,如時鐘頻率為640KHz時,時鐘周期為1.5625微秒,一個通道的轉(zhuǎn)換時間則為1.5625×64=100微秒,那么1秒種就可以轉(zhuǎn)換1000000÷100=10000次。
4、計算定時器初值:
????信號頻率取值50KHz,晶振頻率是12MHz。
????12MHz時鐘頻率下,12MHz = 12000KHz = 12000000Hz,一個時鐘振蕩周期就是1/12000000秒,亦即1/12微秒,標準MCS51系列單片機的一個機器周期是12個時鐘振蕩周期,也就是12 * (1/12) = 1微秒。
要輸出50KHz的矩形方波 周期 T = (1/50K)s 等寬 也就是占空比50% 高電平時間是(0.5/50K)s = 0.01 ms = 10us
?
然而,實際上仿真時這個頻率是太快了(不知道是否是計算方法錯了),編程中沒有使用該初值。
六、Proteus相關(guān)操作
? ? ? 1、電壓探針元件(顯示電壓)
? ? ? ? ? ?
? ?2、自定義電源電壓
? ? ? ??
-------------------------------------------------以下是回復?Rainynightsunset?這位兄弟---------------------------
下載打包文件之后:
========================以下回復 ?木子Jasmine?這位兄弟======================
手動復位效果 (使用輪詢方式檢測按鍵有沒有按下,因為外部中斷引腳被使用了)
測試代碼以及仿真文件:鏈接: https://pan.baidu.com/s/1zC8uhzlbIFRBOkOWuWzAWQ 提取碼: wr39
?
?
===================以下回復?Leon. 這位兄弟=======================
將程序中的addr最值修改為8,如下:
在仿真上,添加5個模擬輸入
效果:(注:想要查看電壓,請加上電壓探針元件)
?
?
============== ===== 以下回復 ? ?馨心愢忞 ? ========================
簡單的測量20v(采用分壓法:先把電壓除以4再進行轉(zhuǎn)換,得到轉(zhuǎn)換的值后再乘以4)
測試例子:鏈接: https://pan.baidu.com/s/10RzT9lFVbB8db4CO7at_0A 提取碼: zwem
測試效果:
分壓測量20V說明:
?
=======================以下回復?yikai0511和validatetoken==============================
以下例子是:按鍵設(shè)置最高電壓,當前電壓大于等于最高電壓時蜂鳴器報警以及LED亮,測試環(huán)境為Win10
電壓為20V的可以自己設(shè)置的,上下限值同時設(shè)置暫時沒弄好(感覺引腳不夠用,需要復用引腳)
例子打包:鏈接: https://pan.baidu.com/s/1RY18AeWCCsXXqlgUBeTv_w 提取碼: pdf7
仿真截圖:
?
效果:
?
總結(jié)
以上是生活随笔為你收集整理的单片机 数字电压表(ADC0809)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AD PCB导出Gerber文件(非常详
- 下一篇: linux tar 打包排除指定目录