六路抢答器源程序

合集下载

单片机六路抢答器课程设计

单片机六路抢答器课程设计

单片机六路抢答器课程设计
单片机六路抢答器是一种用于教育培训场景的设备,旨在提高学生的抢答能力和思维敏捷性。

在这个课程设计中,我们将使用单片机来实现一个具有六个按钮的抢答器系统。

首先,我们需要准备硬件部分的材料。

一个典型的单片机抢答器系统包括一个单片机主控板、六个按钮、一个显示器以及一些连接线材。

在这里,我们选择使用常见的Arduino Uno作为单片机主控板,并将六个按钮分别连接到主控板的不同IO口上。

接下来,我们需要编写相应的代码来实现抢答器的功能。

在Arduino 编程环境中,我们可以使用C/C++语言来编写代码。

首先,我们需要初始化IO口和显示器。

然后,我们可以设置一个定时器,用于限制每个学生的抢答时间。

当某个按钮被按下时,我们可以通过判断相应的IO口状态来确定哪个学生抢答成功。

最后,我们将抢答结果显示在显示器上。

除了基本的抢答功能,我们还可以进一步扩展课程设计。

例如,我们可以加入抢答器的计分功能,每次学生抢答成功后,可以在显示器上显示相应的分数。

此外,我们还可以设置难度级别,给不同的学生设置不同的抢答时间限制,以提高学生的竞争性和抢答能力。

在课程设计的过程中,我们可以引入一些有趣的抢答游戏,例如多人对战、团队比赛等,以增加学生的参与度和趣味性。

此外,我们还可以加入音效和灯光效果,使整个抢答过程更加生动有趣。

总之,单片机六路抢答器是一个很好的教育培训工具,可以帮助学生提高抢答能力和思维敏捷性。

通过合理设计课程内容和引入一些有趣的元素,我们可以创造一个富有活力和互动性的课堂氛围,激发学生的学习兴趣和积极性。

六路抢答器源程序

六路抢答器源程序

