从ADC0809的通道IN0输入0-5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。ADC0809的VREF接+5V电压。
电路原理图如下:
程序如下:
#include <reg52.h> //头文件定义
#include<intrins.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit EOC=P3^3;//EOC转换结束信号,高电平说明转换结束。如果只是作为P3.3口,查询编程;如果是INT1,中断编程方法。
sbit CS=P3^0;
sbit AD_WR=P3^6;//控制ST,WR=0,ST=1;WR=1,ST=0;上升沿(0—1)启动A/D转换,下降沿(1—0)进入A/D转换。
sbit AD_RD=P3^7;//控制OE,RD=0,OE=1;RD=1,OE=0;OE=1,允许数据输出给单片机。OE=0,停止数据输出给单片机
uchar code table[ ]={0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,
0x39,0x5E,0x79,0x71};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)//显示子函数
{
P2=table[bai];//P2连接DATA 显示数字
P1=0x04; //P1连接BIT 选择哪一位数码管
delayms(1);
P2=table[shi];
P1=0x02;
delayms(1);
P2=table[ge];
P1=0x01;
delayms(1);
}
void main()
{
uchar A1,A2,A3,ad_dat,a;
CS=0;//WR=1;RD=1;
while(1)
{
AD_WR=1;//st=1;
_nop_();
_nop_();
_nop_();
AD_WR=0; //上升沿启动A/D转换
_nop_();
_nop_();
_nop_();
AD_WR=1; //下降沿开始A/D转换
while(!EOC);//等待A/D转换结束,当EOC变为1时,A/D转换结束。
for(a=5;a>0;a--);
AD_RD=0;//输出转换数据给单片机
_nop_();
ad_dat=P0;//段选显示
AD_RD=0;//输出数据线为高阻状态 每改变一次电压值,就需要按下仿真器复位按钮,再点击下载,才能显示新的数字量
A1=ad_dat/100;
A2=ad_dat%100/10;
A3=ad_dat%10;
display(A1,A2,A3);
}
}
|