单片机实验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--);}。

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

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

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

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

(完整word版)第1章 单片机8路抢答器(word文档良心出品)

(完整word版)第1章 单片机8路抢答器(word文档良心出品)

第1章单片机8路抢答器1.1 功能要求抢答器是为智力竞赛参赛者大体是进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。

实现抢答器功能的方式有很多种,本项目要求利用51系列单片机作为核心部件设计一个供8名选手参加,能进行逻辑控制及显示的8路抢答器。

每名选手有一个抢答按扭,按扭的编号与选手的编号相对应,抢答器具有信号的鉴别和数据的锁存、显示的功能。

抢答开始后,若有选手抢答按扭,在数码管上显示相应的编号,蜂鸣器发出音响提示。

同时,电路应具备自锁功能,禁止其他选手再抢答,优先抢答选手的编号一直保持到主持人按开始答题开始。

抢答器具有定时抢答的功能。

在主持人发出抢答指令后,定时器立即进行减计时,并在显示器上显示,同时蜂鸣器发出短暂的声响,声响持续0.5s左右。

选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器显示选手编号及最后倒计时剩下的时间。

主持人按开始答题开始,答题时间开始倒计时。

当按复位键后,完成一次抢答流程。

系统完成的主要功能:(1)设置一个由主持人控制的系统清除和抢答控制开关,主持人提问后按动启动开关。

参加竞赛者要在最短的时间内对问题做出判断,并按下抢答按键回答问题。

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

当第一个人按下按键后,在显示器上显示此竞赛者的编号,扬声器发出短暂声响提示。

同时对其它抢答案件封锁,使其不起作用。

竞赛者的编号保持到主持人将系统清除为止。

(3)系统具有定时抢答功能,定时时间由主持人设定。

当主持人启动“开始”键后,倒计时显示定时时间。

(4)竞赛者在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示竞赛者的编号和抢答剩余的时间,并保持到主持人将系统清除为止。

(5)如在规定的抢答定时时间内无人抢答,则本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。

1.2主要器件介绍LED数码管显示器LED显示器是由发光二极管按一定结构组合起来显示字段的显示器件,也称数码管。

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

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

单片机课程设计《八路抢答器》

单片机课程设计《八路抢答器》

1 任务要求(1)实现多路抢答器功能。

(2)用LED 显示屏显示抢答提示、哪组抢答、哪组犯规、加减分情况以及每组的得分。

(3)数码显示抢答和答题时间,时间到调用LED 模块显示“时间到!”。

(4)主持人通过按钮控制抢答功能:抢答、复位、加分和减分。

2硬件设计2.1硬件分析(1)LED 显示屏模块设计LED 显示屏是用了16块8×8点阵模块,把每一行的行线连起来,每一列的列线连起来级联成64×16点阵显示屏。

通过8个74HC273锁存器把每一行的64列数据锁存起来,通过4线-16线译码器74159控制每一行打开。

4块8×8点阵模块级联成16×16点阵模块示意图如图3.1所示:图3.1 4块8×8点阵级联示意图64×16点阵模块由16块8×8点阵模块以及8块74HC273锁存器组成,锁存器负责把每一行的数据锁存起来,电路图如图3.2所示:8条行线连在一起组成16行8条列线连在一起组成16列图3.2 64×16点阵电路图(2)按键模块设计八路抢答器顾名思义有8个抢答按钮,故八路抢答器应由8个抢答键及4个功能键组成。

每一组的按键判断有相应的LED指示灯,用来指示抢答与犯规操作。

按键模块电路如图3.3及图3.4所示:图3.3 抢答按钮图3.4 主持人控制按钮(3)数码显示模块设计数码显示模块由两位数码管组成,可以显示00~99,通过位扫描显示两位数字。

数码管用来显示抢答时间以及答题时间。

数码显示模块电路如图3.5所示:图3.5 数码显示模块2.2硬件电路原理图八路抢答器由LED显示模块、数码显示模块、按键模块以及译码电路,锁存电路组成。

电路原理图如图3.6所示:图3.6 硬件电路原理图3 软件设计3.1主要模块流程图(1)开始程序流程图如图4.1所示图4.1 开始程序流程图(2)开始抢答程序流程图如图4.2所示图4.2 开始抢答程序流程图(3)判断犯规程序流程图如图4.3所示图4.3 判断犯规程序流程图(4)答题程序流程图如图4.4所示图4.4 答题程序流程图(5)加减分流程图如图4.5所示图4.5 加减分流程图3.2主要模块的程序分析本程序主要分为四部分:(1)主程序模块、(2)显示模块、(3)计时模块、(4)按键中断模块。

  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秒了(可怜啊)。

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

相关文档
最新文档