八路抢答器-基于单片机C语言

合集下载

八路抢答器51c语言程序

八路抢答器51c语言程序

# include <reg51.h>int status=-1; //工作状态包括:0,空闲状;1.调整;2.计时开始;3.计时临近;4.计时终止;5.误按int TimeLeft=0; //倒计时时限int TimeSet=20;int Member=-1; //相关选手号码,-1表示该数值无效unsigned short TimeCounter=0;//以10ms为单位,对定时器进行计数,以便控制数码管、蜂鸣器和抢答计时(以秒为单位)//数码管每20ms进行一次的刷新,蜂鸣器的最大响停间隔为500ms,抢答计数以1s为单位。

//计数规则:最大计数为2000,代表20s.此时计数返回0struct{int LED1,LED2,BeepMode;}OutInfo;void Init() //系统初始化,主要是中断服务程序、定时器中断和定时器相关参数设置{;//初始化过程}void /*interrupt */Timer0(){void SetBeep(int command);void SetLED(int member,int time);TimeCounter++;if(TimeCounter==TimeSet*100)TimeCounter=0; //达到了计数顶点if((TimeCounter & 0x0001)==0) //显示LEDSetLED(OutInfo.LED1,OutInfo.LED2);if(status==2 && OutInfo.BeepMode==0) //计时开始,并且方式等于间歇输出,则调用输出蜂鸣器if( ((TimeCounter%50)&0x0001) ==0)SetBeep(0);elseSetBeep(1);if(TimeCounter%100==0 && (status==2 || status==3)) //已经开始计时,则每过一秒,剩余时间的计数值减一TimeLeft--;}void SetBeep(int command){if(command==0);////关闭蜂鸣器else;////开启蜂鸣器}void SetLED(int member,int time) //当出现-1,表示不显示该数码管{void Delay1ms();;//显示人员的数码管Delay1ms();;//显示剩余时间的数码管Delay1ms();}void Delay1ms() //基数时间等于1us.{int x;for(x=1000;x;x--) ;}void main(){int getkey();void showLED();void outBeep();void changeStatus(int keycode);int keycode=0; //中间变量if(status==-1){Init();status=0;}keycode=getkey();showLED();outBeep();changeStatus(keycode);}int getkey() //对所有按键进行编码.同时修改Member的数值,以及TimeSet的值{int key=0;;////你的代码,最终取值介于1-12if(status==0 || status==2 || status==3) //需要记录用户侧的按键if(key>=5 && key<=12)Member=key-4;if(status==1) //设置状态{if(key==3)TimeSet++;if(key==4)TimeSet--;}return key;//获取按键的编码,例如把主机侧设为1、2、3、4号,把客户侧设为5-12号,把无按键或者错误按键设为-1}void showLED(){void numberLED(int x);void TimeLED(int x);switch(status){case 0: //空闲状态TimeLED(0);numberLED(-1); //如果输入Member为-1,表示有选手犯规按下break;case 1: //调整状态TimeLED(TimeSet);break;case 2: //计时开始TimeLED(TimeLeft);numberLED(Member);break;case 3: //计时临近TimeLED(TimeLeft);numberLED(Member);break;case 4: //计时终止TimeLED(TimeLeft);numberLED(Member);break;case 5: //误按状态TimeLED(0);numberLED(Member);break;default: //错误break;}}void numberLED(int x) //输入-1,表示需要禁止显示{OutInfo.LED1=x;}void TimeLED(int x){OutInfo.LED2=x;}void outBeep(){void MBeep(int mode);switch(status){case 0: //空闲状态if(Member==-1)MBeep(1);break;case 1: //调整状态MBeep(2);break;case 2: //计时开始MBeep(0);break;case 3: //计时临近MBeep(1);break;case 4: //计时终止MBeep(1);break;case 5: //误按状态MBeep(1);break;default: //错误break;}}void MBeep(int mode) //0,代表0.5s的正常计时音;1,代表连续响声;2,代表关掉声音{OutInfo.BeepMode=mode;}void changeStatus(int keycode){switch(status){case 0: //空闲状态switch(keycode){case 1:status=2;break;//开始状态case 2:break;case 3:case 4:status=1;break; //设置状态case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12: status=5;break; //误按状态}break;case 1: //调整状态,当主持人发清零命令,进入空闲状态if(keycode==2)status=0;break;case 2: //计时开始,当有效按键及时间改变时,发生切换if (keycode>=5 && keycode<=12) //用户按键status=4;elseif(TimeLeft<=5) //剩余时间status=3;break;case 3: //计时临近if (keycode>=5 && keycode<=12) //用户按键status=4;elseif(TimeLeft==0) //计时完毕status=0;break;case 4: //计时终止,只等待清零if(keycode==2)status=0;break;case 5: //误按状态,等待清零,并需要记录犯规的用户编号?? if(keycode==2)status=0;break;default: //错误break;}}/*其中,StdAfx.h的内容如下:*/#if !defined(AFX_STDAFX_H__100A4F3F_F87C_4656_BCD5_715CBC48BBB0__INCLUDED _)# define AFX_STDAFX_H__100A4F3F_F87C_4656_BCD5_715CBC48BBB0__INCLUDED_# if _MSC_VER > 1000# pragma once# endif // _MSC_VER > 1000// TODO: reference additional headers your program requires here//{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.# endif // !defined(AFX_STDAFX_H__100A4F3F_F87C_4656_BCD5_715CBC48BBB0__INCLUDED _)//结束。

基于单片机的八路抢答器设计

基于单片机的八路抢答器设计

基于单片机的八路抢答器设计单片机作为一种高性能的微处理器,能够实现实时控制、高速计算、数据存储等功能,被广泛应用于各种电子设计中。

本文将介绍一种基于单片机的八路抢答器设计。

一、设计思路本设计的主要目的是实现一个简单实用的抢答器系统,主要功能包括抢答、计分、显示和控制等。

为了实现这些功能,我们采用了AT89C52单片机,利用它的GPIO口实现八路输入、八路输出等控制功能。

同时,为了提高可靠性和稳定性,我们还加入了复位电路、晶振电路、滤波电路等必要的辅助电路。

二、硬件设计1.复位电路为了确保单片机能够正常工作,我们需要加入一定的复位电路。

复位电路的作用是在单片机上电时,将单片机复位,并确保单片机在正常工作时不出现异常。

