简易数字电压表.docx
《简易数字电压表.docx》由会员分享,可在线阅读,更多相关《简易数字电压表.docx(13页珍藏版)》请在冰豆网上搜索。
![简易数字电压表.docx](https://file1.bdocx.com/fileroot1/2023-1/31/0fdcd108-8e14-41aa-b57a-7391b6702f69/0fdcd108-8e14-41aa-b57a-7391b6702f691.gif)
简易数字电压表
前言
本课程设计实现电压数字化测量的方法是模—数(A/D)转换,本设计将用AD转换芯片ADC0808对模拟信号进行转换,AD转换芯片ADC0808的基准电压端,被测量电压输入端分别输入基准电压和被测电压。
AD转换芯片ADC0808将被测量电压输入端所采集到的模拟电压信号转换成相应的数字信号。
然后再通过对单片机AT89SC52进行软件编程,使单片机按规定的时序采集这些数字信号,通过一定的算法计算算出被测量电压值,最后驱动数码管进行电压显示。
简易数字电压表可以测量范围0至5伏范围内的8路输入电压值,并在4位LED数码管上轮流显示或选择显示。
其测量最小分辨率为0.02V。
本系统主要包括四大模块:
数据采集模块、控制模块、显示模块、A/D转换模块。
一、总体设计
因ADC0809在Protues中无法进行仿真,因此选用ADC0808代替ADC0809。
然后选用单片机AT89C52和A/D转换芯片ADC0808实现电压的转换和控制,用四位数码管显示出最后的转换电压结果。
将数据采集接口电路输入电压传入ADC0808数模转换元件,经转换后通过OUT1至OUT8与单片机P0口连接,把转换完的模拟信号以数字信号的信号的形式传给单片机,信号经过单片机处理从LED数码显示管显示。
P3实现通道选择,P2口接数码管位选,P1接数码管,实现数据的动态显示。
二、硬件设计
1、A/D转换电路
A/D转换的作用是进行模数转换,把接收到的模拟信号转换成数字信号输出。
在选择A/D转换时,先要确定A/D转换精度、转换速度以及转换位数等,A/D转换的位数确定与整个测量控制系统所需测量控制的范围和精度有关,在数字电压表设计中采用了8位A/D转换器ADC0808。
图1ADC0808
ADC0808是采样分辨率为8位的,以逐次逼近原理进行模/数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0808是ADC0809的简化版本,功能基本相同。
一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。
引脚功能(外部特性)
ADC0808芯片有28条引脚,采用双列直插式封装,如右图所示。
各引脚功能如下:
1~5和26~28(IN0~IN7):
8路模拟量输入端。
8、14、15和17~21:
8位数字量输出端。
22(ALE):
地址锁存允许信号,输入,高电平有效。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
6(START):
A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
7(EOC):
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9(OE):
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10(CLK):
时钟脉冲输入端。
要求时钟频率不高于640KHZ。
11(Vcc):
主电源输入端。
12(VREF(+))和16(VREF(-)):
参考电压输入端
13(GND):
地。
23~25(ADDA、ADDB、ADDC):
3位地址输入线,用于选通8路模拟输入中的一路.
ADC0808应用说明
(1).ADC0808内部带有输出锁存器,可以与AT89S51单片机直接相连。
(2).初始化时,使ST和OE信号全为低电平。
(3).送要转换的哪一通道的地址到A,B,C端口上。
(4).在ST端给出一个至少有100ns宽的正脉冲信号。
(5).是否转换完毕,我们根据EOC信号来判断。
(6).当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
2、晶振电路
图2晶振电路
电路中的晶振即石英晶体震荡器。
由于石英晶体震荡器具有非常好的频率稳定性和抗外界干扰的能力,所以,石英晶体震荡器是用来产生基准频率的。
通过基准频率来控制电路中的频率的准确性。
同时,它还可以产生振荡电流,向单片机发出时钟信号。
晶振电路用于产生单片机工作所需的时钟信号,使用晶体震荡器时,c1,c2取值20~40PF,使用陶瓷震荡器时c1,c2取值30~50PF。
XTAL1接外部晶体的一个引脚,XTAL2接外晶体的另一端。
在单片机内部,接至上述振荡器的反相放大器的输出端。
采用外部振荡器时,对HMOS单片机,该引脚接外部振。
在石英晶体的两个管脚加交变电场时,它将会产生一定频率的机械变形,而这种机械振动又会产生交变电场,上述物理现象称为压电效应。
一般情况下,无论是机械振动的振幅,还是交变电场的振幅都非常小。
但是,当交变电场的频率为某一特定值时,振幅骤然增大,产生共振,称之为压电振荡。
这一特定频率就是石英晶体的固有频率,也称谐振频率。
石英晶振起振后要能在XTAL2线上输出一个3V左右的正弦波,以便使MCS-52片内的OSC电路按石英晶振相同频率自激振荡。
通常,OSC的输出时钟频率fOSC为0.5MHz-16MHz,典型值为12MHz或者11.0592MHz。
电容C1和C2可以帮助起振,典型值为30pF,调节它们可以达到微调fOSC的目的。
3、复位电路
图3复位电路
复位电路的主要功能是使单片机进行初始化,在初始化的过程中需要在复位引脚上加大于2个机器周期的高电平。
复位后的单片机地址初始化为0000H,然后继续从0000H单元开始执行程序。
在复位电路中提供复位信号,等到系统电源稳定后,再撤销复位信号。
但是为了在复位按键稳定的前提下,电源稳定后还要经一定的延时才撤销复位信号,以防在按键过程中引起的抖动而影响复位。
其中,R1选择1k,C3选择22pF。
4、AT89C52单片机介绍
图4AT89C52
AT89C52是一种低电压、高性能CMOS 8位单片机,片内含有8KB的可反复写的只读程序存储器和256KB的随机存取数据存储器(RAM),器件采用ATMEL 公司高密度、非易失性存储器技术制造兼容MCS-51 产品指令系统。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和Flash存储单元,使得AT89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
a.主电源引脚
Vss-(20脚):
地线
Vcc-(40脚):
+5V电源
b.外接晶振或外部振荡器引脚
XTAL1-(19脚):
当采用芯片内部时钟信号时,接外部晶振的一个引脚;当采用外部时钟信号时,此脚应接地。
XTAL2-(18脚):
当采用芯片内部时钟信号时,接外部晶振的一个引脚;当采用外部时钟信号时,外部信号由此脚输入。
c.控制、选通或电源复用引脚
RST-(9脚):
复位信号输入;Vcc掉电后,此脚可接上备用电源,在低功耗条件下保持 内部RAM中的数据。
ALE-(30脚):
ALE即允许地址锁存信号输出,当单片机访问外部存储器时该脚的输出信号用于锁存P0的低8位地址,其输出的频率为时钟振荡频率的1/6。
PROG为编程脉冲输入端,当选用8751单片机时,由此脚输入编程脉冲。
PSEN-(29脚):
访问外部程序存储器选通信号,低电平有效,用于实现外部程序存储器的读操作。
EA-(31脚):
EA为访问内部或外部程序存储器选择信号,EA=0,单片机只访问外部程序存储器,故对8031此脚只能接地;EA=1,单片机访问内部程序存储器,固对8051和8751此脚应接高电平,但若程序指针PC值超过4KB(OFFFH)范围,单片机将自动访问外部程序存储器。
d.多功能I/O引脚
P0口-(32~39脚):
P0数据/地址复用总线端口。
P1口-(1~8脚):
P1静态通用端口。
P2口-(21~28脚):
P2动态端口。
P3口-(10~17脚):
P3双功能静态端口。
除作I/O端口外,它还提供特殊的第二功能,其具体含义为:
P3.0-(10脚)RXD:
串行数据接收端。
P3.1-(11脚)TXD:
串行数据发送端。
P3.2-(12脚)INT0:
外部中断0请求端,低电平有效。
P3.3-(13脚)INT1:
外部中断1请求端,低电平有效。
5、显示电路
图5显示电路
数码管有共阴极和共阳极两种结构规格,。
电阻为外接。
共阴极数码管的发光二极管阴极共地,当某发光二极管的阳极为高电平时,二极管点亮;共阳极数码管的发光二极管是阳极,并接高电平,对于需点亮的发光二极管将其阴极接低电平即可。
三、软件设计
1、主程序流程图
主程序一般包括:
主程序的起始地址,中断服务程序的起始地址、有关内存单元及相关部件的初始化和一些子程序调用等。
图6主程序流程图
2、A/D转换子程序流程图
是
否
图7A/D转换流程图
系统设置好后,单片机扫描转换结束管脚P2.6的输入电平状态,当输入为高电平则转换完成,将装换的数值转换并显示输出。
若输入为低电平,则继续扫描。
A/D转换程序的功能是采集数据,在整个系统设计中占有很高的地位。
当
四、调试说明
软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。
Proteus软件可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。
Proteus支持的微处理芯片包括8051系列、AVR系列、PIC系列、HC11系列及Z80等等。
Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与u Visions3 IDE工具软件结合进行编程 仿真调试。
调试时,首先在keil中编译程序,若程序没有错误,则生成hex文件,用于后续将hex文件加载入AT89C52中进行仿真。
仿真结果:
图8仿真结果图
五、使用说明
基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。
在实际应用工作应能好,测量电压准确,精度高。
系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。
我的设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
由于单片机AT89C51为8位处理器,当输入电压为5.00V时,ADC0808输出数据值为255(FFH),因此单片机最高的数值分辨率为0.0196V(5/255)。
这就决定了电压表的最高分辨率只能到0.0196V 。
简易数字电压表测得的值基本上比标准电压值偏大0-0.01V,这可以通过校正ADC0808的基准电压来解决。
因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。
当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。
六、结论
本设计能够通过A/D转换模块对输入的模拟直流电压转换为数字信号,并进行进行测量,然后通过LED数码管进行显示。
参考文献
[1]张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:
国防工业出版社,2004
[2]伟福.LAB6000系列单片机仿真实验系统使用说明书
[3]阎石.数字电路技术基础(第五版).北京:
高等教育出版社,2006
[4]王松武.于鑫.电子创新设计与实践.国防工业出版2005,112-114
[5]陈益飞.孙干超.单片机原理及应用技术.国防工业出版2011
[6]谢维成.单片机原理与应用及C51程序设计.清华大学出版社2007
附录:
Ⅰ、系统电路图
Ⅱ、程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
uchardisp[4];//定义数组变量
sbitST=P3^0;//定义START引脚
sbitOE=P3^1;//定义OE引脚
sbitEOC=P3^2;//定义EOC引脚
sbitCLK=P3^3;//定义CLOCK引脚
sbitp17=P1^7;//定义数码管小数点
intgetdata,temp;
voiddelay(uintz);
voiddisplay();
voidinitial();
voidmain()
{
intgetdata=0;
initial();//调用初始化函数
while
(1)
{
OE=0;//刚开始禁止将转换结果输出
ST=0;
ST=1;
ST=0;//启动A/D转换开始
while(EOC==1)//等待转换结束
OE=1;//允许转换结果输出
getdata=P0;//将转换结果赋值给变量getdata
OE=0;//禁止转换结果输出
temp=getdata*1.0/255*5000;//将得到的数据进行处理
disp[0]=temp%10;//取得个位数
disp[1]=temp/10%10;//取得十位数
disp[2]=temp/100%10;//取得百位数
disp[3]=temp/1000;//取得千位数
display();//调用显示子程序
}
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidinitial()//中断服务程序初始化
{
TMOD=0x01;
TH0=(65536-20)/256;
TL0=(65536-20)%256;
EA=1;
ET0=1;
TR0=1;
}
voidtimer0()interrupt1//给ADC0808提供25kHZ的时钟脉冲
{
TH0=(65536-20)/256;
TL0=(65536-20)%256;
CLK=~CLK;
}
voiddisplay()//将显示结果在数码管上显示
{
P2=0xfe;
P1=table[disp[0]];
delay
(1);
P2=0xfd;
P1=table[disp[1]];
delay
(1);
P2=0xfb;
P1=table[disp[2]];
delay
(1);
P2=0xf7;
P1=table[disp[3]];
delay
(1);
p17=0;
}