单片机实验8路抢答器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 _)//结束。

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

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

#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。

8位抢答器C程序(原创)

8位抢答器C程序(原创)

#include <reg51.h>#define uchar unsigned charsbit key_tiaoshi1=P3^0;//调时加按钮sbit key_tiaoshi2=P3^2;//调时减按钮sbit key_zhuchi=P3^1; //主持人控制按钮sbit beep=P3^3; //蜂鸣sbit LED=P3^4;//LED指示灯/*sbit key_1=P1^0; //八位选手按钮sbit key_2=P1^1;sbit key_3=P1^2;sbit key_4=P1^3;sbit key_5=P1^4;sbit key_6=P1^5;sbit key_7=P1^6;sbit key_8=P1^7; *///4位8段共阴数码管0~9uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar time,haoma,flag,count,m,x,a,tsbz;void keyscan(); //键盘扫描void display(); //LED显示void delay(uchar);//延时void main() //主函数{time=10; //抢答开始,倒计时10shaoma=0; //选手号显示tsbz=1; //调时间标志flag=0; //答题允许标志m=0; //产生1S的溢出标志TMOD=0x01; //定时器0工作与方式1EA=1;ET0=1;while(1){keyscan();display();}}void keyscan() //键盘扫描{ //if(key_tiaoshi1==0&&tsbz==1) //加时间{delay(8);if(key_tiaoshi1==0&&tsbz==1){ while(!key_tiaoshi1);a++;if(a==1){TR0=0;time++;flag=0;}if(a==2){TR0=0;a=0;time++;flag=0;}}}if(key_tiaoshi2==0&&tsbz==1)//减时间{delay(8);if(key_tiaoshi2==0&&tsbz==1){ while(!key_tiaoshi2);a++;if(a==1){TR0=0;time--;flag=0;}if(a==2){TR0=0;a=0;time--;}}}//if(key_zhuchi==0)//主持人按键按下{delay(8); //延时消抖if(key_zhuchi==0){while(!key_zhuchi); //按下count++;if(count==1) //主持人按一下,答题开始{ tsbz=0;flag=1;TH0=0x3c;TL0=0xb0;TR0=1;}if(count==2) //主持人按两下,30s答题倒计时{ tsbz=1;beep=1;time=30;TR0=0;flag=0;}if(count==3) //主持人按三下,答题倒计时{ tsbz=0;beep=1;TH0=0x3c;TL0=0xb0;TR0=1;flag=0;}if(count==4) //按四下,全部清零{ tsbz=1;TR0=0;haoma=0;time=10;flag=0;beep=1;LED=1;}}}if(flag==1) //允许抢答{ switch(P1) //等待按键按下{ case 0xfe:delay(8);if(P1==0xfe){flag=0;haoma=1;TR0=0;beep=0;LED=0;} break;case 0xfd:delay(8);if(P1==0xfd){flag=0;haoma=2;TR0=0;beep=0;LED=0;} break;case 0xfb:delay(8);if(P1==0xfb){flag=0;haoma=3;TR0=0;beep=0;delay(50);beep=1;} break; case 0xf7: delay(8);if(P1==0xf7) {flag=0;haoma=4;TR0=0;beep=0;LED=0;} break; case 0xef: delay(8);if(P1==0xef) {flag=0;haoma=5;TR0=0;beep=0;LED=0;} break; case 0xdf: delay(8);if(P1==0xdf) {flag=0;haoma=6;TR0=0;beep=0;LED=0;} break; case 0xbf: delay(8);if(P1==0xbf) {flag=0;haoma=7;TR0=0;beep=0;} break;case 0x7f:delay(8);if(P1==0x7f){flag=0;haoma=8;TR0=0;beep=0;LED=0;} break;}}}void display() //显示函数{ P0=table[time/10]; //计时十位显示P2=0xfe;delay(1);P2=0xff;P0=table[time%10]; //计时个位显示P2=0xfd;delay(1);P2=0xff;P0=0x49; //用来隔开时间显示和号码显示P2=0xfb;delay(1);P2=0xff;P0=table[haoma]; //选手号码显示P2=0xf7 ;delay(1);P2=0xff;}void INT_0() interrupt 1 //中断函数{TH0=0x3c; //50ms定时初值TL0=0xb0;m++;if(m==20) //产生1S的时间{m=0;time--; //倒计时}if(time==0) //没选手抢答,时间减到0 {TR0=0; //关闭定时器beep=0;//报警LED=0;flag=0; //不允许抢答}}void delay(uchar x) //延时{uchar i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}。

