摘 要
随着社会的进步和科技的发展,当今社会活动对电子设备的使用也越发依赖,此时抢答器也作为一种答题方式所需要的设备应运而生。抢答器的适用方面广泛,可用在当下各种答题节目,知识竞赛等活动之中。但随之而来的也有很多问题,当今市面上有的抢答器使用线路复杂,导线散乱,实用性差,有的抢答器采用专用集成芯片,制作成本高,购买难度大。为面对这些问题,本次毕业设计将决定利用C52单片机设计出一种结构简单,元器件易购,实用性强,功能完善的多路抢答器。
本次多路抢答器的设计采用八路抢答的形式,系统以STC89C52单片机为核心作为控制芯片,采用四位数码管显示,实现八位选手抢答功能。在主持人按下开始抢答按键之前,若有选手此时按下抢答键,抢答器会发出警报,视为选手违规。进入正常的抢答程序后,进入30秒抢答倒计时,在此期间选手可进行抢答,抢答成功后进入15秒答题倒计时。若最后5秒钟还没有人抢答,会发出提醒。在答题时间的最后5秒钟,也会发出提醒。此外,主持人可对答题时间和抢答时间进行设置。
该多路抢答器的设计基于Altium Designer原理图设计平台,利用DXP软件对元器件进行查找、放置、连接、制版,进而实现八路抢答器的原理图硬件设计;利用Keil uVision4软件进行单片机程序编写,实现抢答器软件设计;最后利用proteus 8仿真软件将程序载入单片机中,对八路抢答器进行仿真,经过调试运行达到设计目标。
关键词
单片机;数码管;抢答器;电子产品;proteus
目 录
第1章 概 述
1.1 选题来源
在大学各课程的学习中对有关基于单片机设计电路,以及单片机实际应用于生活这一发展现状产生了浓厚的兴趣,有极大的热情对其进行研究与分析。在此次毕业设计中,参考导师指导意见,结合大学中所学知识,从导师所给参考题目中选择了基于单片机的多路抢答器设计作为本次论文题目。
1.2 选题的研究现状
目前市场上抢答器的种类多种多样,但主要还是分为两个大类,一种是电子抢答器,另一种是电脑抢答器。电子抢答器结构简单,主要依靠数字集成电路组成,大多通过抢答器主机和按钮构成,结构简单,但可实现的功能少,具有局限性;电脑抢答器,顾名思义是需要主机配合电脑,利用专门研究的智能抢答器软件实现其完整功能,功能多种多样,应用范围广,但存在体型大,使用不方便的缺陷。
随着当今科技的迅速发展,与之相对应适用的设备也必将层出不穷。抢答器作为一种早期研发应用的电子产品,早已大量应用于各种人才选拔和知识竞赛场合,但早期所使用的抢答器,只由几个三极管、可控硅、发光管等组成,可靠性低,实现起来很困难。目前大多数抢答器仍存在多个不足之处:第一,现场线路连接复杂。由于每位抢答选手在参加比赛时所坐的位置,就需要将抢答器的导线连接到不同地方,进而导致现场连线混乱。这些导线不仅散布混乱导致发生事故,而且降低了抢答器的可靠性,增加了安装的难度,影响了现场的布局美观。第二,容易出现误判的情况,选手虽然抢答成功,但并为被记录到抢答器中,影响了比赛的公平性。第三,抢答器制作成功率低,由于技术的不完善和元器件组装焊接复杂,未能实现相应的抢答功能,进而产生浪费。
1.3 选题的意义
在竞赛中,特别是在做抢答题目时,大多是多个选手一起竞赛,如果采用举手抢答的传统方法,会在某种程度上因为裁判的主观误判而有失比赛的公平性。面对当前现状和考虑到传统抢答器的缺陷,需要设计一个简易可靠的系统,实现规范的抢答功能。
单片机,是一种广泛应用与当下电子产品的芯片。单片机受众面广泛,近几年发展迅速,成为了目前电子产品开发和研究制造的不二之选。单片机具有重量轻、体积小、价格低、抗外界因素影响强、环境要求低、可靠性高、适配程序多样,开发简单灵活等优点。
这就使基于单片机设计出的多路抢答器具有优于传统抢答器的特点,首先,电路连接简单,因为大多数要实现的功能(定时、中断、复位等功能)和接入的管脚都整合在了小小的单片机中,所以可使电路连接变得简单易懂。第二,实用性强,工作可靠,抗干扰能力优于传统抢答器,并能够通过编写相应的程序实现多样化的功能,方便对功能的添加和改善。所以本此设计是结合当下现状而展开的具有创新性的一次研究。
此次多路抢答器利用STC89C52单片进行系统设计,有助于掌握单片机的相关知识。在硬件方面,利用DXP都原理图进行设计,有助于提高我们的设计能力和对软件的应用能力;在软件方面,利用所学知识对单片机软件程序进行编写,加深对程序的了解和掌握;在实物组装方面,对于元件的拼装、焊接、调试,有助于提高动手能力和排障能力。
1.4 论文设计内容
本次多路抢答器的设计与制作论文书写内容大体分为七个章节。
第一章是概述部分,对选题来源,选题意义以及论文结构进行整体论述,确定此次多路抢答器设计的研究方向。
第二章是总体设计方案部分,本章节是针对多路抢答器的设计流程和使用的相关开发软件的设计,同时考虑到实物仿真效果而对所用元器件的选择,以便元件之间彼此完美连接,能够正常工作,使设计出的原理图达到实际仿真效果。
第三章是硬件系统设计部分,该章节采用先整体后局部的叙述方式,先对整体方案设计进行论述,再概述包含在总体设计中的各个输入输出模块,如输入模块有按键模块等,输出模块有数码管模块和蜂鸣器模块等。
第四章是系统软件设计部分,软件以C语言形式编写,烧入单片机。通过插入总体流程图和模块流程图的方式,再配以相应的文字论述,使软件部分设计清楚表现。
第五章是系统仿真部分,通过Proteus软件对设计出原理图进行仿真,以及功能调试。
第六章是实物焊接及调试部分,该部分列举元器件清单,实物焊接原则和实物完成后的相关功能调试。
第七章是总结部分,总结了本次设计的功能,在设计中遇到的问题及解决方案和通过此次设计所学到的知识。
第2章 总体设计方案
2.1 多路抢答器设计方案
本次论文研究的主题是基于单片机的多路抢答器的设计与制作,结合所学知识与实际情况本次设计决定采用八路通道抢答的方式,采用STC89C52单片机为核心设计出一款较为实用的八路抢答器。
八路抢答器以单片机最小系统为核心,输入部分设计为按键模块和电源模块,输出部分通过设计数码管模块和蜂鸣器模块进行发光发声。在硬件设计方面,采用DXP软件进行元件选型和相关模块的原理图设计与PCB板的制作。在软件设计方面,决定使用C语言在Keil4的软件开发环境下对各部分程序进行编写。在仿真方面,利用Proteus8.0仿真软件,通过绘制原理图对其进行仿真,实现预设功能。在实物组装部分,根据所绘制的原理图,选购对应元器件,在电路板上进行元件焊接,经过调试,最终得到成品,实现理想功能。
本次所设计的八路抢答器所要实现的基本功能是支持选手抢答和相关显示。在抢答器接入电源后,按下开关,数码管上显示“0000”。在主持人开始前,如果有选手提前抢答,则数码管将显示该选手编号和警告显示,同时蜂鸣器报警。在主持人按下抢答按键后,数码管上显示进入30s抢答倒计时,最后5s内蜂鸣器报警,若最后无人抢答,则回合结束,数码管上显示“----”;如期间有人抢答,则数码管上显示选手编号,进入15s答题倒计时,最后5s内蜂鸣器报警提醒,答题时间结束后,数码管上显示“----”。本轮答题结束,主持人可通过复位按键进行重置。此外,电路可通过时间设置按键对抢答时间和答题时间进行设置。
2.2 元器件选型
本此多路抢答器由多个模块组成,包括单片机最小系统、按键模块、蜂鸣器模块、数码管模块、电源模块等。为了保证这些模块实现理想的相应功能,同时满足各模块之间能够彼此紧密联系,配合工作,其中对元器件的选型至关重要。
在用DXP软件绘制原理图之前,需要利用元件库,在其中选出构建原理图所需要的相关元器件。在选择元器件时,首先要考虑元件功能是否满足设计需求;考虑到实用性和功耗方面,要选择性价比高、易获取的元器件;由于要进行封装,应尽量在元件库中选择具有封装的元器件;对于具有参数的元器件,如电阻、晶振等元器件,在选择时根据硬件设计需要为满足相应功能来选择合适的参数;对于有极性的元器件如极性电容、三极管等,要注意方向和相应型号,避免因为元件类似而导致之后的仿真失败;考虑到最后要进行实物焊接,在可实现所用功能的情况下,应尽量选择常见易购的元器件。
2.2.2 各模块元器件选择
(1)单片机最小系统
元件选择:1个STC89C52单片机U1,1个九管脚排阻(102)R1;1个10uF电容C1,1个10K电阻R2,1个12M晶振,2个30pF电容C2、C3,1个按键K11。
其中,选择STC89C52单片机的原因是STC89C52体积小、使用方便、易于获取、性价比高、功能比AT89系列多,稳定性强;选择九管脚排阻的原因是由于引脚和单片机之间呈现高阻态,需要利用排阻的引脚电压输出5V,一个连接VCC,另八个引脚连接数码管段选端;选择12M晶振的原因是要每秒产生12000000个正弦波,保证定时时间。
其中,按键K1~K8的选择是为了对应八个选手的抢答按钮,分别连接单片机的P1.0~P1.7引脚;按键K9和K10分别代表开始抢答按键和时间设置按键,连接单片机的P2.0和P2.1的引脚。按键实物图如图2.1所示,独立按键有四个管脚,在连接过程中,只需要连接相对的平行两个管脚即可。
图2.1 按键实物图
(3)蜂鸣器模块
元件选择:1个PNP型三极管Q1;1个蜂鸣器DEEP1。
其中,选择PNP三极管的目的是为了利用三极管的开关作用,通过连接单片机和蜂鸣器,进而实现报警功能;蜂鸣器为了发出声响,实现提醒答题时间和违规功能。蜂鸣器原理图和实物图如图2.2和图2.3所示。
元件选择:1个四位共阴极数码管Dpy1。
其中,选择四位数码管是为了满足设计功能需求,需要同时显示4位数字,其中包含选手编号、分割符、两位数倒计时等;采用共阴极数码管的目的是为了将公共端接地即可,使用方便快捷;此处采用数码管而没有使用液晶显示屏的原因是本次设计显示内容量相对较少,四位数码管就可以清楚展示相应内容,LCD屏相对来说浪费设计空间,成本过高,性价比低。数码管原理图和实物图如图2.4和图2.5所示。
图2.4 数码管原理图 图2.5 数码管实物图
(5)电源模块
元件选择:1个电源座J1;1个开关SW1。
其中,电源座选取最常见的即可,只需要连接电源,无过多功能要求;开关的引入是为了控制电路板通电情况,可随时断电通电,保证电路安全。
第3章 硬件系统设计
3.1 八路抢答器整体方案设计
整个系统是以STC89C52单片机为核心,配合晶振、电阻、电容等构成单片机最小系统,其余模块分布周围配合单片机实现功能。该系统原理图如图2.1所示。
图3.1 系统原理图
系统输入:抢答器输入信号由两个部分发出,一个是主持人指令输入,通过按键模块中的抢答控制按键、时间设置按键、电路复位按键对电路进行控制。另一个是选手抢答输入,八位选手通过按键模块中的八个抢答按键进行抢答输入。系统正常工作的前提是由电源模块提供的5V电压输入。
系统输出:抢答器系统通过蜂鸣器模块和数码管模块以声光两种方式输出。当出现违规、提醒状况时,蜂鸣器报警。当选手违规、抢答、以及倒计时显示时,通过数码管模块中的四位共阴极数码管来显示相关内容。
图3.2 系统框图
如图2.2系统框图所示,本次设计的八路抢答器由五部分模块组成。以单片机最小系统模块为核心,其中包含STC89C52单片机、晶振电路和复位电路,输入部分由选手按键抢答模块、主持人控制模块和电源模块组成,输出部分由数码管显示模块和蜂鸣器报警模块组成。
3.2 单片机最小系统设计
(1)单片机特点
单片机是在一片半导体硅片上,包含了中央处理单元(CPU)、存储器(RAM/ROM)、并行I/O、串行I/O、定时器/计数器、中断系统、系统时钟电路及系统总线的用于测控领域的单片机微型计算机,简称单片机,如图2.3单片机结构图所示。
单片机是集成电路技术与微型计算机技术高速发展的产物。单片机体积小、价格低、应用方便、稳定可靠,因此,单片机的发展普及给当今电子设备的研究和进步带来了巨大的推动。用户可根据实际需要,设计一个以单片机为核心,再配以外围接口电路及其他外围设备(外设),并编写相应的程序来实现其测控功能,以满足各种不同测控系统的功能需求。单片机系统具有显著的优点,简单方便,易于掌握和普及;功能齐全,应用可靠,抗干扰能力强;发展迅速,前景广阔;嵌入容易,用途广泛,性价比高,灵活性高。
图3.3 单片机结构图
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器,指令代码完全兼容传统8051单片机,12时钟 /机器周期和6时钟/机器周期可以任意选择。就对比AT89C52单片机而言,STC单片机具有更大的512字节的数据存储空间,内带2K字节EEPROM存储空间而AT单片机没有。STC系列单片机拥有可直接下载的串口,而AT单片机需要装一个驱动。此外,STC系列单片机使用抗干扰能力更强,价格便宜,性价比高。STC89C52单片机内部硬件结构框图如图2.4所示。
图3.4 STC89C52内部结构框图
(3)8051单片机的引脚功能
STC89C52单片机采用40个引脚,32个外部双向输入/输出(I/O)端口,3个16位可编程定时计数器,2个全双工串行通信口,采用双列直插式封装,用HMOS工艺制造,其外部引脚排列如图2.5所示。
图3.5 STC89C52引脚图
1.电源引脚
1)VCC(40脚):接+5V电源。
2)GND(20脚):接数字地。
2.时钟引脚
1)XTAL1(19脚):片内振荡器反向放大器和时钟发生器电路输入端。使用片内振荡器功能时,该引脚接外部石英晶体和微调电容。外接时钟源时,该引脚接外部振荡信号。
2)XTAL2(18脚):片内振荡器反向放大器的输出端。使用片内振荡器时,该引脚接外部石英晶体和微调电容。外接时钟源时,本脚引悬空。
3.控制引脚
1)RESET(9脚):复位信号输入端,高电平有效。在单片机正常工作时,此引脚应为不大于0.5V的低电平。
2) (31脚):访问外部存储器允许/编程电压输入。为高电平时,访问内部存储器;低电平时,访问外部存储器。
3)ALE(30脚):为CPU访问外部程序存储器或外部数据存储器提供低8位地址锁存信号,将单片机P0口发出的第8位地址锁存在P0口外接的地址锁存器中。
4) (29脚):片外程序存储器的读选通信号,低电平有效。
4.并行I/O口引脚
1)P0口:P0.7~P0.0引脚(32~39脚)
漏极开路的双向I/O口。当扩展外部存储器及I/O接口芯片时,P0口为双向口,作为地址总线(低8位)及数据总线的分时复用的总线端口。P0口也可接入上拉电阻作为通用I/O口(准双向口)使用,。P0口可驱动8个LS型TTL负载。
2)P1口:P1.0~P1.7引脚(1~8脚)
准双向I/O口,具有内部上拉电阻,可驱动4个LS型TTL负载供用户使用。用作输入线时,口锁存器必须由单片机先写入“1”,且每一位都可编程为输入或输出线。
3)P2口:P2.0~P2.7引脚(21~28脚)
准双向I/O口,引脚内部接有上拉电阻,可驱动4个LS型TTL负载。当扩展外部存储器时,P2口作为高8位地址总线用,输出高8位地址。P2口也可作为通用的I/O口使用。
4)P3口:P3.0~P3.7引脚(10~17脚)
第一功能:作为通用的I/0口使用,可驱动4个LS型TTL负载。
第二功能:P3口第二功能定义如表2.1所示。
表3.1 P3口第二功能
端口引脚 | 第二功能 | 注 释 |
P3.0 | RXD | 串行口数据接收端 |
P3.1 | TXD | 串行口数据发送端 |
P3.2 | /INT0 | 外中断请求0 |
P3.3 | /INT1 | 外中断请求1 |
P3.4 | T0 | 定时/计数器0外部信号输入 |
P3.5 | T1 | 定时/计数器1外部信号输入 |
P3.6 | /WR | 外部RAM写选通信号输出 |
P3.7 | /RD | 外部RAM读选通信号输出 |
3.2.2 最小系统模块
基于STC89C52单片机的最小系统原理图如图2.6所示,整个模块由晶振电路、复位电路、排阻等部分组成。最小系统模块作为整个八路抢答器设计的核心,借由单片机引脚连接按键、数码管、蜂鸣器等模块,其中通过将软件程序输入到单片机中,实现各部分相应的功能。
图3.6 最小系统模块
- 晶振电路:该电路包括一个12M的无源晶振X1,两个30pF的电容C2、电容C3。在放置连接方面,由于采用无源晶振,将晶振两端直接连接单片机18、19两个时钟引脚即可。此处,晶振采用12M,相当于每秒产生12000000个正弦波,单片机每收到12个正弦波执行一条指令。电容C2、C3的作用:利用充、放电功能帮助晶振起振,产生稳定的正弦波。
- 复位电路:该电路包括一个10pF的电容C1,一个10K的电阻R2和一个复位按键K11。如图2.6复位电路部分所示,单片机的RESET引脚接在电容和电阻之间,使其分为上下两部分。工作原理:开始通电的瞬间,电容导通,开始充电,RESET引脚接入+5V,单片机复位,程序中断。在极短的时间后,电容充满电,电路进入稳定态状态,电容起到隔离直流的作用,隔离了+5V,而左侧的复位按键K11是弹起状态,下边部分电路就没有电压差的产生,所以按键和电容C1以下部分的电位都是和GND相等的,也就是0 V。由于单片机是高电平复位,低电平正常工作,所以此时单片机处于正常运行状态。这也是仿真时,通电后要等待一小段时间,使整个系统处于稳定后再开始操作的原因。当复位按键按下时,电流绕过电容,通过按键将+5V接入RESET引脚,使单片机复位。松开后,单片机又进入正常工作状态。
- 31脚():由于程序存储在了单片机内部,所以要接高电平,保证单片机是从内部读取程序去执行的。
- 排阻:PO引脚和单片机之间呈现高阻态(电阻高,相当于与芯片断开,无法输出5V),所以引入排阻,使引脚电压为+5V。
3.3 按键模块设计
按键模块采用独立式键盘的设计,每个按键各接一条I/O口线,按键之间相互独立,通过检测I/O引脚的电平状态,即可判断出哪个按键被按下。如图2.7所示为两组独立式键盘,8个按键K1~K8分别连接到单片机的P1.0~P1.7的引脚上,K9和K10分别连接到P2.0和P2.1引脚。当某一按键被按下时,对应的I/O口引脚就变成了低电平,未被按下的按键I/O口引脚就会呈现高电平状态。因此,只要检测I/O口引脚的电平状态,判别是否为低电平,就可判断出被按下的按键是哪个。由于独立式键盘各按键相互独立,互不影响,因此识别所按键号的软件编写相对简单。其中,K1~K8分别对应八位抢答按键,K9和K10分别为开始抢答按键和设置按键。在操作时只需要摁下按键即可实现相对应的功能,对比矩阵式键盘的快速扫描法判断被按下的按键位置,独立式键盘虽然判断效率较慢,但针对本次设计按键少的情况下,为保证条理清晰,软件程序编写简单,采用独立式键盘更为方便快捷。
图3.7 按键模块
3.4 蜂鸣器模块设计
如图2.8所示,蜂鸣器模块由一个PNP型三极管Q1和蜂鸣器DEEP1组成。其中,三极管的发射极接VCC,基极接单片机的P3.2引脚,集电极接GND。
图2.8 蜂鸣器模块
在蜂鸣器模块内,起到最主要作用的不仅是蜂鸣器,还有PNP型三极管。利用三极管的开关作用,当管子的发射极电压大于基极电压时,三极管处于饱和状态,集电极和发射极导通,相当于闭合开关;当集电极电压大于发射极大于基极时,三极管处于截止状态,相当于断开开关。
蜂鸣器有源蜂鸣器与无源蜂鸣器的区别。这里的“源”不是指电源,而是指震荡源。有源蜂鸣器内部具有震荡源,在接入+5V电源后即可发出声响;而无源蜂鸣器内部不具有震荡源,当接入直流电源时,蜂鸣器无法正常工作,在设计电路时要采用2K-5K的方波去驱动它。本设计使用的是有源蜂鸣器。
蜂鸣器模块工作原理:当单片机P3.2引脚输出+5V高电平时,VCC与P3.2导通,电流不流过蜂鸣器,蜂鸣器不报警;当P3.2引脚输出0V时,VCC与GND导通,即三极管导通,蜂鸣器报警。
3.5 数码管模块设计
发光二极管在电路设计中至关重要,起到了指示系统的工作状态,传递电路信息等功能,在日常生活中也可用于制作小彩灯,玩具等。由于当下对于发光材料的优化,目前多数发光二极管的工作电流在1~5mA,其内阻为20~100欧。发光二极管工作电流越大,显示亮度也越高。
LED数码管(LED Segment Displays)是常见的显示器件,作为数码管的集合,将多个发光二极管封装在一起组成“8”字型的元器件,在其内部各引线规则连接,外部管脚分别对应它们的各个笔划和公共电极。数码管实际上是由七个发光管组成“8”字型,外加上右下角的小数点就构成八段。如图2.9所示,这些段分别由字母a、b、c、d、e、f、g、dp来表示。
七段数码管分为共阴极数码管和共阳极数码管。共阳极数码管的阳极为八个发光二极管的公共阳极,由一根公共引脚引出接+5V,将八个发光二极管的另一头接低电平,即可点亮发光二极管。共阴极数码管的阴极为八个发光二极管的公共阴极,由一根公共引脚引出接地,将八个发光二极管的另一头接入高电平,即可点亮发光二极管,进而与之相对应的数码管上显示其内容。其中,共阴极数码管的内部结构如图2.10所示。
图3.9 数码管封装图 图3.10 共阴极数码管内部结构图
单片机控制LED数码管有两种显示方式:静态显示和动态扫描显示。
静态显示就是指多位LED数码管同时处于显示状态。处于静态显示方式时,就共阴极数码管而言,各位的共阴极连接在一起并接地;每位数码管的段码线分别与单片机控制的8位I/O口引脚相连。当数码管已经受到程序控制显示相应的字符段码后,I/O口锁存器将保持该段码输出不变,直到送入下一个显示字符的段码。所以以静态显示方式工作的数码管,显示时并不会轮流点亮,显示亮度高。优点是对于四位数码管,在同一时间,每一位显示的字符可以各不相同。但是,静态显示方式占用的I/O口线较多,导致成本较高。
动态扫描显示就是将所有多为LED数码管的段码线的相应段并联在一起,由一个8位I/O端口控制,而各显示位的公共引脚分别由另一个独立的I/O端口线控制,优势在于可减少对I/O口和驱动电路口的占用,但不可同时点亮四位数码管。
3.5.3 数码管模块电路
本次设计中,数码管显示模块电路采用一个四位共阴极数码管,利用动态扫描显示的方式点亮数码管,如图2.11所示。
图3.11 数码管模块电路
单片机向I/O(P0.0~P0.7)端口发出欲显示字符的段码,而显示器的位点亮控制使用I/O(P2.4~P2.7)端口中的4位线,来控制数码管公共端电平,每一时刻,只有1位数码管公共引脚有效,即选中某一位显示,其他各位位选线都无效,不显示。每隔一定时间逐位地轮流点亮各数码管(扫描方式),由于数码管的快速闪烁的残影和人眼的视觉暂留效果,只要控制好每位数码管点亮的时间和显示的间隔,则可造成多位数码管同时亮起的假象,达到4位数码管同时显示的效果。动态扫描显示的实质是以执行程序的时间来换取I/O端口数目的减少,相比静态显示节省了I/O口数目,降低了成本。
3.6 电源模块设计
电源模块由一个电源座J1和一个控制开关SW1组成,如图2.12所示。采用+5V的直流电源供电,可使用充电宝,手机插头,电脑USB接口等设备进行供电。
图3.12 电源电路
第4章 系统软件设计
4.1 程序语言及开发环境
本次软件设计方面,在Keil uVision4开发软件的开发调试环境里,采用C语言编写软件程序,输入到单片机中实现基本功能。
C语言是一种既可以用来编写系统软件,也可以用来编写应用软件的程序设计语言。C语言是世界上最流行、使用最广泛的面向过程的高级程序设计语言。C语言通过编辑源程序、编译源程序、连接目标程序和运行可执行程序等几个步骤,实现相关设计。此外,C语言具有很多优于其他程序设计语言的特点,简洁紧凑,灵活方便,运算符丰富,语言结构化,执行效率高,语法限制小,程序设计自由度大等。
Keil 4是一种可编写程序输入到单片机中的C语言软件开发系统。Keil 4软件提供丰富的库函数和功能强大的编译调试工具,生成目标代码的效率非常高,语句通俗易懂。
4.2 程序流程设计
八路抢答器的总体设计流程图如图3.1所示,在系统程序设计中运用到了一个8位选手按键扫描程序,单片机内部EEPROM设置程序,答题时间设置程序,延时程序,STC89C52单片机的两个定时器(定时器0和定时器1)服务程序,其中用来编写四位数码管动态扫描程序和50ms计时程序。
编写框架:程序编写之初,先引入头文件,设置寄存器初值,定义蜂鸣器、数码管、按键等引脚,依次初始化定时器,编写8个选手抢答按键扫描程序,编写答题和抢答时间设置程序,编写定时器0和定时器1服务程序,最后进入主函数程序编写。
图4.1 总体设计流程图
初始化单片机后,程序进入一个大循环,如图3.1所示。首先,主持人可判断是否有设置抢答时间和答题时间,若未设置,主持人可通过设置按键进行设置。若已设置,则进入答题流程。在主持人按下开始抢答按键前,程序会判断是否有选手抢答,若有人抢答,蜂鸣器开始报警,数码管上显示违规及选手编号;若无选手抢答,则等待主持人发出指令。开始抢答键被按下后进入抢答时间倒计时,若在最后5s前无选手抢答,蜂鸣器开始长鸣,时间结束后本轮抢答结束;若在倒计时期间有选手抢答,则进入答题时间倒计时。在答题时间倒计时期间,首先判断答题倒计时是否只剩下5s,如果是,则蜂鸣器开始报警。然后判断答题时间是否为0,如果是,则停止抢答,显示屏显示“----”,蜂鸣器报警,本轮答题结束。
本次设计使用的是数码管动态扫描法,通过编写程序利用单片机依次点亮四位数码管,并进行短暂的延时,由于显示切换点亮速度很快,每位数码管只点亮2ms,人眼无法反应过来,利用余辉效应使其看起来像是四位数码管同时被点亮。数码管动态扫描流程图如图3.2所示。
4.2.3 时间设置程序
图4.3 时间设置流程图
为了方便根据实际情况对所设计的八路抢答器的抢答时间和答题时间进行修改,通过C语言汇编软件编写了手动时间设置程序。使用者可根据现场答题规则的实际情况,通过时间设置按键对时间进行修改。在软件编写过程中,将抢答时间按键和答题时间按键合并成一个,方便修改,节省了实物空间。此外,将原本的七号和八号选手抢答按键的功能也修改为,在时间设置模式下,具有对时间减和加的功能。具体设计流程如图4.3时间程序流程图所示。
在初始状态下,裁判按下时间键设置按键,首先进入抢答时间设置模式,同时数码管上显示“E-30”(30为预设抢答时间)。该过程中先判断七号和八号按键是否被按下,若七号按键被按下,同时显示时间大于0,则可以通过七号按键对时间进行减少,否则时间不变;若八号按键被按下,同时显示时间小于99,则可以通过八号按键对时间进行增加,否则时间不变。对抢答时间修改好后,再次按下设置按键,即可进入到答题时间设计模式,同时数码管上显示“F-15”(15为预设答题时间)。在此过程中,流程和抢答时间设置过程相同,都是通过判断,用七号和八号按键对时间进行减加。设置完答题时间后,再次按下时间设置按键,即可返回到初始状态,数码管上显示“0000”。
4.3 系统程序调试
本次设计的八路抢答器系统的程序是采用C语言编写的,通过keil4软件对程序进行编译调试。编写程序时以主函数为主体,依次对数码管显示函数、8个按键抢答函数、蜂鸣器函数、延时函数进行调用,经过编译仿真,确保程序正确。在写完程序后需要进行保存编译,如果出现错误,需要根据箭头显示找到出错位置,然后进行相应的修改,在修改之后再进行保存编译,直到出现“0 Error”的字样。此外,编译程序的结果往往伴随着警告,若无细节要求,即可对警告进行忽略。
第5章 系统仿真
5.1 系统仿真软件
Proteus仿真软件是英国Lab Center Electronics公司出版的EDA工具软件。它不仅具有一般EDA软件的仿真功能,还可以通过将程序输入到单片机实现单片机及外围电路的仿真。Proteus是从原理图布局、代码载入到单片机及外围电路的仿真,乃至切换到PCB设计的真正实现原理到实际的一体化设计。该软件具有超过两万多个仿真器件,丰富激励源,具体形象的仿真显示,具有编译和调试等完整的PCB设计功能,将虚拟仿真技术和计算机多媒体技术相结合。这些特点都使Proteus软件成为了目前应用最频繁的原理图仿真软件。
5.2 原理图仿真
打开Proteus软件后,根据DXP所建原理图,在元件库(点击左侧“P”键)中搜索构建八路抢答器所需要的相关元器件,并对同类元器件进行选型,如图4.1所示。
图5.1 元器件选型图
元器件选择齐全后,将元器件按照原理图的对应位置进行放置,再绘制导线将各管脚相连接,最后添加电源和接地。为了确保仿真的成功,需要将用Keil4编译好的系统软件程序写入到STC89C52单片机中,具体操作双击单片机,选择Program File将程序文件Project.hex导入到单片机中即可。
接着进入仿真实验,点击左下角开始仿真按键,仿真未报错,原理图正常仿真,可以实现预期的所有功能。例如开始抢答后,3号选手抢答成功进入答题倒计时的场景如图4.2所示。在暂停过程中,数码管部分点亮也说明了数码管是以动态扫描的方式运行的。在各项功能调试完成后,即可点击结束按键。
图5.2 系统仿真图
第6章 实物焊接与调试
6.1 元件清单
本次八路抢答器设计的元器件主要有:STC89C52单片机、晶振、电阻、电容、按键、开关、电源座、三极管、蜂鸣器、数码管等。晶振采用12M,电容2个30pF和1个10uF,由于原理图中电阻用10K,需要用万用表测量阻值,确保成品与理论一致。具体元件清单如表5.1所示。
表6.1 元件清单
STC89C52单片机 | 1片 |
40脚IC座 | 1个 |
12M晶振 | 1个 |
30pF独石电容 | 2个 |
电解电容10uF | 1个 |
电阻1K | 1个 |
电阻10K | 1个 |
排阻1K(102) | 1片 |
红色led | 1个 |
轻触按键 | 11个 |
0.36寸4位共阴极数码管 | 1个 |
电源开关 | 1个 |
电源座 | 1个 |
有源蜂鸣器 | 1个 |
PNP三极管S8550 | 1个 |
9*15cm洞洞板(万用板) | 1张 |
电源线 | 1根 |
6.2 电路板焊接
元器件在电路板插放的顺序遵循先小后大,先低后高,先焊接一般元器件,再焊接特殊元器件;电路板的焊接要保持元件的分布清晰有条理,整体美观,实用性强;对于有极性的元器件应严格遵守原理图纸上的安装要求,不能装反;焊接时不能虚焊漏焊,电烙铁不能在电路板上停留时间过长,避免烧坏元器件和电路板;电烙铁的温度要保持适宜,不能过高或过低,而造成焊接不良。
6.3 实物调试
焊接完成后,先对照原理图仔细检查实物焊接电路是否元器件摆放正确齐全,导线是否连接正确,用万用表测量电阻两端阻值,用万用表给蜂鸣器两端通电,看是否正常工作。
在检查无误的情况下,给电路板通电,接入5V电源,首先观察电路是否有异常,看元器件是否有异常发热烧坏等情况。在确保电路和元件无损的情况下,对电路板的功能经行测试。按照八路抢答器的预设功能进行分布测试,观察是否有复位显示;按下抢答键是否会出现犯规报警和显示;按下主持人开始键显示屏是否会进入30s倒计时,最后五秒蜂鸣器报警;有选手抢答,数码管是否显示选手号码和进入15s答题倒计时,最后5s蜂鸣器报警;对于时间设置按键是否能正常调时。
本次设计的实物焊接十分顺利,焊接良好,可实现预期的所有功能,实物焊接图如图5.1所示。按键由上到下,分别是时间设置按键,开始按键,复位按键;从左到右分别是1到8号选手抢答按键,7号和8号按键也可作为时间调整按键。
图6.1 焊接实物图
第7章 总结
本次毕业设计的选题是多路抢答器,以STC89C52单片机为核心,通过外部接口连接各部分模块(按键模块、数码管显示模块、蜂鸣器模块等),并利用单片机的定时功能和计数原理,将软硬件有机地结合起来,最终实现了八路抢答功能。
八路抢答器的基本功能是在抢答器接入电源后,按下开关,数码管上显示“0000”。在主持人开始前,如果有选手提前抢答,则数码管将显示该选手编号和警告显示,同时蜂鸣器报警。在主持人按下抢答按键后,数码管上显示进入30s抢答倒计时,最后5s内蜂鸣器报警,若最后无人抢答,则回合结束,数码管上显示“----”;如期间有人抢答,则数码管上显示选手编号,进入15s答题倒计时,最后5s内蜂鸣器报警提醒,答题时间结束后,数码管上显示“----”。本轮答题结束,主持人可通过复位按键进行重置。此外,电路可通过时间设置按键对抢答时间和答题时间进行设置。
本次设计过程中,先是确定选题,然后查阅相关资料,通过对大学四年所学知识的结合和运用,确定了本次设计的总体方向。首先,是利用DXP软件绘制原理图进行硬件设计,然后Keil4开发环境下利用所学的C语言对软件程序进行编译和调试,然后再通过Proteus仿真软件,将软硬件进行结合进而实现八路抢答器的功能。最后对照所设计的原理图焊接实物,得到成品。在这些过程中并不是一帆风顺,遇到了在原理图设计过程中找不到合适的电阻和电容,对单片机了解不深刻等问题,但最后都通过询问老师,查阅资料的方法得到了解决。本次设计具有的创新点是加入了时间设置模块。通过总结这次设计,回头反思还可加入计分模块,对选手答题分数进行统计显示。
本次设计为我大学四年的学习画上了完美的句号。回想在这大学四年里学到了不少有关单片机,汇编语言等知识,通过这次毕业设计不仅加深了我对所学知识的掌握,还促进了我对新知识的学习,是我对知识的应用更加牢靠,让我受益匪浅。
附录:
附录2:系统仿真图
附录3:焊接实物图
附录4:软件主程序
/*********************************************************/
// 主函数
/*********************************************************/
void main()
{
uchar ret;
WaitTime=EEPROM_Read(0x2000); // 把抢答时间从EEPROM读出来
if((WaitTime==0)||(WaitTime>99)) // 判断读出来的抢答时间是否正常
{
WaitTime=30;
}
AnswerTime=EEPROM_Read(0x2001); // 把答题时间从EEPROM读出来
if((AnswerTime==0)||(AnswerTime>99)) // 判断读出来的答题时间是否正常
{
AnswerTime=15;
}
TimerInit(); // 定时器初始化
Buff[0]=Array[0]; // 给显示缓冲区刷新内容
Buff[1]=Array[0];
Buff[2]=Array[0];
Buff[3]=Array[0];
/*开始正式抢答前的处理,主要用于违规抢答和开始抢答的判断*/
while(1)
{
SetTime(); // 判断是否进入设置状态(设置抢答时间和答题时间)
ret=KeyScanf(); // 违规抢答的判断
if(ret!=0)
{
Buff[0]=Array[ret]; // 数码管显示 “4-CC”,表示4号选手违规,4是举例
Buff[1]=Array[16];
Buff[2]=Array[12];
Buff[3]=Array[12];
bp=0;
while(1);
}
if(kStart==0) // 主持人按下了开始抢答按键,开始进入抢答模式
{
break;
}
}
/*开始正式抢答*/
DelayMs(10); // 消除按键按下的抖动
while(!kStart); // 等待开始按键松开
DelayMs(10); // 消除按键松开的抖动
Buff[0]=Array[17]; // 数码管显示“ 30”,进入30秒倒计时,30是假设的抢答时间
Buff[1]=Array[17];
Buff[2]=Array[WaitTime/10];
Buff[3]=Array[WaitTime%10];
TR1 = 1; // 启动定时器1(开始启动计时功能)
while(1)
{
if(Count>=20) // Count数到20,说明过了1秒钟(Count是每50毫秒加1)
{
WaitTime--; // 每隔1秒,抢答时间减1
Buff[2]=Array[WaitTime/10]; // 在数码管上刷新更新后的抢答时间
Buff[3]=Array[WaitTime%10];
Count=0; // 将Count清零,准备进入下一个20的计数
if(WaitTime<6) // 如果抢答时间小于或等于5秒,则每过1秒,蜂鸣器嘀一声
{
bp=0;
DelayMs(100);
bp=1;
}
}
if(WaitTime==0) // 如果抢答时间为0,说明本轮无人抢答,结束本轮抢答
{
TR1=0; // 停止定时器1
bp=0; // 蜂鸣器长鸣
Buff[0]=Array[16]; // 数码管显示 “----”,表示无人抢答,此轮抢答结束
Buff[1]=Array[16];
Buff[2]=Array[16];
Buff[3]=Array[16];
while(1); // 程序停住
}
ret=KeyScanf(); // 判断是否有选手按下抢答键,有的话,则进入答题模式
if(ret!=0)
{
break;
}
}
/*有人抢答后,进入答题时间的倒计时*/
Buff[0]=Array[ret]; // 数码管显示 “6-15”,表示6号选手还有15秒的答题时间,
Buff[1]=Array[16];
Buff[2]=Array[AnswerTime/10];
Buff[3]=Array[AnswerTime%10];
Count=0;
while(1)
{
if(Count>=20) // Count数到20,说明过了1秒钟(Count是每50毫秒加1)
{
AnswerTime--; // 每隔1秒,答题时间减1
Buff[2]=Array[AnswerTime/10]; // 在数码管上刷新更新后的答题时间
Buff[3]=Array[AnswerTime%10];
Count=0; // 将Count清零,准备进入下一个20的计数
if(AnswerTime<6) // 答题时间小于或等于5秒,每过1秒,蜂鸣器嘀一声
{
bp=0;
DelayMs(100);
bp=1;
}
}
if(AnswerTime==0) // 如果答题时间为0,说明本轮答题结束
{
TR1=0; // 停止定时器1
bp=0; // 蜂鸣器长鸣
Buff[0]=Array[16]; // 数码管显示 “----”,此轮答题结束
Buff[1]=Array[16];
Buff[2]=Array[16];
Buff[3]=Array[16];
while(1); // 程序停住
}
}
}