简易数字电压表单片机课程设计.docx
《简易数字电压表单片机课程设计.docx》由会员分享,可在线阅读,更多相关《简易数字电压表单片机课程设计.docx(29页珍藏版)》请在冰豆网上搜索。
![简易数字电压表单片机课程设计.docx](https://file1.bdocx.com/fileroot1/2022-11/30/495140b7-e12f-4c37-88ce-d1ad1f387529/495140b7-e12f-4c37-88ce-d1ad1f3875291.gif)
简易数字电压表单片机课程设计
课程设计说明书
简易数字电压表的设计
院(系)
专业机械电子工程
班级二班
学生姓名
指导老师
2015年3月13日
课程设计任务书
兹发给机械电子工程
(2)班学生课程设计任务书,内容如下:
1.设计题目:
简易数字电压表的设计
2.应完成的项目:
(1)可测0~5V的8路电压输入值;
(2)在LED数码管上轮流显示;
(3)单路选择显示;
(4)利用功能键可以实现滚动显示,显示启动/停止等;
3.参考资料以及说明:
[1]刘瑞新.单片机原理及应用教程[M].北京:
机械工业出版社,2003.7
[2]张俊,钟知原,王日根.简易数字电压表的设计[J].科协论坛:
下半月,2012(8)34-35
[3]赵静,刘少聪,丁浩.王莉莎.基于单片机的数字电压表的设计[J].数字技术与应用,2011(6):
121-125
[4]魏立峰.单片机原理及应用技术[M].北京大学出版社,2005年
[5]谭浩强.C语言程序设计(第二版)[M].北京:
清华大学出版社,2005.12
[6]蔡美琴.MCS-51系列单片机系统及其应用[M].北京:
高等教育出版社,2004.4
4.本设计任务书于2015年3月2日发出,应于2015年3月13日前完成,然后进行答辩。
专业教研室、研究所负责人审核年月日
指导教师签发年月日
课程设计评语:
课程设计总评成绩:
课程设计答辩负责人签字:
年月日
摘要
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。
而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。
数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
采用单片机的数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC进行实时通信。
目前,由各种单片A/D转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力。
本实验设计主要讲述了数字电压表的设计过程,主要包括硬件设计和程序设计,硬件主要包括以STC89C51单片机为主要控制电路、数据采样电路、显示电路等,是基于51单片机开发平台实现的一种数字电压表系统。
该设计采用STC89C51单片机作为控制核心,驱动控制四块数码管显示被测电压,以ADC0809为模数转换数据采样,实现被测电压的数据采样,使得该数字电压表能够测量0-5V之间的直流电压值。
关键词:
STC89C51、ADC0809、显示电路、数据采样
第一章设计总体方案
1.1设计任务
利用单片机AT89C51与ADC0809设计制作一个数字电压表,能够测量直流电压值。
(1)可测0~5V的8路输入电压值;
(2)在LED数码管上轮流显示;
(3)单路选择显示
1.2设计要求
A.系统硬件设计
(1)单片机采用MCS51系列
(2)A/D转换器0809
(3)键盘为4×4行列式键盘,按键设有10个数字键0……9,和5个功能键依次是:
各通道轮流显示键、单通道显示键、向左滚动显示键、显示启动/停止键、回车键。
(4)有4位LED管,左边1位用于指示显示通道,右边3位显示电压值。
B.系统软件设计
(1)键盘管理程序(包括键扫描、键处理程序)。
(2)LED动态显示程序,包括:
(3)各通道轮流显示,共显示8个通道,每通道显示1s;
(4)单通道显示,仅显示指定通道电压,并保持到其他功能键按下。
第二章芯片功能简介
2.1STC89C51单片机简介
STC89C51单片机学习板是一款基于8位单片机处理芯片STC89C52RC的系统。
其功能强大,可以实现单片机开发的多种要求,学习、开发者可以根据需要选配多种常用模块,达到实验及教学的目的。
89C51单片机学习板功能强大,具有报警,跑马灯、串行通信(max232)、段码液晶(msm0801LCD)和字符液晶显示(LCD1602)、电机控制(L298)、A/D转换(TLC2543)、D/A转换(TLC5615)、温度采集(DS18B20)、数字信号合成(AD9851)、实时时钟电路(DS1302)、4—20mA输出、PWM输出(UC3842)、红外检测(KSM-603LM)控制等十七种功能,供学习者学习开发使用。
如图2-1所示外观图。
图2-1STC89C51芯片
2.1.1主要性能特点
1、4kBytesFlash片内程序存储器;
2、128bytes的随机存取数据存储器(RAM);
3、32个外部双向输入/输出(I/O)口;
4、2个中断优先级、2层中断嵌套中断;
5、6个中断源;
6、2个16位可编程定时器/计数器;
7、2个全双工串行通信口;
8、看门狗(WDT)电路;
9、片内振荡器和时钟电路;
10、与MCS-51兼容;
11、全静态工作:
0Hz-33MHz;
12、三级程序存储器保密锁定;
13、可编程串行通道;
14、低功耗的闲置和掉电模式。
2.1.2管脚说明
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口除了作为普通I/O口,还有第二功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(T0定时器的外部计数输入)
P3.5T1(T1定时器的外部计数输入)
P3.6/WR(外部数据存储器的写选通)
P3.7/RD(外部数据存储器的读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。
读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。
只有读端口时才真正地把外部的数据读入到内部总线。
89C51的P0、P1、P2、P3口作为输入时都是准双向口。
除了P1口外P0、P2、P3口都还有其他的功能。
RST:
复位输入端,高电平有效。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
地址锁存允许/编程脉冲信号端。
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号,低电平有效。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
外部程序存储器访问允许。
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
片内振荡器反相放大器和时钟发生器的输入端。
XTAL2:
片内振荡器反相放大器的输出端。
图2-2AT89C51芯片管脚
2.2ADC0809模数转换简介
ADC0809是美国国家半导体公司生产的带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
产品外观图如图2-3所示。
图2-3ADC0809芯片
2.2.1主要性能特点
(1)8路输入通道,8位A/D转换器,即分辨率为8位。
(2)具有转换起停控制端。
(3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)
(4)单个+5V电源供电
(5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
(6)工作温度范围为-40~+85摄氏度
(7)低功耗,约15mW。
2.2.2内部结构
ADC0809内部逻辑电路如下:
图2-4ADC0809内部图
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
2.374HC164移位寄存器
2.3.1概述
74HC164、74HCT164是高速硅门CMOS器件,与低功耗肖特基型TTL(LSTTL)器件的引脚兼容。
74HC164、74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA或DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟(CP)每次由低变高时,数据右移一位,输入到Q0,Q0是两个数据输入端(DSA和DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
2.3.2特性
∙门控串行数据输入
∙异步中央复位
∙符合JEDEC标准no.7A
∙静电放电(ESD)保护:
·HBMEIA/JESD22-A114-B超过2000V
·MMEIA/JESD22-A115-A超过200V。
∙多种封装形式
∙额定从-40°C至+85°C和-40°C至+125°C。
2.3.3功能图
图2-5.逻辑符号
图2-674HC164管脚分布图
74HC164典型工作时序图:
图2-774HC164工作时序图
2.474HC573锁存器
在数码管显示方面,要维持一个数据的显示,往往要持续的快速的刷新。
尤其是在四段八位数码管等这些要选通的显示设备上。
在人类能够接受的刷新频率之内,大概每三十毫秒就要刷新一次。
这就大大占用了处理器的处理时间,消耗了处理器的处理能力,还浪费了处理器的功耗。
锁存器的使用可以大大的缓解处理器在这方面的压力。
当处理器把数据传输到锁存器并将其锁存后,锁存器的输出引脚便会一直保持数据状态直到下一次锁存新的数据为止。
这样在数码管的显示内容不变之前,处理器的处理时间和IO引脚便可以释放。
可以看出,处理器处理的时间仅限于显示内容发生变化的时候,这在整个显示时间上只是非常少的一个部分。
而处理器在处理完后可以有更多的时间来执行其他的任务。
这就是锁存器在LED和数码管显示方面的作用:
节省了宝贵的MCU时间。
锁存器作用:
锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。
锁存,就是把信号暂存以维持某种电平状态。
锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个I/O口既能输出也能输入的问题。
锁存器就是把当前的状态锁存起来,使CPU送出的数据在接口电路的输出端保持一段时间锁存后状态不再发生变化,直到解除锁定。
还有些芯片具有锁存器,比如芯片74LS244就具有锁存的功能,它可以通过把一个引脚置高后,输出就会保持现有的状态,直到把该引脚清0后才能继续变化。
图2-874HC573锁存器管脚图
注:
1脚三态允许控制端低电平有效;
1D~8D为数据输入端;
Q~8Q为数据输出端;
74HC573引脚图;
LE为锁存控制端;OE为使能端。
2.5LED显示系统
2.5.1LED显示器的选择
在本设计中,选择4位一体的数码型LED显示器,简称“4-LED”。
本系统中第一位为通道显示,第二位为显示电压的整数位,即个位,后两位显示电压的小数位,分别为十分位和百分位。
4-LED显示器引脚如图2-9所示,是一个共阴极接法的4位LED数码显示管,其中a,b,c,e,f,g为4位LED各段的公共输出端,1、2、3、4分别是每一位的位数选端,dp是小数点引出端,4位一体LED数码显示管的内部结构是由4个单独的LED组成,每个LED的段输出引脚在内部都并联后,引出到器件的外部。
图2-94位LED外观及引脚图
图2-10A5416AH四位共阴数码管引脚详图
对于这种结构的LED显示器,它的体积和结构都符合设计要求,由于4位LED阴极的各段已经在内部连接在一起,所以必须使用动态扫描方式(将所有数码管的段选线并联在一起,用一个I/O接口控制)显示。
2.5.2LED译码方式
译码方式是指由显示字符转换得到对应的字段码的方式,对于LED数码管显示器,通常的译码方式有硬件译码和软件译码方式两种。
硬件译码是指利用专门的硬件电路来实现显示字符码的转换。
软件译码就是编写软件译码程序,通过译码程序来得到要显示的字符的字段码,译码程序通常为查表程序[3]。
本设计系统中为了简化硬件线路设计,LED译码采用软件编程来实现。
由于本设计采用的是共阴极LED,其对应的字符和字段码如下表2-1所示。
表2-1共阴极字段码表
第三章设计方案
3.1硬件设计
图3-1为硬件的总体框图,可分为四个模块。
模数转换使用ADC0809芯片,它将输入的模拟电压量转换为一个8位的二进制数字,然后进入到单片机STC80C51控制单元,经过驱动处理模块用数码管显示出直流电压值。
另外注意ADC0809芯片输入电压不可大于5V。
3.1.1单片机最小系统设计
1.时钟电路的设计
MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。
本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和2个电容即可,如图3-2所示。
图3-2时钟电路的设计
2.复位电路的设计
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。
MCS-51单片机有一个复位引脚RST,采用施密特触发输入。
当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。
复位电路如图3-3所示。
图3-3复位电路的设计
3.单片机电源电路设计
只要能够提供稳定的+5V电压的各种电源都可以,但一般都用三端稳压器7805。
接法如图,7805的“1”有7V以上就行。
C1可选1000~2200微法的电解电容,C3可选10~100微法的电解电容,C2、C4可选0.01~0.1微法的无极电容。
如图3-4所示。
当然,电源这块不是我们本次实验的设计重点,这里大概提一下。
图3-4电源电路
3.1.2采样电路的设计
这里使用的是ADC0809的模数转换芯片,可根据其工作机理来设计电路图:
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。
数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。
采样电路如图3-5所示。
图3-5采样电路
3.1.3键盘电路的设计
当按键数量较多时,为节省I/O口线和减少引线,常将其按矩阵方式连接。
每条行线与列线的交叉处通过一个按键来接通,则只需要N条行线和M条列线,即可组成N*M个按键的键盘。
比如,有16个按键的键盘,可将其按4*4的方式连接,即4根行线和4根列线,每根行线和列线交叉点处即为一个键位,其连接形式如图3-6所示。
图3-6键盘电路的设计
3.1.4LED显示电路的设计
单片机的并行口不能直接驱动LED显示器,所以,在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作[7]。
如果驱动电路能力差,即负载能力不够时,显示器亮度就低,而且驱动电路长期在超负荷下运行容易损坏,因此,LED显示器的驱动电路设计是一个非常重要的问题。
为了简化数字式直流电压表的电路设计,在LED驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LED的A-G段显示引脚和DP小数点显示引脚并联到P0口与上拉电阻之间,这样,就可以加大P0口作为输出口德驱动能力,使得LED能按照正常的亮度显示出数字,如图3-7所示。
图3-7LED显示电路的设计
3.1.5整体电路的设计
最终结合整体硬件布局以及适合布线规划的设计。
最终整体电路的设计如图3-8所示。
图3-8整体电路的设计
3.2系统程序的设计
系统程序的设计是对照已经设计好的硬件电路进行编写的程序,其每个函数模块及其硬件原理都可以在上一节中进行对应。
系统程序设计代码:
//-------------------------头文件与宏定义-------------------------------
#include//头文件
#include//使用其中的移位函数_crol_与_cror_
#defineucharunsignedchar//简写定义,方面后面书写
#defineuintunsignedint
#defineADDP3
ucharcodeLED_Data1[]=
{0xfc,0xc0,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//共阴数码管表0~9
ucharcodeLED_Data2[]=
{0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xb7,0xe1,0xff,0xf7};//共阴数码管表0.~9.
sbitHC164_DATA=P1^1;//定义HC164数据位
sbitHC164_CLK=P1^0;//定义HC164时钟位
sbita0=ACC^0;
sbitchannel=P1^2;//定义数码管通道
sbitwei1=P1^3;//定义各个数码管的位选
sbitwei2=P1^4;
sbitwei3=P1^5;
sbitST=P1^6;//定义A/D转换启动信号输入端
sbitOE=P1^7;//定义输出允许控制端
sbitADD_A=P3^5;//定义A/D转换三个地址位
sbitADD_B=P3^6;
sbitADD_C=P3^7;
ucharnum,getdata,temp1,temp2,temp3,temp4;
uchara=0,b=0,c=0,t=0,k=0,sig_flag=0,on_off=0,CHAN=0,chan_temp=0;nTIME=0,sig_mul=0,k1=0;
//-------------------------原函数声明---------------------------------
voidinit();
voidAD_convert(ucharj);
voidHC164_Display(uchardata_buf);
voidLED_scan(ucharl,ucharm,ucharn,ucharw);
voidmul_display();
voidleft_display();
ucharkeyscan();
ucharkey_driver();
voiddelay_ms(uint);
//----------------------------主函数----------------------------------
voidmain()
{
init();//通电即初始化
while
(1)
{
switch(key_driver())
{
case0:
if(sig_flag==1)k=0;k1=0;break;
case1:
if(sig_flag==1){k=0x20;k1=1;}break;
case2:
if(sig_flag==1){k=0x40;k1=2;}break;
case3:
if(sig_flag==1){k=0x60;k1=3;}break;
case4:
if(sig_flag==1){k=0x80;k1=4;}break;
case5:
if(sig_flag==1){k=0xa0;k1=5;}break;
case6:
i