常见的复位电路包括电容复位电路、复位芯片电路等。

本设计采用的是电容复位电路,具体电路如下图所示:2.晶振电路晶振电路是单片机正常工作的关键部分,晶振电路的稳定性直接影响系统运行稳定性。

因此,我们需要选择高质量的晶振,并且在电路设计过程中注意规范布局,保证信号传输的稳定性。

具体的电路如下图所示:3.输入电路本设计要实现的是八路输入,因此我们需要设计八路独立的输入电路。

输入电路的作用是将外部输入信号有效地输入到单片机GPIO口,以实现控制功能。

由于输入信号有可能受到外部干扰,因此我们需要加入滤波电路,此处采用RC滤波器。

4.输出电路本设计要实现的是八路输出,因此我们需要设计八路独立的输出电路。

输出电路的作用是将单片机的控制信号输出到外部电路,以实现八路LED灯的控制。

由于LED的电流较小,因此我们适当加入一个三极管,以保证LED正常工作。

三、软件设计1.主程序本设计采用C语言编写,主程序包括初始化、读取输入、判断输入、显示得分等步骤。

主程序的框架如下图所示:2.中断程序为了实现抢答功能,我们需要使用到单片机的中断功能。

当检测到有按键按下时,单片机会进入中断程序,中断程序的作用是停止倒计时并保存得分,然后将LED显示出得分数。

基于单片机八路抢答器设计

基于单片机八路抢答器设计

第一章系统方案与论证1.1 根本要求〔1〕系统容量:为满足竞赛抢答的要求,系统容量定位8路。

〔2〕系统能完成:倒计时指令发送与接收;抢答对别信息发送与接收;〔3〕抢答倒计时可在0-99秒内根据需要任意调整。

〔4〕所有信息交换都采用无线通信。

〔5〕抢答指令发出和抢答成功要有提示音。

1.2 系统方案选择1.2.1 系统根本构造框图1-1 根本系统构造框图系统工作流程:主持人电路通电后,2位数码管不断加1,以示电路可以正常工作。

主持人按下控制开关后,电路进入倒计时预设状态,设置好后再按一下控制开关,则完成预设,数码管显示预设数。

当主持人按下开场按钮后,选手可以抢答,同时数码管显示倒计时读秒,如有选手按下抢答键,数码管显示该选手的序号,同时封锁其他的抢答信号,蜂鸣器鸣叫10s,以示有人抢答成功。

如读秒归零时还无人抢答,则蜂鸣器鸣叫10s,数码管显示为不断闪亮的“00〞,以示抢答时间到。

当抢答的选手答复完毕或读秒归零后,主持人按一下开场按钮,电路即可恢复到开场抢答,倒计时读秒状态1.2.2 通信方案论证与选择要实现无线通信,可选用频分复用和时分复用两种形式。

频分复用各信道独立,不考虑信号在时间上的重叠。

但是在整个系统最少也需要8个信道,电路复杂,制作本钱高,故不取。

对实际问题进展分析,发现系统通信中,除抢答信号外,其他信号的传送都具有明显的分时性〔即各信号的传送都不可能同时出现〕。

再对抢答信号进展深入研究,发现:〔1〕人对抢答信号的反响在毫秒级是很不灵敏的,人的反响速度是在0.2s-0.8s 内随即出现。

〔2〕在比赛现场,抢答题目一般在几十秒内。

能做出答复决定的人也只在40%左右,坚决做出答复决定的占20%左右。

根据系统满容量算20*20%=4,只有4个左右的人数进入0.2—0.8s反响比赛中。

〔3〕按键反响速度也是有差异的,大概在20ms左右。

根据以上三点分析,可以定性的得出抢答信号在一定的时间区间内具有随机分时的特性。

单片机实验8路抢答器C语言版

单片机实验8路抢答器C语言版

单片机综合实验报告题目: 8路抢答器实验班级:姓名:学号:指导老师:时间:一、实验内容:以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

本实验有Protues软件仿真。

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。

当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。

二、实验电路及功能说明分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。

复位后参赛队员可继续抢答。

如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。

三、实验程序流程图:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。

主流程图如下图所示子程序四、实验结果分析五、心得体会六、程序清单#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit wela_a=P3^0;sbit wela1=P3^1;sbit wela2=P3^7;sbit rest=P3^5;sbit host=P3^6;sbit led1=P3^4;//绿灯sbit led2=P3^3;//红灯sbit led3=P3^2;//黄灯sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit key5=P1^4;sbit key6=P1^5;sbit key7=P1^6;sbit key8=P1^7;uchar x,q,d,s,ge,t0,t1,start,flag; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void init();/*初始函数申明*/void display(uchar s,uchar ge,uchar a); void delay(uint z); void keyscan();void main(){init();display(s,ge,a);while(1){if(host==0) //主持人控制开关{delay(5);if(host==0){flag=1;start=1;delay(5); 延时while(!host); 检测开关}}if(rest==0) //复位{delay(5);if(rest==0){q=30;led2=1;led3=1;x=0;delay(5);start=1;delay(5);while(!rest);}}if(flag==1){if(start==0)//选手按下,倒计10秒开始 {led3=0;wela1=0;wela2=0;delay(1);TR0=0;TR1=1;display(s,ge,a);delay(1);}if(start==1)//主持人按下,倒计时30秒{led1=0;wela1=0;wela2=0;delay(1);TR0=1;TR1=0;display(s,ge,a);delay(1);keyscan();}}}}void init()/*初始化*/{t0=0;t1=0;flag=0;q=30;d=10;wela_a=0;a=0;TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR0=0;TR1=0;}void display(uchar s,uchar ge,uchar a)/*数码管动态扫描*/{wela1=1;P0=table[ge];delay(5);wela2=1;P0=table[s];delay(5);wela_a=0;P2=table[a];delay(5);}void keyscan()/*按键扫描函数*/ {if(key1==0){delay(5);if(key1==0){a=1;P2=table[a];start=0;TR1=1;TR0=0;delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){a=2;P2=table[a];start=0;delay(5);while(!key2);}}if(key3==0){delay(5);if(key3==0){a=3;P2=table[a]; start=0;delay(5);while(!key3);}}if(key4==0){delay(5);if(key4==0){a=4;P2=table[a]; start=0;delay(5);while(!key4);}}if(key5==0){delay(5);if(key5==0){a=5;P2=table[a]; start=0;delay(5);while(!key5);}}if(key6==0){delay(5);if(key6==0){a=6;P2=table[a]; start=0;delay(5);while(!key6);}}if(key7==0){delay(5);if(key7==0){a=7;P2=table[a]; start=0;delay(5);while(!key7);}}if(key8==0){delay(5);if(key8==0){a=8;P2=table[a];start=0;delay(5);while(!key8);}}}void delay(uint z)/*延时函数*/{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1/*定时器0*/ {TH0=(65536-50000)/256;TL0=(65536-50000)%256;s=q/10;ge=q%10;t0++;if(t0==20){t0=0;q--;s=q/10;ge=q%10;if(q==0){while(1){q=0;a=0;led1=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}void time1() interrupt 3/*定时器1*/ {TH1=(65536-50000)/256;TL1=(65536-50000)%256;s=d/10;ge=d%10;t1++;if(t1==20){t1=0;d--;s=d/10;ge=d%10;if(d==0){while(1){d=0;a=0;led1=1;led3=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}//最后,给朋友们一点点提示,本程序有一点点小问题,有个中断没关,当主持人复位之后,后面的选手回答问题的时间就没有10秒了(可怜啊)。

