仿真版本:proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:S0005
功能说明
2、可以测量0~5V输入电压值;
3、LED数码管显示;
4、最小分辨率为0.01V,测量误差约为±0.01V。
设计要求
本课题是利用单片机设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码管显示,使用的元器件数目较少。外界电压模拟量输入到A/D转换部分的输入端,通过ADC0809转换变为数字信号,输送给单片机。然后由单片机给数码管数字信号,控制其发光,从而显示数字。
选择AT89C51作为单片机芯片,选用四位8段共阴极LED数码管实现电压显示,利用ADC0809作为数模转换芯片。将数据采集接口电路输入电压传入ADC0809数模转换元件,经转换后通过D0至D7与单片机P0口连接,把转换完的模拟信号以数字信号的信号的形式传给单片机,信号经过单片机处理从LED数码显示管显示。P2口接数码管位选,P1接数码管,实现数据的动态显示,
仿真图
原理图
PCB
程序(提供源文件)
系统上电后,配置数码管个引脚,然后对其进行初始化,再调用的读写函数,可将采集处理后的电压数值实时显示。其程序流程图如图所示。
由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是连接在AT89C51单片机的40管脚,也就是要求从40管脚输出CLK信号供ADC0809使用。因此产生CLK信号的方法就等于从软件产生。电压表系统有主程序,A/D转换子程序、按键子程序和显示子程序。
显示函数
code unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char i;
void display0()
{
P0 = 0xff;
switch(i)
{
case 0:P2 = 0x10;P0 = seven_seg[shuju / 1000 % 10];break;
case 1:P2 = 0x20;P0 = seven_seg[shuju / 100 % 10]&0x7f;break;
case 2:P2 = 0x40;P0 = seven_seg[shuju / 10 % 10];break;
case 3:P2 = 0x80;P0 = seven_seg[shuju % 10];break;
case 4:P2 = 0x01;P0 = seven_seg[1];break;
case 5:P2 = 0x02;P0 = seven_seg[2];break;
case 6:P2 = 0x04;P0 = 0xff;break;
case 7:P2 = 0x08;P0 = seven_seg[shuju / 10000 % 10];break;
}
i++;if(i >= 8)i = 0;
}