源程序代码#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define led_seg P0#define led_bit P2 //高四位位选#define JZ_KEY P2 //矩阵扫描Unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};//共阳段码,0-9unsigned char code rest[]={0xbf,0xbf,0xbf,0xbf};bit action = 0; //允许抢答标志bit key_flag=0;bit qianda_flag=0;bit Rest_flag=0;sbit K7=P1^6; //抢答指示灯sbit buzzer=P3^7; // 蜂鸣器uchar qianda_time=5,dati_time=30; //抢答、答题倒计时uchar qianda_time_m=5,dati_time_m=30;uchar timer0_count = 0;uchar player=0;uchar key=100;uchar GD_player=0;//成功者编号(存储用数组)void K_scan4x4(void);void alert();void show_QD();void show_DT();void dati();void DelayMs(uint Delay){uchar i;for(;Delay>0;Delay--)for(i=0;i<128;i++);}uchar FW_wait(){uchar i;Rest_flag=1;P1=~0xaa;do //等待按键{K_scan4x4();led_bit =~(0x10); led_seg = rest[0]; DelayMs(10);led_bit =~(0x20); led_seg = rest[1]; DelayMs(10);led_bit =~(0x40); led_seg = rest[2]; DelayMs(10);led_bit =~(0x80); led_seg = rest[3]; DelayMs(10);i++;if(i==6) {i=0;P1=~P1;} //闪烁延时DelayMs(30);if(key==0x0a) break;if(key==0x0b) break;if(key!=0x0c){if(action==0&&key_flag==1) {alert();}}}while(key!=0x0c);return (key);}uchar QD_wait(){P1=~(0x02);dati_time=dati_time_m;do //等待启动按键{K_scan4x4();led_bit =~(0x10); led_seg = table[GD_player];DelayMs(10); led_seg=0xff; //led_seg=0xff 消影led_bit =~(0x20); led_seg = rest[1];DelayMs(10); led_seg=0xff;led_bit =~(0x40); led_seg = table[(dati_time/10)];DelayMs(10); led_seg=0xff;led_bit =~(0x80); led_seg = table[(dati_time%10)];DelayMs(10); led_seg=0xff;if(key==0x0d) {key=1;return (key);}}while(key!=0x0c);key=0;return (key);}void show_QD(){qianda_time=qianda_time_m;led_bit =~(0x10); led_seg = rest[0];DelayMs(10); led_seg=0xff;led_bit =~(0x20); led_seg = rest[1];DelayMs(10); led_seg=0xff;led_bit =~(0x40); led_seg = table[(qianda_time/10)];DelayMs(10); led_seg=0xff;led_bit =~(0x80); led_seg = table[(qianda_time%10)];DelayMs(10); led_seg=0xff;}void show_DT(){dati_time=dati_time_m;led_bit =~(0x10); led_seg = table[GD_player];DelayMs(10); led_seg=0xff;led_bit =~(0x20); led_seg = rest[0];DelayMs(10); led_seg=0xff;led_bit =~(0x40); led_seg = table[(dati_time/10)];DelayMs(10); led_seg=0xff;led_bit =~(0x80); led_seg = table[(dati_time%10)];DelayMs(10); led_seg=0xff;}void K_scan4x4(void){char a=0;key_flag=0;JZ_KEY=0x0f;if(JZ_KEY!=0x0f)//读取按键是否按下{DelayMs(10);//延时10ms进行消抖if(JZ_KEY!=0x0f)//再次检测键盘是否按下{key_flag=1;JZ_KEY=0x0f; //读取列值switch(JZ_KEY){case(0X07): player=0; key = player;break;case(0X0b): player=1; key = player;break;case(0X0d): player=2; key = player;break;case(0X0e): player=3; key = player;break;}JZ_KEY=0xf0; //读取行值switch(JZ_KEY){case(0X70): player=player; key = player;break;case(0Xb0): player=player+4; key = player;break;case(0Xd0): player=player+8; key = player;break;case(0Xe0): player=player+12;key = player;break;}while((a<50)&&(JZ_KEY!=0xf0)) { DelayMs(10);a++; } //检测按键松手检测}}}void alert(){uchar i=0;for(i=100;i>0;i--) //i:警报长短{buzzer=0;DelayMs(20); //不同声音buzzer=1;}}void qianda(){qianda_flag=1;qianda_time=qianda_time_m;K7=0;key=100;do{K_scan4x4();show_QD();if(qianda_time == 0) {qianda_time = qianda_time_m; qianda_flag=0; break; } ////抢答倒计时,10s结束DelayMs(10);if((key>4)&&(key<16)) //这里设置路数按错键退出{if(key==0x0d) {qianda_flag=0; break;}else {alert();qianda_flag=0; break;}}} while(!(key<8));if(qianda_flag==0){ qianda_flag=0;} //未抢答成功else{qianda_flag=1; //抢答成功,关闭定时TR0 = 0;K7=1;GD_player=key+1;key=0;action = 0;}}void dati(){dati_time = dati_time_m;player=0;while(player!=0x0d){K_scan4x4();show_DT();if(dati_time == 0) { dati_time = 20; break;}}}void mod_time_q(){uchar flag=0;do{K_scan4x4();if(player==0x0e) { player=0; flag=1; qianda_time_m++; }if(player==0x0f) { player=0; flag=1;qianda_time_m--; }if(flag==0&&key_flag==1) {if(key!=0x0d) {key_flag=0;alert();}}DelayMs(50);show_QD();} while(key!=0x0d);qianda_time=qianda_time_m;dati_time=dati_time_m;}void mod_time_d(){uchar flag=0;do{K_scan4x4();if(player==0x0e) { player=0; flag=1; dati_time_m++; }if(player==0x0f) { player=0; flag=1; dati_time_m--; } if(flag==0&&key_flag==1) {if(key!=0x0d){key_flag=0;alert();} }DelayMs(50);show_DT();} while(key!=0x0d);qianda_time=qianda_time_m;dati_time=dati_time_m;}void main(){TMOD=0x01; //使用定时0,工作方式1,16位定时器TH0=(65536-20000)/256; //定时50msTL0=(65536-20000)%256;EA=1;ET0=1;TR0=0;while(1){FW_wait(); //复位状态等待按键switch(key){case 0x0a: if(Rest_flag==1){key=0;Rest_flag=0;mod_time_q();break;} break;case 0x0b: if(Rest_flag==1){key=0;Rest_flag=0;mod_time_d();break;}break;case 0x0c: key=0;K7=0;DelayMs(10); action=1; TR0=1; qianda();//启动抢答if(qianda_flag==0) {break;} //抢答不成功else QD_wait(); //抢答成功,执行答题等待界面if(key==0) {K7=0; TR0=1; dati(); K7=1;break;}//启动if(key==1) {break;} //复位case 0x0d: if(action==1) {key=0; FW_wait();break;} //抢答复位键if(qianda_flag==1) {key=0;QD_wait();break;}break; //答题复位键}}}void timer0() interrupt 1 //定时时间为1s{TH0=(65536-20000)/256; //定时20msTL0=(65536-20000)%256;timer0_count ++;if(timer0_count == 50){timer0_count = 0;qianda_time--;dati_time--; //答题记时}}。