基于c语言单片机8位竞赛抢答器设计课程设计

基于c语言单片机8位竞赛抢答器设计课程设计

课程设计报告课程名称:单片机课程设计报告题目:8位竞赛抢答器的设计学生姓名:所在学院:信息科学与工程学院专业班级:学生学号:指导教师:2013 年12月25日课程设计任务书摘要抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。

但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。

作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。

本设计是以八路抢答为基本理念。

考虑到依需设定限时回答的功能,利用AT89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。

用开关做键盘输出,扬声器发生提示。

同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-30s设定;可以显示是哪位选手有效抢答,正确按键后有5s的音乐提示(即扬声器发出响声);抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。

关键词:89c52;电路;显示;按键目录一、概述 (1)二、方案设计 (1)三、硬件电路设计 (2)1、抢答器的电路框图 (2)2、单元电路 (3)2.1、抢答器电路 (3)2.2、时序控制电路 (3)2.3、复位电路 (3)3、时钟震荡电路 (3)4、报警电路 (3)四、软件设计 (4)1、系统主程序 (4)2、系统程序 (5)五、结论与心得 (10)六、参考文献 (10)一、概述本实验电路由抢答电路、译码显示电路、主持人控制电路、定时电路、报警电路组成。

通过复位按键FW,电路进入准备就绪状态。

将抢答时间设定在30S,然后按下开始键开始抢答。

,在电路中“S0-S7”为8路抢答器的8个按键,当有键按下,程序锁定信号,从P2口输出抢答者号码的七段码值,送到数码管显示,并封锁按键,保持刚才按键按下时刻的时间,禁止其他人按键的输入,从而实现了抢答的功能。

基于单片机的八路抢答器设计

基于单片机的八路抢答器设计
[5]李仁发、肖玲、吴强.数字逻辑设计(第四版).人民邮电出版社,2006.05
[6]51单片机学习网/
[7]单片机学习网/
[8]《单片机C语言应用程序设计》第四版,马忠梅主编,北京航空航天大学
出版社
[9]《单片机开发与典型工程项目实例详解》,边海龙、孙永奎编著,电子工业
出版社
[10]《51单片机C语言教程----入门、提高、开发、拓展全攻略》,郭天祥编著,
电子工业出版社
[11]华光,陈大钦.电子技术基础.第四版.北京:高等教育出版社,1999. 1~15
[12]张延庆,张开华,朱兆宗.半导体集成电路.上海:上海科学技术出版社,1986.
[13][匈]M·赫彼.模拟集成电路.北京:高等教育出版社,1984.
G.B. Stringfellow and M.G. Craford,“High Brightness Light Emitting Diodes”, Semiconductors and Semi-metals Vol. 48,Academic Press, 1997
指导
教师
签章
年 月 日
专业毕业设计小组审查意见
年 月 日
备注
说明:毕业设计任务书由指导教师根据课题的具体情况填写,经专业毕业设计小组审查后生效。任务书必须在毕业设计开始前一个月内填写并发给学生。
5.第10~12周:软硬件综合调试。
6.第13周:整理设计论文,准备答辩。
主要
参考
文献
[1]张毅坤.单片微型计算机原理及应用,西安电子科技大学出版社1998
[2]余锡存曹国华.单片机原理及接口技术[M].陕西:西安电子科技大学出版社
[3]苏家健.单片机原理及应用技术.高等教育出版社,2004.11

基于单片机的八路抢答器设计论文

基于单片机的八路抢答器设计论文

论文(设计)题目:基于单片机的八路抢答器设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。

除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。

本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

基于单片机的八路智能抢答器的毕业设计

基于单片机的八路智能抢答器的毕业设计
本设计限定抢答人数为八人,抢答过程如下:当主持人按“抢答开始按键”后,数码显示屏显示抢答时间倒计时,并在最后五秒启动报警电路提示,在抢答时间过程中八名选手进行抢答,抢答成功后,显示模块显示选手号和回答问题时间。回答完问题后,主持人可按“停止按键”结束,新一轮抢答开始。如果在主持人没有按下“抢答开始按键”而选手就抢答,则视为犯规,显示模块显示“FF”并显示选手号码,而且报警电路进行提示。主持人按“停止按键”后,新一轮抢答开始。显示模块在初始显示、超过规定抢答时间仍无人抢答和答题超过规定时间后显示“FFF”。抢答时间和回答问题的时间可以设定,设定范围为1-99s,原始状态下抢答时间为10s,回答问题时间为30s。后台主持人可以通过“抢答时间调整键”、“回答时间调整键”和时间“加1”、“减1”按键修改抢答时间和选手回答问题的时间时间,改完后“停止按键”确定,新时间开始有效。
本系统采用软硬件结合的方法而设计,其中硬件设计是借用单片机AT89C51为中心控制模块,采用模块化设计思想,根据系统功能划分成六个模块,分别为:核心控制模块、电源模块、时钟与复位模块、按键输入模块、显示模块、报警模块。软件设计是采用汇编语言编程。
按键输入模块共有14个按键,分为抢答按键和控制按键。抢答按键共有八个,分别为S1―S8,供抢答选手进行抢答使用;控制按键有六个,分别为S9―S14,其中S9和S10分别为“抢答时间调整键”和“回答时间调整键”;S11和S12分别为时间“加1”和“减1”按键;S13和S14分别为“抢答开始按键”和“停止按键”。显示模块本系统采用四个共阳极LED数码管显示,一个数码管用来显示抢答到问题的选手的号码,两个用来显示倒计时时间,一个未使用的数码管作为以后的扩展使用。时钟与复位模块包括时钟电路和复位电路,单片机的时钟信号用来提供单片机片内各种操作的时间基准,复位操作则使单片机的片内电路初始化,使单片机从一种确定的初态开始运行。报警模块在本系统中为附加模块,它的主要用途就是起到提示并引起人们的注意。电源模块是为了增强本系统应用的广泛性而设计的模块,它的主要任务是将交流220V电压转换为系统中可以直接使用的稳定的直流+5V。

