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