六路抢答器课程设计(附程序)

六路抢答器课程设计(附程序)

北京科技大学本科生课程设计说明书题目:六路抢答器学院:专业:姓名:学号:指导教师签字:摘要随着电子技术的发展,计算机在现代科学技术的发展中起着越来越重要的作用。

各种技术都离不开计算机,计算机已经在人们生活的各个方面普及了。

本课程设计是微机原理及接口技术的简单应用。

运用所学的微机原理和接口技术知识完成六路抢答器。

通过硬件与软件的结合,用我们刚刚学过的汇编语言编写程序模拟分析了六路抢答器出现的各种情况。

该抢答器以主持人为中心,操作抢答器的开始与复位,选手们可以根据主持人的提示进行抢答,该抢答器基本能满足现在社会抢答的需要,设计简单,成本低,适合小型抢答场合。

关键词:抢答器硬件电路软件编程模拟系统前言随着人们生活水平的提高,微机已经成为人们生活中重要的部分,掌握微机原理是我们信息类专业的必备知识。

8086/8088CPU是基础且广泛应用的处理器,它由执行单元和总线接口部分组成。

本说明书是包括课程设计的要求、汇编语言程序以及相关的硬件设计等内容组成。

根据汇编语言的优点,运用汇编语言的来编写程序,使程序更加便于阅读和理解。

本说明书是根据本人课堂上所学的知识以及参考相关文献的基础上编写的。

通过这次的编写,使我对微机原理和各种软硬件系统的认识变得更加深刻,打下实践的基础。

全书共分为4章,第1章为课题的来源,为本说明书的导论,基本概括来介绍了本设计题目的基本要求。

第2章为总体的设计思路,系统的介绍了本课题的具体如何实现。

第3章为硬件设计,该部分主要介绍了所需要的硬件和硬件的连接。

第4章为软件设计,该部分主要介绍了设计流程和具体实现的程序代码。

本说明书的编写得到了许多同学的关心和帮助,正是由于他们的指导、帮助和大力支持,才使本说明书得以顺利的完成。

由于本人水平有限,说明书中难免存在不足与疏漏之处,恳请老师不吝指正。