单片机制八路抢答器实训报告

单片机制八路抢答器实训报告

单片机制八路抢答器一、设计任务与要求1. 抢答器同时供8名选手或8个代表队比赛,分别用8个按钮S0 ~ S7表示。

2. 设置一个系统清除和抢答控制开关S,该开关由主持人控制。

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

即选手按动按钮,锁存相应的编号,并在LED数码管上显示,同时扬声器发出报警声响提示。

选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。

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

当主持人启动"开始"键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右。

5. 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止6. 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

二、方案设计1、设计原理与参考电路其工作原理为:接通电源后,主持人将开关拨到"清除"状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。

当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。

如果再次抢答必须由主持人再次操作"清除"和"开始"状态开关。

2、实训元器件清单:三、电路硬件设计1.电源:交直流均可输入,桥式整流后有1000UF电容滤波,7805稳压,输入电压较宽,适应性好,电路工作稳定;2.显示:用0。

56 英寸的共阴数码管,动态扫描,不需三极管来驱动,字符大,亮度适中;3.发声:用无源蜂鸣器。

由8050、8550复合驱动,信号用电容C7耦合,电阻R1作为泄放电荷(不发声时,迅速拉低Q1的基极电位);4.复位和时钟:这部分电路放在单片机块子的内部,节约一点空间。

REST是系统复位按钮,一般情况下不用,也可以看成是强制性停止按钮(STOP),晶振12M;5.抢答按钮:S1到S8,未按顺序排列是为了电路板设计的方便,按钮一方面与单片机的P1口相连,作为单片机的识别信号,同时也并接到74HC30数字集成块上。

基于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口输出抢答者号码的七段码值,送到数码管显示,并封锁按键,保持刚才按键按下时刻的时间,禁止其他人按键的输入,从而实现了抢答的功能。

八路抢答器电子线路设计(附C语言程序)

八路抢答器电子线路设计(附C语言程序)

