ADC0809模数转换与显示
ADC0809模数转换并显示过程对于初学者来讲比较难理解的部分,所以把转换程序详细的
解释对于初学者有很大的帮助。
程序解释部分如下:
-------------------------------------
/*名称:ADC0809数模转换与显示
说明:ADC0809采样通道3输入的
模拟量,转换后的结果显示在数码管上。*/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
/*各数字的数码管段码,共阴*/
uchar code LEDData[]= {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
sbit OE = P1^0; //输出使能,OE=0高阻,OE=1 ADC转换结果输出到单片机
sbit EOC = P1^1; //转换结束信号,EOC=0 表示ADC正在转换 EOC=1 ADC转换结束
sbit ST = P1^2; //启动信号,上升沿复位清零ADC,下降沿启动转换,低电平保持转换
sbit CLK = P1^3; //时钟信号,一般500KHz始终信号
/*延时*/
void DelayMS(uint ms) {
uchar i;
while(ms--) {
for(i=0;i<120;i++);
}
}
/*ADC0809输入电压0-5v对应数字信号00H-FFH,也就是0-255.
模拟输入看成X,数字输出看成Y则Y=255*X/5=51*X,前提条件
VREF+=5V,VREF-=0V.如:X=2.5V Y=51*2.5=127
*/
/*显示转换结果*/
void Display_Result(uchar d) {
P2 = 0xf7; /*11110111,第4个数码管显示个位数*/
P0 = LEDData[d%10];/*Y=51*2.5=127 个位=127%10=7*/
DelayMS(5);
P2 = 0xfb; /*11111011,第3个数码管显示十位数*/
P0 = LEDData[d%100/10];/*Y=51*2.5=127 十位=127%100/10=2*/
DelayMS(5);
P2 = 0xfd; /*11111101,第2个数码管显示百位数*/
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 这个是设置定时\计数器1的
低四位配置T0也就是你说的0001是设置定时器0的.
所以你说的TMOD = 0x21,00100001,是将定时器1设置与工作方式2.将定时器0设置成工作方式1.
*/
TH0 = 0x14;/*20us发生溢出中断一次,定时器专用寄存器,TH0高位*/
TL0 = 0x00;/*定时器专用寄存器,TL0地位,
当TL0满了后自动清零同时TH0进一位,当TL0,TH0都满了会发生溢出中断*/
IE = 0x82;/*10000010,EA=1,中断总开关允许,ET=1,溢出中断允许*/
TR0 = 1; /*启动定时器*/
P1 = 0x3f;/*选择ADC0809的通道3(0111)*/
while(1) {
ST = 0;ST = 1;ST = 0;/*启动A/D转换,上升沿复位清零ADC,下降沿启动转换,低电平保持转换*/
while(EOC == 0); /*等待转换完成,EOC=0 表示ADC正在转换 EOC=1 ADC转换结束*/
OE = 1; //输出使能,OE=0高阻,OE=1 ADC转换结果允许输出到单片机
Display_Result(P3);
OE = 0; //输出使能,OE=0高阻
}
}
/*T0定时器中断给ADC0808提供时钟信号*/
void Timer0_INT() interrupt 1 {
CLK = !CLK; /*每20us发生溢出中断一次,给AD0809提供时钟信号*/
}
-------------------------------------
|