#include<reg51.h>
#define uchar unsigned char;
uchar code dispbitcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*定义0~9的显示段码*/
uchar code dispbitcode1[]={0x78,0x3e,0x3f}; /*定义‘out’的显示段码*/
uchar dispbuf[4]; /*定义4个存储空间*/
uchar i,j;
uchar getdata;
unsigned long temp;/*定义暂存空间*/
uchar range;
bit range_ok; /*量程合适标志为1时表示量程合适*/
float muli;
sbit ST=P3^0; /*定义单片机和ADC的控制信号*/
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
sbit P34=P3^4; /*定义数码管显示模块位选*/
sbit P35=P3^5;
sbit P36=P3^6;
sbit P37=P3^7;
sbit P17=P1^7; /*定义数码管显示小数点段位*/
/*延时函数*/
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
/*
函数:切换量程
量程有0-3 共4档输入量程i 应在0-3之间
硬件操作对应于P0.1 P0.2 P0.3
*/
APPL_Range()
{
range=range&0x07;
if(range>4) range=0;/*量程选择错误复位为0 档*/
P2=P2&0xf8; /*将其值放入P2.0 P2.1 P2.2*/
P2=P2|range;
}
/*数码管显示函数*/
void Display()
{
P1=dispbitcode[dispbuf[3]];
P34=0;
P35=1;
P36=1;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[2]];
P17=1; /*置小数点位*/
P34=1;
P35=0;
P36=1;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[1]];
P34=1;
P35=1;
P36=0;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode[dispbuf[0]];
P34=1;
P35=1;
P36=1;
P37=0;
Delay(10);
P1=0x00;
}
void main()
{
range=0; /*选择最高量程100V 为默认量程*/
muli=20;
range_ok=0;
while(1)
{
if(range_ok==0)
{APPL_Range();}
range_ok=1;
ST=0;
OE=0;
ST=1; /*启动A/D转换*/
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
temp=getdata*1.0/255*500; /*数据处理*/
temp=temp*muli;
dispbuf[0]=temp%10;
dispbuf[1]=temp/10%10;
dispbuf[2]=temp/100%10;
dispbuf[3]=temp/1000;
if(getdata>=255)
{
range_ok=0;
if(range>0)
{range--;} /*超量程未到100V 档升量程 */
else /*若超过100V,显示溢出*/
{
dispbuf[0]=0;
dispbuf[1]=1;
dispbuf[2]=2;
P1=dispbitcode1[dispbuf[2]];
P34=1;
P35=0;
P36=1;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode1[dispbuf[1]];
P34=1;
P35=1;
P36=0;
P37=1;
Delay(10);
P1=0x00;
P1=dispbitcode1[dispbuf[0]];
P34=1;
P35=1;
P36=1;
P37=0;
Delay(10);
P1=0x00;
}
}
else /*判断是否可降低量程*/
{
switch(range)
{
case 0: if(getdata<0x85){range++;range_ok=0;} /*小于50 伏?*/
else muli=20;
break;
case 1:if(getdata<0x85){range++;range_ok=0;} /*小于25伏?*/
else muli=10;
break;
case 2:if(getdata<0x35){range++;range_ok=0;} /*小于5 伏?*/
else muli=5;
break;
case 3:muli=1;
break;
}
Display();
}
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
CLK=~CLK;
}
}