目录摘要 (2)引言 (3)课程设计任务书 (5)1[课题来源] (6)1.1[需求分析] (6)1.1.1[课题来源的意义] (6)1.1.2[设计内容] (6)1.1.3[设计目的] (6)1.1.4[系统功能] (6)2[总体设计思路] (8)2.1[设计思路] (8)2.2[红黄绿灯的表示] (9)3[硬件设计] (10)3.1[芯片8255] (10)3.1.1[芯片8255,8253,8259的引脚] (10)3.1.2[芯片8255,8253,8259的工作方式] (11)3.2[硬件连接] (12)3.2.1[硬件连接图] (12)3.2.2[其他配置] (14)4[软件设计] (15)4.1[程序流程图] (15)4.2[程序设计] (16)小结 (23)参考文献 (24)课程设计任务书一.设计内容设计一个具有6路抢答的抢答器,启动计算机,计算机自动为系统各芯片进行初始化,抢答器开始工作。

PLC的六路抢答器设计

PLC的六路抢答器设计

PLC的六路抢答器设计PLC的六路抢答器设计摘要伴随我国经济文化水平以及实业公司的不断的壮大,对于商业活动中公正的竞争与裁决面临了一个瓶颈,比如很多的证券公司、股票与基金的交易加上不同单位组织的各种智力竞赛等,面对于交易上遇到的种种障碍,抢答器孕育而生。

随着抢答器的不断完善,由最初的优先权编码器组成的抢答器逐渐发展成为PLC 以及单片机组成的微型抢答器,把原来的复杂线路简单化、运算速度快速化、抗干扰能力强并且大大提高的它的可靠性、精确性与功能多样性。

更能满足商业或者单位对于公然、公正、公平性质的交易尤其对于参加知识智力竞赛以及一些活动的抢答器的需求,深受广大群众的青睐。

本设计将以西门子PLC为核心控制器,设计一个六路抢答器。

设计内容包括主要由系统结构图、梯形图、程序指令等实现在选手知识竞赛时抢答者的座位号的控制,及时公正的反应出抢答者的抢答内容实现计分功能。

关键词:PLC;梯形图;抢答器;可编程序控制器ABSTRACTWith China's economic and cultural levels and industrial company continues to grow, for business activities in an impartial competition and award of facing a bottleneck, such as many securities companies, fund transactions with different units of the various intelligence contest, etc., in the face of on the hand is easy to encounter all sorts of obstacles, conceived and students. With the continuous improvement of the responder, composed of initial priority encoder responder gradually developed into composed of PLC and single chip micro responder, the original complex has the advantages of simple circuit,impartial competition and award is strong and greatly improve the reliability, accuracy and multiple functions of. To meet the business unit or the demand for openness, fairness of the transaction the face of by the people of all ages. This design will be Siemens PLC目录一、绪论 01.1 课题的背景和意义 01.2 毕业设计研究内容 (1)二、可编程控制器 (1)2.1 PLC的定义 (1)2.2 PLC的功能与发展 (2)2.3 PLC的组成 (2)2.4 PLC的组态技术 (2)2.5 STEP7简介 (3)三、整体方案选择 (4)3.1 设计思想 (4)3.2 系统构架图 (4)四、硬件配置 (5)4.1 西门子S7-200 CUP226 (5)4.2 电气接线图 (5)五、软件设计 (6)5.1 I/O分配表 (6)5.2 梯形图设计与分析 (8)5.3 语句表编程 (17)六、程序调试及分析 (25)6.1 程序行过程分析说明 (25)6.2 调试结果 (25)总结 (27)致谢 (28)参考文献 (29)一、绪论1.1 课题的背景和意义在现今计算机技术的普遍提高和电子信息下大数据覆盖的范围不断扩张,抢答器作为现在商业交易以及各单位各学校之间组织的知识竞赛竞技常用的判断依据之一,客观的分析判辨出哪位选手最先获得发言权,以及最后的分数统计。

数字六路抢答器

数字六路抢答器

六路抢答器的设计一、设计要求与任务:1、设计抢答器可供六名选手抢答,编号1~6号,分别用六个按钮键s1~s6。

