1、基于STC89C52单片机的带时间及声光提示的抢答器设计组长:常松 组员:高强摘要:本系统是基于ST89C52单片机带时间和声光提示的抢答器,它由控制核心ST89C52单片机、选手按键、主持人按键、声光提示和LED数码显示等部分组成。选手按键和主持人按键均由独立按键构成,采用扫描方式工作;声光提示部分由无源蜂鸣器提供声音提示,光提示由发光二极管提供。LED数码显示部分则是由普通发光二极管构成的数码管。关键词:STC89C52单片机 按键 无源蜂鸣器 发光二极管一、 设计任务与要求(1) 设计一个智力竞赛抢答器,可同时供8名选手或8个代表队参加比赛,编号为1、2、3、4、5、6、7、8,各用一个
2、按钮。(2) 给节目主持人设置5个控制开关,用来控制系统的清零和抢答的开始及各种时间的调节控制。(3) 抢答器具有数据锁存功能、显示功能和声光提示功能。(4) 主持人可以通过两个时间调节键来调节抢答限制时间和答题时间限制时间。需在主持人按下抢答开始后方可开始,且各个环节有相应的时间限制。(5) 显示部分用LED组成的模拟数码管来显示数字。二、 方案设计与论证 2.1 总体方案设计2.1.1方案一:基于逻辑数字电路抢答器的设计定时抢答器的总体框图如下图2.1所示,它由主体电路和扩展两部分组成。主体电路完成基本的抢答功能,即开始抢答后,当选手按动抢答键时,能显示选手的编号,同时能封锁输入电路,禁止
3、其他选手抢答。扩展电路完成定时抢答的功能。图2.1.1 方案一结构图 系统各部分采用中小规模集成数字电路,用机械开关按钮作为控制开关,完成抢答输入信号的触发。该方案的特点是中小规模集成电路应用技术成熟,性能可靠,能方便的完成选手抢答的基本功能,但是由于系统功能要求较高,所以电路连接集成电路相对较多,而且过于复杂,并且制作过程比较繁琐,使用不方便。2.1.2方案二:基于ST89C52单片机控制的抢答器的设计器 抢答器的控制核心是STC89C52单片机,用查询式键盘进行抢答。通过抢答按键模块,连接按键进行抢答。实现功能的框图如下所示,按下开始按钮,此时进入抢答状态,选手的输入采用扫描式的输入,之后
4、由相关的信息由单片机处理,送到显示部分显示。此时如果有人第一个按下相应的按键,经过单片机的处理选择,显示相应的号码,并锁存,不再响应其它按键输入。主持人系统有开始按键,限时开始按键,抢答时间调节按键,限时时间调节按键。选手系统有抢答按钮,计时显示,声光提示等。 ST89C52控制器复位电路主持人按键声光提示选手按键数码显示 图2.1.2 方案二结构图由以上可知,方案一结构太复杂,成本过高,而方案二编程简单,易于制作。所以选用方案二。2.2各个模块方案设计 2.2.1 核心控制器(1)方案一由CPLD、FPGA来作主控制器。其特点是具有用户可编程的特性,其可灵活的配置IO端口,方便的进行硬件功能
5、设置。具有静态可重复编程或在线动态重构特性,使硬件的功能象软件一样通过编程来修改,不仅使设计修改和产品升级变得十分方便,而且极大地提高了电子系统的灵活性和通用能力。(2)方案二 由单片机STC89C52进行控制,实现相关功能。STC89C52 具有以下标准功能: 8K 字节 Flash ,256 字节 RAM,32 位 I/O 口线,还可扩展外部存储器。编程容易实现,外围电路较为简单。 大规模可编程逻辑器件一般是使用状态机方式来实现,即所解决的问题都是规则的有限状态转换问题。本系统状态较多,难度较大。另外系统没有其它高标准的要求,基于成本及控制功能的考虑,最终选择了STC89C52这个比较普通
6、单片机来实现系统设计。 2.2.2 按键模块(1)方案一 独立键盘,键盘接口中使用多少根IO线,键盘中就有几个按键,这种类型的键盘,在按键比较少和IO口资源不紧张时使用。在工作中键盘的各个按键互不干扰。因此可以根据实际需要对键盘中的按键灵活的编码。如图2.2.2.1 图2.2.2.1 (2)方案二 采用矩阵式键盘,矩阵式键盘的特点是把检测线分成两组,一组为行线,一组列线,按键放在行线和列线的交叉点上,编程实现较复杂,但占用IO口较少。这种形式的键盘结构,能够有效的提高单片机IO口的利用率,适用于按键输入多的情况,如图2.2.2.2。图2.2.2.2 矩阵键盘2.2.3显示模块 (1)方案一 采
7、用点阵组成的LED屏,亮度高而且组装也容易,但编程复杂,需要较多的驱动芯片,因而成本高,不适合一般的制作。 (2)方案二 采用普通发光二极管按一定顺序排列构成数码管,虽然构成的LED灯数目多,但结构还是较简单,制作也较容易而且单片机控制也方便,成本也不是很高,因而出于成本和控制的考虑,选用方案二。三、 硬件单元电路设计与参数计算3.1单片机控制电路 图3.1 单片机控制电路 单片机控制部分的电路图如上,晶振频率为12M,P0口接上拉电阻。3.2按键电路 图3.2 按键电路 按键部分如上图所示,选手按键由P1口控制,共有8个按键;主持人按键有四个按键,由P3口控制。全部按键采用独立式键盘。3.3
8、声光提示电路 图3.3 声光提示电路 声音提示部分由无源蜂鸣器和PNP三极管构成,给其1个脉冲,它就会发出声响;光提示部分由发光二极管和限流电阻构成。3.4数码显示电路 图3.4 数码显示电路 此部分如上图所示,由140个发光二极管和28个构成,每两列二极管由单片机的一个口控制。3.5 有关参数的计算在软件编程过用到了定时/计数器0和定时/计数1,定时器1控制有人按下抢答器时“嘟”的哪一声响,其他的则由定时器0处理。定时器0和1的定时溢出时间都为20毫秒。定时/计数器0和1都工作在方式1,即16加1计数器,分为两个8位的寄存器,定时20毫秒的计算公式为TH0=(65536-2000)/256;
9、 TL0=(65536-2000)%256;TH1=(65536-2000)/256;TL1=(65536-2000)%256;TH0和TH1分别表示定时器0和1在工作方式1时的高8位寄存器,TL0和TL1则为低8位寄存器,因为定时器0和1是加1计数器,是一直加到65536溢出,变为0,所以给寄存器装入的是和65536相差2000的初值,晶振为12M,12分频后,频率为1M,也就是周期为1微秒,即为单片机每执行1条指令所用的时间,执行2000次加1,则就是2000乘以1微秒等于20毫秒。四、 软件设计与流程图 上电复位后显示模块显示“F”,程序开始对系统进行初始化。开始抢答后,若没有选手按动抢
10、答按钮则开始9秒的倒计时,直到抢答限制时间到,进入下一轮的抢答。若有选手按动抢答按钮,编号立即锁存,并在显示模块选手的编号,且伴随声音提示。在开始键没按下时,有人按了抢答器,则该人违规,数码管显示号码,与此同时LED亮,表示有人违规。其他人再按下时则不响应,优先响应第一个。有人违规及有人抢答时会发出“嘟”的一声。当抢答时间或答题时间快到时会响3下。程序流程图如下:开始初始化开始键按下?调时键按下?倒计时时间到选手按键按下判断是哪位选手先按下,显示选手号并给出声音提示选手是否作答?按下复位键加1S选手违规?声光报警并显示违规选手号按开始键按下限时开始键开始计时时间到YNNYNNYNYY 图四 程
11、序流程图 五、 总电路原理图及元器件清单5.1总原理图 总原理图如下: 图5.1 系统总原理图5.2 PCB图图5.2 系统整体PCB图5.3 整体电路仿真图以及仿真结果分析 仿真开始后,由发光二极管组成的显示电路显示“F”,当开始键按下后,便开始依次显示倒计时90,如果有选手键按下,则显示是几号按下。按下限时开始键后,便是倒计时9秒;在开始键没按下时,有人近按了抢答器,则也显示违规的号码。有人违规及有人抢答时蜂鸣器会发出“嘟”的一声。当抢答时间或答题时间快到时会响3下。如果不在三极管的基极加上一个电阻,则单片机的IO口无法输出电平,无法控制三极管的导通或截止;当三极管的C极和E极反过来时,L
12、ED灯的亮度很暗,这是因为三极管的反向电流比较小的缘故。 图5.3 系统仿真图5.4 元件清单表5-4 带时间及声光提示的抢答器元器件清单元件名称型号数量/个用途元件名称型号数量/个用途单片机STC89C521控制核心按键8选手输入晶振12M1晶振电路按键5主持人输入,复位键电容30pF2晶振电路排阻10K1上拉电阻电阻10K1复位电路发光二极管143电源指示电路,显示电路电阻2001蜂鸣器控制电路电解电容10uF/16V1复位电路电阻4702光提示电路电解电容220uF/25V1滤波电路电阻4701电源指示电路六、 安装与调试电路使用覆铜板焊接和安装,由于元器件都安装在同一面,需要屏蔽掉电阻
13、和三极管等器件;调试分软件调试和硬件调试,软件调试使用Keil软件,使用该软件可单步调试,软件调试一般包括分块调试和联机调试两个阶段。程序的分块调试一般在单片机开发板上运行,也可配合相应的硬件模块单独运行某个程序块,然后检查是否正确,如果不是预期的结果,可以通过单步运行或设置断点的方法,查出原因并加以改正,直到结果正确为止。联机调试就是将已调好的完整的程序在全部的硬件电路上运行。看是否结果是否正确,如不正确,则检查软件是否能实现所需要的功能,重新修正,直到结果正确为止。硬件调试主要检查电路是否连接正确,在保证电路无错连,开路,断路的情况下和软件配合调试,看是否能实现预期的功能。七、 性能测试与
14、分析1 上电复位后,显示部分显示字符“F”,按下开始键后,有9秒的抢答时间,如果无人抢答,则恢复显示“F”。2 如果上电后没按开始键,这时如果有人按下抢答器,则是违规,也显示违规的号码,与此同时黄灯亮。3 抢答时间和限时时间由抢答时间调节键和限时时间调节键调节,可从09调节。4 第一个选手抢答后,单片机会锁存这个编号,不再响应其他选手的抢答。5 有人抢答成功后,在显示部分显示相应的号码,按下限时开始键,将会进行最大为9秒的倒计时。6 开始键、答题限时键按下,有人违规及有人抢答时会发出“嘟”的一声。7 当抢答时间或答题时间快到时会间断响3下。 实物如图所示。八、 结论与心得 通过这次课程设计,无
15、论是在硬件方面还是软件方面我都得到了不少的收获。经过这一个月的努力,过程曲折可谓一语难尽。在此期间我也失落过,也曾一度热情高涨。从开始时满盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。 多和同学讨论,在做课程设计的过程中要不停的讨论问题,这样,可以尽可能的获取更多的想法,这样就不会使自己在做的过程中不会迷失方向,并且这样也是为了方便最后程序和硬件结合在一起。讨论不仅是一些思想的问题,还可以深入的讨论一些技术上的问题,这样可以使处自己处理问题要快一些。在整整一个月的日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有
16、学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,有时软件仿真出来了,硬件也不一定可以实现,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 对我而言,知识上的收获重要,结果不一定是最重要。九、 参考文献 1杨居义等 单片机课程设计指导 北京:清华大学出版社 2009.9:233-2452Proteus教程电子线路设计、制版与仿真/朱清慧,张凤蕊,翟天嵩 编著。-北京:清华大学出版社,2
17、008.9十、 致谢特别感谢我的指导老师彭建盛,在本系统开发中给予我悉心指导,从系统开发到结束中过程遇到很多困难都是他给我鼓励与指引,使我能够克服重重困难,将系统做完成,在此谨向彭建盛老师致以诚挚的谢意和崇高的敬意。我还要感谢在班里同学和朋友,感谢你们在我遇到困难的时候帮助我,给我支持和鼓励,感谢你们,谢谢!十一、 程序清单#include#define uchar unsigned char#define uint unsigned intchar s;uchar num=0;char time=9;/抢答时间char datitime=9;/答题限时时间uint tt,t1;/T0,T1定
18、时器定一秒bit flag,s_flag=1,b_flag,fall_flag;/标志位bit K_startcountflag,K_timecountflag;/时间调整标志位sbit K0=P30;sbit beep=P37; /蜂鸣器sbit rled=P31;/指示灯sbit K1=P10;sbit K2=P11;sbit K3=P12;sbit K4=P13;sbit K5=P14;sbit K6=P15;sbit K7=P16;sbit K8=P17;sbit K_Time=P32;/答题计时键sbit K_startcount=P33;/开始抢答时间调整键sbit K_timec
19、ount=P34;/答题计时时间调整键void delay(uchar ms)uchar y;for(;ms0;ms-)for(y=120;y0;y-);uchar code tabledu=0X80,/*0*/ 0Xf2,/*1*/ 0X48,/*2*/ 0X60,/*3*/ 0X32,/*4*/ 0X24,/*5*/ 0X04,/*6*/ 0Xf0,/*7*/ 0X00,/*8*/ 0X20,/*9*/ 0x1c,/*F*/;/共阳数码管编码void T0_Init(void)TMOD=0X01; /定时器的工作方式TH0=(65536-2000)/256; /定时20毫秒TL0=(655
20、36-2000)%256;TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;EA=1;P0=0;void Key_Scan(void)/开始键扫描if(K0=0)delay(5);if(K0=0)while(!K0);TR0=1;s=time;tt=0;flag=1;s_flag=1;b_flag=1;num=0;beep=1;rled=1;fall_flag=0;/清除违规标志位K_startcountflag=0;K_timecountflag=0;void Scan(void)/八路热键扫描(哪个键先按下,哪个优先级最高)if(K
21、1=0)delay(5);if(K1=0)while(!K1);num=1;/数码管显示1号1TR0=0;/关闭定时器0,时间停止TR1=1;/打开定时器1,使扬声器响一声s_flag=0;/关闭开始键标志位,使再按其他七个键不会响应if(K2=0)/下面七个键的处理同上delay(5);if(K2=0)while(!K2);num=2;TR0=0;TR1=1;s_flag=0;/重要if(K3=0)delay(5);if(K3=0)while(!K3);num=3;TR0=0;TR1=1;s_flag=0;if(K4=0)delay(5);if(K4=0)while(!K4);num=4;T
22、R0=0;TR1=1;s_flag=0;if(K5=0)delay(5);if(K5=0)while(!K5);num=5;TR0=0;TR1=1;s_flag=0;if(K6=0)delay(5);if(K6=0)while(!K6);num=6;TR0=0;TR1=1;s_flag=0;if(K7=0)delay(5);if(K7=0)while(!K7);num=7;TR0=0;TR1=1;s_flag=0;if(K8=0)delay(5);if(K8=0)while(!K8);num=8;TR0=0;TR1=1;s_flag=0;void display(void)if(flag=1)
23、/开始键按下,开始计时抢答if(num!=0)/如果有人抢答,则显示相应的几号P2=tabledunum;/显示几号抢到了delay(250); if(K_Time=0) num=0;else/否则没人抢答,则前面不显示几号 delay(2); P2=tabledus; delay(250); else/如果开始键没有按下,则显示F (若有违规者,则显示违规号码)或时间调整if(fall_flag=1)/违规显示if(num!=0)P2=tabledunum;/显示几号违规了delay(250);elseP0=0XFF;else/没有人违规才显示调整时间if(K_startcountflag=
24、1)P2=tabledutime;delay(250);else if(K_timecountflag=1)P2=tabledudatitime;delay(250);else/否则显示F P2=tabledu10;delay(250);void Time_Scan(void)/调整时间键扫描if(K_startcount=0)/抢答时间调整delay(5);if(K_startcount=0)while(!K_startcount);time+;if(time=10)time=0;K_startcountflag=1;/将抢答时间标志位置1K_timecountflag=0;/同时关闭答题时
25、间标志位if(K_timecount=0)/答题时间调整delay(5);if(K_timecount=0)while(!K_timecount);datitime+;if(datitime=10)datitime=0;K_timecountflag=1;K_startcountflag=0;void main(void)T0_Init();while(1)Key_Scan();/开始键扫描if(flag=0)&(s_flag=1)/当开始键没按下及没有人违规时才可进行时间调整Time_Scan();if(flag=1)&(s_flag=0)/当开始键按下及有人抢答才进行开始回答计时倒计时if
26、(K_Time=0)delay(5);if(K_Time=0)while(!K_Time);/等待按键释放s=datitime;TR0=1;tt=0;TR1=1;if(flag=0)&(s_flag=1)/违规Scan();if(num!=0)/开始键没有按下时,有人按下了抢答器,则置违规标志位fall_flag=1;rled=0;if(flag=1)&(s_flag=1)/如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描Scan();display();/显示到数码管上void timer0(void) interrupt 1TH0=(65536-2000)/256;/2msTL0=(
27、65536-2000)%256;if(b_flag)/开始(START)键按下,嘟一声(长1秒),表示开始抢答beep=beep;elsebeep=1;if(s5)/抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声if(s%2=0)b_flag=1;rled=0;elseb_flag=0;rled=1;tt+;if(tt=500)/1秒tt=0;s-;b_flag=0;/关闭开始键按下响一秒的嘟声if(s=-1)s=20;TR0=0;flag=0;/显示Fs_flag=1;num=0;rled=1;void timer1(void) interrupt 3/定时器1处理有人按下抢答器嘟一声(长1秒)TH1=(65536-2000)/256;TL1=(65536-2000)%256;beep=beep;t1+;if(t1=500)t1=0;TR1=0;21