单片机实验8路抢答器C语言版

单片机实验8路抢答器C语言版
答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。
抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。
当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。
二、
分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。
抢答器具有锁存与显示功能。即选手按按钮抢答时,锁存相应的编号,并且优先抢
单片机综合实验报告
题 目
班 级:
姓 名:
学 号:
指导老师:
时 间:
一、
以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,
分别用8个按钮SO〜S7表示。本实验有Protues软件仿真。
分别设置一个抢答控制ห้องสมุดไป่ตู้关S1和复位开关S2,由主持人控制。
抢答器具有锁存与显示功能。即选手按按钮抢答时,锁存相应的编号,并且优先抢
三、实验程序流程图:
主程序
非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯
规处理程序;显示及发声程序。主流程图如下图所示
子程序
答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。参赛选手在设 定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答 的时间,并保持到主持人将系统复位为止。复位后参赛队员可继续抢答。
如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢
答,定时显示器上显示00。

基于单片机的八路抢答器的设计(C语言版)

基于单片机的八路抢答器的设计(C语言版)

毕业论文基于单片机的8路抢答器专业院系: 信息工程系班级名称: 计算机硬件与外设****: *******: ***完成时间: 2011年12月28日湖南铁道职业技术学院信息工程系2012届毕业设计任务书专业:硬件与外设班级:硬件091 填表日期:2011年11月20日指导教师王昱煜职称讲师联系电话159****7341学生姓名周俊兵课题名称基于单片机的8路抢答器的设计课题工作内容介绍单片机的选型、引脚功能等,然后分析抢答器的设计原理,从各个硬件的总体设计到局部电路设计,分析并阐述设计思路;再进行软件的设计,从程序总体流程图到关键部分的设计思路以及中断处理,最后附上程序代码。

该论文的主要内容应包括:1、单片机芯片选择(1)单片机选择(2)模块性能分析2、硬件设计(1)总体设计(2)外部振荡电路设计(3)复位电路设计(4)显示电路设计(5)按键电路设计(6)报警电路设计3、系统软件设计(1)程序总体结构图(2)程序流程图(3)主程序(4)中断处理4、总结本论文的撰写需要先设计出产品的电路图及软件系统,然后再自己焊接组装成产品,然后根据自己的设计思路及产品焊接组装流程用文字加图片的形式在文章中展示出来。

要求指标(目标)通过毕业设计,应达到以下要求:(1)熟悉单片机的型号及各引脚功能。

(2)熟悉单片机硬件电路设计。

(3)熟练单片机C语言程序设计。

(4)用C语言实现软件系统,并在仿真环境下调试运行。

(5)熟练电子元器件的焊接。

(6)根据硬件电路图和程序代码将产品制作出来并调试。

(7)撰写符合规范的毕业设计论文,对毕业设计所做的工作表达出来。

(8)掌握团队合作开发的方法。

(9)进一步积累实际的单片机产品的开发和研究经验。

进程安排(1)第1周:落实毕业设计任务,明确工作内容,部署毕业设计各项工作。

(2)第2周:查阅与课题相关或针对性强的文献5~10篇,阅读并进行归纳、总结。

(3)第3周:根据课题要求进行资料收集、整理,并写出分析报告。

单片机课程设计 八路抢答器(C语言)

单片机课程设计 八路抢答器(C语言)

单片机课程设计8路抢答器指导老师:宋*******学号:************ 班级:12电子卓越班目录一绪论 (3)二基本设计方案 (4)三具体设计 (5)四电路板的制作 (7)五电路功能测试与调试 (7)六心得体会 (8)附录 (9)一绪论1.1单片机抢答器的背景二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。

不过,这种电脑,通常是指个人计算机,简称PC机。

它由主机、键盘、显示器等组成。

还有一类计算机,大多数人却不怎么熟悉。

这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。

顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。

因为它体积小,通常都藏在被控机械的“肚子”里。

它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。

现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。

各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。

现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。

究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。

在知识竞赛中,特别是做抢答题时,在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题,必须要有一个系统来完成这个任务。

若在抢答中,只靠人的视觉(或者是听觉)是很难判断出哪一组(或哪一个选手)先抢答到题的。

利用单片机编程来设计抢答器,可以使以上问题得以解决,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题的。

本文主要介绍了抢答器的工作原理及设计,以及它的实际用途。

1.2设计要求:一、基本功能:1、六路抢答,抢答有效时相应的灯亮,并有音乐提示;2、每轮抢答需主持人按“开始”后,抢答才有效;3、抢答无效时,有相应的灯及音乐提示;二、扩展功能:1、扩展到8路或以上;2、抢答倒计时提示;3、各路的参赛者有得分显示;4、其他自行增加的功能;二基本设计方案2.1 单片机的选择我选择STC89C52单片机芯片的理由如下:1、在设计过程中可能会出现很多问题,89C52可重复烧程序;2、是80C51的增强型,功能与我们所学的51单片机基本相同;3、学校配套发的单片机开发板用的就是89C52,有很多相关教程,程序的测试与烧写都十分方便;4、器材室很方便就能领到。

《单片机应用技术(C语言)》实训课件—4.1 8路抢答器设计