2、设置一个系统清除和抢答控制开关,控制开关由主持人控制,当主持人置“清除”端,抢答无效。

置“开始”端才有效。

3、每位选手的抢答具有锁存与显示功能,优先抢答的编号一直保持到主持人将系统清除为止。

4分辨出选手按键的先后,并锁存优先抢答者,同时译码显示电路显示编号,再禁止其他选手的按键操作无效。

二、确定方案和器件:由电路的输入功能,为六路输入,优先的顺序,选用8线-3线优先编码器74LS148,优先选择后,用锁存器将编号锁存,再编号译码显示。

这里锁存器用D触发器和RS触发器。

译码显示用BCD-七段显示译码器,形成的LED灯显示的数字即为选手编号。

其基本原理图如下:三、各部分功能介绍:1、当主持人开关置“清除”端,由74LS148功能表如图:选择1I ~6I 一次为编号1~6选手的按钮,S 为选通输入端,只有在S =0的条件下,编码器才能正常工作。

设计双向开关,在“清除”端74LS148不工作,即无论选手们怎么按键都不起作用,在“开始”端,S =0使74LS148工作,这时EX Y =0,但为了禁止其他选手按键起作用,通过逻辑电路,使EX Y 为输入,输出为高电平,反馈给“S ”端,这样就使74LS148芯片停止工作,但锁存器存储的数据还可以继续工作。

当主持人置“开始”端,控制电路同上继续工作。

如图为输入控制电路:2、对于锁存器,采用D 触发器和RS 触发器,这样就保证了在74LS148停止工作时其输出还是有效状态,再进行下一步译码过程。

D 触发器的功能表如下:3、BCD-七段显示码(7448芯片):由其功能表,这里只有6路,所以在7448的输入端只有三端(3位),令3A =0. LT 为灯测试输入,只要令LT =0,便可使被驱动数码管的七段同时点亮,以检查该数码管各段能否正常发光,在工作是应置LT 为高电平。

单片机六路抢答器课程设计

单片机六路抢答器课程设计

单片机六路抢答器课程设计概述在现代教育中,抢答器是一种被广泛应用的工具,能够有效提高学生的积极性和参与度。

本课程设计旨在使用单片机设计一个六路抢答器,实现简单、高效的抢答系统,为教学活动增添趣味和互动性。

设计要求1.使用单片机实现六个抢答按键,每个按键代表一个选手。

2.设计一个显示屏,显示抢答结果,包括选手编号和抢答时间。

3.实现按键的状态检测和抢答时间的计时功能。

4.提供简单的用户界面,包括开始抢答、停止抢答和重置功能。

结构设计按键和状态检测为了实现六个抢答按键,可以使用六个GPIO口作为输入端,通过外部上拉电阻连接到VCC电源。

当按键按下时,GPIO口会检测到低电平。

使用中断机制可以实现按键状态的实时检测,当检测到按键按下时,触发中断处理函数进行相应的操作。

抢答时间计时抢答时间计时可以使用定时器实现,定时器在启动抢答过程后开始计时,当有选手按下按键时,记录下计时器的当前值作为该选手的抢答时间。

为了满足要求,可以选择使用32位定时器,以提供足够的计时范围。

显示屏和界面设计为了显示抢答结果,可以使用简单的数码管或液晶显示屏。

数码管可以显示选手编号和抢答时间,而液晶显示屏可以提供更多的显示信息,如选手姓名等。

为了方便用户操作,可以设计几个按钮实现开始抢答、停止抢答和重置功能。

可以使用单片机的GPIO口作为输出端,通过外部上拉电阻连接到VCC电源。

当按钮按下时,GPIO口会检测到低电平。

使用中断机制可以实现按钮状态的实时检测,当检测到按钮按下时,触发中断处理函数进行相应的操作。

