八路抢答器.docx
《八路抢答器.docx》由会员分享,可在线阅读,更多相关《八路抢答器.docx(25页珍藏版)》请在冰豆网上搜索。
![八路抢答器.docx](https://file1.bdocx.com/fileroot1/2022-11/25/b661bbf1-854b-454a-8545-d568ac1f00e0/b661bbf1-854b-454a-8545-d568ac1f00e01.gif)
八路抢答器
单片机课程设计说明书
八路抢答器设计
专业
电气工程及其自动化
学生姓名
刘振宇
班级
B电气081班
学号
0810601105
指导教师
张兰红
完成日期
2011年6月18日
目录
1概述1
1.1课题背景与意义1
1.2课题设计内容1
2课程方案设计1
2.1总体设计思路1
2.2设计基本功能1
3各模块的选择和论证2
3.1抢答器显示模块选择2
3.2控制器选择2
3.3键盘选择3
3.4时钟频率电路的设计3
3.5复位电路的设计4
3.6报警电路4
3.7STC89C52单片机管脚说明5
4系统软件的设计7
4.1软件设计7
4.2数码显示7
5软硬件联调及调试结果7
6电路板的制作与检查9
7总结9
参考文献10
附录10
附录1基于单片机的八路抢答器原理图11
附录2基于单片机的八路抢答器PCB图12
附录3基于单片机的八路抢答器proteus仿真图13
附录5基于单片机的八路抢答器元器件目录表22
1概述
1.1课题背景与意义
抢答器在我们的日常生活中是很常见的,特别是在一些知识竞赛和一些益智性的电视节目中抢答器的作用更是不容忽视。
能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测日新月异更新。
在电视和学校中我们会经常看到一些智力抢答的节目,如果要是让抢答者用举手等方法,主持人很容易误判,会造成抢答的不公平,比赛中为了准确、公正、直观地判断出第一抢答者,所设计的抢答器通常由数码显示、灯光、音响等多种手段指示出第一抢答者。
为了使这种不公平不发生,只有靠电子产品的高准确性来保障抢答的公平性.
1.2课题设计内容
设计一个简易的抢答器,本方案以AT89C52单片机作为主控核心,与晶振、数码管、蜂鸣器等构成八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的八路抢答器具有实时显示抢答选手的号码,还有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C51语言编程,使其实现一些基本的功能。
2课程方案设计
2.1总体设计思路
主控制器模块:
采用STC89C52单片机程序控制,P0口接四位共阳极数码管的段选,P2^0~P2^3接位选,P1口接八路抢答按键,通过终端允许和中断禁止来实现抢答功能,显示抢答者号码同时蜂鸣器响,而且采用抢答倒计时和加减分功能设计。
抢答器显示模块:
数码管显示
电源方案的选择:
采用5V电源供电
2.2设计基本功能
此次设计用STC89C52单片机为核心控制元件,设计一个简易的抢答器,本方案以STC89C52单片机作为主控核心,与晶振、数码管、蜂鸣器等构成八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,有复位电路,使其再开始新的一轮的答题和比赛,同时还利用C51语言编程,使其实现一些基本的功能。
它的功能实现是比赛开始,主持人读完题之后按下总开关,即计时开始,此时数码管开始进行30s的倒计时,直到有一个选手抢答时,对应的会在数码管上显示出该选手的编号,如果在规定的30s时间内没有做出抢答,则此题作废,即开始重新一轮的抢答。
在抢答的最后10s,蜂鸣器会给予报警提示。
当有选手抢答成功,显示基本加分60分,还可以根据回答者回答得好差适当加减分。
3各模块的选择和论证
3.1抢答器显示模块选择
显示模块主要是显示抢答的时间,组别号码等。
在使用传统的数码管显示。
数码管具有:
低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度高,称量快,精确可靠,操作简单。
数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
显示功能与硬件关系极大,当硬件固定后,如何在不引起操作者误解的前提下提供尽可能丰富的信息,全靠软件来解决。
在这里我们使用的是七段数码管显示,通常在显示上我们采用的方法一般包括两种:
一种是静态显示,一种是动态显示。
其中静态显示的特点是显示稳定不闪烁,程序编写简单,但占用端口资源多;动态显示的特点是:
显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。
在本设计中根据实际情况采用的是动态显示方法。
4位七段数码管显示电路如下图所示。
图3-14位七段数码管显示电路图
上图中数码管采用的是4位一体七段共阳数码管,其中a~dp段分别接到单片机的P0口,由单片机输出的P0口数据来决定段码值,位选码DIG1,DIG2,DIG3,DIG4分别接到单片机的P2.0,P2.1,P2.2,P2.,3,由单片机来决定当前该显示的是哪一位。
还有一个排阻,连接在P0口上,用作P0口的上拉电阻,保证P0口没有数据输出时候处于高电平状态。
通过查表法,将其在数码管上显示出来,其中P0口为字型码输入端,P2口低4位为字选段输入段。
在这里我们通过查表将字型码送给7段数码管显示的数字。
3.2控制器选择
控制器主要用于对显示、抢答、音乐、计分等模块进行控制。
采用ATMEL公司的STC89C52作为系统控制器的CPU方案。
单片机算术运算功能强,软件编程灵活、自由度大,可以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
3.3键盘选择
键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。
键盘按结构形式可以分为非编码键盘和编码键盘,前者用软件方法产生键码,而后者则用硬件方法来产生键码。
在单片机中使用的都是非编码键盘,因为非编码键盘结构简单,成本低廉,非编码键盘的类型很多,常用的有独立式键盘,行列式键盘等。
本设计采用独立式键盘
键盘接口中使用多少根I/O线,键盘中就有几个按键,键盘接口使用了8根I/O口线,该键盘就有8个按键,这种类型的键盘,其按键比较少,且键盘中各按键的工作互不干扰。
因此可以根据实际需要对键盘中的按键灵活的编码。
如图3-3。
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
图3-3独立式键盘
3.4时钟频率电路的设计
单片机必须在时钟的驱动下才能工作。
在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
时钟电路如下图所示。
图3-4外部振荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2的作用有两个:
一是帮助振荡器起振;二是对振荡器的频率进行微调。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数。
图中时钟频率为12MHz。
3.5复位电路的设计
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如下所示:
图3-5复位电路
3.6报警电路
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的巨型波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使喇叭发出不同的声音。
本文设计如下图所示。
图中单片机的14脚输出具有复合功能,此处用到了单片机14脚的IO端口功能,单片机通过内部定时器的操作实现交替变换的波形输出驱动扬声器发声。
图3-6发声电路
3.7STC89C52单片机管脚说明
图3-7STC89C52单片机管脚图
ATMEL公司的STC89C52是一种高效微控制器。
采用40引脚双列直插封装形式。
STC89C52单片机是高性能单片机,因为受引脚数目的限制,所以有不少引脚具有第二功能。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,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口将输出电流。
P3口也可作为STC89C52的一些特殊功能口,如下表所示:
P3口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INT0(外部中断0)
P3.3INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
ALE/
:
当访问外部存储器时,地址锁存允许端的输出电平用于锁存地址的地址字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
PSEN:
外部程序存储器的选通信号端。
在由外部程序存储器取指期间,每个机器周期两次PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/VP:
当
保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,
将内部锁定为RESET;当
端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
反向振荡器的输出,如采用外部时钟源驱动器件,应不接。
4系统软件的设计
4.1软件设计
系统软件由主程序和INT0中断服务组成。
主程序由验键,倒计时等功能子程序组成,系统完成初始化后循环检查各个功能当用户使用某个功能时,按下相应的按钮(或开关)单片机进入相应的功能处理。
INT0中断服务程序完成抢答信号采样和识别处理。
该智能抢答器以AT89C52单片机为控制核心,控制精度较高,操作误差主要来自晶振自身所造成的误差。
其他外围电路包括复位电路、时钟电路、报警电路、LED显示电路、抢答按键等。
该智能抢答器具有计时记忆功能,一次时间设置完,复位后不需重新进行时间设定;通过按键扫描输出按键信息,并通过单片机将它转化为在七段数码管上显示的字形符。
单片机的P1口为8组抢答按键的输入口,P0.0~P0.7为数码管的段选口,P2.0~P2.3为数码管的片选口。
P3.7为报警电路的控制口,P3.1为加分按钮的控制口,P3.2为减分按钮的控制口,P3.0为重新开始按钮的控制口。
4.2数码显示
数码显示管用来作为时间的显示输出,一般用7段数码显示管。
本次设计中采用7段共阳数码显示管应用简单、可靠性高、成本低,作为显示输出。
连接时段选信号接在P0口的P0.0~P0.7七个I/O口上,P1口是准双向I/O接口在输出驱动部分具有驱动4个TTL负载的能力,即输出电流不大于400μA,所以在接电阻时选择接5.1KΩ限流电阻。
而在位选方面采
用P2口的P2.0~P2.3用单片机四个I/O口作为位选信号的输出口。
5软硬件联调及调试结果
调试几经修改开始数码管比较暗,后来加了驱动电流放大电路,才好。
测试结果见下图:
图5-1实物图复位状态
图5-2抢答开始倒计时图5-31号选手抢答结果图5-4表现优秀多加一分
图5-3实物图(反面)
6电路板的制作与检查
考虑到本系统所用元器件较少,大部分功能都是通过软件编程来实现,同时也出于对课程设计成本的考虑,因此所用到的板子是自己手工制作的PCB板。
在电路板的制作中,首先要进行线路的排布。
利用PROTEL软件模拟实际电路板的线路走向,尽量避免线路出现交叉短路,电源线路尽量安排在电路板的最外圈。
PCB板刻录完成之后,开始进行焊接工作。
焊接完后进行电路板检查,将原线路图与实际焊接的电路板进行对比,由于线路不多,所以用万用表的欧姆档或是短路声响指示功能来做焊点的检测,如此可以避免焊接时漏焊、虚焊和配线错误的问题,同时保证了所制作出来的线路与原设计线路的一致性。
一般来说,造成硬件问题的首要问题就是焊接了,也就是说焊接的好与坏直接响产品的正常运行。
造成焊接质量不高的常见原因是:
1.焊锡用量过多,形成焊点的锡堆积;焊锡过少,不足以包裹焊点。
2.冷焊。
焊接时烙铁温度过低或加热时间不足,焊锡未完全熔化、浸润、焊锡表面不光亮(不光滑),有细小裂纹。
3.夹松香焊接,焊锡与元器件或印刷板之间夹杂着一层松香,造成电连接不良。
若夹杂加热不足的松香,则焊点下有一层黄褐色松香膜;若加热温度太高,则焊点下有一层碳化松香的黑色膜。
对于有加热不足的松香膜的情况,可以用烙铁进行补焊。
对于已形成黑膜的,则要"吃"净焊锡,清洁被焊元器件或印刷板表面,重新进行焊接才行。
4.焊锡连桥。
指焊锡量过多,造成元器件的焊点之间短路。
这在对超小元器件及细小印刷电路板进行焊接时要尤为注意。
5.焊剂过量,焊点明围松香残渣很多。
当少量松香残留时,可以用电烙铁再轻轻加热一下,让松香挥发掉,也可以用蘸有无水酒精的棉球,擦去多余的松香或焊剂。
6.焊点表面的焊锡形成尖锐的突尖。
这多是由于加热温度不足或焊剂过少,以及烙铁离开焊点时角度不当浩成的内。
最小系统的电路不工作,首先应该确认电源电压是否正常。
用电压表测量接地引脚跟电源引脚之间的电压,看是否符合电源电压,常用的是5V左右。
接下来就是检测复位引脚的电压是否正常,EA引脚的电压要正常为5V左右。
7总结
通过这次课程设计,我才明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己知识和综合素质。
总之,不管学会的还是学不会的的确觉得困难比较多,真是万事开头难,不知道如何入手。
最后终于做完了有种如释重负的感觉。
此外,还得出一个结论:
知识必须通过应用才能实现其价值!
有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。
通过这次课程设计懂得了很多,我们自己去图书馆,上网查资料然后自己和我们这组的成员一起合作商讨完成的,原以为会很简单的,但无论在制作与写作过程中我们都遇到了理论课上所不曾遇到的问题,第一是综合性强,这次制作与论文不仅涉及到我们以前所学到的单片机,模拟电子技术,数字电子技术,高等数学等课程的知识还涉及到很多我们的选修及课外的知识像实训课上学到的手工焊接技术等等知识。
第二是理论联系实际性太强,把所学的搜集到得知识运用的实际中不是一件容易的事,不仅由元件从课本上的符号到实物的认识还是理论的测量结果与实际值的误差。
在不断的努力下我们组的课程设计终于完成了。
在没有做课程设计以前觉得课程设计只是对这几年来所学知识的大概总结,但是真的面对课程设计时发现自己的想法基本是错误的。
课程设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。
课程设计是我们对所学知识理论的检验与总结,能够培养和提高设计者独立分析和解决问题的能力;课程设计提高了我们理论联系实际的能力更在知识的巩固与实际的操作上的衔接提高了我们的能力,课程设计中遇到的困难与挫折以及解决这些问题的思路与方法更增加了我们对以后工作中遇到困难克服解决的信心,也让我们积累了经验,为以后的工作打下了良好的基础,同时也培养了我们遇到突发状况要稳定冷静的精神,也培养了我们学会怎么与别人合作的方法,怎么解决与合作的伙伴意见不同一时状况,为以后怎么和同事相处好奠定了基础。
这次课程设计业也让我们懂得了分析问题,才能解决问题的道理,通过了这次更增加了我们以后能够干好自己工作的信心。
参考文献
文献、资料名称
编著者
出版单位
《基于Proteus的单片机可视软硬件仿真》
李全利迟荣强
北京航空航天大学出版社
《单片机原理及其应用技术》
陈益飞沈兆军孙干超
国防工业出版社
《单片机原理与接口技术》课程实验指导书
陆广平张兰红
盐城工学院
附录
附录1基于单片机的八路抢答器原理图
附录2基于单片机的八路抢答器PCB图
附录3基于单片机的八路抢答器proteus仿真
附录4C语言程序清单
附录1基于单片机的八路抢答器原理图
附录2基于单片机的八路抢答器PCB图
附录3基于单片机的八路抢答器proteus仿真图
附录4C语言程序清单
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitm1=P3^1;//主持人按键答对加分,按一下加一分
sbitm2=P3^2;//答错减分
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
sbitk6=P1^5;
sbitk7=P1^6;
sbitk8=P1^7;//选手按键
sbitk=P3^0;//主持人按键开始
sbitbeep=P3^7;//蜂鸣器
ucharcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x10,0xbf};//0-9代码
ucharshiwei,gewei,xuanshou,count,i,second;
ucharscore1,score2,score3,score4,score5,score6,score7,score8;//选手1~8的分数
uintt,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;
voidTimer()
{
TMOD|=0x01;
TH0=0xd8;//初值55536,计数10000次,每次1US,总计10ms
TL0=0xf0;
IE=0x82;//这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1;
}
voidtim(void)interrupt1using1//为定时中断TR0
{
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if(count==100)//100*10ms=1秒
{
count=0;
second--;//秒减1
}
}
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay(ucharshiwei,gewei,xuanshou)//显示函数
{
P2=0x09;//打开显示时间十位的位选
P0=shiwei;//显示十位
delay(5);
P2=0x0A;//个位位选
P0=gewei;
delay(5);
P2=0x00;//选手位选
P0=xuanshou;
delay(5);
}
voiddis(void)
{
shiwei=tab[second/10];
gewei=tab[second%10];
xuanshou=tab[i];
display(shiwei,gewei,xuanshou);
}
voidinit()//初始化函数
{
P2=0x03;
P0=0xc0;
t=0;
i=0;
second=29;
score1=60;
score2=60;
score3=60;
score4=60;
score5=60;
score6=60;
score7=60;
score8=60;
a1=1;
a2=1;
a3=1;
a4=1;
a5=1;
a6=1;
a7=1;
a8=1;
}
voidmain()
{
init();
if(k==0)//主持人按下开始键
{
Timer();
delay(10);
while(!
k);
while
(1)
{
dis();
m=0;
n=0;
if(second==10){beep=0;delay(500);beep=1;}
if(second==0){
TR0=0;n=1;
if(k==0)
{beep=0;delay(500);beep=1;second=29;TR0=1;m=1;}
}
if(n==0)
{
if(k1==0){delay(5);if(k1==0);while(!
k1);t=1;}
elseif(k2==0){delay(5);if(k2==0);while(!
k2);t=2;}
elseif(k3==0){delay(5);if(k3==0);while(!
k2);t=3;}
elseif(k4==0){delay(5);if(k4==0);while(!
k2);t=4;}
elseif(k5==0){delay(5);if(k5==0);while(!
k2);t=5;}
elseif(k6==0){