课程设计数字电压表.docx
《课程设计数字电压表.docx》由会员分享,可在线阅读,更多相关《课程设计数字电压表.docx(15页珍藏版)》请在冰豆网上搜索。
![课程设计数字电压表.docx](https://file1.bdocx.com/fileroot1/2023-1/31/2b6a8135-4854-472a-9df2-260e259636e2/2b6a8135-4854-472a-9df2-260e259636e21.gif)
课程设计数字电压表
目录
0.前言1
1.简易数字电压表的基本理论1
2.方案设计2
3.硬件电路的工作原理2
3.1ADC08082
3.2单片机最小系统3
3.2.1复位电路4
3.2.2时钟电路5
3.3LED显示电路5
4.软件编程6
4.1主程序6
4.2初始化程序7
4.3A/D转换子程序7
4.4显示子程序7
5.系统调试和结果分析7
6.结论及进一步设想8
参考文献9
附录1元件清单10
课设体会11
简易数字电压表
摘要:
本文介绍的是数字电压表的发展背景,并且基于单片机设计一个简易数字电压表,能够测量0~5V的直流电压,并且通过四位数码管显示。
使用元件比较少,运用单片机STC89C51、A/D转换器ADC0809和数码管。
ADC0809采集连续模拟量(直流输入电压),将其转换成离散的数字形式。
数字量输入到单片机STC89C52中加以处理,并且通过LED显示出来,从而实现电压的测量与显示。
关键词:
ADC0809;STC89C52;电压测量
0.前言
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。
数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC化),另一方面,精度也从0.01%-0.005%。
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
1.简易数字电压表的基本理论
根据设计要求选用高精度A/D转换器ADC0809进行数据转换,针对ADC0809对模拟输入信号的要求,对输入信号进行量程转换并进行调理。
通过单片机STC89C52和A/D转换器ADC0809完成数据转换及传输,是系统的核心内容。
阐述了ADC0809工作原理并对A/D转换电路、参考电压电路、复位电路、时钟电路等电路进行具体设计。
本设计从各个角度分析了由单片机组成的数字电压表的设计过程及各部分电路的组成及其原理,并且分析了程序如何驱动单片机进而使系统运行起来的原理及方法。
软件的设计包括了对主程序、模数转换程序和显示程序的设计,给出了程序流程图。
最后根据软硬件设计方案对系统进行了调试。
2.方案设计
简易数字电压表电路的基本组成如图1所示。
图1简易数字电压表电路的原理框图
根据设计要求,采用的方案如下。
硬件部分实现采集模拟电压,转换为数字量,并且显示功能,包括信号采集转换模块、显示模块;软件部分实现将8位二进制数转化为十进制数并且在数码管上显示出来。
主要设计思想是选择AT89C51单片机为核心控制器件,A/D转换采用ADC0809实现,与单片机的接口为P0口和P2口的低四位引脚,电压显示采用4位的LED数码管,LED数码的段选输入,由并行端口P1产生;位选输入,用并行端口P2高四位产生。
3.硬件电路的工作原理
3.1ADC0808
现实世界的物理量很多都是模拟量,能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为计数比较型,逐次逼近型,双重积分型等等。
双积分式A/D转换。
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
ADC0808芯片有28条引脚,采用双列直插式封装。
因为在Proteus软件中ADC0809无法仿真,所以使用功能相近的ADC0808代替,其引脚图如图1所示。
图2ADC0808
下面说明各个引脚功能:
IN0-IN7(8条):
8路模拟量输入线,用于输入和控制被转换的模拟电压。
地址输入控制(4条):
ALE:
地址锁存允许输入线,高电平有效,当ALE为高电平时,为地址输入线,用于选择IN0-IN7上那一条模拟电压送给比较器进行A/D转换。
ADDA,ADDB,ADDC:
3位地址输入线,用于选择8路模拟输入中的一路。
START:
START为“启动脉冲”输入法,该线上正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。
EOC:
EOC为转换结束输出线,该线上高电平表示A/D转换已结束,数字量已锁入三态输出锁存器。
3.2单片机最小系统
STC89C52系列单片机的复位电路的极性电容C1直接影响单片机的复位时间,一般采用10-30uF,单片机最小系统容值越大需要的复位时间越短。
89C52单片机的晶振X1可以采用6MHz或者11.0592MHz,在正常工作的情况下可以采用更高频率的晶振,52单片机的晶振振荡频率直接影响单片机的处理速度,频率越大处理越快。
52单片机系统的起振电容C2、C3一般采用15-33pF,并且电容离晶振越近越好,晶振离单片机越近越好。
P0口作为输出口时需要上拉电阻,阻值一般为10K。
其他接口内部有上拉电阻,作为输出口不需要外加上拉电阻。
最小系统包含晶振电路、复位电路、电源电路。
74HC573锁存器:
主要用于对数码管、按键的控制,这里只用到了数据锁存的功能,当输入的数据传输完毕,在输出端仍然保持数据。
保证了投入硬币后能让显示的数字保存一段时间,同时也完成了对硬币数量的累加功能。
在LED和数码管显示方面,要维持一个数据的显示,往往要持续的快速的刷新。
尤其是在四段八位数码管等这些要选通的显示设备上。
在人类能够接受的刷新频率之内,大概每三十毫秒就要刷新一次。
这就大大占用了处理器的处理时间,消耗了处理器的处理能力,还浪费了处理器的功耗。
锁存器的使用可以大大的缓解处理器在这方面的压力。
当处理器把数据传输到锁存器并将其锁存后,锁存器的输出引脚便会一直保持数据状态直到下一次锁存新的数据为止。
这样在数码管的显示内容不变之前,处理器的处理时间和IO引脚便可以释放。
可以看出处理器处理的时间仅限于显示内容发生变化的时候,这在整个显示时间上只是非常少的一个部分。
而处理器在处理完后可以有更多的时间来执行其他的任务。
这就是锁存器在LED和数码管显示方面的作用:
节省了宝贵的MCU时间。
图3单片机最小系统
3.2.1复位电路
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。
MCS-51单片机有一个复位引脚RST,采用施密特触发输入。
当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位[1]。
复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。
单片机的复位方式有上电自动复位和手动复位两种,是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作。
图4复位电路
3.2.2时钟电路
单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。
CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。
MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简单,只需要一个晶振和2个电容即可。
图5时钟电路
3.3LED显示电路
动态显示驱动:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
图6LED数码管电路
4.软件编程
根据设计方案,应用Proteus软件进行了模拟仿真,设计的主要思想是模块化,总体分为主程序模块、数据采集模块、数据显示模块。
程序通过主程序调用子程序来完成所需要的各种功能。
主程序流程如图所示。
4.1主程序
图7主程序框图
4.2初始化程序
所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。
4.3A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图所示。
否
是
图8A/D转换子电路框图
4.4显示子程序
显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得LED显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,就能够产生比较好的显示效果。
5.系统调试和结果分析
根据方案设计结果,进行了设计电路的实际联接。
图中左侧的是Proteus中提供的电压表,用来验证仿真结果,并且进行对比。
仿真结果如下:
图9仿真结果
仿真说明本设计还存在误差,但是误差较小,基本满足需要。
结果可采用图形、表格等形式给出,通过分析实验结果,得到结论。
应详细说明分析的过程。
表1测试数据表
Proteus中提供的电压表值
本设计的电压表测试值
+1.10
1.098
+1.80
1.803
+2.50
2.490
+3.70
3.705
+5.00
5.000
6.结论及进一步设想
由上所述,本次设计是一个简易数字电压表,基本完成了课程设计的任务要求,通过软件仿真验证了正确性,达到了要求。
但设计中的不足之处仍然存在。
这次设计是我第一次设计电路,Proteus实现了仿真,并且焊接电路。
在这过程中,我对电路设计,单片机的使用等都有了新的认识。
通过这次设计学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。
在实际应用工作应能好,测量电压准确,精度高。
系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。
本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
通过本次设计,我对单片机这门课有了进一步的了解。
无论是在硬件连接方面还是在软件编程方面。
本次设计采用了AT89C51单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。
设计中还用到了模/数转换芯片ADC0808,以前在学单片机课程时只是对其理论知识有了初步的理解。
通过这次设计,对它的工作原理有了更深的理解。
在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
总之这次电路的设计和仿真,基本上达到了设计的功能要求。
在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。
参考文献
[1]刘复华.单片机及其应用系统.北京:
清华大学出版社,1992
[2]黄红霞.基于电涡流传感器的硬币识别研究.湖北理工学院学报,2012,28(5)
[3]杨立业.简单程序实现数码管的动态显示.燕山大学学报2010,19(4)
[4]薛邵武.单片机在投币电话中的应用.电子技术,1996,9(4):
13-15
[5]田磊.公交投币系统的设计.安徽建筑工业学院毕业设计,2010,6(7)
附录1元件清单
元件名称
型号
数量
单片机
STC89C52
1
A/D转换器
ADC0809
1
数码管
7SEGMPX4CC
1
电阻
10K
2
电容
1nF
2
极性电容
1.0uF
1
按钮
1
排电阻
1
电位器
1
课设体会
在这次的智能仪器课程设计中,通过教材、图书馆查阅资料、上网查阅资料等方式,了解单片机的工作原理、设计方法、程序的编写和调试,并且用Proteus软件进行仿真。
在数字显示模块,将以前数字电路所学的知识应用其中,从各个方面用所学知识和新学到的知识综合运用,从而解决各个问题。
并且在仿真中,通过不懈的调试,终于将电路仿真结果实现了。
在这一阶段的课程设计中,我对以前所学的知识了解有了加深,将数字电路的知识和单片机的知识有机的结合起来,并且应用于实际当中,完成了课设的任务。
在本次课程设计中,我了解到完成一个设计任务,可以通过分块设计的方式实现,这样既提高了效率,还减小了设计的难度,方便更改、调试。
当需要实现完整的功能时,在组合起来,完成所要求的任务。
在这次课程设计中,通过不同的电路组合、同样的电路不同的程序就能实现不能的功能。
在这种实践中,真正用自己所学的知识来解决各种问题,更加锻炼了自己动手能力。
从拿到设计的题目开始,分析,构思,整理,选用器件,模块设计,一步一步,都碰到很多的困难。
在碰到困难时学会耐心思考,用自己的能力,尽力自己解决问题。
在仿真的过程中,自己连接电路图以及编写程序,这都使我受益匪浅,我对Keil,Proteus等软件的运用更加纯熟,寻找各种元件也更快更准,完成仿真也更加快速准确,并且对如何测量数据也有了一定的了解。
单片机能实现的功能真的很强大,博大精深,课程设计中学到了很多平时没有学到的东西,并且应用到了实际应用中,这次课程设计给了我一个很好的学习、实践的机会。
为将来的毕业设计做了一个很好的铺垫,加深我对单片机的认识和使用,提高了实际操作的能力。
在这个过程中,课程设计能够顺利完成,得到了很多同学直接或者间接的帮助。
我考虑设计方案、芯片的选择、数据采集及程序的调试都有同学对我进行帮助。
同时我也得到了冯志刚老师的帮助和悉心教导,帮我理清设计思路、扫清障碍、提供传感器。
刘老师严谨的态度和耐心的教导,给我很深的印象。
再此我要进行感谢,感谢他们无私的帮助使我学习到了更多的知识,以及解决问题的办法。
从最开始的方案设计阶段到软件仿真阶段,再到最后的开发板操作阶段,都很难是一个人的智慧和能力所能成功完成的,除了自己的努力外,还有他人的努力。
这让我更加认识到了,同伴的重要性以及团队配合的力量。
做了很多努力,最终才能取得成功,顺利完成了设计项目。
所有的付出,都是有回报的。
这两周的智能仪器课程设计既是在学习,也是在实践,真的很有意义,让我受益匪浅。
[2014年1月10日完成]
//---------------------------------------
//AD0809byyyw
#include"reg51.h"
sbitST_ALE=P3^0;
sbitEOC=P3^1;//EOCconnecttoP3.1
sbitOE=P3^2;//OEconecttoP3.2
sbitCLK=P3^3;//CLKconnecttoP3.3时钟脉冲输入端。
要求时钟频率不高于640KHZ。
unsignedcharCHANNEL;//ADchannelvariable
unsignedcharLED[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极
unsignedcharCHECK[4]={0xEF,0xDF,0xBF,0x7F};//chooseLEDchannel
voiddisplay()
{
unsignedlongtemp;//长形
unsignedcharDATA,digit[4];//字符型
unsignedintk,l;//int型
DATA=P0;//saveADdata
temp=DATA;//thetemporaryvariable
temp=temp*1000/51;//ADformula:
D=A*5/255
digit[0]=temp/1000;//thethousandsplace
digit[1]=temp%1000/100;//thehundredsplace
digit[2]=temp%1000%100/10;//thetensplace
digit[3]=temp%1000%100%10;//theonesplace
DATA=P2;//saveP2
for(k=0;k<1000;k++)
{
for(l=0;l<4;l++)
{
P2=P2|0xF0;//avoidLEDresidual按位或
P1=LED[digit[l]]+0x80*(l==0);//LEDcode
P2=DATA&CHECK[l];//chooseLEDchannel按位与
}
}
P2=DATA;//restoreP2
}
voidmain()
{
CHANNEL=0xF8;//ADchannel0
ST_ALE=0;//STARTandALEdefault
OE=0;//OEdefault
TMOD=0x02;//T0operateinmode2
TH0=0xFF;//autoloadvalue16
TL0=0xFF;//defaultvalue
EA=1;//allinterruptenable
ET0=1;//T0interruptenableET0=1允许T0中断
TR0=1;//T0runwhile
(1)
{
P2=CHANNEL;//chooseADchannel
ST_ALE=1;//locktheADchanneladdress
ST_ALE=0;//ADrun
while(EOC==0);//waituntilADover
OE=1;//enabletotransmitADdata
display();//viewtheADresultanddiaplayLED
OE=0;//forbittotransmitADdata
if(CHANNEL==0xFF)
CHANNEL=0xF7;//ADchannelloop
CHANNEL++;//nextADchannel
}
}
voidT1_TIME()interrupt1using0
{
CLK=~CLK;//CLK500kHz按位取反
}