硬件原理图以下是单片机六路抢答器的硬件原理图:1. VCC2. GND3. 抢答器按键14. 抢答器按键25. 抢答器按键36. 抢答器按键47. 抢答器按键58. 抢答器按键69. 显示屏数据线10. 显示屏使能线11. 按钮112. 按钮213. 按钮3软件设计初始化在软件设计中,首先需要进行初始化设置,包括初始化GPIO口、定时器、中断等。

用PLC制作六路抢答器

用PLC制作六路抢答器

制作天地 HANDS ON PROJECTS用 PLC制作六路抢答器广东省佛山市三水区技工学校◆张菊芳抢答器广泛应用在各种智力抢答竞赛中,现在市面上的抢答器,种类繁多,功能各异,控制方式也不尽相同,但价格都比较贵。

笔者最近采用一种新的控制方法:用触摸屏、PLC、数码管制作了一台六路抢答器,用于学生的知识竞赛中,效果十分的理想。

在该制作中,采用了三菱公司型号为 FX2N—48M的 PLC,三菱公司型号为 GT11**—Q—C (320X240)的触摸屏,数码管采用超大显示共阳极数码管、并用数字集成块 74LS47来驱动。

现把具体的实现方法介绍给大家。

一、整体设计方案图 1是一个抢答器的整体显示面板的实物图,放在场地的显著位置。

在面板中,用一个数码管来显示抢答的组别,用三个数码管来显示每一组的得分。

主持人通过触摸屏来监控比赛的进行。

在触摸屏上可以显示:组别、得分、是哪组抢答,并进行加减分控制。

面板上有主持人使用的抢答开始按钮、系统启动按钮,并有相应的指示灯显示(红色为抢答开始、绿色为系统启动)。

抢答指示与抢答按钮是按六组来设计的。

每一组都有一个抢答按钮与指示,并且设计制作成活动的面板,可自由的拆装,能从后部拆出,通过后部的连线安放在每一组选手的座位上。

PLC放在面板的下部,用于显示输入、输出的状态。

系统启动按钮用来启动整个系统的工作,蜂鸣器用来抢答失误时的报警。

二、控制要求(1)比赛开始之前,主持人要按一次系统启动按钮(绿灯亮),使所有参赛组的指示灯均灭,组别显示为 0,得分显示为 0。

(2)比赛开始后,主持人要按一次抢答开始按钮(红灯亮)之后,才允许参赛组进行抢答。

按下抢答开始按钮,四个数码管都显示为 0,等待抢答。

(3)如果参赛组在开始灯(红灯亮)之前按下按钮进行抢答,则视为抢答违规。

此时,蜂鸣器以 1次/s的频率呜叫,抢答指示灯闪亮,数码管显示违规参赛组的序号,同时,触摸屏也显示违规组号。

在触摸屏上进行减分处理后,再按下抢答开始按钮,再进行抢答。

《六路抢答器设计》doc版

《六路抢答器设计》doc版

《六路抢答器设计》doc版《六路抢答器设计》doc版《单片机原理及应用》课程设计报告题目六路抢答器的设计姓名XXX、XX、XX 专业班级11电子信息工程2班指导教师许长安日期2013.12.20 目录一、设计任务及要求1 二、元器件清单及简介1 1、元器件清单1 2、AT89C52简介2 三、设计原理及分析3 1、总原理图3 2、时钟频率电路4 3、显示电路4 4、抢答电路4 5、软件设计5 四、设计中遇到的问题与改进6 五、总结6 六、参考文献6 附录一:7 一、设计任务及要求1、设计一个六路抢答器;2、系统设置复位按钮,按动后,重新开始抢答;3、选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人按下复位键为止。

抢答后显示优先抢答者序号,同时红LED亮。

并且不出现其他抢答者的序号;4、抢答器具有定时抢答功能,且一次抢答的时间有主持人设定,本抢答器的时间设定为20 秒,当主持人启动“开始”开关后,定时器开始减计时,同时绿LED亮;5、设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。

并保持到主持人按复位键。