电子系统课程设计姓名:___________ 周康学号:___________ 24号_______________专业班级:_________ 嵌入式10指导教师:一=朱水金设计题目:八路抢答器完成时间:2013年07月01日功能(20%实训(60%设计报告(20%总评简易难度(10%控制方式(10%原理图(10%装配图(10%元器件焊接(10%自控质量(10%功能实现(10%质量评估(10%格式(5%内容(15%应用科学学院电子系统课程设计数字抢答器由主体电路与扩展电路组成。

用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。

通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。

经过布线、焊接、调试等工作后数字抢答器成形。

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

单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。

关键字:抢答电路报警电路倒计时电路目录第一章八路抢答器的概述及制作要求 (4)1.1 数字抢答器的概述 (4)1.2 设计任务与要求 (4)第二章单片机芯片的选择及抢答器方案 (5)2.1单片机芯片的选择 (5)2.2模块性能分析 (7)第三章硬件电路设计 (8)3.1总体设计 (8)3.2外部振荡电路 (9)3.3复位电路的设计 (9)3.4显示电路的设计 (9)3.5按钮输入电路的设计 (9)3.6报警电路的设计 (9)第四章系统软件设计 (12)4.1抢答器流程图 (12)4.2抢答器程序 (12)-1 -第五章产品的样品 (25)4.1实物图 (12)4.2 PCB 版图 (12)4.1实物焊接图 (12)结束语 (25)参考文献 (28)引言:单片机的发展史单片机诞生于20世纪70年代末,经历了SCM MCU SoC三大阶段。

1.SCM即单片微型计算机(Single Chip Microcomputer )阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。

单片机、微机原理课程设计(八路抢答器)

单片机、微机原理课程设计(八路抢答器)

03
硬件电路设计
单片机、微机原理硬件电路设计
单片机:8051系列单片机,具有丰富的I/O接口和定时器/计数器资源
微机原理:基于8086/8088微处理器,具有丰富的指令集和内存资源
硬件电路设计:包括电源电路、时钟电路、复位电路、I/O接口电路、定时器/计数器电路等
八路抢答器:采用八路抢答器设计,实现八路抢答功能,具有抢答指示灯和抢答按钮等 硬件电路设计
感谢观看
汇报人:
电源电路设计
电源类型:直流电源或交流电源 电源电压:根据设备需求选择合适的电源电压 电源连接:确保电源线连接正确,避免短路或断路 电源保护:使用电源保护装置,如保险丝、断路器等,防止电源过载或短路。
04
软件程序设计
主程序流程图设计
初始化:设置抢 答器状态、显示 抢答器状态、设 置抢答时间
抢答阶段:判断 是否有人抢答、 判断抢答时间是 否结束、判断抢 答者是否正确
图设计
程序代码实现
程序设计语言:C语言
程序结构:主函数、子函数、 循环结构、条件判断等
程序功能:实现八路抢答器的 功能,包括抢答、计分、显示 等
程序优化:考虑程序的效率和 稳定性,进行优化和改进
05
系统调试与测试
系统调试步骤和方法
硬件连接:检查各模块之间的 连接是否正确,确保电源、地 线、信号线等连接无误。
八路抢答器的工作原理
八路抢答器由八路抢答按钮、八路抢答指示灯、八路抢答控制电路组成。
八路抢答按钮用于选手抢答,按下后,对应的八路抢答指示灯亮起,表示 抢答成功。
八路抢答控制电路用于控制八路抢答按钮和八路抢答指示灯的工作,确保 只有一个选手可以抢答成功。
八路抢答器通过单片机或微机原理实现,可以实时检测选手的抢答情况, 并给出相应的反馈。

单片机实验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、器材室很方便就能领到。

单片机实验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;d elay(1);T R0=0;T R1=1;display(s,ge,a);delay(1);}if(start==1)//主持人按下,倒计时30秒{led1=0;w ela1=0;w ela2=0;delay(1);T R0=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);i f(key1==0){a=1;P2=table[a];start=0;TR1=1;TR0=0;delay(5);while(!key1);}}if(key2==0){delay(5);i f(key2==0){a=2;P2=table[a]; start=0;delay(5);while(!key2);}}if(key3==0){delay(5);i f(key3==0){a=3;P2=table[a]; start=0;delay(5);while(!key3);}}if(key4==0){delay(5);i f(key4==0){a=4;P2=table[a]; start=0;delay(5);while(!key4); }}if(key5==0){delay(5);i f(key5==0){a=5;P2=table[a]; start=0;delay(5);while(!key5);}}if(key6==0){delay(5);i f(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);i f(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语言)》实训课件—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;}}}。

基于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口输出抢答者号码的七段码值,送到数码管显示,并封锁按键,保持刚才按键按下时刻的时间,禁止其他人按键的输入,从而实现了抢答的功能。

八路抢答器实验报告

八路抢答器实验报告

八路抢答器的实验报告一、设计题目八路抢答器设计二、设计要求1.设计一个竞赛抢答器, 可同时供8名选手或者8个代表队参加比赛, 他们的编号分别是 1.2.3.4.5.6.7、8, 各用一个抢答器的按钮, 按钮的编号与选手的编号相对应。

2.给节目主持人设计一个控制开关, 用来控制系统的清零和抢答开始。

3.抢答器具有数据锁存、显示的功能和声音提示功能。

抢答开始后, 若有选手按动按钮, 编号立即锁存, 在数码管上显示选手的编号, 并有声音提示。

此外, 要封锁其他选手抢答。

优先抢答的选手的编号一致保持到主持人将系统清零为止。

三、设计思路工作原理为:接通电源前, 抢答按钮与清零按钮都未按下。

接通电源后, 主持人清除开关处于工作状态, 抢答器处于工作状态, 编号显示器显示为0, 蜂鸣器未鸣响(为方便控制, 电路设计为清除开关按下时是清零状态, 未按下时为工作状态)。

等一轮抢答完成后(七段数码管显示出优先抢答队员编号, 并蜂鸣器鸣响), 主持人将清零开关按下数码管清为零, 蜂鸣器停止鸣响。

然后先后把各队员抢答按钮与主持人清零按钮复位。

即可进入下一轮抢答。

原理为:电路中清零按钮控制D触发器集成块74LS175清零端低电平输入, 按下时清零端输入为低电平(清零端低电平有效), 未按下时输入高电平。

清零后D 触发器集成块74LS175 Q`端输出全变为高电平, 使编码器74HC147(有效输入电平为低电平)无有效低电平输入, 七段数码管上显示为0。

抢答时, 队员按下抢答按钮的时间有先后次序, 电路中每个抢答按钮连接一个D触发器, 当一抢答按钮按下后其对应的触发器锁存住信号, Q`端输出有效低电平, 同时通过反馈电路使D触发器集成块得脉冲信号终止输入, 从而使其他D触发器停止工作, 抢答后也无法锁存。

达到有先输入有先锁存功能。

原理为:根据与门功能特点:只要有一低电平输入输出即为低电平。

当D触发器集成块74LS175输出端输出一有效低电平后, 电路中第7个与门U15A输出即为低电平, 而U15A输出信号又与555触发器构成的多谐振荡器输出信号相与, 因此只要U15A输出低电平, 多谐振荡器产生的脉冲就无法输入, 只有当D触发器集成块74LS175输出端输出全为高电平时脉冲才正常输入, 各D触发器正常工作。

单片机抢答器实验报告

单片机抢答器实验报告

单片机八路抢答器实验报告一实验任务1.设计一个竞赛抢答器,可同时供8名选手或者8个代表队参加比赛,他们的编号分别是1、2、3、4、5、6、7、8,各用一个抢答器的按钮,按钮的编号与选手的编号相对应。

2.给节目主持人设计一个控制开关,用来控制系统的清零和抢答开始。

3.抢答器具有数据显示,声音提示的功能。

二.源程序(1)头文件#include <REG52.H>#include <intrins.h>#include <string.h>#include <stdio.h>#define uint unsigned int#define uchar unsigned char// -------------------------------------------------------------------------------------void show(); //液晶显示程序// -------------------------------------------------------------------------------------//12864液晶显示部分子程序模块// -------------------------------------------------------------------------------------sbit LCD_RS = P2^0; //寄存器输入sbit LCD_RW = P2^1; //液晶读/写控制sbit LCD_EN = P2^2; //液晶使能控制sbit LCD_PSB = P2^3;sbit SW1 = P1^0;sbit SW2 = P1^1;sbit SW3 = P1^2;sbit SW4 = P1^3;sbit SW5 = P1^4;sbit SW6 = P1^5;sbit SW7 = P1^6;sbit SW8 = P1^7;sbit beep = P3^6;#define LCD_data P0//sbit busy=P0^7; //lcd busy bitvoid lcd_xieping0(uchar x,uchar y,uchar date);void lcd_xieping(uchar x,uchar y,uchar *str);void chn_disp0(uchar code *chn);void img_disp(uchar code *img);void lcd_xieping1(uchar x,uchar y,uchar *str);void lcd_init();void write_cmd(uchar cmd);void delay_ms1(uint z);void delay_ms(uint z);void dingding(int a);//void Init_Timer0(void);void clr(void);extern unsigned char mmm[8][9];char keynumber();(2)显示部分的程序#include "head.h"unsigned char mmm[8][9];void delay_ms(uint z)//长延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay_ms1(uint z)//长延时{uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}// ------------------------------------------------------------------------------------- // 液晶显示部分// ------------------------------------------------------------------------------------- void write_cmd(uchar cmd){LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P0 = cmd;delay_ms1(1);LCD_EN = 1;delay_ms1(1);LCD_EN = 0;}void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delay_ms1(1);LCD_EN = 1;delay_ms1(1);LCD_EN = 0;}void lcd_xieping0(uchar x,uchar y,uchar date) {switch(x){case 0: write_cmd(0x80+y); break;case 1: write_cmd(0x90+y); break;case 2: write_cmd(0x88+y); break;case 3: write_cmd(0x98+y); break;}write_dat(date);}void lcd_xieping(uchar x,uchar y,uchar *str) {switch(x){case 0: write_cmd(0x80+y); break;case 1: write_cmd(0x90+y); break;case 2: write_cmd(0x88+y); break;case 3: write_cmd(0x98+y); break;}while (*str){write_dat(*str);str++;}}void lcd_xieping1(uchar x,uchar y,uchar *str) {switch(x){case 0: write_cmd(0x84+y); break;case 1: write_cmd(0x94+y); break;case 2: write_cmd(0x8C+y); break;case 3: write_cmd(0x9C+y); break;}while (*str){write_dat(*str);str++;}}void lcd_init(){LCD_PSB = 1; //并口方式write_cmd(0x30); //基本指令操作delay_ms(5);write_cmd(0x0C); //显示开,关光标delay_ms(5);write_cmd(0x01); //清除显示内容delay_ms(5);}void chn_disp0(uchar code *chn){uchar i,j;write_cmd(0x30); //void write_cmd(uchar cmd) write_cmd(0x84);j=0;for(i=0;i<8;i++)write_dat(chn[j*16+i]);write_cmd(0x8c);j=1;for(i=0;i<8;i++)write_dat(chn[j*16+i]);}void show(){lcd_xieping(0,0,mmm[0]);lcd_xieping(0,4,mmm[1]);lcd_xieping(1,0,mmm[2]);lcd_xieping(1,4,mmm[3]);lcd_xieping(2,0,mmm[4]);lcd_xieping(2,4,mmm[5]);lcd_xieping(3,0,mmm[6]);lcd_xieping(3,4,mmm[7]);}(3)抢答器:#include "head.h"unsigned int ms,i=0;//定义全局变量bit FLag=0;//定义停止,计时标志char yy[8]={0,0,0,0,0,0,0,0};void main(){unsigned char num=0,k,j,temp;EX0=1; //外部中断0开IT0=1; //IT1=0表示边沿触发EX1=1; //外部中断1开IT1=1; //IT1=1表示边沿触发Init_Timer0();lcd_init();for(k=0;k<8;k++)for(j=0;j<8;j++)mmm[k][j]=0;//mmm[0][0]='0';mmm[1][0]='0';mmm[2][0]='0';mmm[3][0]='0';mmm[4][0]='0';mmm[5][0]='0';mmm[6][0]='0';mmm[7][0]=' 0';while(1){temp= keynumber();if(temp){mmm[i][0]=temp+'0';mmm[i][1]=':';mmm[i][2]= ms/1000+'0';mmm[i][3]=ms%1000/100+'0';mmm[i][4]=ms%100/10+'0';mmm[i][5]=ms%10+'0';mmm[i][6]='m';mmm[i][7]='s';mmm[i][8]='\0';show();i++;}show();}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/ void Init_Timer0(void){TMOD |= 0x01;EA=1;ET0=1;TR0=1;}/*------------------------------------------------定时器中断子程序------------------------------------------------*/ void Timer0_isr(void) interrupt 1{TH0=0xFC; //重新赋值1msTL0=0x66;if(FLag){ms++;if (ms==60000){ms=0;}}}/*------------------------------------------------外部中断0程序------------------------------------------------*/ void ISR_INT0(void) interrupt 0{EX0=0;dingding(50);lcd_xieping(0,2," 可以开始抢答");FLag=!FLag;}/*------------------------------------------------外部中断1程序------------------------------------------------*/ void ISR_INT1(void) interrupt 2{if(FLag==0)//停止时才可以清零clr();}/*------------------------------------------------数值清零------------------------------------------------*/ void clr(void){unsigned char k,j;for(k=0;k<8;k++) //清空显示for(j=0;j<8;j++)mmm[k][j]=0;for(k=0;k<8;k++) //清空标志yy[k]=0;ms=0; //清空计时i=0;write_cmd(0x01); //清屏}char keynumber(){if((!SW1)&&(!yy[0])){delay_ms1(20);if((!SW1)&&(!yy[0])){yy[0]=1;return 1;}}if((!SW2)&&(!yy[1])){delay_ms1(20);if(!SW2){yy[1]=1;return 2;}}if((!SW3)&&(!yy[2])) {delay_ms1(20);if(!SW3){yy[2]=1;return 3;}}if((!SW4)&&(!yy[3])) {delay_ms1(20);if(!SW4){yy[3]=1;return 4;}}if((!SW5)&&(!yy[4])) {delay_ms1(20);if(!SW5){yy[4]=1;return 5;}}if((!SW6)&&(!yy[5])) {delay_ms1(20);if(!SW6){yy[5]=1;return 6;}}if((!SW7)&&(!yy[6])) {delay_ms1(20);if(!SW7){yy[6]=1;return 7;}}if((!SW8)&&(!yy[7])){delay_ms1(20);if(!SW8){yy[7]=1;return 8;}}return 0;}void dingding(int a){int k;for(k=0;k<a;k++){beep=0;delay_ms(1);beep=1;}}。

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

单片机综合实验报告题目: 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秒了(可怜啊)。

但还是可以运行的,要求不高的朋友可借鉴一哈。

相关文档
最新文档