adc0809做一個5v電壓表proteus時鐘ale分頻4017?

對於多通道的資料採集,如果精度要求不是很高,那麼我們完全沒必要使用高位數的adc,特別是對於自己diy,完全可以從淘寶網購買一些拆機的adc0809,價格非常便宜。用來做多通道的資料採集還是很適合的。下面我就拋磚引玉,使用proteus演示一下如何模擬並製作一個adc0809的電壓表

adc0809做一個5v電壓表proteus時鐘ale分頻4017

工具/原料

proteus7.8 sp2 和諧版

方法/步驟

先來說幾點比較重要的問題:

1 proteus的51微控制器模擬模型,ale預設無時鐘輸出,需要按圖設定

adc0809做一個5v電壓表proteus時鐘ale分頻4017

2 proteus的adc0809無模擬模型 只有pcb模型和原理圖符號

3 使用adc0808代替adc0809

4 adc0808的輸出端是反的

意思是 0808的msb要接到微控制器埠的lsb。0808的lsb要接到微控制器埠的msb

adc0809做一個5v電壓表proteus時鐘ale分頻4017

使用4位一體共陽數碼管進行顯示。573作驅動

adc0809做一個5v電壓表proteus時鐘ale分頻4017

使用cd4017進行分頻,將微控制器的ale輸出頻率 f=OSC/6mhz=2mhz進行分頻

adc0808(9)的頻率為1280khz到20khz之間,我們選擇500khz,太快轉換精度差,太慢沒必要。

adc0809做一個5v電壓表proteus時鐘ale分頻4017

可調電壓電路,使用電位器

adc0809做一個5v電壓表proteus時鐘ale分頻4017

0v模擬

adc0809做一個5v電壓表proteus時鐘ale分頻4017

2.5v模擬

adc0809做一個5v電壓表proteus時鐘ale分頻4017

5v模擬

8bit的ADC 單位解析度是5/256=19.53125mv

四捨五入 4.98v

注意,這裡是0-255一共256個最小單位

而不是255

adc0809做一個5v電壓表proteus時鐘ale分頻4017

原始碼 複製到 keil 裡面

然後調整一下格式

就可以拿過來用了

#include #define uint unsigned int#define uchar unsigned charsbit st=P3^0;sbit eoc=P3^2;sbit clk=P3^3;sbit a=P3^4;sbit b=P3^5;sbit c=P3^6;sbit OE=P3^1;sbit dian=P1^7;uchar code dt[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};uint data1,disi,disan,dier,diyi;/*********延時函式************/void delay(uint ms){ uint i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--);}/*********初始化函式************/void init(){ EA=1;//開總中斷 ET0=1;//開定時器中斷 TMOD=0x01;//定時器工作方式2 TH0=(65536-20)/256; TL0=(65536-20)%256;//設定時器初值 TR0=1;//啟動定時器}/*********AD轉化函式************/void AD(){ //OE=0; st=0; a=b=c=0; //選擇通道0 delay(1); st=1; st=0; delay(5);// while(eoc==1);//等待轉換完畢 OE=1;//開啟傳送資料 data1=P0;//資料送入P0口}/*********計算除法************/void chufa(){ data1=data1*19.53125; disi=data1/1000; disan=data1%1000/100; dier=data1%1000%100/10; diyi=data1%1000%100%10; }/*********顯示函式************/void xianshi(){ P1=dt[disi];//整數部分 dian=0;//開啟小數點 P2=0x01; delay(1); P1=0xff; P1=dt[disan];//小數點後一位 P2=0x02; delay(1); P1=0xff; P1=dt[dier];//小數點後兩位 P2=0x04; delay(1); P1=0xff; P1=dt[diyi];//小數點後第三位 P2=0x08; delay(1); P1=0xff;}/*********中斷函式************/void time() interrupt 1{ clk=~clk; TH0=(65536-20)/256; TL0=(65536-20)%256;}/*********主函式************/void main(void){ init(); while(1) { AD(); chufa(); xianshi(); }}

注意事項

模擬可以不接晶振

ale預設無輸出,按圖設定則有輸出

adc0808輸出引腳是反的

相關問題答案