数字电压表设计.docx
《数字电压表设计.docx》由会员分享,可在线阅读,更多相关《数字电压表设计.docx(9页珍藏版)》请在冰豆网上搜索。
数字电压表设计
物理与电子信息工程学院
实验报告
实验课程名称:
电子综合设计实验
实验项目名称:
数字直流电压表的设计
班级:
0912241
姓名:
学号:
成绩:
______________
实验时间:
2011.10.25
1.实验目的
(1)掌握数字直流电压表的工作原理。
(2)掌握单片机的使用方法。
(3)掌握程序的编写、调试和下载方法。
(4)学会分析、观察及调式电路。
2.仪器设备
AT89C51单片机1个
ADC08091个
11.0592M晶振1个
四位共阴极数码管1个
22pF瓷片电容2个
10uF电解电容1个
排阻1k*81个
10k电阻若干
3、基本要求:
(1)设计一个能测量直流电压并显示的数字电压表
(2)直流电压输入范围:
0V-5V;
(3)数码管显示至少3位,准确率>80%,偏差<30%;
数字电压表
本题实验主要采用AT89C51芯片和ADC0809芯片来完成一个简易的数字电压表,能够对输入的0~5V的模拟直流电压进行测量,并通过一个3位一体的7段LED数码管进行显示,测量误差约为0.025V。
一、硬件方案的选择:
该电压表的测量电路主要由三个模块组成:
A/D转换模块、数据处理模块及显示控制模块。
A/D转换主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。
数据处理则由芯片AT89S51来完成,其负责把ADC0809传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着ADC0809芯片的工作。
显示模块主要由7段数码管及相应的驱动芯片(74HC373)组成,显示测量到的电压值,
二、硬件方案的实现:
本实验采用AT89C51单片机芯片配合ADC0809模/数转换芯片构成一个数字电压表,该电路通过在ADC0809芯片采样输入口IN0前加入低通滤波器(可以提高测量的精度)使输入的0~5V的模拟量电压经过模/数转换后,产生相应的数字量经过其输出通道D0~D7传送给AT89C51芯片的P0口。
AT89C51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给数码管。
同时它还通过其三位I/O口P3.0、P3.1、P3.2产生位选信号,并通过其P3口驱动芯片74HC245驱动控制数码管的亮灭。
另外,AT89C51还控制着ADC0809的工作。
其ALE管脚为ADC0809提供工作时钟脉冲;P2.3控制ADC0809的地址锁存端(ALE);P2.4控制ADC0809的启动端(START);P2.5控制ADC0809的输出允许端(OE);P3.7控制ADC0809的转换结束信号(EOC)。
系统框图如图1-1示。
(2)、AT89C51与ADC0809的连接电路如图1-2所示。
图1-2
硬件电路原理图,见图1-4
图1-4
三、程序设计
1.主程序设计
初始化中主要对AT89C51,ADC0809的管脚和数码管的位选及所用到的内存单元70H,78H,79H,7AH进行初始化设置。
准备工作做好后便启动ADC0809对IN0脚输入进的0~5V电压模拟信号进行数据采集并转换成相对应的0~255十进制数字量。
在数据处理子程序中,运用标度变换知识,编写算法将0~255十进制数字量转换成0.00~5.00V的数据,输出到显示子程序进行显示。
整个主程序就是在A/D转换,数据处理及显示程序循环执行。
整个程序流程框图如图1-5所示。
图1-5
2.各子程序设计
1)A/D转换子程序(数据采集)
启动ADC0809对模拟量输入信号进行转换,通过判断EOC(P3.1引脚)来确定转换是否完成,若EOC为0,则继续等待;若EOC为1,则把OE置位,将转换完成的数据存储到70H中。
程序流程图如图1-6所示。
图1-6
2)数据处理子程序
程序流程图如图1-7所示
图1-7
3)显示子程序
显示子程序采用动态扫描法实现三位数码管的数值显示。
测量所得的A/D转换数据放在70H内存单元中,测量数据在显示时需转换成10进制BCD码放在78H~7AH单元中。
寄存器R1用作显示数据地址指针。
程序流程图如图1-8所示。
图1-8
程序
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeLEDData[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
sbitOE=P1^0;
sbitEOC=P1^1;
sbitST=P1^2;
sbitCLK=P1^3;
voidDelayMS(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
voidDisplay_Result(uintd,uintc)
{
P2=0xf7;
P0=LEDData[d%10];
DelayMS(5);
P2=0xfb;
P0=LEDData[d%100/10];
DelayMS(5);
P2=0xfd;
P0=LEDData[d/100];
DelayMS(5);
P2=0x7f;
P0=LEDData[c%10];
DelayMS(5);
P2=0xbf;
P0=LEDData[c%100/10];
DelayMS(5);
P2=0xdf;
P0=LEDData[c/100];
DelayMS(5);
}
voidmain()
{
TMOD=0x02;
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
while
(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
OE=1;
P1=0x2f;
Display_Result(0,P3*2.0);
OE=0;
}
}
voidTimer0_INT()interrupt1
{
CLK=!
CLK;
}