#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
uint volt,vtime; //电压值测定值
uchar addr;//测量地址位
sbit LW1=P2^3; //对应第4个数码管
sbit LW2=P2^2; //对应第3个数码管
sbit LW3=P2^1; //对应第2个数码管
sbit LW4=P2^0; //对应第1个数码管
sbit LW5=P1^4;//指示当前显示的是第几个转换值
sbit CLK=P2^4; //时钟信号
sbit START=P2^5; //转换启动开关
sbit EOC=P2^6; //转换结束标志
sbit OE=P2^7;//定义ADC0809各脚
/**********************************************************/
//函数名:delay(uint x)
//功能:延时程序 改变测量地址
//调用函数:
//输入参数:x
//输出参数:
//说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
/**********************************************************/
void delay(uint x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z--);//该步运行时间约为0.5ms
vtime++;
if(vtime==1000)
{
vtime=0;
addr++;
if(addr==3) //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
addr=0;//以上语句实现测量地址位的改变
}
}
/**********************************************************/
//函数名:ADC()
//功能:数模转换程序
//调用函数:
//输入参数:
//输出参数:
//说明:将转换好的测定值保存在变量volt中
/**********************************************************/
void ADC()
{
EA=1;//开中断
//确保进入正常AD转换状态?
START=0;
START=1;
START=0;//ad开始转换
while(EOC==0); //等待转换结束
OE=1; //输出数据标志为真
EA=0;//关中断
volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
OE=0;//输出转换结束 (要在获取转换值之后)
}
/**********************************************************/
//函数名:display()
//功能:4位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值显示在4位数码管上
/**********************************************************/
void display()
{
P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
LW1=0;
P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
delay(2);
P0=0xff;
LW1=1;
LW2=0;
P0=~led[(volt/1000)%10];//100毫伏显示位
delay(2);
P0=0xff;
LW2=1;
LW3=0;
P0=~led[(volt/100)%10];//10毫伏显示位
delay(2);
P0=0xff;
LW3=1;
LW4=0;
P0=~led[(volt/10)%10];//1毫伏显示位
delay(2);
P0=0xff;
LW4=1;
LW5=0;
P0=~led[addr+1];//显示电压测量位
delay(2);
LW5=1;//指示当前显示的是第几个转换值
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
EA=1;//开总中断
TMOD=0x01;//设定定时计数工作方式
//为定时器初赋值
TH0=0XFF;
TL0=0XB4;
ET0=1;//开定时器0中断
TR0=1;//开启定时器0
while(1)
{
P1=addr;//装入测量地址
LW5=1;
ADC();//调用模数转换程序
display();//调用显示程序
}
}
/**********************************************************/
//函数名:timer() interrupt 1
//功能:定时中断0响应程序
//调用函数:
//输入参数:
//输出参数:
//说明:为ADC提供时钟信号
/**********************************************************/
void timer() interrupt 1
{
//初值重置
TH0=0XFF;
TL0=0XF0;
CLK=~CLK;//取反 产生时钟信号
}