/
//
// at89s52 adc0809 数码管显示
// 作者:倪建华 QQ:10772919
// 江苏省南通技师学院
// 2014.5.28
//
sfr P0=0x80; //数码管段码,adc0809数据端
sfr P2=0xa0; //控制脚
//数码管控制脚定义,wr,cs由0变1有效
sbit cs1=P2^0;//段码
sbit cs2=P2^1;//位码
sbit wr=P2^2;//时钟
//adc0809控制脚定义
sbit adc_eoc=P2^3;//转换完成=1,未完成=0
sbit adc_cs=P2^4;//可以直接接地=0
sbit adc_rd=P2^5;//oe=~(rd|cs)
sbit adc_wr=P2^6;//start=ale=~(wr|cs)
//变量定义
unsigned long int v;//电压值
unsigned char v2;//保存adc结果
//延时函数
void ys(unsigned x)
{
unsigned char i;
while(x--)for(i=0;i<120;i++);
}
//adc转换函数
adc()
{
//准备
adc_eoc=1;//转换结束标志置位
adc_rd=1;//禁止总线,防止影响数码管
adc_wr=1;//禁止写
adc_cs=0;//cs同时控制wr,rd,可以直接接地
//启动转换
adc_wr=0;//设置通道号,ale高电平锁存通道地址,start上升沿复位
adc_wr=1;//start下降沿开始转换
while(adc_eoc==0);//转换结束为高电平
adc_rd=0;//oe高电平允许输出
//读取结果
P0=0xff;//P0作为输入端
v2=P0;//读取转换结果
adc_rd=1;//禁止总线,防止影响数码管
}
//8位共阳数码管显示函数
xianshi()
{
unsigned char code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//段码
unsigned char i;
v=(unsigned long int)v2*5000/255;//一定要时行强制类型转换
//从右扫描到左,从最低位开始扫描
for(i=0;i<8;i++)
{
//位消陷
P0=0xff;//关闭
cs2=0;//位有效
wr=0;wr=1;//时钟
cs2=1;//位无效
//送段码
P0=DSY_CODE[v%10];//送段码
cs1=0;//段有效
wr=0;wr=1;//时钟
cs1=1;//段无效
//送位码
P0=~(1<<i);//送位码
cs2=0;//位有效
wr=0;wr=1;//时钟
cs2=1;//位无效
v/=10;//将v缩小10倍,时间较长
ys(1);
}
}
//主函数
main()
{
while(1)
{
adc();//adc转换
xianshi();//数码管显示
}
}
下面是仿真原理图