《单片机应用技术(C语言)》实训课件—4.1 8路抢答器设计
否则显示“E”约3 s,继续保持锁定状态。
硬件电路
51单片机
4个按键由P0.0~P0.3控制; 共阳数码管由P1口静态控制; 由P3.0引脚控制的发光二极管 的亮灭模拟开锁电路的打开和 锁定。
程序设计思路
密码设定为“2”
if……else if …… else switch语句
#include <reg51.h> 器
P0=0xff;
//读引脚状态,需先置1
P1=disp[8];
//显示“”
while(1)
{
button=P0;
//第一次读按键状态
delay(1200);
//延时消抖
button=P0;
//第二次读按键状态
switch(button) //根据按键的值进行多分支跳转
{
case 0xfe: P1=disp[0];delay(10000);while(1);break; //0按下,显示0,待机
9 1 0 0 1 0 0 0 0 0x90 0 1 1 0 1 1 1 1 0x6F
三、程序设计
软件设计思路
使用数组存储显示数据
//定义数组led,依次存储包括0~7和“”的共阳极数码管显示码表 unsigned char code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};
//从数组中取出数码管的显示字符“” P1=disp[8];
数组定义语句中,关键字“code”是为了把disp[] 数组存储在片内程序存储器ROM中。
程序设计:
系统上电时,数码管显示“”,表示开始抢答, 当记录到最先按下的按键序号后,数码管将显示该参赛 者的序号,同时无法再接受其它按键的输入;当系统按 下复位按钮S时,系统显示“”,表示可以接受新一轮 的抢答。

八路抢答器C语言程序(带音乐)完整版

八路抢答器C语言程序(带音乐)完整版

#include <reg52.h>/*-----------------------------------------------------------宏定义------------------------------------------------------------*/#define uint unsigned int#define uchar unsigned char/*-----------------------------------------------------------共阴极数码管编码表0 - f显示------------------------------------------------------------*/unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*-----------------------------------------------------------音乐程序------------------------------------------------------------*/unsigned char timer1h,timer1l,time; //世上只有妈妈好数据表code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0}; // 音阶频率表高八位code unsigned char FREQH[]={ 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;// 音阶频率表低八位code unsigned char FREQL[]={ 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,}; /*-----------------------------------------------------------变量定义------------------------------------------------------------*/sbit key1 = P1^0;sbit key2 = P1^1;sbit key3 = P1^2;sbit key4 = P1^3;sbit key5 = P1^4;sbit key6 = P1^5;sbit key7 = P1^6;sbit key8 = P1^7;sbit state = P3^4;sbit beep = P3^5;sbit start_stop = P3^6;sbit reset = P3^7;bit start_stop_flag = 0;bit key1_flag = 0;bit key2_flag = 0;bit key3_flag = 0;bit key4_flag = 0;bit key5_flag = 0;bit key6_flag = 0;bit key7_flag = 0;bit key8_flag = 0;bit reset_flag = 0;bit action = 0;uchar second = 10;uchar timer0_count = 0;uchar number = 0;uchar number_display = 0;/*-----------------------------------------------------------延时函数------------------------------------------------------------*/ void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*----------------------------------------------------------- 数码管显示驱动函数------------------------------------------------------------*/ void display(uchar number,uchar second){uchar second_first,second_second;second_first = second / 10;second_second = second % 10;P2 = 0xfe;P0 = table[number];delay(2);P2 = 0xfd;P0 = 0x40;delay(2);P2 = 0xfb;P0 = table[second_first];delay(2);P2 = 0xf7;P0 = table[second_second];delay(2);}/*----------------------------------------------------------- 开始键扫描函数------------------------------------------------------------*/ void start_stop_keyscan(){if(start_stop == 0){delay(8);if((start_stop == 0)&&(!start_stop_flag)){start_stop_flag = 1;action = 1;TR0 = 1;state = 0;}}else{start_stop_flag = 0;}}/*----------------------------------------------------------- 八位抢答键扫描函数------------------------------------------------------------*/ uchar key_scan8(){if(key1 == 0){delay(8);if((key1 == 0)&&(!key1_flag)){key1_flag = 1;number = 1;beep=0;delay(400);beep=1;number_display = number;}}else{key1_flag = 0;number = 0;}if(key2 == 0){delay(8);if((key2 == 0)&&(!key2_flag)){key2_flag = 1;number = 2;beep=0;delay(400);beep=1;number_display = number;}}else{key2_flag = 0;number = 0;}if(key3 == 0){delay(8);if((key3 == 0)&&(!key3_flag)){key3_flag = 1;number = 3;beep=0;delay(400);beep=1;number_display = number;}}else{key3_flag = 0;number = 0;}if(key4 == 0){delay(8);if((key4 == 0)&&(!key4_flag)){key4_flag = 1;number = 4;beep=0;delay(400);beep=1;number_display = number;}}elsekey4_flag = 0;number = 0;}if(key5 == 0){delay(8);if((key5 == 0)&&(!key5_flag)){key5_flag = 1;number = 5;beep=0;delay(400);beep=1;number_display = number;}}else{key5_flag = 0;number = 0;}if(key6 == 0){delay(8);if((key6 == 0)&&(!key6_flag)){key6_flag = 1;number = 6;beep=0;delay(400);beep=1;number_display = number;}}else{key6_flag = 0;number = 0;}if(key7 == 0){delay(8);if((key7 == 0)&&(!key7_flag)){key7_flag = 1;number = 7;beep=0;delay(400);beep=1;number_display = number;}}else{key7_flag = 0;number = 0;}if(key8 == 0){delay(8);if((key8 == 0)&&(!key8_flag)){key8_flag = 1;number = 8;beep=0;delay(400);beep=1;number_display = number;}}else{key8_flag = 0;number = 0;}if(number_display != 0){return 1;}else{return 0;}}/*----------------------------------------------------------- 复位键扫描函数------------------------------------------------------------*/ void reset_keyscan(){if(reset == 0){delay(8);if((reset == 0)&&(!reset_flag)){reset_flag = 1;number_display = 0;state = 1;}}else{reset_flag = 0;}}void delay_fm(unsigned char t){ unsigned char t1;unsigned long t2;for(t1=0;t1<t;t1++){ for(t2=0;t2<8000;t2++){ ; }}TR1=0;}void time1() interrupt 3{TR1=0;beep=!beep;TH1=timer1h;TL1=timer1l;TR1=1;}void song(){ TH1=timer1h;TL1=timer1l;TR1=1;delay_fm(time);}/*-----------------------------------------------------------主函数------------------------------------------------------------*/void main(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;while(1){start_stop_keyscan();reset_keyscan();while(action){while(!key_scan8()){unsigned char k,i;TMOD=0x11; //置CT0定时工作方式1EA=1;ET1=1;//IE=0x82 //CPU开中断,CT0开中断i=0;while(i<100){ //音乐数组长度,唱完从头再来k=sszymmh[i]+7*sszymmh[i+1]-1;timer1h=FREQH[k];timer1l=FREQL[k];time=sszymmh[i+2];i=i+3;song();second = 10;break;}}TR0 = 0;second = 10;display(number_display,second);action = 0;break;}display(number_display,second);}}/*-----------------------------------------------------------中断服务函数------------------------------------------------------------*/void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;timer0_count ++;if(timer0_count == 20){timer0_count = 0;second --;if(second == 0){TR0 = 0;number_display = 0;state = 1;action = 0;}}}。

基于单片机的8路抢答器的设计

基于单片机的8路抢答器的设计

基于单片机的八路抢答器设计方案第一章抢答器设计功能分析1.1 数字抢答器的概述对于抢答器我们大家来说都不陌生, 它是用于很多竞赛场合, 真正实现先抢先答, 让最先抢到题的选手来回答问题。

抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。

选手们都站在同一个起跑线上, 体现了公平公正的原则。

1.2 设计任务与要求1.基本要求:给主持人设置一个开关, 用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。

抢答器具有数据锁存和显示的功能。

抢答开始后, 若有选手按动抢答器按钮, 编号立即锁存, 并在LED数码上显示选手的编号, 同时扬声器给出音响提示。

此外, 要封锁输入电路, 禁止其他选手抢答。

1.发挥部分:2.抢答器具有定时抢答的功能, 且一次抢答的时间可以由主持人设定(如30秒)。

当节目主持人启动“开始”键后, 要求定时器立即减计时, 并用显示器显示, 同时扬声器发出短暂的声响, 声响持续时间0.5秒左右。

3.参加选手在设定的时间内抢答, 抢答有效, 定时器停止工作, 显示器上显示选手的编号和抢答时刻的时间, 并保持到主持人将系统清零为止。

如果定时抢答的时间已到, 却没有选手抢答时, 本次抢答无效, 系统短暂报警, 并封锁输入电路, 禁止选手超时后抢答, 时间显示器上显示00。

选手如果在主持人按开始键之前违规抢答, 系统报警, LED显示违规选手号码和FF, 直到主持人按下停止键。

第二章抢答器方案论证抢答器的实现方式有种多样, 通过纯电子器件搭建电路实现, 如优先编码器, 锁存器, 555定时器译码器等, 纯电子器件实现没有软件参与, 调试简单, 但是它不易于扩展和修改, 而且电路结构复杂, 调试困难电子, 电子器件管脚很多, 实际搭建起来费时费力, 焊接很容易出错。

于是, 我想到了用单片机实现。

单片机体积小价格低, 应用方便, 稳定可靠。

单片机将很多任务交给了软件编程去实现, 大大简化了外围硬件电路, 使外围电路的实现简单方便。

推荐-基于单片机的八路数字抢答器的设计 精品

推荐-基于单片机的八路数字抢答器的设计 精品

基于单片机的八位数字抢答器一、设计目的(1) 掌握单片机芯片AT89C52的基本功能和使用。

(2) 熟悉Proteus仿真软件的使用,了解各元件的功能及作用。

(3) 掌握Keil软件的使用方法,以及如何创建文件和编写程序。

(4) 掌握基本的模拟电路和数字电路的知识。

(5) 进一步将单片机和C语言相结合,能够熟练掌握单片机的程序编写。

(6) 提高焊接能力以及实际问题分析能力。

二、设计功能利用现在市面上性价比极高且易于购买的STC89C52单片机设计一款数字抢答器,需实现以下功能:(1) 八名选手同时使用;(2) 能显示答题人的编号;(3) 需显示出剩余时间;(4) 开始与抢答成功声音提示;(5) 抢答成功的选手,前面会亮对应的灯;(6) 主持人可控制开始和结束抢答;(7) 时间可调。

三、设计思路接通电源后,系统自动复位,无需手动按复位键。

抢答器处于禁止状态,选手按抢答键无效,也不作提示。

数码管显示030,主持人这时可以按动ADD键与DEC键设置抢答剩余时间;主持人启动START键后,抢答器开始工作。

蜂鸣器给出声响提示。

抢答时间开始减少,直到有选手抢答为止。

如果在规定的时间内,没有选手抢答,抢答器自动复位。

选手在设定的时间内抢答时,抢答器完成:优先判断、编号显示、蜂鸣器提示、对应的灯亮。

当一轮抢答成之后,禁止二次抢答、数码管显示当前剩余时间。

选手答题结束后,主持人按下RESET键,抢答器复位,方可进行下一轮的抢答。

该数字抢答器的预期目标如下:(1) 抢答器同时供8名选手或8个代表队比赛,分别用8个按钮SW1 ~ SW8和8个灯D0~D7表示。

(2) 设置一个系统复位键RESET,一个系统开始键START,由主持人控制。

(3) 抢答器可自动识别抢答成功的选手,并在LED数码管上显示该选手编号,同时蜂鸣器发出提示声。

选手抢答成功后其他选手不可抢答,及按下抢答键后无效。

(4) 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(默认30秒)。

基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计(C语言)#include <reg51.h>#define uchar unsigned char#define GPIO_KEY P1sbit key1_zhuchi=P3^1; //主持人按键sbit key2_addt=P3^0; //加时按键sbit key3_mint=P3^2; //减时按键sbit beep=P1^5; //蜂鸣器报警sbit LED=P2^0; //LED指示灯sbit LSA=P2^2; //数码管位选sbit LSB=P2^3;sbit LSC=P2^4;//8段共阴数码管0~9段选uchar time,KeyValue,flag,count,m,a,tsbz;//倒计时时间,检测到的选手号,允许抢答标志,主持人按键检测次数,溢出标志,加时判断,时间调整标志uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void keyscan(); //键盘扫描函数void display(); //数码管显示函数void delay(uchar i); //延时函数void Key_down(); //选手按键按键扫描函数void main() //主函数{time=10; //初设抢答时间为10sKeyValue=0; //设置抢答没开始时选手号为0tsbz=1; //调时间标志flag=0; //答题允许标志m=0; //产生1S的溢出标志TMOD=0x01; //定时器0工作与方式1EA=1;ET0=1;while(1){keyscan();display();}}void keyscan() //键盘扫描{if(key2_addt==0&&tsbz==1) //为抢答或答题加时间{delay(8); //消抖if(key2_addt==0&&tsbz==1){while(!key2_addt);a++;if(a==1){TR0=0;time++;flag=0;}if(a==2){TR0=0;a=0;time++;flag=0;}}}if(key3_mint==0&&tsbz==1)//为抢答或答题减时间{delay(8);if(key3_mint==0&&tsbz==1){while(!key3_mint);a++;if(a==1){TR0=0;time--;flag=0;}if(a==2){TR0=0;a=0;time--;flag=0;}}}if(key1_zhuchi==0)//主持人按键按下{delay(8); //延时消抖if(key1_zhuchi==0){while(!key1_zhuchi); //按下count++;if(count==1) //主持人按键按下一次,开始抢答倒计时{tsbz=0; //不允许调时flag=1; //允许抢答TH0=0x3c;TL0=0xb0;TR0=1; //开启计时器}if(count==2) //主持人按键按下两次,切换到30s答题倒计时界面,可进行答题时间调整{LED=1;tsbz=1; //允许调整时间time=30;TR0=0; //停止计时flag=0; //不允许抢答}if(count==3) //主持人按键按下三次,答题时间开始倒计时{tsbz=0; //不允许调时TH0=0x3c;TL0=0xb0;TR0=1; //开启计时器flag=0; //不允许抢答}if(count==4) //主持人按键按下四次,全部清零{tsbz=1;TR0=0;time=10;flag=0;count=0;KeyValue=0;LED=1;}}}if(flag==1) //允许抢答后进行选手按键扫描{Key_down();}}void display() //显示函数{LSA = 1;LSB = 1;LSC = 1;P0=table[KeyValue]; //选手号码显示delay(100);P0=0x00; //消隐LSA = 0;LSB = 1;LSC =1;P0=0x40; //用来隔开时间显示和号码显示delay(100);P0=0x00; //消隐LSA = 1;LSB = 0;LSC =1;P0=table[time/10]; //计时十位显示delay(100);P0=0x00; //消隐LSA = 0;LSB = 0;LSC =1;P0=table[time%10]; //计时个位显示delay(100);P0=0x00; //消隐}void INT_0() interrupt 1 //中断函数{TH0=0x3c; //50ms定时初值TL0=0xb0;m++;if(m==20) //产生1S的时间{m=0;time--; //倒计时if(time<=5&&time>=0){uchar b=100;while(b--) //蜂鸣器报警{beep=~beep;delay(100);LED=~LED; //LED闪烁报警delay(50000);}}}if(time==0) //没选手抢答或答题时间结束{LED=0;TR0=0; //关闭定时器flag=0;//不允许抢答}}void delay(uchar i) //延时{while(i--);}void Key_down() //扫描选手按键{uchar c=100;uchar n=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下delay(8);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{GPIO_KEY=0X0F;//测试列switch(GPIO_KEY){case(0X07): KeyValue=1;break;case(0X0b): KeyValue=2;break;case(0X0d): KeyValue=3;break;case(0X0e): KeyValue=4;break;}GPIO_KEY=0XF0;//测试行switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+9;break;case(0Xe0): KeyValue=KeyValue+9;break;}}}while((n<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测{delay(8);n++;}switch(KeyValue) //读取选手按键{case 1: //一号选手抢答成功delay(8);if(KeyValue==1){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 2: //二号选手抢答成功delay(8);if(KeyValue==2){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 3: //三号选手抢答成功delay(8);if(KeyValue==3){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 4: //四号选手抢答成功delay(8);if(KeyValue==4){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 5: //五号选手抢答成功delay(8);if(KeyValue==5){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 6: //六号选手抢答成功delay(8);if(KeyValue==6){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 7: //七号选手抢答成功delay(8);if(KeyValue==7){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 8: //八号选手抢答成功delay(8);if(KeyValue==8){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;}}。

基于单片机的八路智能竞赛抢答器

基于单片机的八路智能竞赛抢答器

摘要抢答器在现实生活中应用广泛,比如在各类娱乐节目中,像中央电视台的幸运52,开心辞典,因此做一个抢答器是具有现实意义的。

抢答器具有人数限制,我们选择做八路抢答器。

当某人抢答时,能够显示他的号码,限定他的答题时间,别人不能抢答,主持人要有启动和清空的权利。

八路抢答器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。

如果在抢答中,靠视觉是很难判断出哪组先答题。

利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。

抢答组数可以在八组以内任意使用,本系统采用AT89S52单片机作为核心,控制系统的四个模块分别为:单片机最小系统、显示模块、显示驱动模块、抢答开关模块。

关键词抢答器;单片机;数码管ABSTRACTQiangda in real life applications in a wide range, such as the various types of entertainment, such as China Central Television's lucky 52, Happy Dictionary, it is a Qiangda practical significance. Qiangda restrictions on the number of features, we choose to do Qiangda eight-way device. Qiangda when a person can show his numbers, to limit his time to answer, other people can not Qiangda, and the host must start to empty. Qiangda Qiangda in eight-way process, in order to know which group or which one's first answer, we must design a system to accomplish this task. If Qiangda, it is difficult to rely on visual determine which group to answer. The use of single-chip design Qiangda system, so that the above problems are resolved, even if the two groups Qiangda the difference in time, a few microseconds, can tell which group the priority answer. Qiangda group in a number of the eight groups within the arbitrary use of this system as a single-chipAT89S52 core of the control system of the four modules are: the smallest single-chip systems, display modules, display driver module, Qiangda switch module.Key words Single-chip computer; qiangda device; digital control目录1 功能要求及方案选择 (3)1.1 功能要求 (3)1.2 方案选择 (3)2 硬件设计 (4)2.1 设计原理 (4)2.2 抢答器原理图 (4)2.3 PCB (6)3 软件设计 (9)3.1 资源分配 (9)3.2 设计思想 (9)3.3 流程图 (9)3.4 程序清单 (12)4 使用说明及设计体会 (18)4.1 使用说明 (18)4.2 设计体会 (18)参考文献 (20)致谢 (21)1 功能要求及方案选择1.1 功能要求设计一个具有特定功能的抢答器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;sbit k5=P1^4;sbit k6=P1^5;sbit k7=P1^6;sbit k8=P1^7; //选手按键sbit beep=P3^6; //蜂鸣器uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //0-9代码(共阴极)uchar shiwei,gewei,xuanshou,count,i,second;uchar score1,score2,score3,score4,score5,score6,score7,score8;//选手1~8的分数uint t,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;void Timer(){TMOD|=0x01;TH0=0xd8; //初值55536,计数10000次,每次1US,总计10msTL0=0xf0;IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时TR0=1;}void tim(void) interrupt 1 using 1 //为定时中断TR0{TH0=0xd8; //重新赋值TL0=0xf0;count++;if(count==100) //100*10ms=1秒{count=0;second--; //秒减1}}void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);//延时1ms}void display (uchar shiwei,gewei,xuanshou) //显示函数{P2=0xfe; //打开显示时间十位的位选低电平有效1111 1110 P0=shiwei;//显示十位delay(5);P2=0xfd; //个位位选1111 1101P0=gewei;delay(5);P2=0xf7; //选手位选1111 0111P0=xuanshou;delay(5);}void dis(void)//调用显示函数{shiwei=tab[second/10];gewei=tab[second%10];xuanshou=tab[i];display (shiwei,gewei,xuanshou);}void init() //初始化函数{P2=0x04;//0000 0100P0=0x3f;//数码管共阴0011 1111显示0t=0;beep=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;}void main()//主函数{init();//调用初始化函数if(k==1){ m=0; if(k1==0) {delay(5);if(k1==0);while(!k1);beep=1;delay(500);beep=0;} // 违规抢答显示号码报警while(t){if(m==0) //开关,保证程序只执行一次{switch(t){case 1:{TR0=0;i=1;second=score1;beep=1;delay(500);beep=0;a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; //有选手抢答时显示选手号码蜂鸣器响,时间为0,t和i对应}}} }if(k2==0) {delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}if(k3==0) {delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}if(k4==0) {delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}if(k5==0) {delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}if(k6==0) {delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}if(k7==0) {delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}if(k8==0) {delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}}if(k==0){Timer();//中断定时器打开delay(10);while(!k);while(1){dis();m=0;n=0;if (second==29){beep=1;delay(500);beep=0;}if(second==0){TR0=0;n=1;if(k1==0){delay(5);if(k1==0);while(!k1);t=1;beep=1;delay(500);beep=0;} // 违规抢答显示号码报警if(k2==0){delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}if(k3==0){delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}if(k4==0){delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}if(k5==0){delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}if(k6==0){delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}if(k7==0){delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}if(k8==0){delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}if(k==0){beep=1;delay(500);beep=0;second=29;TR0=1;m=1;}}//如果再次按下开始按钮,蜂鸣器响0。

5秒,定时器打开,从29开始倒计时if(n==0){if(k1==0) {delay(5);if(k1==0);while(!k1);t=1;} //正常抢答显示号码else if(k2==0) {delay(5);if(k2==0);while(!k2);t=2;}else if(k3==0) {delay(5);if(k3==0);while(!k2);t=3;}else if(k4==0) {delay(5);if(k4==0);while(!k2);t=4;}else if(k5==0) {delay(5);if(k5==0);while(!k2);t=5;}else if(k6==0) {delay(5);if(k6==0);while(!k2);t=6;}else if(k7==0) {delay(5);if(k7==0);while(!k2);t=7;}else if(k8==0) {delay(5);if(k8==0);while(!k2);t=8;}else if(k==0) {delay(5);if(k==0);while(!k);t=0;i=0;second=29;beep=1;delay(500);beep=0;TR0=1;}//从新开始,从新启动。

}while(t){if(m==0) //开关,保证程序只执行一次{switch(t){case 1:{TR0=0;i=1;second=0;beep=1;delay(500);beep=0;a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; //有选手抢答时显示选手号码蜂鸣器响,时间为0,t和i对应}case 2:{TR0=0;i=2;second=0;beep=1;delay(500);beep=0;a2=0;a1=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break;}case 3:{TR0=0;i=3;second=0;beep=1;delay(500);beep=0;a3=0;a1=1;a2=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break;}case 4:{TR0=0;i=4;second=0;beep=1;delay(500);beep=0;a4=0;a1=1;a2=1;a3=1;a5=1;a6=1;a7=1;a8=1;m=1;break;}case 5:{TR0=0;i=5;second=0;beep=1;delay(500);beep=0;a5=0;a1=1;a2=1;a3=1;a4=1;a6=1;a7=1;a8=1;m=1;break;}case 6:{TR0=0;i=6;second=0;beep=1;delay(500);beep=0;a6=0;a1=1;a2=1;a3=1;a4=1;a5=1;a7=1;a8=1;m=1;break;}case 7:{TR0=0;i=7;second=0;beep=1;delay(500);beep=0;a7=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a8=1;m=1;break;}case 8:{TR0=0;i=8;second=0;beep=1;delay(500);beep=0;a8=0;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;m=1;break;}}}if(a1==0) //选手1的分数{second=score1;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score1+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score1-=5;}dis();}else if(a2==0){ second=score2;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score2+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score2-=5;}dis();}else if(a3==0){ second=score3;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score3+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score3-=5;}second=score3;dis();}else if(a4==0){second=score4;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score4+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score4-=5;}second=score4;dis();}else if(a5==0){second=score5;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score5+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score5-=5;}second=score5;dis();}else if(a6==0){second=score6;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score6+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score6-=5;}second=score6;dis();}else if(a7==0){second=score7;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score7+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score7-=5;}second=score7;dis();}else if(a8==0){second=score8;dis();if(m1==0){delay(5);if(m1==0);while(!m1);beep=1;delay(100);beep=0;score8+=5;}else if(m2==0) {delay(5);if(m2==0);while(!m2);beep=1;delay(100);beep=0;score8-=5;}second=score8;dis();}if(k==0){i=0;t=0;second=29;beep=1;delay(500);beep=0;TR0=1;}while(!k);}}}}。

相关文档
最新文档