程序
/*---------------------------------------------------------------------------------
名称:ADC0808模拟检测电压数码管显示
编写:人言者007
日期:2013.5.20
说明:ADC0808的其中两路去检测电压,电压范围0~5V,
电压用电阻器调节模拟出来。检测到模拟电压转
化为数字量后转变为16进制在数码管中显示,每
两位数码管显示一路电压的数字量,声明:显示
的数不是实际电压,只是与电压呈现性关系。
----------------------------------------------------------------------------------*/
#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仿真) 因篇幅问题不能全部显示,请点此查看更多更全内容