八路抢答器单片机程序
基于单片机8路抢答器的设计与实现

基于单片机8路抢答器的设计与实现引言:抢答器是一种用于比赛或考试中进行抢答的设备,它可以实现多个参与者同时抢答,实时显示最先抢答者的编号。
本文将介绍一种基于单片机的8路抢答器的设计与实现。
一、设计方案:1.硬件设计:本设计采用单片机作为主控制器,使用LED显示器显示抢答编号。
按键用于选择参与抢答的编号。
____________________+------------------,P1.0,,P1.1,,P1.2,,P1.3Infrared sensor ----- ------- ----- -----+------------------,P1.4,,P1.5,,P1.6,,P1.7LED display ----- ------- ----- -----+---------------+---------+---------+---------+---------+AVRMicrocontroller+---------------+---------+---------+2.软件设计:本设计的软件部分主要涉及中断、定时器、按键扫描和显示控制几个方面的内容。
(1)中断:使用外部中断响应红外传感器的触发信号,并处理中断程序。
(2)定时器:使用定时器来实现LED显示的时序控制,以达到流畅的显示效果。
(3)按键扫描:定时扫描按键,当一些按键按下时,触发相应的抢答编号。
(4)显示控制:根据抢答编号,通过对LED显示器的控制,实现编号的显示。
二、实现步骤:1.硬件部分的实现:(1)按照上述连接图的方式,将红外传感器和LED显示器与单片机进行连接。
(2)编写硬件程序,对红外传感器和LED显示器进行初始化配置。
2.软件部分的实现:(1)编写中断服务函数,用于响应红外传感器的触发信号,并完成相应的中断处理。
(2)编写定时器中断服务函数,用于控制LED显示的时序。
(3)编写按键扫描函数,用于检测按键是否按下,并触发相应的抢答编号。
单片机课程设计《八路抢答器》

目录1 引言 (1)2 任务要求 (1)3 硬件设计 (1)3.1硬件分析 (1)3.2硬件电路原理图 (3)4 软件设计 (4)4.1主要模块流程图 (4)4.2主要模块的程序分析 (7)5 仿真分析 (35)6 课程设计总结 (39)参考文献 (40)附录(源程序清单) (41)1 引言在生活中很多情况都要使用到抢答,如知识抢答竞赛、游戏娱乐抢答等活动,如果仅用举手的方法,这在一定程度上会因为主持人的误判造成抢答的不公平。
为了公平、准确地判断出第一个抢答者,一个能够提供多路抢答、显示抢答信息和计分、计时的智能抢答器必不可少。
2 任务要求(1)实现多路抢答器功能。
(2)用LED显示屏显示抢答提示、哪组抢答、哪组犯规、加减分情况以及每组的得分。
(3)数码显示抢答和答题时间,时间到调用LED模块显示“时间到!”。
(4)主持人通过按钮控制抢答功能:抢答、复位、加分和减分。
3 硬件设计3.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点阵级联示意图8条行线连在一起组成16行8条列线连在一起组成16列64×16点阵模块由16块8×8点阵模块以及8块74HC273锁存器组成,锁存器负责把每一行的数据锁存起来,电路图如图3.2所示:图3.2 64×16点阵电路图(2)按键模块设计八路抢答器顾名思义有8个抢答按钮,故八路抢答器应由8个抢答键及4个功能键组成。
每一组的按键判断有相应的LED指示灯,用来指示抢答与犯规操作。
按键模块电路如图3.3及图3.4所示:图3.3 抢答按钮图3.4 主持人控制按钮(3)数码显示模块设计数码显示模块由两位数码管组成,可以显示00~99,通过位扫描显示两位数字。
基于单片机八路抢答器设计

