硬件设计、
附:http://www.jh-tec.cn/archives/7307
之前讲过的几种数字电压表均是一路输入,今天讲一下多路输入的电压表,显示是采用数码管显示,ADC采用的是TI的ADC0809。
以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、模数转换电路电路。设计思路分为五个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、模数转换器电路这五个模块。
仿真图如下:
三路输出分别采用数码管轮流显示,测量精度大概在0.0.1V左右。
程序设计
#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;//指示当前显示的是第几个转换值
}