二、元器件清单及简介1、元器件清单元器件清单如表2-1所示:AT89C52 1片12M晶振1个30pf普通电容2个10uf电解电容1个2K电阻1个10K排阻2个100Ω电阻4个四角按键7个红LED 1个绿LED 1个四位共阴八段数码管1个表2-1 2、AT89C52简介AT89C52是美国ATMEL 公司生产的低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的只读程序存储器(PEROM)和256 bytes 的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C52单片机适合于许多较为复杂控制应用场合。

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

源程序代码#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define led_seg P0#define led_bit P2 //高四位位选#define JZ_KEY P2 //矩阵扫描Unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};//共阳段码,0-9unsigned char code rest[]={0xbf,0xbf,0xbf,0xbf};bit action = 0; //允许抢答标志bit key_flag=0;bit qianda_flag=0;bit Rest_flag=0;sbit K7=P1^6; //抢答指示灯sbit buzzer=P3^7; // 蜂鸣器uchar qianda_time=5,dati_time=30; //抢答、答题倒计时uchar qianda_time_m=5,dati_time_m=30;uchar timer0_count = 0;uchar player=0;uchar key=100;uchar GD_player=0;//成功者编号(存储用数组)void K_scan4x4(void);void alert();void show_QD();void show_DT();void dati();void DelayMs(uint Delay){uchar i;for(;Delay>0;Delay--)for(i=0;i<128;i++);}uchar FW_wait(){uchar i;Rest_flag=1;P1=~0xaa;do //等待按键{K_scan4x4();led_bit =~(0x10); led_seg = rest[0]; DelayMs(10);led_bit =~(0x20); led_seg = rest[1]; DelayMs(10);led_bit =~(0x40); led_seg = rest[2]; DelayMs(10);led_bit =~(0x80); led_seg = rest[3]; DelayMs(10);i++;if(i==6) {i=0;P1=~P1;} //闪烁延时DelayMs(30);if(key==0x0a) break;if(key==0x0b) break;if(key!=0x0c){if(action==0&&key_flag==1) {alert();}}}while(key!=0x0c);return (key);}uchar QD_wait(){P1=~(0x02);dati_time=dati_time_m;do //等待启动按键{K_scan4x4();led_bit =~(0x10); led_seg = table[GD_player];DelayMs(10); led_seg=0xff; //led_seg=0xff 消影led_bit =~(0x20); led_seg = rest[1];DelayMs(10); led_seg=0xff;led_bit =~(0x40); led_seg = table[(dati_time/10)];DelayMs(10); led_seg=0xff;led_bit =~(0x80); led_seg = table[(dati_time%10)];DelayMs(10); led_seg=0xff;if(key==0x0d) {key=1;return (key);}}while(key!=0x0c);key=0;return (key);}void show_QD(){qianda_time=qianda_time_m;led_bit =~(0x10); led_seg = rest[0];DelayMs(10); led_seg=0xff;led_bit =~(0x20); led_seg = rest[1];DelayMs(10); led_seg=0xff;led_bit =~(0x40); led_seg = table[(qianda_time/10)];DelayMs(10); led_seg=0xff;led_bit =~(0x80); led_seg = table[(qianda_time%10)];DelayMs(10); led_seg=0xff;}void show_DT(){dati_time=dati_time_m;led_bit =~(0x10); led_seg = table[GD_player];DelayMs(10); led_seg=0xff;led_bit =~(0x20); led_seg = rest[0];DelayMs(10); led_seg=0xff;led_bit =~(0x40); led_seg = table[(dati_time/10)];DelayMs(10); led_seg=0xff;led_bit =~(0x80); led_seg = table[(dati_time%10)];DelayMs(10); led_seg=0xff;}void K_scan4x4(void){char a=0;key_flag=0;JZ_KEY=0x0f;if(JZ_KEY!=0x0f)//读取按键是否按下{DelayMs(10);//延时10ms进行消抖if(JZ_KEY!=0x0f)//再次检测键盘是否按下{key_flag=1;JZ_KEY=0x0f; //读取列值switch(JZ_KEY){case(0X07): player=0; key = player;break;case(0X0b): player=1; key = player;break;case(0X0d): player=2; key = player;break;case(0X0e): player=3; key = player;break;}JZ_KEY=0xf0; //读取行值switch(JZ_KEY){case(0X70): player=player; key = player;break;case(0Xb0): player=player+4; key = player;break;case(0Xd0): player=player+8; key = player;break;case(0Xe0): player=player+12;key = player;break;}while((a<50)&&(JZ_KEY!=0xf0)) { DelayMs(10);a++; } //检测按键松手检测}}}void alert(){uchar i=0;for(i=100;i>0;i--) //i:警报长短{buzzer=0;DelayMs(20); //不同声音buzzer=1;}}void qianda(){qianda_flag=1;qianda_time=qianda_time_m;K7=0;key=100;do{K_scan4x4();show_QD();if(qianda_time == 0) {qianda_time = qianda_time_m; qianda_flag=0; break; } ////抢答倒计时,10s结束DelayMs(10);if((key>4)&&(key<16)) //这里设置路数按错键退出{if(key==0x0d) {qianda_flag=0; break;}else {alert();qianda_flag=0; break;}}} while(!(key<8));if(qianda_flag==0){ qianda_flag=0;} //未抢答成功else{qianda_flag=1; //抢答成功,关闭定时TR0 = 0;K7=1;GD_player=key+1;key=0;action = 0;}}void dati(){dati_time = dati_time_m;player=0;while(player!=0x0d){K_scan4x4();show_DT();if(dati_time == 0) { dati_time = 20; break;}}}void mod_time_q(){uchar flag=0;do{K_scan4x4();if(player==0x0e) { player=0; flag=1; qianda_time_m++; }if(player==0x0f) { player=0; flag=1;qianda_time_m--; }if(flag==0&&key_flag==1) {if(key!=0x0d) {key_flag=0;alert();}}DelayMs(50);show_QD();} while(key!=0x0d);qianda_time=qianda_time_m;dati_time=dati_time_m;}void mod_time_d(){uchar flag=0;do{K_scan4x4();if(player==0x0e) { player=0; flag=1; dati_time_m++; }if(player==0x0f) { player=0; flag=1; dati_time_m--; } if(flag==0&&key_flag==1) {if(key!=0x0d){key_flag=0;alert();} }DelayMs(50);show_DT();} while(key!=0x0d);qianda_time=qianda_time_m;dati_time=dati_time_m;}void main(){TMOD=0x01; //使用定时0,工作方式1,16位定时器TH0=(65536-20000)/256; //定时50msTL0=(65536-20000)%256;EA=1;ET0=1;TR0=0;while(1){FW_wait(); //复位状态等待按键switch(key){case 0x0a: if(Rest_flag==1){key=0;Rest_flag=0;mod_time_q();break;} break;case 0x0b: if(Rest_flag==1){key=0;Rest_flag=0;mod_time_d();break;}break;case 0x0c: key=0;K7=0;DelayMs(10); action=1; TR0=1; qianda();//启动抢答if(qianda_flag==0) {break;} //抢答不成功else QD_wait(); //抢答成功,执行答题等待界面if(key==0) {K7=0; TR0=1; dati(); K7=1;break;}//启动if(key==1) {break;} //复位case 0x0d: if(action==1) {key=0; FW_wait();break;} //抢答复位键if(qianda_flag==1) {key=0;QD_wait();break;}break; //答题复位键}}}void timer0() interrupt 1 //定时时间为1s{TH0=(65536-20000)/256; //定时20msTL0=(65536-20000)%256;timer0_count ++;if(timer0_count == 50){timer0_count = 0;qianda_time--;dati_time--; //答题记时}}。

相关文档
最新文档