ADC0809模數(shù)轉(zhuǎn)換與顯示
ADC0809模數(shù)轉(zhuǎn)換并顯示過程對于初學(xué)者來講比較難理解的部分,所以把轉(zhuǎn)換程序詳細(xì)的
解釋對于初學(xué)者有很大的幫助。
程序解釋部分如下:
-------------------------------------
/*名稱:ADC0809數(shù)模轉(zhuǎn)換與顯示
說明:ADC0809采樣通道3輸入的
模擬量,轉(zhuǎn)換后的結(jié)果顯示在數(shù)碼管上。*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
/*各數(shù)字的數(shù)碼管段碼,共陰*/
uchar code LEDData[]= {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
sbit OE = P1^0; //輸出使能,OE=0高阻,OE=1 ADC轉(zhuǎn)換結(jié)果輸出到單片機
sbit EOC = P1^1; //轉(zhuǎn)換結(jié)束信號,EOC=0 表示ADC正在轉(zhuǎn)換 EOC=1 ADC轉(zhuǎn)換結(jié)束
sbit ST = P1^2; //啟動信號,上升沿復(fù)位清零ADC,下降沿啟動轉(zhuǎn)換,低電平保持轉(zhuǎn)換
sbit CLK = P1^3; //時鐘信號,一般500KHz始終信號
/*延時*/
void DelayMS(uint ms) {
uchar i;
while(ms--) {
for(i=0;i<120;i++);
}
}
/*ADC0809輸入電壓0-5v對應(yīng)數(shù)字信號00H-FFH,也就是0-255.
模擬輸入看成X,數(shù)字輸出看成Y則Y=255*X/5=51*X,前提條件
VREF+=5V,VREF-=0V.如:X=2.5V Y=51*2.5=127
*/
/*顯示轉(zhuǎn)換結(jié)果*/
void Display_Result(uchar d) {
P2 = 0xf7; /*11110111,第4個數(shù)碼管顯示個位數(shù)*/
P0 = LEDData[d%10];/*Y=51*2.5=127 個位=127%10=7*/
DelayMS(5);
P2 = 0xfb; /*11111011,第3個數(shù)碼管顯示十位數(shù)*/
P0 = LEDData[d%100/10];/*Y=51*2.5=127 十位=127%100/10=2*/
DelayMS(5);
P2 = 0xfd; /*11111101,第2個數(shù)碼管顯示百位數(shù)*/
P0 = LEDData[d/100];/*Y=51*2.5=127 百位=127/100=1*/
DelayMS(5);
}
/*主程序*/
void main() {
TMOD = 0x02;/*M1=1,M0=0,T0定時器,工作模式2
如果TMOD = 0x01,M1=0,M0=1,T0定時器,工作模式1*/
/*
TMOD=0x21; 00100001
TM0D的高四位配置T1也就是你說的0010 這個是設(shè)置定時\計數(shù)器1的
低四位配置T0也就是你說的0001是設(shè)置定時器0的.
所以你說的TMOD = 0x21,00100001,是將定時器1設(shè)置與工作方式2.將定時器0設(shè)置成工作方式1.
*/
TH0 = 0x14;/*20us發(fā)生溢出中斷一次,定時器專用寄存器,TH0高位*/
TL0 = 0x00;/*定時器專用寄存器,TL0地位,
當(dāng)TL0滿了后自動清零同時TH0進一位,當(dāng)TL0,TH0都滿了會發(fā)生溢出中斷*/
IE = 0x82;/*10000010,EA=1,中斷總開關(guān)允許,ET=1,溢出中斷允許*/
TR0 = 1; /*啟動定時器*/
P1 = 0x3f;/*選擇ADC0809的通道3(0111)*/
while(1) {
ST = 0;ST = 1;ST = 0;/*啟動A/D轉(zhuǎn)換,上升沿復(fù)位清零ADC,下降沿啟動轉(zhuǎn)換,低電平保持轉(zhuǎn)換*/
while(EOC == 0); /*等待轉(zhuǎn)換完成,EOC=0 表示ADC正在轉(zhuǎn)換 EOC=1 ADC轉(zhuǎn)換結(jié)束*/
OE = 1; //輸出使能,OE=0高阻,OE=1 ADC轉(zhuǎn)換結(jié)果允許輸出到單片機
Display_Result(P3);
OE = 0; //輸出使能,OE=0高阻
}
}
/*T0定時器中斷給ADC0808提供時鐘信號*/
void Timer0_INT() interrupt 1 {
CLK = !CLK; /*每20us發(fā)生溢出中斷一次,給AD0809提供時鐘信號*/
}
-------------------------------------
|