基于单片机八路抢答器设计设计基于单片机的八路抢答器,需要考虑以下几个方面:硬件设计、软件设计以及抢答器工作流程。
硬件设计:1.单片机选择:可以选择一款具有较多IO引脚和较强处理能力的单片机,如STC89C51、这款单片机具有40个IO口,并且内部集成了PWM、ADC等模块,适合本次设计。
2.触发器设计:使用8个按钮作为触发器,每个按钮与一个IO口连接。
当有用户按下按钮时,会通过IO口向单片机发送一个高电平信号。
3.显示模块设计:可以使用LED灯作为显示模块,用于显示抢答的结果。
每个参与者对应一个LED灯,抢答成功的参与者对应的LED灯会亮起。
4.电源模块设计:使用适配器将220V交流电转换为5V直流电,供给单片机和LED灯。
5.电路连接:将按钮和LED灯与IO口连接,并接地,保持电路的正确连接。
软件设计:1.IO口初始化:将涉及到的IO口初始化为输入或输出口。
2.中断设置:将按钮连接到中断引脚,当按钮按下时,触发中断。
在中断函数内根据按下的按钮编号,判断抢答的结果。
3.抢答逻辑:设计一个数组来保存参与抢答者的结果。
当用户按下按钮后,根据按下按钮的编号,将结果保存到数组中。
根据题目的要求,可以选择先按下的为正确答案或者最后按下的为正确答案。
4.显示结果:根据抢答结果,控制相应的LED灯点亮或熄灭。
抢答器工作流程:1.开机初始化:开机后,进行硬件初始化,包括IO口的初始化和LCD屏幕的初始化。
2.抢答准备:显示等待抢答,等待用户按下按钮。
3.抢答开始:当用户按下按钮后,系统根据按下按钮的编号判断答案是否正确,并将结果保存到数组中。
4.结果显示:根据抢答结果,控制相应的LED灯点亮或熄灭,显示抢答结果。
5.重置抢答器:在每轮抢答结束后,将抢答器重置为初始状态,清空结果数组,准备下一轮抢答。
通过上述硬件设计、软件设计以及抢答器工作流程的设计,实现了基于单片机的八路抢答器。
抢答器的设计可以根据实际需求进行修改和扩展,例如增加显示屏幕显示更多信息、添加声音提示等,以满足不同的使用场景。
基于单片机的八路抢答器设计

基于单片机的八路抢答器设计单片机作为一种高性能的微处理器,能够实现实时控制、高速计算、数据存储等功能,被广泛应用于各种电子设计中。
本文将介绍一种基于单片机的八路抢答器设计。
一、设计思路本设计的主要目的是实现一个简单实用的抢答器系统,主要功能包括抢答、计分、显示和控制等。
为了实现这些功能,我们采用了AT89C52单片机,利用它的GPIO口实现八路输入、八路输出等控制功能。
同时,为了提高可靠性和稳定性,我们还加入了复位电路、晶振电路、滤波电路等必要的辅助电路。
二、硬件设计1.复位电路为了确保单片机能够正常工作,我们需要加入一定的复位电路。
复位电路的作用是在单片机上电时,将单片机复位,并确保单片机在正常工作时不出现异常。
常见的复位电路包括电容复位电路、复位芯片电路等。
本设计采用的是电容复位电路,具体电路如下图所示:2.晶振电路晶振电路是单片机正常工作的关键部分,晶振电路的稳定性直接影响系统运行稳定性。
因此,我们需要选择高质量的晶振,并且在电路设计过程中注意规范布局,保证信号传输的稳定性。
具体的电路如下图所示:3.输入电路本设计要实现的是八路输入,因此我们需要设计八路独立的输入电路。
输入电路的作用是将外部输入信号有效地输入到单片机GPIO口,以实现控制功能。
由于输入信号有可能受到外部干扰,因此我们需要加入滤波电路,此处采用RC滤波器。
4.输出电路本设计要实现的是八路输出,因此我们需要设计八路独立的输出电路。
输出电路的作用是将单片机的控制信号输出到外部电路,以实现八路LED灯的控制。
由于LED的电流较小,因此我们适当加入一个三极管,以保证LED正常工作。
三、软件设计1.主程序本设计采用C语言编写,主程序包括初始化、读取输入、判断输入、显示得分等步骤。
主程序的框架如下图所示:2.中断程序为了实现抢答功能,我们需要使用到单片机的中断功能。
当检测到有按键按下时,单片机会进入中断程序,中断程序的作用是停止倒计时并保存得分,然后将LED显示出得分数。
八路抢答器-基于单片机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。
单片机课程设计(八路抢答器)

