標(biāo)題: 51單片機(jī)驅(qū)動(dòng)ADC0809 A/D轉(zhuǎn)換器實(shí)現(xiàn)數(shù)字電壓表實(shí)例 [打印本頁]
作者: ziba108 時(shí)間: 2018-6-10 10:52
標(biāo)題: 51單片機(jī)驅(qū)動(dòng)ADC0809 A/D轉(zhuǎn)換器實(shí)現(xiàn)數(shù)字電壓表實(shí)例
圖片1.jpg (116.02 KB, 下載次數(shù): 57)
下載附件
2018-6-10 10:46 上傳
ADC0809工作原理:
ADDA/ADDB/ADDC 輸入3位地址,并使ALE=1,將地址存入地址鎖存器中
ALE:地址鎖存允許信號(hào)接入端,高電平時(shí)允許改變CBA的值,低電平時(shí)鎖死,防止在A/D轉(zhuǎn)換過程中切換通道
地址經(jīng)譯碼選通8路模擬輸入IN0~IN7之一到比較器,輸入與被選通道關(guān)系
圖片2.png (4.71 KB, 下載次數(shù): 41)
下載附件
2018-6-10 10:46 上傳
· START端上升沿將逐次逼近寄存器復(fù)位,下降沿啟動(dòng)A/D轉(zhuǎn)換
· EOC輸出信號(hào)變低電平,表示正在轉(zhuǎn)換;當(dāng)A/D轉(zhuǎn)換完成,EOC變?yōu)楦唠娖剑Y(jié)果數(shù)據(jù)已存入鎖存器。
·
· OE輸入高電平,輸出三態(tài)門打開,轉(zhuǎn)換結(jié)果的數(shù)字量輸出到數(shù)據(jù)總線上。
·
· OE=1時(shí),D0-D7引腳上為轉(zhuǎn)換后的數(shù)據(jù),當(dāng)OE=0時(shí),D0-D7為對(duì)外呈現(xiàn)高阻狀態(tài)
其他引腳:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps1AD1.tmp.jpg
IN0~IN7:8路模擬量輸入引腳
CLK:時(shí)鐘信號(hào)輸入端
V_(REF(+)):參考電壓正端
V_(REF(-)):參考電壓負(fù)端
實(shí)現(xiàn)思路:
A/D轉(zhuǎn)換
初始化時(shí)啟動(dòng)A/D轉(zhuǎn)換,轉(zhuǎn)換結(jié)束后OE自動(dòng)置位
檢查OE狀態(tài),為高電平時(shí)讀取數(shù)據(jù)口數(shù)據(jù)并轉(zhuǎn)換成對(duì)應(yīng)的電壓值
顯示結(jié)束后啟動(dòng)下一次A/D轉(zhuǎn)換數(shù)碼管顯示讀入數(shù)據(jù)并轉(zhuǎn)換成電壓值后,通過數(shù)碼管顯示,百位數(shù)值后顯示小數(shù)點(diǎn)。
程序如下:
- #include <reg52.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- typedef unsigned long ulong;
- uchar code table[] =
- {
- 0xfc, 0x60, 0xda, 0xf2,
- 0x66, 0xb6, 0xbe, 0xe0,
- 0xfe, 0xf6, 0xee, 0x3e,
- 0x9c, 0x7a, 0x9e, 0x8e 8 };
- sbit start = P3 ^ 0; //控制start引腳
- sbit eoc = P3 ^ 1; //查詢eoc引腳情況
- sbit oe = P3 ^ 2; //輸出允許控制端
- sbit dot = P1 ^ 0; //數(shù)碼管小數(shù)點(diǎn)
- void Delay(uint m) {
- while(m--);
- }
- //主函數(shù)
- void main() {
- ulong temp, temp_data;
- // uint temp;
- start = 0;
- oe = 0; //oe為高阻狀態(tài)
- start = 1; //start下降沿開始轉(zhuǎn)換
- start = 0;
- while(1)
- {
- if (eoc == 1) //當(dāng)eoc為1時(shí)轉(zhuǎn)換結(jié)束
- {
- /*讀入狀態(tài)*/
- oe = 1; //打開oe,數(shù)據(jù)讀入引腳
- temp = P0;
- /*讀入的數(shù)值轉(zhuǎn)換成模擬電壓對(duì)應(yīng)的電壓值,由于ADC0809將0-5V平分為255份,每一份為5/255v,
- 電壓=1.0v時(shí),temp=1.0*(5/255),為了方便顯示小數(shù),則擴(kuò)大一百倍,得到公式temp=temp*1.0/255*500
- 但是在此處存在個(gè)問題,temp轉(zhuǎn)換成為flout類型后運(yùn)算量過大,影響后數(shù)碼管顯示速度,在一定范圍內(nèi)數(shù)碼管顯示錯(cuò)誤 temp = temp * 1.0 / 255 * 500; → temp = temp * 500 / 255;
- p.s. 修改后的temp要改成unsigned long, FF*500溢出int范圍
- */
- temp = temp * 500 / 255;
- oe = 0; //oe呈高阻
- /*數(shù)碼管顯示*/
- temp_data = temp % 10;
- P2 = 0xfe; //數(shù)碼管選擇最后一位
- P1 = table[temp_data];
- Delay(500);
- temp_data = temp / 10 % 10;
- P2 = 0xfd; //數(shù)碼管選擇十位
- P1 = table[temp_data];
- Delay(500);
- temp_data = temp / 100 % 10;
- P2 = 0xfb; //數(shù)碼管選擇百位
- P1 = table[temp_data];
- dot = 1; //顯示小數(shù)點(diǎn)
- Delay(500);
- /*啟動(dòng)下一次轉(zhuǎn)換*/
- start = 1;
- start = 0;
- }
- }
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
51單片機(jī)AD轉(zhuǎn)換器實(shí)現(xiàn)數(shù)字電壓表實(shí)例.docx
(238.71 KB, 下載次數(shù): 102)
2018-6-10 10:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: feiji666 時(shí)間: 2018-6-10 20:58
必學(xué)的呀!
作者: 掃福11 時(shí)間: 2018-6-27 11:10
大佬會(huì)這個(gè)嗎,看一看附件[attach]127344[/attach]
作者: 我活著哎1 時(shí)間: 2018-6-29 10:33
我做了,有問題,運(yùn)行不出來結(jié)果
作者: zichuan 時(shí)間: 2018-10-4 23:05
為什么要1分多種數(shù)碼管哪兒才顯示電壓?
作者: the-instinct 時(shí)間: 2018-10-13 15:37
只要把轉(zhuǎn)換輸出換了就能將0808改成0809了吧
作者: linaa 時(shí)間: 2020-3-9 18:40
好像有點(diǎn)問題
作者: wangai0405 時(shí)間: 2020-7-10 21:11
怎么運(yùn)行結(jié)果不對(duì)啊
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |