标题:
单片机ADC0808电压表仿真程序
[打印本页]
作者:
邹民鑫
时间:
2018-9-29 21:10
标题:
单片机ADC0808电压表仿真程序
51单片机电压表,ADC
0.png
(9.02 KB, 下载次数: 66)
下载附件
2018-9-29 23:16 上传
0.png
(41.22 KB, 下载次数: 62)
下载附件
2018-9-29 23:16 上传
LM324 CD4051
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)
2018-9-29 21:09 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1