基于单片机的智能抢答器设计毕业设计.doc
基于单片机的智能抢答器设计摘 要 8路抢答器,就是一种利用单片机功能而做出来的产品。该抢答器除具有基本的抢答功能外,还具有计时和报警功能。 主持人通过时间预设开关预设供抢答的时间,系统将完成自动倒计时。若在规定的时间内有人抢答,则计时将自动停止;若在规定的时间内无人抢答,则系统中的蜂鸣器将发响,提示主持人本轮抢答无效,实现报警功能。主持人还可以通过时间预设开关预设答题的时间,系统将完成自动倒计时。规定要在设置的答题时间内回答完问题,如在倒计时时间内没有回答完问题,实现报警功能。关键词:八路 抢答器 定时 报警1 方案设计1.1 设计方案1.1.1确定单片机的型号 根据系统的功能与要求,选择STC89C52RC单片机。1.1.2任务:设计一个供8名选手参加的八路扫描式抢答器。每组设计一个抢答按扭供参加者使用。电路具有第一抢答信号的鉴别和锁定存储功能。在主持人将系统复位并发出抢答指令后,如果参赛者在第一时间按抢答开关,则按钮指示灯灯亮并用组别电路显示出抢答者的组别。同时扬声器发出声音。电路应具有自锁功能,使其他组不起作用。1.2 系统的功能与要求 每名选手有一个抢答按扭,按扭的编号与选手的编号相对应,抢答器具有信号的鉴别和数据的锁存、显示的功能。抢答开始后,若有选手抢答按扭,在数码管上显示相应的编号,蜂鸣器发出音响提示。同时,电路应具备自锁功能,禁止其他选手再抢答,优先抢答选手的编号一直保持到主持人按开始答题开始。抢答器具有定时抢答的功能。在主持人发出抢答指令后,定时器立即进行减计时,并在显示器上显示,同时蜂鸣器发出短暂的声响,声响持续0.5s左右。选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器显示选手编号及最后倒计时剩下的时间。主持人按开始答题开始,答题时间开始倒计时。当按复位键后,完成一次抢答流程。1.3 八路抢答器的概述 本文介绍的八路数显抢答器具有电路简单、成本较低、操作方便、灵敏可靠等优点,经使用效果良好,具有较高的推广价值。可用于8组或8组以下的智力竞赛中。比赛前,将参赛组从1至8编号,每组发给对应的的一个抢答按钮。主持人按一下总控制启动键后,抢答开始。此后,哪一组最先按下抢答按钮,数码显示器就立即显示该组的组号并锁定,同时蜂鸣器发出声响。以后,按下任何一路抢答按钮均不起反应。主持人按开始答题开始,答题时间开始倒计时。当按复位键后,完成一次抢答流程。2 系统总体结构设计2.1 原理图 2.2 原理图简要说明基于这个设计的上述要求,根据功能要求,须设计有抢答电路、显示电路、主持人控制电路、定时电路、报警电路,各个电路都有其自己的功能。通过复位键,电路进入就绪状态,等待抢答。首先由主持人发布抢答命令,按下S3进入倒计时状态和抢答状态。在电路中“S7S14”为八路抢答器的8个按键,如果有人按下按键,程序就会判断是谁先按下的,然后从P0口输出抢答者号码的七段码值,送到码管显示,并封锁键盘,保持刚才按键按下时刻的时间,禁止其他人按键的输入,从而实现了抢答的功能。如果在设定的时间中没有一个人按下按键,一到时间则产生报警信号已超时,不可以抢答。当主持人,按S4键,答题开始,答题时间开始倒计时。如没有按复位键,时间倒计直到0,并报警。当要进行下一次抢答时,由主持人先按一下复位按键S2,电路复位,进入下一次抢答的就绪状态。主持人可以在抢答开始前按“S5”,”S6”可以分别设置抢答时间,和答题时间。3 各模块电路设计与实现3.1抢答器电路如图2.3所示电路,该电路完成两个功能:一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时数码管显示编号;二是禁止其他选手按键,即使其他选手操作无效。抢答器具有锁存、定时、显示和报警功能。即当抢答开始后,选手抢答按动按钮,锁存器锁存相应的选手编码,同时用LED数码管把选手的编码显示出来,并且开始抢答时间的倒计时,同时用LED数码管把选手的所剩抢答时间显示出来。而在选手按键抢答以及抢答时间倒计时到时的时候都有报警以提醒主持人和选手。3.2 时序控制电路时序控制电路是抢答器设计的关键,它要完成以下功能:A主持人按“开始”键时,抢答电路和定时电路进入正常抢答状态。B当参赛选手按动抢答键时,蜂鸣器声响,抢答电路和定时电路停止工作。C.主持人按“答题开始”键时,定时电路进入正常答题状态。3.3 复位电路的设计复位是计算机的一个重要工作状态。在单片机工作时,接电之前要复位,断电后也要复位,发生故障也要复位,在抢答器中复位则是为定时做铺垫的,在抢答之前要复位,抢答完要复位,按了复位键之后,LED的显示的是0。单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。整个复位电路包括芯片内外二部分。外部电路产生的复位信号通过复位引脚RST进入片内的斯密特触发器(抑制噪声作用)再与片内复位电路相连。复位电路每个机器周期对斯密特触发器的输出采样一次。当RST引脚端保持两个机器周期(24个时钟周期)以上的高电平时,AT89C51进入复位状态.图2-5 复位电路3.4 定时电路的设计 (1)设置一个系统清除和抢答控制开关S即复位键,该开关由主持人控制。 (2) 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动总控制启动"复位"键后,定时器进行减计时,并在显示器上显示。 (3) 抢答器要具有数据锁存和显示的功能,参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,并在LED数码管上显示,同时扬声器发出报警声响提示。显示器上显示选手的编号,同时其他人在按就无效,并一直保持到主持人将系统清除为止。(4) 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示0,并发出一段时间的报警声。(5)3.5 报警电路设计 10K的电阻,一个三级管和一个蜂鸣器就组成了一个报警的电路,当选手开始抢答是蜂鸣器便提醒主持人是哪一个台号,当在设定的时间内没有人抢答,倒计时完毕后蜂鸣器也会发出短时间的叫声。图(2)中,接在三极管基极的10K电阻为限流电阻,在此利用晶体管的高电流增益,以达到电路快速饱和的目的。图2-6 报警电路3.6 LED数码显示器及驱动电路LED是发光二极管的缩写,LED显示器由若干个发光二极管构成的,当发光二极管导通时,显示对应的字符。LED显示器由7个发光二极管组成,也称为7段显示器,排列形状。LED显示器还有一个圆点型的发光二极管,用于显示小数点,有时也称为8段LED显示器。LED显示器的发光二极管有共阴极和共阳极两种接法。共阴极接法,各发光二极管的阴极连在一起并接地,当某一发光二极管的阳极输入高电平时,则该段发光;共阳极接法,各发光二极管的阳极连在一起并接+5V,当阴极输入低电平时,该段发光二极管发光。3.7 电源电路图2-8 电源电路电源通过USB数据线,接电脑USB口供+5V电,这样方便简单。4 软件设计 程序流程图4.1 系统主要程序设计4.1.1 系统主程序设计 为了能达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前设定抢答的时间。当时间设好了之后,主持人发布抢答命令。按下S3按键后,程序开始打开,定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。当扫描到有人按下了键,马上关闭T0,调用显示程序,并封锁键盘。按下S4键后,定时中断开始倒计时,并扫描复位键是否按下。4.1.2抢答器的源程序 P1.0-P1.7为八路抢答器的输入端口,数码管断选P0口,位选P2口,蜂鸣器输出为P3.7。程序框架图:开始P1.5=0? N NP1.0=0? Y 调用响铃,显示程序调用响铃,显示程序 Y NP1.1=0? N P1.6=0? Y 调用响铃,显示程序 Y调用响铃,显示程序 NP1.7=0?P1.2=0? Y N Y 调用响铃,显示程序调用响铃,显示程序 NP1.3=0? Y结束调用响铃,显示程序 NP1.4=0? Y调用响铃,显示程序开 始主程序框图:P1 口 全 置1 关 闭 显 示 个位送“0”,十位全灭(送FF) 设定中断方式,下 降沿有效 开 四 个 中 断 关 提 示 音 十位位码取低电平(即0送到p3.0口) 十位字符码送P0口 延 时 十位位码取高电平(即1送P3.0口) 个位位码去低电平(即0送P3.1口) 个位字符码送P0口 延 时 个位位码取高电平(即1送P3.1口) 5 调试5.1硬件调试过程接完毕后,在接通电源前。先检查一下焊接电路板有没有虚焊,和电源正负有没有短路的现象,再接通电源。如通电源后,发现数码管不亮,要立刻切断电源,再做仔细的检查,改正后再进行测试,直到正常为止。 电源检查通电后,再进行功能调试。首先看下数码管各断码显示是否正常,如发现显示乱码,就依次检查各断码对应的线路,直到正常显示。再检查各个按键,是否达到了功能要求,及蜂鸣器是否正常响。5.2软件调试软件调试是通过对用户程序的编译、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。程序运行后编辑,查看是否有逻辑的错误。常见的软件错误有:程序失控、中断错误、输入输出错误和结果不正确等,对不同的错误和现象采取相应的方法找出错误并加以修改程序,达到预期的功能。6 总结此次设计要求我们在老师的指导下独立进行查阅资料,设计方案与组织实验等工作,并写出报告。这次实验对于提高我们的素质和科学实验能力非常有益,为以后从事电子电路方面的设计,研制电子产品打下基础。通过这两个多月的学习,发现了自己的很多不足,自己知识的很多漏洞,看到了自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。这次的设计也让我看到了团队的力量,我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。刚开始的时候,大家就分配好了各自的任务,大家有的绘制原理图,进行仿真实验,有的积极查询相关资料,并且经常聚在一起讨论各个方案的可行性。在设计中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。虽然这只是一次的极简单的制作(八路抢答器),可是平心而论,也耗费了我们不少的心血,这就让我不得不佩服专门搞单片机开发的技术前辈,才意识到老一辈对我们社会的付出,为了人们的生活更美好,他们为我们社会所付出多少心血啊!通过这次设计,为完成这次设计我们确实很辛苦,但苦中仍有乐,和团队人员这十几天的一起工作的日子,让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,大学里两年的相处还赶不上这两个月的实习,我感觉我和同学们之间的距离更加近了。这个工程确实很累,但当我们仿真实验成功的时候,当我们连好线,按下按钮,LED亮了起来,喇叭响起的是我一生以来最好听的声音,我们的心中就不免兴奋,不免激动。对我而言,知识上的收获重要,精神上的丰收更加可喜。在此要特别感谢我的指导老师对我们的指导,在此向老师说一声,老师您辛苦了!当然我也要感谢我们同组的人的积极合作。在老师的启发和我们共同的努力下,我们才能顺利的完成设计。在以后的工作中,我一定会更加努力的学习,充分的发挥自己的特长。参考文献1 朱运利. 单片机技术应用. 北京:机械工业出版社, 2005年1月第一版.2 张大彪. 电子技能与实训. 北京:电子工业出版社, 2004年7月.3 李 华. MCS-51单片机接口技术及应用. 北京:北京航天航空大学出版社. 附录A 程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intchar s;uchar num=0;char time=20;char datitime=30;uint tt,t1;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_timecount=P34;void delay(uchar ms)uchar y;for(;ms>0;ms-)for(y=120;y>0;y-);uchar code tabledu=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uchar code tablewe=0XFE,0XFD,0XFB,0XF7;void T0_Init(void)TMOD=0X01;TH0=(65536-2000)/256;TL0=(65536-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(10);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(K1=0)delay(10);if(K1=0)while(!K1);num=1;TR0=0;TR1=1;s_flag=0;if(K2=0)delay(10);if(K2=0)while(!K2);num=2;TR0=0;TR1=1;s_flag=0;if(K3=0)delay(10);if(K3=0)while(!K3);num=3;TR0=0;TR1=1;s_flag=0;if(K4=0)delay(10);if(K4=0)while(!K4);num=4;TR0=0;TR1=1;s_flag=0;if(K5=0)delay(10);if(K5=0)while(!K5);num=5;TR0=0;TR1=1;s_flag=0;if(K6=0)delay(10);if(K6=0)while(!K6);num=6;TR0=0;TR1=1;s_flag=0;if(K7=0)delay(10);if(K7=0)while(!K7);num=7;TR0=0;TR1=1;s_flag=0;if(K8=0)delay(10);if(K8=0)while(!K8);num=8;TR0=0;TR1=1;s_flag=0;void display(void)if(flag=1)if(num!=0)P0=tabledunum;P2=tablewe0;delay(2);P0=0;P2=0XFF;elseP0=0;P2=0XFF;P0=tabledus/10;P2=tablewe2;delay(2);P0=0;P2=0XFF;P0=tabledus%10;P2=tablewe3;delay(2);P2=0XFF;P0=0;elseif(fall_flag=1)if(num!=0)P0=tabledunum;P2=tablewe0;delay(2);P0=0;P2=0XFF;P0=tabledu15;P2=tablewe2;delay(2);P0=0;P2=0XFF;P0=tabledu15;P2=tablewe3;delay(2);P0=0;P2=0XFF;elseP0=0;P2=0XFF;elseif(K_startcountflag=1)P0=0X40;P2=tablewe0;delay(2);P0=0;P2=0XFF;P0=0X40;P2=tablewe1;delay(2);P0=0;P2=0XFF;P0=tabledutime/10;P2=tablewe2;delay(2);P0=0;P2=0XFF;P0=tabledutime%10;P2=tablewe3;delay(2);P0=0;P2=0XFF;else if(K_timecountflag=1)P0=0X07;P2=tablewe0;delay(2);P0=0;P2=0XFF; P0=0x31;P2=tablewe1;delay(2);P0=0;P2=0XFF;P0=tabledudatitime/10;P2=tablewe2;delay(2);P0=0;P2=0XFF;P0=tabledudatitime%10;P2=tablewe3;delay(2);P0=0;P2=0XFF;elseP0=tabledu15;P2=tablewe0;delay(2);P0=0;P0=tabledu15;P2=tablewe2;delay(2);P0=0;/P2=0XFF;P0=tabledu15;P2=tablewe3;delay(2);P0=0;P2=0XFF;void Time_Scan(void)if(K_startcount=0)delay(10);if(K_startcount=0)while(!K_startcount);time+;if(time>50)time=20;K_startcountflag=1;K_timecountflag=0;if(K_timecount=0)delay(10);if(K_timecount=0)while(!K_timecount);datitime+;if(datitime>60)datitime=30;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(K_Time=0)delay(10);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=(65536-2000)%256;if(b_flag)beep=beep;elsebeep=1;if(s<5)if(s%2=0)b_flag=1;rled=0;elseb_flag=0;rled=1;tt+;if(tt=500)tt=0;s-;b_flag=0; if(s=-1)s=20;TR0=0;flag=0;s_flag=1;num=0;rled=1;void timer1(void) interrupt 3TH1=(65536-2000)/256;TL1=(65536-2000)%256;beep=beep;t1+;if(t1=500)t1=0;TR1=0;附录B 仿真截图