51单片机电压表,ADC
 ADC0808
- IN0~IN7:8路模拟量输入端。
- D0~D7:8位数字量输出端。
- ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。
- ALE:地址锁存允许信号,输入端,产生一个正脉冲以锁存地址。
- START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
- EOC: A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
- OE: 数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
- CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。
- REF(+)、REF(-):基准电压。
Vcc:电源,接+5V。- GND:地。
 74LS74 74LS04
 CD4511 - A0~A3:二进制数据输入端
- Ya~Yg:数据输出端
BI:输出消隐控制端,接电源 LT:灯测试端,接电源- LE:数据锁定控制端,接地
- VDD: 接电源
- VSS: 接地
4位数码管
AT89C52 
单片机源程序如下:
- #include <reg52.H>
- #define uchar unsigned char;
- uchar code scan_con[]={0x08,0x04,0x02,0x01}; //定义扫描片选
- uchar dispbuf[4]={0,0,0,0}; //定义4个存储空间
- uchar getdata;
- unsigned long int temp;//定义暂存空间
- uchar i,j,k,l,m;
- int a,b;
- sbit s3=P3^7; //位定义,控制模拟开关
- sbit s2=P3^6;
- sbit s1=P3^5;
- sbit dp=P0^7; //定义小数点
- #define v20_on {s3=0;s2=0;s1=0;} //宏定义不同量程,不同的开关状态
- #define v2_on {s3=0;s2=0;s1=1;}
- #define v02_on {s3=0;s2=1;s1=0;}
- sbit ST=P3^1; //定义单片机和ADC的控制信号
- sbit OE=P3^3;
- sbit EOC=P3^2;
- delay_ms(int n)
- {
- for(a=n;a>0;a--)
- for(b=100;b>0;b--);
- }
- main(void)
- {
- while(1)
- {
- _20v: //2~20V量程
- v20_on;
- ST=1;
- delay_ms(1); //启动A/D转换
- ST=0;
- while(EOC==0)
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21) //量程不合适,切换
- {
- goto _2v;
- delay_ms(1);
- }
- l=3;
- temp=getdata; //量程合适,数据处理
- temp=temp*100;
- temp=temp*5/51;
- goto disp; //跳到数码管显示程序段
- _2v: //200MV~2V量程
- v2_on;
- ST=1;
- delay_ms(1); //启动A/D转换
- ST=0;
- while(EOC==0)
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {
- goto _02v;
- delay_ms(1);
- }
- else if(getdata>204)
- {
- goto _20v;
- delay_ms(1);
- }
- l=2;
- temp=getdata;
- temp=temp*100*5/51;
- goto disp;
- _02v: //0~200MV量程
- v02_on;
- OE=0;
- ST=1;
- delay_ms(1); //启动A/D转换
- ST=0;
- while(EOC==0)
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata>204)
- {
- goto _2v;
- delay_ms(1);
- }
- l=1;
- temp=getdata;
- temp=temp*100*5/51;
-
- disp:
- dispbuf[3]=0;
- dispbuf[2]=0;
- dispbuf[1]=0;
- dispbuf[0]=0;
- i=0;
- for(;temp;i++)//电压值的每个位计
- {
- dispbuf[i]=temp%10;
- temp=temp/10;
- }
- for(k=0;k<=3;k++) //数码管显示
- {
-
- if((k==3&&l==3&&i==3) ||(k==3&&l==1&&i==3))
- continue;
- P0=scan_con[k]; //位选
- P2=dispbuf[k]&0x0f; //段选
- if((l==3&&k==2)||(l==2&&k==3)||(l==1&&k==1))
- dp=0 ;
- else dp=1;
- for(m=0;m<=2;m++)
- for(j=0;j<=20;j++);
- }
- }
- }
复制代码
所有资料51hei提供下载:
电压表.zip
(795.15 KB, 下载次数: 23)
|