【www.nmgzasp.com--数字谜语大全】
[量程自动切换的数字电压表设计]量程自动切换的数字电压表设计 http://apps.hi.baidu.com/share/detail/23592439
【设计要求】
⑴测量范围0~20V直流电压,量程可自动切换
(
0~200MV,200MV~2V,2V~20V),
量程自动切换的数字电压表设计
[智库|专题]。 ⑵测量精度20MV,误差⑶用四位八段数码管显示被测电压值。
原理图:(分模拟输入部分和单片机部分)
C语言原程序如下:
#include
#define uchar unsigned char;
uchar code scan_con[]={0x03,0x02,0x01,0x00}; //定义列扫描
uchardispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//定义0~9的显示段码
uchar dispbuf[8]={0,0,0,0,0,0,0,0}; //定义8个存储空间
uchar dispcount=0;
uchar getdahttp://www.unjs.comta;
unsigned int temp;//定义暂存空间
uchar i,j,k,l,m;
sbit s3=P2^7; //位定义,控制模拟开关
sbit s2=P2^6;
sbit s1=P2^5;
sbit dp=P1^7; //定义小数点
#define v20_on {s3=1;s2=0;s1=0;} //宏定义不同量程,不同的开关状态 #define v2_on {s3=0;s2=1;s1=0;}
#define v02_on {s3=0;s2=0;s1=1;}
sbit ST=P2^0; //定义单片机和ADC的控制信号
sbit OE=P2^1;
sbit EOC=P2^2;
main()
{
while(1)
{
_20v: //2~20V量程
v20_on;
ST=0; //启动A/D转换
ST=1;
ST=0;
while(EOC==0);
OE=0;
getdata=P0;
OE=1;
if(getdata
{
goto _2v;
}
l=3;
temp=getdata; //量程合适,数据处理
temp=temp*100;
temp=(temp/51)*5;
goto disp; //跳到数码管显示程序段
_2v: //200MV~2V量程
v2_on;
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=0;
getdata=P0;
OE=1;
if(getdata
{
goto _02v;
}
else if(getdata>204)
{
goto _20v;
}
l=2;
temp=getdata;
temp=(temp*100/51)*10;
temp=temp/2;
goto disp;
_02v: //0~200MV量程
v02_on;
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=0;
getdata=P0;
OE=1;
if(getdata>204)
{
goto _2v;
}
l=1;
temp=getdata;
temp=(temp*100/51)*100;
temp=temp/20;
disp:
dispbuf[0]=0;
dispbuf[1]=0;
dispbuf[2]=0;
dispbuf[3]=0;
dispbuf[4]=0;
dispbuf[5]=0;
dispbuf[6]=0;
dispbuf[7]=0;
i=0;
while(temp/10) //电压值的每个位计算 {
dispbuf[i]=temp%10;
temp=temp/10;
i++;
}
dispbuf[i]=temp;
for(k=0;k
P1=dispcode[dispbuf[k]];
P3=scan_con[k];
if(l==3){if(k==2) { P1=P1 | 0x80; }} //小数点的确定 else if(l==2) {if(k==3) { P1=P1 | 0x80; }} else if(l==1){if(k==1) { P1=P1 | 0x80; }} for(m=0;m
for(j=0;j
}
}
}