网上很多文章在使用ADC0809时都是采用查询的方法来设计的,这里采用中断的方法。
中断的方法,写出的代码量小,而且对单片机的负荷小,单片机在中断来临之前可以去处理别的事情,具有较高的实用价值。
电路连接图
#include<reg51.h>
#include<absacc.h>
#define adr XBYTE[0x7ff8]
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9
void delay(uchar k)//延时程序
{
uchar l;
while(k>0)
{
for(l=0;l<100;l++);
k--;
}
}
void main()
{
IT1 = 1;//电平跳跃触发
EA = 1;
EX1 = 1;//开中断
adr = 0x00;//启动A/D转换
while(1);//等待中断
}
extern1 () interrupt 2//外部中断1中断函数
{
uchar i;
uint result;
result = adr;//采样得到数据赋给result
result = result*19.61;//5000/255=19.61,将数字量转化为模拟量电压
for(i=0;i<4;i++)
{
switch(i)
{
case 0:P2 = 0x0e;P1 = table[result/1000]|0x80;break;//取第一位
case 1:P2 = 0x0d;P1 = table[result%1000/100];break;//取第二位
case 2:P2 = 0x0b;P1 = table[result%100/10];break;//取第三位
case 3:P2 = 0x07;P1 = table[result%10];break;//取第四位
}
delay(10);
P2 = 0xff;//熄灭数码管
}
adr = 0x00;
}
运行效果:
与实际电压表读数偏差不超过0.1。
注意的是,ADC0809芯片的时钟设置为500kHz左右才能正常工作。
在proteus中ADC0809芯片只有模型,无法使用,所以这里采用ADC0808。功能类似。只是输出口out1是最高位,out8是最低位,这和ADC0809不同。
第一次发blog,没啥经验。仅供参考,转载请标注作者姓名。