基于C51单片机数字电压表的设计及仿真解读.docx
《基于C51单片机数字电压表的设计及仿真解读.docx》由会员分享,可在线阅读,更多相关《基于C51单片机数字电压表的设计及仿真解读.docx(21页珍藏版)》请在冰豆网上搜索。
基于C51单片机数字电压表的设计及仿真解读
学科代码:
07120100
学号:
************
师范大学(本科)
毕业论文
题目:
基于C51单片机数字电压表设计及仿真
学院:
专业:
电子信息科学与技术
年级:
2010级
姓名:
指导老师:
老师(副教授)
完成时间:
2010年04月15日
摘要:
本论文讲述了基于C51单片机的数字电压表的设计及仿真,设计主要由三个部分组成:
单片机(AT89C51)、LED显示模块、A/D转换器。
A/D转换主要由芯片ADC0808来完成,作用是把电压的模拟量转换为相应的数字量并传送到数据处理模块。
数据处理则由芯片AT89C51来完成,其负责把ADC0808传送来的数字量经过一定的处理,产生相应的显示代码驱动显示模块进行显示;另外,它还控制着ADC0808芯片工作。
该系统的数字电压表电路简洁明了,所涉及到的元件较少,成本低,而测量精度和可靠性较高。
该数字电压表可以测量0-5V的1路模拟直流输入电压值,并通过一个4位一体的7段数码管显示出来。
关键词AT89C51;ADC0808;LED数码显示管;数字电压表
Abstract:
ThisessaywhichintroducesakindofsimpledigitalvoltmeterisbasedonC51single-chipmicrocontrollerdesignandsimulation.Thecircuitofthevoltagemeterismainlycontainingthreeparts:
dataprocessor(AT89C51)、LEDdisplay、A/Dconvertingmouldpiece,A/DconvertingismainlycompletedbytheADC0808,itconvertstheanalogdataintothedigitaldataandtransmitstheoutcometothedataprocessor(C51).DataprocessingismainlycompletedbytheAT89C51chip,itprocessesthedataproducedbytheADC0808chipandgeneratestherightmanifestationcodes,。
meanwhile,transmitsthecodestothemanifestationcontrollingmouldpiece.Also,theAT89C51chipcontrolstheADC0808chiptowork.Thevoltmeterismadeofsimpleelectricalcircuit,loweruseofelements,lowcost,butitsmeasuringprecisionandreliability.Thevoltmeteriscapableofmeasuringvoltageinputsfrom1routerangingfrom0to5volt,anddisplayingthemeasurementsthoughadigitalcodetubeof7piecesofLED.
KeywordsAT89C51;ADC0808;LEDdigitaldisplaytube;digitalvoltmeter
引言
电压、电流和频率是最基本的三个被测电量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。
由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等优点而泛应用到实际生活中。
传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。
采用单片机的数字电压表,将连续的模拟量转换离散的数字形式并加以显示。
数字电压表是诸多数字化仪表的核心与基础。
以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。
目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。
数字电压表问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC),另一方面,精度较以前有所提高
目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。
本文是以简易数字直流电压表的设计仿真为研究内容,系统主要包括三大模块:
转换模块、数据处理模块、显示模块。
其中,A/D转换采用ADC0808,对输入的模拟电压信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动显示装置LED来显示数字电压信号。
1设计方案
1.1设计需求
1、以AT89C51单片机为核心器件,组成一个简单的直流数字电压表。
2、采用1路模拟量输入,能够测量0--+5V之间的直流电压值。
3、电压显示用4位一体的LED数码管显示,至少能够显示两位小数。
1.2设计思路
1、根据设计要求,选择AT89C51单片机为核心控制器件。
2、A/D转换采用ADC0808实现,输出端口与单片机的接口为P1口,时钟等端口与P2口的低四位引脚相连。
3、数字电压显示采用4位一体的7段LED数码管。
4、LED数码的段码输入,由并行端口P0产生:
位码输入,用并行端口P3低四位产生。
1.3系统组成
硬件电路设计由3个部分组成:
A/D转换电路,AT89C51单片机系统,LED显示系统。
硬件电路设计框图如图所示:
数字电压表系统硬件设计框图
2硬件电路
2.1A/D转换器
能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为逐次逼近型,双重积分型等等。
双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点。
与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0809、ADC0808等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送到单片机进行分析和显示。
一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用。
2.1.1逐次逼近型A/D转换器原理
逐次逼近型A/D转换器是由一个比较器、A/D转换器、存储器及控制电路组成。
它利用内部的寄存器从高位到低位一次开始逐位试探比较。
转换过程如下:
开始时,寄存器各位清零,转换时,先将最高位置1,把数据送入A/D转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量。
其原理框图如图2所示:
逐次逼近式A/D转换器原理
2.1.2ADC0808的主要性能
ADC0808是CMOS单片型逐次逼近式A/D转换器,带有使能控制端,与微机直接接口,片内带有锁存功能的8路模拟多路开关,可以对8路0-5V输入模拟电压信号分时进行转换,由于ADC0808设计时考虑到若干种模/数变换技术的长处,所以该芯片非常适应于过程控制,微控制器输入通道的接口电路,智能仪器和机床控制等领域。
ADC0808主要特性:
它有8路模拟开关、地址锁存、译码器、8位A/D转换器以及三态输出锁存器组成。
0808芯片可以处理8路模拟输入信号而不是1路,许多可以和微机接口的A/D转换器芯片都有这种特性。
为了区分是对哪一路输入信号进行A/D转换,了;由3个通道地址信号ADDA、ADDB和ADDC来决定是哪一路模拟信号被选中并送到内部的A/D转换器去转换。
输出位8位数字量D7-D0.
2.1.3ADC0808的外部脚
ADC0808芯片有28条引脚,采用双列直插式封装,其引脚图如下图所示:
ADC0808引脚图
IN0-IN7(8条):
8路模拟量输入线,用于输入和控制被转换的模拟量。
ALE:
地址锁存信号。
高电平有效是把3个通道地址信号送入地址锁存器,并经译码器得到地址输出,以选择相应的模拟输入通道。
EOC:
转换结束信号,是芯片的输入信号。
转换一开始,EOC信号变低,转换结束时,EOC返回高电平。
这个信号可以作为A/D转换器的状态信号来查询,也可以直接做中断申请信号。
OE:
输出控制信号,高电平输入有效时,打开输出缓冲器。
CLOCK:
时钟信号,最高允许值位640KHZ.
VREF(+)和VVREF(-):
都是A/D转换器的参考电压。
START:
START为“启动脉冲”输入法,该线上正脉冲由CPU送来,宽度应大于100ns,上升沿清零SAR,下降沿启动ADC工作。
2.1.4ADC0808的内部结构、工作原理及时序图
ADC0808由8路模拟通道选择开关,地址锁存与译码器,比较器,8位开关树型A/D转换器,逐次逼近型寄存器,定时和控制电路和三态输出锁存器等组成,其内部结构如图4所示。
ADC0808的内部结构
(1)8路模拟通道选择开关实现从8路输入模拟量中选择一路送给后面的比较器进行比较。
(2)地址锁存与译码器用于当ALE信号有效时,锁存从ADDA、ADDB、ADDC3根地址线上送来的3位地址,译码后产生通道选择信号,从8路模拟通道中选择当前模拟通道。
(3)比较器,8位开关树型A/D转换器,逐次逼近型寄存器,定时和控制电路组成8位A/D转换器,当START信号有效时,就开始对当前通道的模拟信号进行转换,转换完成后,把转换得到的数字量送到8位三态锁存器,同时通过引脚送出转换结束信号。
(4)三态输出锁存器保存当前模拟通道转换得到的数字量,当OE信号有效时,把转换的结果送出。
ADC0808的工作原理:
1、输入3位地址,并使ALE=1,将地址存入地址锁存器中,经地址译码器从8路模拟通道中选通1路模拟量送给比较器。
2、送START一高脉冲,START的上升沿使逐次寄存器复位,下降沿启动A/D转换,并使EOC信号为低电平。
3、当转换结束时,转换的结果送入到输出三态锁存器中,并使EOC信号回到高电平,通知CPU已转换结束。
4、当CPU执行一读数据指令时,使OE为高电平,则从输出端D0-D7读出数据。
2.2单片机最小系统
2.2.1单片机的介绍
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.2.2AT89C51的引脚功能
AT89C51提供以下标准功能:
4KB的Flash闪速存储器,128B内部RAM,32个I/O口线,2*16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路。
引脚配置如下图所示:
AT89C51的引脚图
VSS:
接地端。
VCC:
电源端。
P0.0-P0.7:
通道0,双向I/O口。
第二功能是在访问外部存储器时可分时用作低8位地址线和8位数据线,在编程和检验是,用于数据的输入和输出。
P1.0-P1.7:
通道1,双向I/O口,在编程和检验是,用于接收地位地址字节。
P2.0-P2.7:
通道2,双向I/O口,在第二功能是在访问外部存储器时,输出高8位地址,在编程和检验时,用做高位地址字节和控制信号。
P3.0-3.7:
双向I/O口,每条线都有自己的功能。
详见下表:
表2P3口各位的第二功能
P3口各位
第二功能
P3.0
RTD(串行口输出)
P3.1
TXD(串行口输入)
P3.2
(外部中断0输入)
P3.3
(外部中断1输入)
P3.4
T0(定时器/计数器0的外部输入)
P3.5
T1(定时器/计数器1的外部输入)
P3.6
(片外数据存储器写信号)
P3.7
(片外数据存储器读信号)
ALE:
地址锁存允许线,在访问外部存储器是,用来锁存P0口送出的低8位地址信号。
在不访问外部存储器是,ALE也震荡频率的六分之一的固定速率输出,此时,它可用做外部时钟和外不定时。
但若要访问外部存储器,则ALE不是连续周期脉冲,无法用做时钟信号。
:
片外存储器访问选择线,可以控制89C51使用片内ROM或使用片外ROM,
若
=1,则允许使用片内ROM,若
=0,则只使用片外ROM。
PSEN:
片外ROM的选通线,在访问片外ROM时,89C51自动在PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。
RST:
复位线,可以使89C51处于复位(即初始化)工作状态。
通常89C51复位有自动上电复位和人工按键复位两种。
XTAL1和XTAL2:
片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。
2.3LED显示系统
2.3.1LED的基本结构
LED显示器是由若干个发光二极管组成显示字段的显示器件。
在单片机中使用最多的是七段数码显示器。
LED七段数码显示器由8个发光二极管组成显示字段,其中7个长条形的发光二极管排列成“日”字形,另一个圆点形的发光二极管在显示器的右下角作为显示小数点用,其通过不同的组合可用来显示各种数字。
LED引脚排列如下图所示:
LED引脚排列
2.3.2LED显示器的选择
4-LED显示器引脚如图9所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端:
4位LED引脚
2.3.3LED的译码方式
译码方式是指由显示字符转换得到对应的字段码的方式,对于LED数码管显示器,通常的译码方式有硬件译码和软件译码方式两种。
本设计系统中为了简化硬件线路设计,LED译码采用软件编程来实现。
由于本设计采用的是共阴极LED,其对应的字符和字段码如下图所示:
2.3.4LED与C51的接口设计
由于单片机的并行口不能直接驱动LED显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作。
如果驱动电路能力差,显示器亮度就低,而且驱动电路长期在超负荷下运行容易损坏,因此,LED显示器的驱动电路设计是一个非常重要的问题。
为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LED的A-G段显示引脚和DP小数点显示引脚并联到P0口与上拉电阻之间,这样,就可以加大P0口作为输出口的驱动能力,使得LED能按照正常的亮度显示出数字。
2.4复位电路和时钟电路
2.4.1复位电路
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。
MCS-51单片机有一个复位引脚RST,采用施密特触发输入。
当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。
复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。
单片机的复位方式有上电自动复位和手动复位两种,下图是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作。
2.4.2时钟电路
在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。
在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路,通常电容一般取30pF,晶振的频率取值在1.2MHz~12MHz之间。
晶体振荡器的振荡信号从XTAL2端送入内部时钟电路,它将该振荡信号二分频,产生一个两相时钟信号P1和P2供单片机使用。
时钟信号的周期称为状态时间S,它是振荡周期的2倍,P1信号在每个状态的前半周期有效,在每个状态的后半周期P2信号有效。
CPU就是以两相时钟P1和P2为基本节拍协调单片机各部分有效工作的。
如图所示:
时钟电路
2.5总电路硬件图
经过以上的设计过程,整合可得出基于单片机的简易数字直流电压表硬件电路原理图。
如图所示:
简易数字电压表电路图
3程序设计
3.1程序设计方案
根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图12所示。
数字式直流电压表主程序框图
3.2系统子程序设计
3.2.1子程序初始化
所谓初始化,是对将要用到的AT89C51单片机内部部件或扩展芯片进行初始工作状态设定,主要是设置定时器的工作模式,初值预置,开中断和打开定时器等。
3.2.2A/D转化子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图13所示。
A/D转换流程图
4仿真
4.1软件调试
软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。
本系统的调试主要用到keil和protues软件。
其中,系统电路图的绘制和仿真采用的是Proteus软件,而C语言程序用Keil软件调试并把程序写入单片机。
程序调试:
硬件仿真:
4.2仿真结果
仿真结果有三种情况:
当滑动变阻器短路时,数字电压表没有读数显示;滑动变阻器滑片处于正中央,在理想情况下电压表的读数是2.5;当滑动变阻器全部接入电路中,理想情况下电压表的读数是5.
滑动变阻器短路时
滑动变阻器滑片处于中间
滑动变阻器滑到最大端
参考文献
[1]单片机原理及接口技术.机械工业出版社,胡健,2004年10月.
[2]单片微型计算机(第三版).北京邮电大学出版社。
徐惠民、安德宁、丁玉珍编著.
[3]单片机原理与程序设计实验教程.西安电子科技大学出版社,于殿泓、王新年,2007年5月.
[4]单片机原理与应用及C51程序设计实例.电子工业出版社,谢维成、杨加国,2006年3月.
[5]魏立峰.单片机原理及应用技术.北京大学出版社,魏立峰.
[6]Protues在MCS-51&ARM7系统中的应用百例(第一版)。
电子工业出版社,周润景.
[7]计算机接口技术,清华大学出版社,赵松主编.
致谢辞
经过最近一段时间的努力,基于C51单片机的简易数字电压表设计及仿真毕业论文基本完成。
系统功能、指标基本达到了设计预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。
通过本次设计,我对单片机这门课有了进一步的了解。
无论是在硬件连接方面还是在软件编程方面。
本次设计采用了AT89C51单片机芯片,这让我对其认识及了解更深刻,特别是其端口功能和用途。
设计中还用到了模/数转换芯片ADC0808,以前在学单片机课程时只是对其理论知识有了初步的理解。
通过这次设计,对它的工作原理有了更深的理解。
但是本次论文还是存在不足,比如在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
此外,在电路的设计上存在缺陷,例如应该在在滑动变阻器上应该加一个数子电压表,以便和最后LED显示的结果作对比来验证是否正确和误差分析。
总之本次电路的设计和仿真,基本上达到了设计的功能要求。
这期间,感谢一路来支持我的老师和同学,特别感谢我的导师肖老师一路来对我的悉心帮助和讲解。
在以后的实践中,我将继续努力学习与AT89C51相关的理论知识,并理论联系实际,争取在以后设计方面能有所进展。
附录
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitST=P2^0; //启动转换位
sbitOE=P2^2; //输出允许位
sbitALE=P2^3; //地址允许锁存位
sbitEOC=P2^1; //转换结束位
sbitCLK=P2^4; //时钟
longintdatas,bai,she,ge;
ucharduan;
ucharcodenum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//不带点的数字
ucharcodenum_dot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed}; //带点的数字
ucharcodewei[]={0x0d,0x0b,0x07}; //位码
voiddelay(uintz)
{
uchari;
while(z--)
for(i=0;i<120;i++);
}
voiddisplay()
{
uchari=0;
bai=(datas*500/255)/100;//计算并得到最高位
she=(datas*500/255)/10%10;//计算并得到中间位
ge=(datas*500/255)%10;//计算并得到最低位
for(i=0;i<3;i++)
{
P3=wei[i];
if(i==0){duan=num_dot[bai];}
elseif(i==1){duan=num[she];}
elseif(i==2){duan=num[ge];}
P0=duan;
delay
(2);
}
}
voidmain()
{
TMOD=0x02; //定义T0,工作方式2
TH0=0x216; //TH0初值
TL0=0x216; //TH1初值
EA=1; //打开总中断
ET0=1; //打开TO中断允许位
TR0=1; //打开T0
while
(1)
{
ST=OE=0; //将START和EO先置0
ALE=1; //将ALE和ST置1拉高电平
ST=1;
ALE=0;//将ALE和START置0开始数据变换
ST=0;
while(!
EOC); /