数字电压表的设计.docx
《数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《数字电压表的设计.docx(23页珍藏版)》请在冰豆网上搜索。
数字电压表的设计
单片机原理及应用
课程设计报告书
题目:
数字电压表的设计
姓名:
杜典武
学号:
103521034
专业:
电气工程及其自动化
指导老师:
万青老师
设计时间:
2012年11月
数字电压表的设计
1.引言
(1)设计意义:
我们学习的是单片机这门课程,这门课程最显著的特点就是它是一门实用技术课程,它要求我们不仅仅要掌握扎实的理论基础,更重要的是要学会如何去真真利用它为我们的电路设计服务,也只有通过课程设计这样的动手实践才是我们掌握这门技术的最佳途径,因此,我们开设这样的实践是很重要的,也是我们努力去学习钻研的动力。
数字电压表设计意义:
数字电压表是采用数字化检测技术,把连续的模拟量(直流输入电压)换成不连续的、离散的数字形式并加以现实的仪表,克服了传统模拟电压表的读书不方便和不精确等问题。
不能满足数字化时代的需求,采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强集成方便,还可以与PC进行实时通信。
目前,由各种单片A/D转换器构成的数字电压表,已广泛应用于电子电工测量、工业自动化仪表、自动测试系统等智能化测量领域,展现了强大的生命力。
与此同时,由数字电压表扩展而成的各种通用及专用数字化仪器,也把电量及非电量测量技术提高到了崭新的水平,因此,通过这次课程设计能让我们了解这些知识,为以后研究相关技术打下坚实的基础。
(2)系统功能要求:
简易数字电压表可以测量0~5V范围内的8路输入电压值,并在4位LED数码管上轮流显示或单路选择显示。
其测量最小分辨率位0.02V.
2.方案论证及方框图
(1)硬件设计方案及方框图:
数字电压表系统设计方框图
数字电压表测量电路是由A/D转换、数字处理及显示控制等组成。
A/D转换由集成芯片ADC0809电路完成。
ADC0809具有8路模拟输入端口,地址线(第23~25脚)可决定对哪一路模拟输入作A/D转换。
第22引脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。
第6引脚为测试控制,当输入一个2us宽电平脉冲时,就开始A/D转换。
第7引脚为A/D转换结束标志,当A/D转换结束时,第7引脚输出高电平。
第9引脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从端口输出。
第10引脚为ADC0809的时钟输入端,利用单片机第30引脚的六分频晶振频率,再通过14024二分频的得到1MHz的时钟。
单片机的P1/P3.0-P3.3端口作为4位LED数码管显示控制。
P3.5端口用作单路显示/循环显示转换按钮,P3.6端口用作单路显示时选择显示通道。
P0端口用作A/D转换数据输入,P2端口用作ADC0809的A/D转换控制。
(2)软件设计方案及方框图:
主程序流程图
系统刚上电时,初始化程序主要执行70H-77H内存单元清0和P2口置0等准备工作。
在刚上电时,系统默认为循环显示8个通道的电压值状态。
当进行一次测量后,将显示每一通道的A/D转换值,每个通道的数据显示时间在1S左右。
主程序在调用显示子程序与测试子程序之间循环。
A/D转换测试子程序流程图
A/D转换测量子程序用来控制对ADC0809的8路模拟输入电压的A/D转换,并将对应的数值移入70H~77H内存单元。
3.单元电路设计细则
(1)数码管显示器:
数码管的驱动方式的不同,可以分为静态式和动态式两类。
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
共阴极数码管及其接口电路
(2)单片机的晶振电路:
晶振是晶体振荡器的简称,在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率是串联谐振,较高的频率是并联谐振。
由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。
这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。
一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。
本设计采用12MHz晶振,并联两个30pF电容构成晶振电路。
(3)显示模块:
该模块为数字电压表的显示模块,主要由4位7端共阳LED数码管和PNP三极管构成的选通电路构成。
其中,我们需注意共阳数码管的数字0-9的编码,另外,每个位选管要与程序对应。
位选是通过单片机P3.0-P3.3口控制三极管的基极从而控制每位数码管的选通。
显示模块电路
(4)ADC0809模块:
1结构和转换原理
如图(3-15)所示为ADC0809的内部结构框图。
ADC0809由3部分组成:
8路模拟量选通开关、8位A/D转换器和三态输出数据锁存器。
ADC0809允许8路模拟信号输入,由8路模拟开关选通其中一路信号,模拟开关受通道地址锁存和译码电路的控制。
当地址锁存信号ALE有效时,3位地址C、B、A进入地
ADC0809的内部结构
ADC0809的引脚
地址锁存器,经译码后使8路模拟开关选通某一路信号。
8位A/D转换器为逐次逼近式,由256R电阻分压器、树状模拟开关(这两部分组成一个D/A变换器)、电压比较器、逐次逼近寄存器、逻辑控制和定时电路组成。
三态门输出锁存器用来保存A/D转换结果,当输出允许信号OE有效时,打开三态门,输出A/D转换结果。
因输出有三态门,便于与单片机总线连接。
2引脚功能
由引脚图(3-15)b所示,ADC0809共有28个引脚,
采用双列直插式封装。
ADC0809虽然有8路模拟
通道可以同时输入8路模拟信号,但每个瞬间只能
转换一路,各路之间的切换由软件变换通道地址来
实现。
其主要引脚功能如下所示。
IN0~IN7:
8路模拟量输入端。
D7~D0:
8位数字量输出端。
A、B、C:
3位地址输入线,用于选通8路模拟输入中的一路。
ALE:
地址锁存允许信号,输入,高电平有效。
START:
A/D转换启动信号,输入,高电平有效。
EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ。
REF(+)、REF(-):
基准电压。
Vcc:
电源,单一+5V。
GND:
地。
(5)通道选择及单路/循环模块:
该模块两个按键开关分别是控制单路/循环和通道选择的,当单路/循环按键未按下时,数码管上的通道位是循环显示通道,当该键按下时,数码管通道位显示的是某一路通道,看起来就像暂停一样,即单路测压。
另外一个按键通道选择按键,当你选择单路时,按一下通道选择键,数码管上的通道位显示的数字会加1,即通道移向下一位测压。
通道选择及单路/循环按键电路
4.调试及性能分析
(1)调试方法及步骤:
a.软件仿真调试:
首先将电路原理图用Proteus7.0仿真软件画出来,再用Keil单片机编程软件将数字电压表程序编写出来,通过Proteus7.0仿真软件中与Keil软件的联调功能,将编好的程序导入单片机中,在Proteus7.0中实现软件仿真。
b.实物调试:
将硬件电路都连接完好后,将单片机编号的数字电压表程序通过ISP程序烧入软件烧入到单片机中,用直流可调电压源给ADC0809的模拟输入端口通以不同电压值的电压,将数字电压表装置上的数码管上读出的电压值记录下来,与可调电压源上显示的标准值进行比较并分析。
实物调试数据:
数据误差分析:
a.绝对误差
任取三组进行分析:
1 4.23-4.2=0.02V
2 3.68-3.6=0.08V
3 3.18-3.2=-0.02V
由于我们用的可调直流电压源只能精确0.1V,所以实际上,我们的误差可以说已经可以忽略了,相当的小。
该数字电压表的设计的最高分辨率约为0.02V。
我们因为不知道标准电压值的小数点后第二位的数值,而无法估计误差,但从这些数据上看,足以证明我们的此次设计相当成功。
b.相对误差
根据相对误差=(测试值-标准值)/标准值x100%
在数据记录表中任取3组值进行分析:
1 (4.23-4.2)/4.2*100%=7.1%
2 (2.62-2.6)/2.6*100%=7.7%
3 (3.18-3.2)/3.2*100%=-6.3%
计算得的相对误差也相当小,充分说明了此电压表制作之成功。
(2)性能分析:
1 从记录表中可以看出简易电压表测得的值基本比标准表电压值偏大,这可以通过校正ADC0809的基准电压来解决。
因为该电压表设计时直接用5V的供电电源作为基准电压,所以电压可能有偏差。
2 ADC0809的直流输入阻抗为1MΩ,能满足常用的电压测试需要。
另外,经测试的ADC0809可直接在2MHz的时钟频率下工作,这样可省去二分频器14024集成块。
3 当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要计算程序的被除数进行调整就行了。
但量程越大,测量精度就会越低。
5.系统的电路原理图
6.电子元器件清单
序号
器件名称
型号、规格
单位
数量
单价
1
单片机
AT89S52
片
1
13
2
IC座
40脚
片
2
0.4
3
芯片
ADC0809
片
1
8
4
IC座
28脚
片
1
0.3
5
芯片
74LS244
片
1
2
6
IC座
20脚
片
1
0.2
7
芯片
14024
片
1
2.5
8
IC座
14脚
片
1
0.2
9
4联体数码管
共阳
个
1
4
10
晶振
12M
个
1
1
11
电容
30pf
个
2
0.1
12
电解电容
10uf
个
1
0.2
13
按键
个
2
0.2
14
电阻
10K
个
2
0.05
15
电阻
510
个
8
0.05
16
电阻
8.2K
个
1
0.05
17
电阻
4,.7K
个
4
0.05
18
三极管
9012
个
4
0.1
19
插针
个
10
0.05
20
导线
Φ0.4
米
6
0.5
21
焊锡
米
5
0.8
22
标签纸
片
1
23
帽钉
个
4
0.1
24
万能印刷电路板
中号
快
1
20
7.源程序清单
/*使用AT89C52单片机,12MHZ晶振,P0口读入AD值,P2口作AD控制,用共阳LED数码管
P1口输出段码,P3口扫描,最高位指示通道(0-7)。
*/
#include"reg52.h"//52系列单片机定义文件
#include"intrins.h"//调用_nop_();延时函数用
#definead_conP2//AD控制口
#defineaddataP0//AD数据计入读入口
#defineDisdataP1//显示数据段码输出口
#defineucharunsignedchar//无符号字符(8位)
#defineuintunsignedint//无符号整数(16位)
sbitALE=P2^3;//锁存地址控制位
sbitSTART=P2^4;//启动一次转换位
sbitOE=P2^5;//0809输出数据控制位
sbitkey1=P3^5;
sbitkey2=P3^6;
sbitEOC=P3^7;//转换结束标志位
sbitDISX=Disdata^7;//LED小数点
//
//
ucharcodedis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*共阳七段LED段码表"0""1""2""3""4""5""6""7""8""9""不亮"*/
ucharcodescan_con[4]={0xf7,0xfb,0xfd,0xfe};//四位列扫描控制字
uchardataad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义8个数据内存单元
uintdatadis[5]={0x00,0x00,0x00,0x00,0x00};//定义4个显示数据单元、1个数据暂存单元
//
//
/********1毫秒延时子函数**********/
delay1ms(uintt)
{
uinti,j;
for(i=0;ifor(j=0;j<120;j++)
;
}
//
//
/***********显示扫描子函数**********/
scan()
{
uchark,n;
inth;
dis[3]=0x00;//通道初值为0
for(n=0;n<8;n++)//每次显示8个数据
{
dis[2]=ad_data[n]/51;//测得值转换为三位BCD码,最大为5.00V
dis[4]=ad_data[n]%51;//余数暂存
dis[4]=dis[4]*10;//计算小数第一位
dis[1]=dis[4]/51;//
dis[4]=dis[4]%51;//
dis[4]=dis[4]*10;//计算小数第二位
dis[0]=dis[4]/51;//
for(h=0;h<500;h++)//每个通道值显示时间控制(约1秒)
{
for(k=0;k<4;k++)//四位LED扫描控制
{
Disdata=dis_7[dis[k]];
if(k==2){DISX=0;}
P3=scan_con[k];delay1ms
(1);P3=0xff;
}
}
dis[3]++;//通道值加1
}
}
//
//
/*******0809AD转换子函数***********/
test()
{
ucharm;
uchars=0x00;
ad_con=s;
for(m=0;m<8;m++)
{
ALE=1;_nop_();_nop_();ALE=0;//转换通道地址锁存
START=1;_nop_();_nop_();START=0;//开始转换命令
_nop_();_nop_();_nop_();_nop_();//延时4微秒
while(EOC==0);//等待转换结束
OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取AD值,地址加1
}
ad_con=0x00;//控制复位
}
//通道选择及单路/循环控制程序
td_dx()
{
ucharnum=1,flag=0;
uintad_data;
voiddelay(ucharms)//延时子函数
{
ucharj,i;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
voidkey_scan()
{
if(key1==0)
{
num=1;
}
while(key1==0);
}
if(key2==0)
{
delay(10);//消抖延时
if(key2==0)
{
num=2;
}
while(key2==0);
}
}
/**************主函数****************/
main()
{
P0=0xff;//初始化端口
P2=0x00;
P1=0xff;
P3=0xff;
while
(1)
{
td_dx();
scan();//依次显示8个通道值一次
test();//测量转换一次
}
}
//*********************结束**************************//
8.参考资料
[1] 新编MCS-51单片机应用设计 张毅刚编著 哈尔滨 哈尔滨工业大学出版社 2008.3
[2] 电子技术基础模拟部分 康华光主编 北京 高等教育出版社 2006.1
[3] 电子技术基础数字部分康华光主编北京高等教育出版社2006.1
[4] PROTELDXP电路设计与实例精解 黎文模,段晓峰编著 北京 人民邮电出版社 2006
[5]李科杰新编传感器技术手册[M]北京国防工业出版社,1995
[6]PROTELDXP电子电路设计精彩范例 林庭双等编著 北京 机械工业出版社 2005.6
[7]微型计算机原理及应用郑学坚,周斌编著北京清华大学出版社2001
[8]电路邱关源编著北京高等教育出版社1999
9.收获
选题时,因为暑期校电子竞赛培训期间,我已经做过了温度传感器,所以,我觉得要学到真东西,就要不断挑战新的东西,去钻研。
而且数字电压表采用8位A/D转换。
可能懂的人认为没什么大不了的,对于没有没有接触过A/D转换芯片的我,太不容易了。
我一心想做的完美些,加些难度,加些挑战。
这个设计的重点在于编程,通道选择和单路/循环程序更增加了设计难度。
为了尽量追求完美,我尝试了很多次编程,发现有时候在别人的程序中加入自己的程序也是有难度的。
调试程序时,我遇到了很多困难,例如:
参考文献错误的误导,调试环境的错误使用,硬件改装,程序本身不可预见的错误等。
经历了,写程序,调试,仿真,没有人告诉你错在那里,没有人告诉你该怎么做,我在走没人可借见的路,坎坷充满荆棘的路。
那短日子真的是难熬啊,几乎每时每刻都在想办法。
有空就在纸上写画着,最后,再历经多次调试后成功了,我高兴的大喊大叫起来,真的太难了,大家也很为我高兴,做好一件事真的不容易!
在以后的学习中我会更加努力的学习理论知识,在理论的基础上加强实践,达到理论与实践的更好结合。
在这次的设计中也让我明白了一个道理,只有多加练习运用才会真正的吸收知识,使之成为自己的东西。
单片机这种东西不是在理论中练出高手的,而是实践。
光写程序也不行,你必须把它和硬件电路联系起来,不断的调试,不断地改程序,调试,再改程序,在调试,在经历无数次的修改之后,你会发现你的程序是多么的完美,越来越完美!
那种成就感不言而喻,也正是这种头疼的过程后绽放的美丽让你越来越痴迷上它了。
单片机技术也在这种无形之中被你慢慢掌握甚至到达精通!
这种魅力太精彩了!
这也许就是为什么有时看程序看到头疼你还不由自主的坚持着的原因吧!
因为你已经爱上它了。