程序ADC0809模拟检测电压数码管显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uchar unsigned char
#define uint unsigned int
uchar temp,dianya0,dianya1;
uchar code LED[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71
}; //共阴数码管断码0~9~a~f
uchar disbuff[4]; //显示缓冲器(数组)
sbit clk=P3^3; // 芯
sbit EOC=P3^2; // 片
sbit OE=P3^0; // 引
sbit start=P3^1; // 脚
sbit adress_A=P3^4; // 定
// 义
void delay(uint z)
{
while(z--);
}
void timer0init()
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-1)/256; //定时器0高八位赋值1us中断一次TL0=(65536-1)%256; //定时器0低八位赋值
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void display()
{
// disbuff[0]=dianya%10; //个位
// disbuff[1]=dianya/10%10; //十
// disbuff[2]=dianya/100%10; //百
// disbuff[3]=dianya/1000; // 千
P2=0xfe; //打开第一个数码管
P0=LED[disbuff[3]]; //给数码管送数据(段码)
delay(60); //延时,防止数码管重影
P2=0xfd; // 以
P0=LED[disbuff[2]]; // 下
delay(60); // 功
P2=0xfb; // 能
P0=LED[disbuff[1]]; // 类
delay(60); // 同
P2=0xf7;
P0=LED[disbuff[0]];
delay(60);
}
void main()
{
timer0init(); //定时器0初始化
while(1)
{
adress_A=0; //打开通道0
delay(10); //延时等待芯片反应
start=1; //开始ADC转换
// while(!EOC); //等待转换完成标志(未知原因,此语句导致数码管不能显示)
OE=1; //输出允许
P1=0XFF; //输入前P1口需置1
dianya0=P1; //AD转换完成,读取值
OE=0; //关闭输出
start=0; //关闭AD转换
disbuff[0]=dianya0%16;//将二进制数据转换为16进制低位
disbuff[1]=dianya0/16;//将二进制数据转换为16进制高位
delay(10); //延时等待芯片反应
adress_A=1; //打开通道1
delay(10);
start=1;
OE=1;
// while(!EOC);
P1=0XFF;
dianya1=P1;
OE=0;
start=0;
disbuff[2]=dianya1%16;
disbuff[3]=dianya1/16;
display(); //显示
}
}
void timer0() interrupt 1
{
TH0=(65536-1)/256; //重装初值
TL0=(65536-1)%256;
clk=~clk; //模拟给ADC0808提供时钟
}
硬件图(protues仿真)