单片机课程设计八路抢答器一设计要求:①如果想调节抢答时间或答题时间,按“抢答时间调节”键或“答题时间调节”键进入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下“加1s”键,如果想减一秒按一下“-1s”键,时间LED上会显示改变后的时间,调整范围为0s~99s, 0s时再减1s会跳到99,99s时再加1s会变到0s。
②主持人按“抢答开始”键,会有提示音,并立刻进入抢答倒计时(预设30s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设60s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。
倒数时间到小于5s会每秒响一下提示音。
③如倒计时期间,主持人想停止倒计时可以随时按“停止”按键,系统会自动进入准备状态,等待主持人按“抢答开始”进入下次抢答计时。
④如果主持人未按“抢答开始”键,而有人按了抢答按键,犯规抢答,LED上不断闪烁FF和犯规号数并响个不停,直到按下“停止”键为止。
⑤P3.0为开始抢答,P3.1为停止,p1.0-p1.7为八路抢答输入数码管段选P0口,位选P2口低3位,蜂鸣器输出为P3.6口。
P3.2抢答时间调整结,P3.3回答时间调整,P3.4为时间加1调整,P3.5为时间减1调整。
⑥当参赛选手在回答问题时要求使用锦囊,则主持人按下抢答开始键,计时重新开始。
二设计思路:系统设计主要包括硬件和软件两大部分,依据控制系统的工作原理和技术性能,将硬件和软件分开设计。
硬件设计部分包括电路原理图、合理选择元器件、绘制线路图,然后对硬件进行调试、测试,以达到设计要求。
软件设计部分,首先在总体设计中完成系统总框图和各模块的功能设计,拟定详细的工作计划;然后进行具体设计,包括各模块的流程图,选择合适的编程语言和工具,进行代码设计等;最后是对软件进行调试、测试,达到所需功能要求。
在系统设计中设计方法的选用是系统设计能否成功的关键。
硬件电路是采用结构化系统设计方法,该方法保证设计电路的标准化、模块化。
单片机、微机原理课程设计(八路抢答器)

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

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

基于51单片机八路抢答器程序代码程序代码:```#include <reg51.h>// 定义IO口sbit buzzer = P2^0; // 蜂鸣器sbit led1 = P2^1; // LED1 sbit led2 = P2^2; // LED2 sbit led3 = P2^3; // LED3 sbit led4 = P2^4; // LED4 sbit led5 = P2^5; // LED5 sbit led6 = P2^6; // LED6 sbit led7 = P2^7; // LED7// 定义全局变量unsigned char num = 0; // 计数器int flag = 0; // 抢答标志位// 延时函数void delay(unsigned int t) {unsigned int i, j;for(i=0;i<t;i++) {for(j=0;j<110;j++);}}// 抢答函数void answer() interrupt 0 {flag = 1; // 标志位变为1 num ++; // 计数器加1 }}// 主函数void main() {// 初始化定时器TMOD = 0x01;TH0 = 0xF8;TL0 = 0xCC;ET0 = 1;EA = 1;TR0 = 1;buzzer = 0;led1 = 1;led2 = 1;led3 = 1;led4 = 1;led5 = 1;led6 = 1;led7 = 1;// 主循环while(1) {if(num == 1) { buzzer = 1; led1 = 0; delay(500);delay(2000);num = 0;} else if(num == 2) { buzzer = 1;led2 = 0;delay(500);buzzer = 0;led2 = 1;delay(2000);num = 0;} else if(num == 3) { buzzer = 1;led3 = 0;delay(500);delay(2000);num = 0;} else if(num == 4) { buzzer = 1;led4 = 0;delay(500);buzzer = 0;led4 = 1;delay(2000);num = 0;} else if(num == 5) { buzzer = 1;led5 = 0;delay(500);delay(2000);num = 0;} else if(num == 6) { buzzer = 1;led6 = 0;delay(500);buzzer = 0;led6 = 1;delay(2000);num = 0;} else if(num == 7) { buzzer = 1;led7 = 0;delay(500);delay(2000);num = 0;}}}```该代码实现了一个基于51单片机的八路抢答器系统,使用了定时器和中断来控制抢答过程。
52单片机 八路抢答器

1. 简介52单片机八路抢答器是一种基于52单片机的抢答系统。
它通过连接八个抢答器和主控板,实现了抢答互动的功能。
这个文档将介绍该抢答器的硬件设计、软件设计以及使用方法。
2. 硬件设计2.1 抢答器设计抢答器由按钮、LED指示灯和蜂鸣器组成。
按下按钮后,LED指示灯亮起,蜂鸣器发出声音表示抢答成功。
抢答器与主控板通过信号线连接。
2.2 主控板设计主控板由52单片机、LCD显示屏和八个抢答器接口组成。
它负责控制抢答流程、显示抢答结果以及与抢答器进行通信。
3. 软件设计3.1 抢答流程设计抢答流程分为三个阶段:准备阶段、抢答阶段和显示阶段。
在准备阶段,主控板初始化系统,并等待开始信号。
在抢答阶段,主控板读取抢答器按键状态,记录第一个按下按钮的抢答器编号,并发出抢答成功信号。
在显示阶段,主控板向LCD屏幕显示抢答器编号和抢答结果。
3.2 通信协议设计主控板与抢答器之间使用简单的串口通信进行数据交换。
协议格式为:开始标志位 + 抢答器编号 + 结束标志位。
开始标志位和结束标志位用于标识数据的开始和结束。
3.3 主控板软件实现在主控板软件中,使用C语言编写了以下功能模块:初始化系统、串口通信、抢答流程控制、LCD显示控制和中断处理。
每个模块通过函数调用的方式进行交互,实现了抢答系统的功能。
4. 使用方法使用52单片机八路抢答器的方法如下: 1. 连接抢答器和主控板,确保电路接线正确。
2. 上传主控板软件到52单片机。
3. 按下主控板上的开始按钮,启动抢答系统。
4. 抢答器的LED指示灯亮起后,用户可以按下按钮进行抢答。
5. 主控板将抢答器编号和抢答结果显示在LCD屏幕上。
5. 注意事项使用52单片机八路抢答器时需要注意以下事项: - 确保电路接线正确,避免短路或连接错误。
- 注意抢答器和主控板的电源供应,避免电压不稳或过高。
- 在固件升级或维修时,断开电源并小心操作,防止损坏设备。
- 遵循使用手册中的操作指南,避免不正确的使用方法导致系统故障。
单片机课程设计:八路抢答器设计 精品

摘要抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。
但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。
作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。
本设计是以八路抢答为基本理念。
考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。
用开关做键盘输出,扬声器发生提示。
同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示;抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。
关键词:AT89C51 LED数码管抢答器计时目录1绪论 (1)1.1课题研究的相关背景 (1)1.2国内外研究现状 (1)1.3抢答器目前存在的主要问题 (1)2抢答器的系统概述 (3)2.1系统的主要功能 (3)2.2系统需求分析 (4)2.3抢答器的工作流程 (4)2.4抢答器的工作过程 (5)2.5AT89C51特殊功能寄存器 (6)2.6AT89C51的功能及简介 (7)2.7抢答器的优点及组成 (8)3系统总体方案的设计 (10)3.1硬件电路的设计 (10)3.2总体原理图 (11)3.3时钟频率电路的设计 (13)3.4复位电路的设计 (14)3.5显示电路的设计 (14)3.6键盘扫描电路的设计 (16)3.7发声电路 (18)3.8系统复位 (19)4软件设计 (21)4.1软件任务分析 (21)4.2程序流程图 (22)4.3主程序系统结构图 (23)5 总结 (24)附录A: 器件选型方案及详细清单 (25)附录B: 主要程序分析 (25)附录C: 实物图 (37)参考文献 (39)1绪论1.1 课题研究的相关背景抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。
单片机八路抢答器课程设计

单片机八路抢答器课程设计课程设计概述:本课程设计是针对单片机的八路抢答器的设计。
抢答器是一种常见的竞赛工具,可以用于比赛、竞赛等活动中实现精准的答题和排名。
本设计旨在实现一个基于单片机的八路抢答器系统,通过使用单片机和相应的电路设计实现对八路玩家的快速、准确的答题判断和排名结果的显示。
设计思路:本设计采用基于单片机的设计,将每个玩家的回答结果作为输入信号,通过对输入信号进行处理后,实现对八个回答结果的判断和排名。
其中,每个玩家的输入信号通过一个按键输入到单片机的IO口中,然后将IO口信号处理后,向显示屏发送相应的排名信息。
电路设计:1、按键输入电路按键输入电路是将每个玩家的回答结果输入到单片机中的重要电路。
每个按键连接到一个IO口,并通过一个上拉电阻连接到VCC。
当玩家按下按键时,IO口信号被拉低,单片机检测到信号后,将其处理为按键按下事件。
2、显示屏输出电路显示屏输出电路是将排名结果以数字方式输出的电路。
选用数码管进行数字显示,驱动数码管的芯片采用共阳极显示方式。
将多个数码管的ANODE和COM端分别与单片机的IO口连接,通过发送不同的电平信号,实现各位玩家排名结果的显示。
程序设计:首先,需要对IO口进行初始化,使其适应按键输入电路和显示屏输出电路。
接着,需要编写轮流扫描每个IO口并检测是否有按键被按下的程序,检测到按键按下后,将其加入到一个答题人员回答顺序队列中,并更新相应的显示屏。
当八个玩家答题完毕后,根据答题顺序队列进行排名,并更新显示屏显示排名结果。
总结:本设计实现了一个基于单片机的八路抢答器系统,通过使用按键输入电路、显示屏输出电路和相应的程序设计,实现了快速、准确的答题判断和排名结果的显示。
基于单片机的8路抢答器的设计

基于单片机的八路抢答器设计方案第一章抢答器设计功能分析1.1 数字抢答器的概述对于抢答器我们大家来说都不陌生, 它是用于很多竞赛场合, 真正实现先抢先答, 让最先抢到题的选手来回答问题。
抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气。
选手们都站在同一个起跑线上, 体现了公平公正的原则。
1.2 设计任务与要求1.基本要求:给主持人设置一个开关, 用来控制系统的清零(编号显示数码管灭灯)和抢答器的开始。
抢答器具有数据锁存和显示的功能。
抢答开始后, 若有选手按动抢答器按钮, 编号立即锁存, 并在LED数码上显示选手的编号, 同时扬声器给出音响提示。
此外, 要封锁输入电路, 禁止其他选手抢答。
1.发挥部分:2.抢答器具有定时抢答的功能, 且一次抢答的时间可以由主持人设定(如30秒)。
当节目主持人启动“开始”键后, 要求定时器立即减计时, 并用显示器显示, 同时扬声器发出短暂的声响, 声响持续时间0.5秒左右。
3.参加选手在设定的时间内抢答, 抢答有效, 定时器停止工作, 显示器上显示选手的编号和抢答时刻的时间, 并保持到主持人将系统清零为止。
如果定时抢答的时间已到, 却没有选手抢答时, 本次抢答无效, 系统短暂报警, 并封锁输入电路, 禁止选手超时后抢答, 时间显示器上显示00。
选手如果在主持人按开始键之前违规抢答, 系统报警, LED显示违规选手号码和FF, 直到主持人按下停止键。
第二章抢答器方案论证抢答器的实现方式有种多样, 通过纯电子器件搭建电路实现, 如优先编码器, 锁存器, 555定时器译码器等, 纯电子器件实现没有软件参与, 调试简单, 但是它不易于扩展和修改, 而且电路结构复杂, 调试困难电子, 电子器件管脚很多, 实际搭建起来费时费力, 焊接很容易出错。
于是, 我想到了用单片机实现。
单片机体积小价格低, 应用方便, 稳定可靠。
单片机将很多任务交给了软件编程去实现, 大大简化了外围硬件电路, 使外围电路的实现简单方便。
基于单片机的8路抢答器简单设计

基于单片机的8路抢答器简单设计
要设计一个基于单片机的8路抢答器,需要使用以下材料和工具:
1.单片机:使用AT89C52或AT89S52单片机。
2.显示屏:使用8位共阴极数码管进行显示。
3.按钮开关:使用8个按键来进行答题。
4.蜂鸣器:用于提示抢答成功或失败。
5.电源:使用12V直流电源供电。
6.电路板、电线、焊接工具等。
设计步骤:
1.通过AT89C52单片机的端口P1.0~P1.7来控制各个数码管的显示,并通过P
2.0~P2.7控制对应的按钮。
2.在程序中设定一个计数器,每当有一个用户答题成功后,计数器加一。
3.如果出现两个或以上的用户同时答对,由单片机判断并发出蜂鸣声提示。
4.根据计数器的值来确定当前的排名,并在数码管上进行显示。
5.当抢答结束后,将计数器清零,等待下一轮抢答。
6.设计完整的电路图,进行焊接和调试。
7.将电路板安装在合适的外壳内,添加电源等其他必要设备,完成8路抢答器的制作。
以上就是基于单片机的8路抢答器的简单设计步骤。
基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计(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;}}。
单片机 8路抢答器程序

