数字电压表Word文档下载推荐.docx
《数字电压表Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字电压表Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
6.程序清单·
12
7.小结·
17
数字电压表采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
数字电压表自从一九五二年问世以来,随着电子技术的飞跃发展,特别是目前,作为测量仪表、模拟指示仪表的数字化以及自动测量的系统,而得到了很大的发展。
数字电压表是从电位差计的自动化这种想法研制出来的,因此即便是最初的数字电压表,其精度也要比模拟式仪表高,而其成本比电位差计也高。
以后,DVM的发展就着眼在高精度和低成本两个方面。
单片机可单独地完成现代工业控制所要求的智能化控制功能,这是单片机最大的特征。
本电路主要采用AT89S52芯片和ADC0809芯片来完成一个简易的数字电压表,能够对输入的0~5V的模拟直流电压进行测量,并通过一个4位一体的7段LED数码管进行显示。
该电压表的测量电路主要由三个模块组成:
A/D转换模块、数据处理模块及显示控制模块。
A/D转换主要由芯片ADC0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。
数据处理则由芯片AT89S51来完成,其负责把ADC0809传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;
另外它还控制着ADC0809芯片的工作。
1.设计任务
结合实际情况,基于AT89C51单片机设计一个数字电压表。
该电压表应满足的设计要求为:
(1)按键换量程(小数点的位置)
(2)使用ADC0809
(3)串行静态显示(十进制)
(4)数值转换(小数运算、BCD转换)
主要硬件设备:
单片实验开发系统、ADC0809模数转换芯片×
1、8155外部扩展×
1、4×
6矩阵键盘×
1、七段译码管×
4。
2.整体方案设计
电压表设计以AT89S52单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个硬件系统。
该系统主要由AD0809模块、键盘量程选择、AT89S52单片机和显示模块等几部分组成。
各模块的主要功能如下:
(1)模拟电压信号输入。
(2)AD0809接收输入到的模拟电压,进行模拟转换。
(3)键盘模块处理量程选择问题,为51单片机提供量程选择信号。
(4)显示模块有数码管组成,可显示四位数字量。
(5)A/D转换器的功能是把需要测量的模拟电压信号转换成0~255的数字电压信号,然后送入单片机。
图1基于单片机的简易数字电压表原理图
3.系统硬件电路设计
3.1模拟电压输入
滑动变阻器与电压表构成模拟电压输入,试验箱上的+5V电源,接到可调电压上面,通过旋钮进行输入电压的调节。
图2模拟电压输入实现
3.2模数转换电路
本设计所用A/D转换电路采用通用的ADC0809模数转换芯片,它是一种8位数字输出的逐次逼近式A/D转换器件,转换时间为100us。
它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
3.2.1IN0-IN7:
8条模拟量输入通道
ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;
输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条。
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
通道选择表如下表所示:
C(ADDC)
B(ADDB)
A(ADDA)
选择的通道
IN0
IN1
IN2
IN3
IN4
IN5
IN6
IN7
图3ADC0809通道选择表
3.2.2数字量输出及控制线
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;
下跳沿时,开始进行A/D转换;
在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;
否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;
OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,工作频率范围为10KHZ-1280KHZ,当频率范围为500KHZ时,其转换速度为128us。
VREF(+),VREF(-)为参考电压输入。
3.2.3ADC0809应用说明
(1)ADC0809内部带有输出锁存器,可以与AT89S52单片机直接相连。
(2)初始化时,使ST和OE信号全为低电平。
(3)送要转换的哪一通道的地址到A,B,C端口上。
(4)在ST端给出一个至少有100ns宽的正脉冲信号。
(5)是否转换完毕,我们根据EOC信号来判断。
(6)当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
AD0809的启动方式为脉冲启动方式,启动信号START启动后开始转换,EOC信号在START的下降沿10us后才变为无效的低电平。
这要求查询程序待EOC无效后再开始查询,转换完成后,EOC输出高电平,再由OE变为高电平来输出转换数据。
在设计程序时可以利用EOC信号来通知单片机(查询法或中断法)读入已转换的数据,也可以在启动AD0809后经适当的延时再读入已转换的数据。
ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式AD转换器。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只通8路模拟输入信号中的一个进行A/D转换。
主要特性:
(1)8路输入通道,8位A/D转换器,即分辨率为8位。
(2)具有转换起停控制端。
(3)转换时间为100μs,时钟为640kHz,130μs,时钟为500kHz
(4)单个+5V电源供电
(5)模拟输入电压范围0~5V,不需零点和满刻度校准。
(6)工作温度范围为-40~+85摄氏度。
(7)低功耗,约15mW。
3.3矩阵键盘
图4矩阵键盘
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式(而在此设计中由于无法找到独立按键,所以使用矩阵键盘代替)。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
矩阵键盘的工作原理:
按键设置在行、列线交点上,行、列线分别连接到按键开关的两端。
行线通过上拉电阻接到+5V电源上。
无按键按下时,行线处于高电平的状态,而当有按键按下时,行线电平与此行线相连的列线电平决定。
3.4数码管显示模块
3.4.1七段译码管介绍
数码管是最常用的一种显示器件,它是由几个发光二极管组成的8字段显示器件,其特点是价格非常的便宜,使用也非常的方便,显示效果非常的清楚。
小电流下可以驱动,发光响应时间极短,体积小,重量轻,抗冲击性能好,寿命长。
但数码管只能是显示0~15的数据,不能够显示字符。
这也是数码管的不足之处。
3.4.2译码管的分类
七段译码管分为共阳极数码管(Common-Anode)和共阴极数码管(Common-canode)。
由于其每一段也是有发光二极管构成的,将各数码管的阳极连在一起构成共阳极数码管,如图7所示。
3.4.3译码管的驱动方式
(1)直流驱动
每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
优点是编程简单,显示亮度高,缺点是占用I/O端口多。
(2)动态显示驱动
所有数码管通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示。
将所有数码管的8个显示笔划"
a,b,c,d,e,f,g,dp"
的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
(3)由于此试验箱内部电路为动态连接形式,所以只能采用动态显示。
4.系统程序设计
4.1主程序流程图
图5主程序流程图
4.2A/D数模转换
图6A/D数模转换
4.3数据处理模块
图7数据处理模块
4.4显示模块
图8显示模块
图9矩阵扫描模块
5.系统调试
5.1Proteus软件仿真调试
5.1.1调试过程
利用Proteus软件进行仿真
图10仿真原理图
5.1.2调试时遇到的问题及解决方法
(1).在用proteus仿真时,遇到了无法仿真的现象,后经排查,查阅相关资料后,发现proteus的库中没有AD0809的仿真模型,后改为AD0808后即可仿真。
(2).在第一次调试时,忘记了给ADC0808的CLK引脚时钟信号置初始值,结果ADC输出的值都是0,找到主程序进行分析,发现问题,修改程序后,将ADC0809输出接至LED灯检查,显示输出正常。
(3).在对P1口读数据时发现P1口读入数据不正确,显示错误的现象。
经查资料的得知:
P1口是准双向口,它作为输出口与一般的双向口使用方法相同。
由双向口的结构可知当P1口作为输出口时,必须对它预先置高电平使得内部MOS管接至,因为内部上拉电阻阻值是20K~40K欧姆,故不会对外部输入产生影响。
如不对它置高,且原始低电平,则MOS管导通,读入数据不正确。
5.1.3运行结果
(1)0~1V档位
图110~1V数码管显示
(2)0~5V档位
图120~0.5V数码管显示
(3)超量程处理显示
图13超量程处理显示
5.2硬件调试
5.2.1调试过程
做单片机实验时,接触的是菊阳仿真器,但是版本比较老,我们想着能不能用Keil,经过询问别人发现可以用,进度加快了许多。
不然我们先用Keil编程生成hex文件,再用菊阳仿真软件下载到试验箱里。
安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头。
将写好的.C文件通过Keil软件生成.hex文件,点击下载,将hex文件拷入单片机中,并观察测试结果。
5.2.2调试时遇到的问题及解决方法
台子问题很重要,试了好多台,有一台可以出数,但是某一位数总是多6,编了C程序不能解决,我们总是找不到原因,到最后还是换了一台机子才好使。
6.程序清单
#include"
reg52.h"
absacc.h"
intrins.h"
#defineCOM8155XBYTE[0xFF20]
//定义8155H命令字
#definePAXBYTE[0xFF21]
//定义PAPBPC与AD端口地址
#definePBXBYTE[0xFF22]
#definePCXBYTE[0xFF23]
#defineADCXBYTE[0xFEF3]
unsignedcharcodetable[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//数码管数字查表
unsignedcharcodetable_dian[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
sbitCLK=P3^3;
sbitCS=P2^7;
sbitIOM=P2^0;
sbitEO=P3^2;
sbitADDA=P2^1;
sbitADDB=P2^2;
sbitADDC=P2^3;
//定义P2^7为8155和AD0809的片选信号段
unsignedintADCDat;
floatvot=0;
floatAD_data=0;
unsignedintData_4,Data_0,Data_1,Data_2,Data_3,AD;
unsignedcharFlag=2;
voidAD0809();
//函数声明
voiddelayms(unsignedintxms);
voidDatacaculate();
voidkeyscan();
voidDisplay1(unsignedinta1,unsignedinta2,unsignedinta3,unsignedinta4);
voidDisplay2(unsignedinta1,unsignedinta2,unsignedinta3,unsignedinta4);
voiddelayms(unsignedintxms)//延时程序
{
unsignedinti,j;
for(i=0;
i<
xms;
i++)
for(j=0;
j<
110;
j++);
}
voidDatacaculate()//用于计算数据
{
Data_0=0;
//数据的存储初始化
Data_1=0;
Data_2=0;
Data_3=0;
vot=0;
AD_data=(float)ADCDat*0.0196;
vot=((unsignedint)(AD_data*1000))/1000.000;
//精确为小数点后面三位
AD=((int)(vot*1000));
Data_0=(int)vot;
//存储最终数据依次为显示的第一位,第二位,第三位,第四位
Data_1=AD%1000/100;
Data_2=AD%100/10;
Data_3=AD%10;
voidAD0809()//在P1口加灯验证读出数据
ADC=0;
//启动IN0通道
CS=0;
//片选信号
RD=1;
//初始化OE=0
WR=1;
//初始化ST=0清楚缓冲器中内容
WR=0;
WR=1;
while(!
EO);
RD=0;
P1=0XFF;
ADCDat=P1;
delayms
(1);
CS=1;
voidkeyscan()
unsignedchartemp;
COM8155=0x0e;
//选择另一种方式IO口输出方式C口输出,A口输入,B口输出
PC=0xfe;
temp=PA;
temp=temp&
0x03;
if(temp!
=0x03)
{
temp=PA;
delayms(10);
//消抖
{
switch(temp)
case0x02:
Flag=1;
//0-1V
break;
case0x01:
Flag=2;
//0-5V
default:
break;
}
voidDisplay1(unsignedinta1,unsignedinta2,unsignedint
a3,unsignedinta4)//0~1V
COM8155=0x43;
PB=0xff;
PB=table_dian[a1];
PA=0xdf;
delayms
(2);
PB=table[a2];
PA=0xef;
PB=table[a3];
PA=0xf7;
PB=table[a4];
PA=0xfb;
voidDisplay2(unsignedinta1,unsignedinta2,unsignedinta3,unsignedinta4)//0~5V
PB=table[a1];
PB=table_dian[a2];
voidmain()
EA=1;
//开全局中断
TMOD=0x01;
TL0=(65536-24)%256;
//T0装载,初值65512
TH0=(65536-24)/256;
CLK=0;
ET0=1;
//开T0定时器
TR0=1;
//Gate=0此时TR0=1开启定时器0
CS=0;
//CS信号主要用来控制选择8155与AD0809
while
(1)
{
AD0809();
Datacaculate();
keyscan();
if(Flag==1)
if((Data_0<
1)&
&
(Data_1<
5))
{
Display1(Data_0,Data_1,Data_2,Data_3);
}
else
{
COM8155=0x43;
PA=0xdf;
PB=0xF9;
PB=0xff;
if(Flag==2)
if(Data_0<
5)
Data_4=0;
Display2(Data_4,Data_0,Data_1,Data_2);
PB=0xF9;
}
}
voidT0_time()interrupt1
//定时器初值65512
CLK=~CLK;
//产生AD时钟信号
7.小结
经过一周的共同努力,基于单片机的数字电压表终于设计成功,LED的显示结果和直接用数字电压表测试模拟量输入所得结果几乎一致,误差完全在合理的范围之内,达到预期目的。
但设计中的不足之处仍然存在。
这次设计使用Proteus实现了仿真。
在这个过程中,对电路设计,单片机的使用等都有了新的认识。
通过这次设计学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。
在实际应用工作应能好,测量电压准确,精度高,系统功能、指标达到了课题的预期要求。
本设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
通过本次设计,对单片机这门课有了进一步的了解。
无论是在硬件连接方面还是在软件编程方面。
本次设计采用了AT89S52单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。
设计中还用到了模/数转换芯片ADC0809,以前在学单片机课程时只是对其理论知识有了初步的理解。
通过这次设计,对单片机的工作原理有了更深的理解。
在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
第一、不够细心比如由于粗心大意