ORG 0000HAJMP MAINORG 0003HAJMP INT0SUBORG 000BHAJMP T0INTORG 001BHAJMP T1INTOK EQU 20HRING EQU 22HORG 0040H MAIN: MOV R1,#0FHMOV R2,#0AHMOV TMOD,#11HMOV TH0,#0F0HMOV TL0,#0FFHMOV TH1,#3CHMOV TL1,#0B0HSETB EASETB ET0SETB ET1SETB EX0SETB EX1CLR OKCLR RINGSETB TR1SETB TR0 START: MOV R5,#0BHMOV R4,#0BHMOV R3,#0BHACALL DISPLAYJB P3.0,NEXTACALL DELAYJB P3.0,NEXTACALL BARKMOV A,R1MOV R6,ASETB OKMOV R3,#0AHAJMP COUNT NEXT: JNB P1.0,FALSE1 JNB P1.1,FALSE2JNB P1.2,FALSE3JNB P1.3,FALSE4JNB P1.5,FALSE6JNB P1.6,FALSE7 JNB P1.7,FALSE8AJMP STARTFALSE1: ACALL BARKMOV R3,#01HAJMP ERROR FALSE2: ACALL BARKMOV R3,#02HAJMP ERROR FALSE3: ACALL BARKMOV R3,#03HAJMP ERROR FALSE4: ACALL BARKMOV R3,#04HAJMP ERROR FALSE5: ACALL BARKMOV R3,#05HAJMP ERROR FALSE6: ACALL BARKMOV R3,#06HAJMP ERROR FALSE7: ACALL BARKMOV R3,#07HAJMP ERROR FALSE8: ACALL BARKMOV R3,#08HAJMP ERRORCOUNT: MOV R0,#00HMOV TH1,#3CHMOV TL1,#0B0H RECOUNT: MOV A,R6MOV B,#0AHDIV ABMOV 30H,AMOV 31H,BMOV R5,30HMOV R4,31HMOV A,R6CLR CSUBB A,#07HMOV A,R0CJNE A,#0AH,FULLCLR RINGAJMP CHECK FULL: CJNE A,#14H,CHECKSETB RINGMOV A,R6JZ QUITMOV R0,#00HDEC R6AJMP CHECK LARGER: MOV A,R0CJNE A,#14H,CHECKDEC R6MOV R0,#00H CHECK: JNB P3.1,QUITACALL DISPLAYJNB P1.0,TRUE1 JNB P1.1,TRUE2JNB P1.2,TRUE3JNB P1.3,TRUE4JNB P1.4,TRUE5JNB P1.5,TRUE6JNB P1.6,TRUE7JNB P1.7,TRUE8AJMP RECOUNT QUIT: CLR OKCLR RINGACALL BARKAJMP STARTTRUE1: ACALL BARKMOV A,R2MOV R6,AMOV R3,#01HCLR OKAJMP LOOP2TRUE2:ACALL BARKMOV A,R2MOV R6,AMOV R3,#02HCLR OKAJMP LOOP2TRUE3:ACALL BARKMOV A,R2MOV R6,AMOV R3,#03HCLR OKAJMP LOOP2 TRUE4:ACALL BARKMOV A,R2MOV R6,AMOV R3,#04HCLR OKAJMP LOOP2 TRUE5: ACALL BARKMOV A,R2MOV R6,AMOV R3,#05HCLR OKAJMP LOOP2 TRUE6: ACALL BARKMOV A,R2MOV R6,AMOV R3,#06HCLR OKAJMP LOOP2 TRUE7: ACALL BARKMOV A,R2MOV R6,AMOV R3,#07HCLR OKAJMP LOOP2 TRUE8: ACALL BARKMOV A,R2MOV R6,AMOV R3,#08HCLR OKLOOP2: AJMP DISPLAY SETB RINGJNB P3.1 , QUITAJMP LOOP2ERROR: SETB RINGMOV R5,#0BHMOV R4,#0BH LOOP3: ACALL DISPLAYJNB P3.1 , QUIT1AJMP LOOP3QUIT1: CLR RINGCLR OKAJMP STARTDISPLAY:MOV DPTR,#DA T1MOV A,R5MOVC A,@A+DPTRMOV P2,#01HMOV P0,AACALL DELAYMOV DPTR,#DA T2MOV A,R4MOVC A,@A+DPTRMOV P2,#02HMOV P0,AACALL DELAYMOV A,R3MOVC A,@A+DPTRMOV P2,#04HMOV P0,AACALL DELAYRETDA T1:DB 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ;"灭","1","2","3","4","5","6","7","8","9","灭","F"DA T2:DB 3FH, 06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H DELAY1: MOV 35H,#08HLOOP0: ACALL DISPLAYDJNZ 35H,LOOP0RETDELAY: MOV 32H,#12HLOOP: MOV 33H,#0AFHLOOP1: DJNZ 33H,LOOP1DJNZ 32H,LOOPRETBARK: SETB RINGACALL DELAY1ACALL DELAY1CLR RINGRETINT0SUB:MOV A,R1MOV B,#0AHDIV ABMOV R5,AMOV R4,BMOV R3,#0AHACALL DISPLAYJNB P3.2,INC0JNB P3.3,DEC0JNB P3.4,BACK0AJMP INT0SUB INC0: MOV A,R1CJNE A,#63H,ADD0MOV R1,#00HACALL DELAY1AJMP INT0SUB ADD0: INC R1ACALL DELAY1AJMP INT0SUB DEC0: MOV A,R1JZ SETR1DEC R1ACALL DELAY1AJMP INT0SUB SETR1: MOV R1,#63HACALL DELAY1AJMP INT0SUB BACK0: RETIT0INT:MOV TH0,#0ECHMOV TL0,#0FFHJNB RING,OUTCPL P3.6OUT: RETIT1INT: MOV TH1,#3CHMOV TL1,#0B0HINC R0RETIEND。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机控制8路抢答器程序OK EQU 20H ;抢答开始标志位RING EQU 22H ;响铃标志位ORG 0000HAJMP MAINORG 0003HAJMP INT0SUBORG 000BHAJMP T0INTORG 0013HAJMP INT1SUBORG 001BHAJMP T1INTORG 0040HMAIN: MOV R1,#30 ;初设抢答时间为30sMOV R2,#60 ;初设答题时间为60sMOV TMOD,#11H ;设置未定时器/模式1MOV TH0,#0F0HMOV TL0,#0FFH ;越高发声频率越高,越尖MOV TH1,#3CHMOV TL1,#0B0H ; 50ms为一次溢出中断SETB EASETB ET0SETB ET1SETB EX0SETB EX1 ;允许四个中断,T0/T1/INT0/INT1CLR OKCLR RINGSETB TR1SETB TR0 ;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了查询程序START: MOV R5,#0BHMOV R4,#0BHMOV R3,#0BHACALL DISPLAY ;未开始抢答时候显示FFFJB P3.0,NEXTACALL DELAYJB P3.0,NEXT ;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询ACALL BARK ;按键发声MOV A,R1MOV R6,A ;送R1->R6,因为R1中保存了抢答时间SETB OK ;抢答标志位,用于COUNT只程序中判断是否查询抢答MOV R3,#0AH ;抢答只显示计时,灭号数AJMP COUNT ;进入倒计时程序,"查询有效抢答的程序"在COUNT里面NEXT: JNB P1.0,FALSE1JNB P1.1,FALSE2JNB P1.2,FALSE3JNB P1.3,FALSE4JNB P1.4,FALSE5JNB P1.5,FALSE6JNB P1.6,TZ1JNB P1.7,TZ2AJMP STARTTZ1:JMP FALSE7TZ2:JMP FALSE8非法抢答处理程序FALSE1: ACALL BARK ;按键发声MOV R3,#01HAJMP ERRORFALSE2: ACALL BARKMOV R3,#02HAJMP ERRORFALSE3: ACALL BARKMOV R3,#03HAJMP ERRORFALSE4: ACALL BARKMOV R3,#04HAJMP ERRORFALSE5: ACALL BARKMOV R3,#05HAJMP ERRORFALSE6: ACALL BARKMOV R3,#06HAJMP ERRORFALSE7: ACALL BARKMOV R3,#07HAJMP ERRORFALSE8: ACALL BARKMOV R3,#08HAJMP ERRORINT0(抢答时间R1调整程序)INT0SUB:MOV A,R1MOV B,#0AHDIV A,BMOV R5,AMOV R4,BMOV R3,#0AHACALL DISPLAY ;先在两个时间LED上显示R1JNB P3.4,INC0 ;P3.4为+1s键,如按下跳到INCOJNB P3.5,DEC0 ;P3.5为-1s键,如按下跳到DECOJNB P3.1,BACK0 ;P3.1为确定键,如按下跳到BACKOAJMP INT0SUBINC0: MOV A,R1CJNE A,#63H,ADD0 ;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOV R1,#00HACALL DELAY1AJMP INT0SUBADD0: INC R1ACALLDELAY1AJMP INT0SUBDEC0: MOV A,R1JZ SETR1 ;如果R1为0, R1就置99,DEC R1ACALL DELAY1AJMP INT0SUBSETR1: MOV R1,#63HACALL DELAY1AJMP INT0SUBBACK0: RETI;=====INT1(回答时间R2调整程序)=====INT1SUB:MOV A,R2MOV B,#0AHDIV ABMOV R5,AMOV R4,BMOV R3,#0AHACALL DISPLAYJNB P3.4,INC1JNB P3.5,DEC1JNB P3.1,BACK1AJMP INT1SUBINC1: MOV A,R2CJNE A,#63H,ADD1MOV R2,#00HACALL DELAY1AJMP INT1SUBADD1: INC R2ACALL DELAY1AJMP INT1SUBDEC1: MOV A,R2JZ SETR2DEC R2ACALL DELAY1AJMP INT1SUBSETR2: MOV R2,#63HACALL DELAY1AJMP INT1SUBBACK1: RETI;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====COUNT: MOV R0,#00H;重置定时器中断次数MOV TH1,#3CHMOV TL1,#0B0H;重置定时器RECOUNT:MOV A,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6MOV B,#0AHDIV AB;除十分出个位/十位MOV 30H,A;十位存于(30H)MOV 31H,B;个位存于(31H)MOV R5,30H;取十位MOV R4,31H;取个位MOV A,R6SUBB A,#07HJNC LARGER;大于5s跳到LARGER,小于等于5s会提醒MOV A,R0CJNE A,#0AH,FULL;1s中0.5s向下运行CLR RINGAJMP CHECKFULL: CJNE A,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计SETB RINGMOV A,R6JZ QUIT;计时完毕MOV R0,#00HDEC R6;一秒标志减1AJMP CHECKLARGER: MOV A,R0CJNE A,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"DEC R6;计时一秒R6自动减1MOV R0,#00HCHECK: JNB P3.1,QUIT;如按下停止键退出ACALL DISPLAYJB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)AJMP RECOUNTACCOUT:JNB P1.0,TRUE1JNB P1.1,TRUE2JNB P1.2,TRUE3JNB P1.3,TRUE4JNB P1.4,TRUE5JNB P1.5,TRUE6JNB P1.6,TZ3JNB P1.7,TZ4AJMP RECOUNTTZ3:JMP TRUE7TZ4:JMP TRUE8QUIT: CLR OK;如果按下了"停止键"执行的程序CLR RINGAJMP START;=====正常抢答处理程序=====TRUE1: ACALL BARK;按键发声MOV A,R2MOV R6,A;抢答时间R2送R6MOV R3,#01HCLR OK;因为答题的计时不再查询抢答,所以就锁了抢答AJMP COUNTTRUE2:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#02HCLR OKAJMP COUNTTRUE3:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#03HCLR OKAJMP COUNTTRUE4:ACALL BARK;MOV A,R2MOV R6,ACLR OKAJMP COUNTTRUE5: ACALL BARK;MOV A,R2MOV R6,AMOV R3,#05HCLR OKAJMP COUNTTRUE6: ACALL BARK;MOV A,R2MOV R6,AMOV R3,#06HCLR OKAJMP COUNTTRUE7: ACALL BARK;MOV A,R2MOV R6,AMOV R3,#07HCLR OKAJMP COUNTTRUE8: ACALL BARK;MOV A,R2MOV R6,AMOV R3,#08HCLR OKAJMP COUNT;=====犯规抢答程序=====ERROR: MOV R0,#00HMOV TH1,#3CHMOV TL1,#0B0HMOV 34H,R3;犯规号数暂存与(34H)HERE: MOV A,R0CJNE A,#0AH,FLASH;0.5s向下运行->灭并停响CLR RINGMOV R3,#0AHMOV R4,#0AHMOV R5,#0AH;三灯全灭AJMP CHECK1FLASH: CJNE A,#14H,CHECK1;下面是1s的情况,响并显示号数并清R0,重新计SETB RINGMOV R0,#00HMOV R3,34H;取回号数MOV R4,#0BH;显示FF和号数AJMP CHECK1CHECK1: JNB P3.1,QUIT1ACALL DISPLAYAJMP HEREQUIT1: CLR RINGCLR OKAJMP START;=====显示程序=====DISPLAY:MOV DPTR,#DA T1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,MOV A,R3MOVC A,@A+DPTRMOV P2,#0feHMOV P0,AACALL DELAYMOV DPTR,#DA T2MOV A,R5MOVC A,@A+DPTRMOV P2,#0fdHMOV P0,AACALL DELAYMOV A,R4MOVC A,@A+DPTRMOV P2,#0fbHMOV P0,AACALL DELAYRETDA T1:DB 00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H;"灭","1","2","3","4","5","6","7","8","9","灭","F"DA T2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H;第一个为零,其他与上相同,因为十位如果为零显示熄灭;====加减时间延时(起到不会按下就加N个数)======DELAY1: MOV 35H,#08HLOOP0: ACALL DISPLAYDJNZ 35H,LOOP0RET;=====延时(显示和去抖动用到)=====DELAY: MOV 32H,#12HLOOP: MOV 33H,#0AFHLOOP1: DJNZ 33H,LOOP1DJNZ 32H,LOOPRET;=====发声程序=====BARK: SETB RINGACALL DELAY1ACALL DELAY1CLR RING;按键发声RET;=====TO溢出中断(响铃程序)=====T0INT: MOV TH0,#0ECHMOV TL0,#0FFHJNB RING,OUT;CPL P3.6;RING标志位为1时候P3.6口不断取反使喇叭发出一定频率的声音OUT: RETI;=====T1溢出中断(计时程序)=====T1INT: MOV TH1,#3CHMOV TL1,#0B0HINC R0RETIEND。