51单片机多路抢答器电路

第1章 概 述

1.1 选题的研究现状

        目前市场上抢答器的种类多种多样,但主要还是分为两个大类,一种是电子抢答器,另一种是电脑抢答器。电子抢答器结构简单,主要依靠数字集成电路组成,大多通过抢答器主机和按钮构成,结构简单,但可实现的功能少,具有局限性;电脑抢答器,顾名思义是需要主机配合电脑,利用专门研究的智能抢答器软件实现其完整功能,功能多种多样,应用范围广,但存在体型大,使用不方便的缺陷。

        随着当今科技的迅速发展,与之相对应适用的设备也必将层出不穷。抢答器作为一种早期研发应用的电子产品,早已大量应用于各种人才选拔和知识竞赛场合,但早期所使用的抢答器,只由几个三极管、可控硅、发光管等组成,可靠性低,实现起来很困难。目前大多数抢答器仍存在多个不足之处:第一,现场线路连接复杂。由于每位抢答选手在参加比赛时所坐的位置,就需要将抢答器的导线连接到不同地方,进而导致现场连线混乱。这些导线不仅散布混乱导致发生事故,而且降低了抢答器的可靠性,增加了安装的难度,影响了现场的布局美观。第二,容易出现误判的情况,选手虽然抢答成功,但并为被记录到抢答器中,影响了比赛的公平性。第三,抢答器制作成功率低,由于技术的不完善和元器件组装焊接复杂,未能实现相应的抢答功能,进而产生浪费。

1.2选题的意义
        在竞赛中,特别是在做抢答题目时,大多是多个选手一起竞赛,如果采用举手抢答的传统方法,会在某种程度上因为裁判的主观误判而有失比赛的公平性。面对当前现状和考虑到传统抢答器的缺陷,需要设计一个简易可靠的系统,实现规范的抢答功能。                                

        单片机,是一种广泛应用与当下电子产品的芯片。单片机受众面广泛,近几年发展迅速,成为了目前电子产品开发和研究制造的不二之选。单片机具有重量轻、体积小、价格低、抗外界因素影响强、环境要求低、可靠性高、适配程序多样,开发简单灵活等优点。

        这就使基于单片机设计出的多路抢答器具有优于传统抢答器的特点,首先,电路连接简单,因为大多数要实现的功能(定时、中断、复位等功能)和接入的管脚都整合在了小小的单片机中,所以可使电路连接变得简单易懂。第二,实用性强,工作可靠,抗干扰能力优于传统抢答器,并能够通过编写相应的程序实现多样化的功能,方便对功能的添加和改善。所以本此设计是结合当下现状而展开的具有创新性的一次研究。

第2章 总体设计方案


2.1 多路抢答器设计方案


      本次论文研究的主题是基于单片机的多路抢答器的设计与制作,结合所学知识与实际情况本次设计决定采用八路通道抢答的方式,采用STC89C52单片机为核心设计出一款较为实用的八路抢答器。由于proteus中没有STC89C52,因此在仿真用用AT89C52替代。

        八路抢答器以单片机最小系统为核心,输入部分设计为按键模块和电源模块,输出部分通过设计数码管模块和蜂鸣器模块进行发光发声。在软件设计方面,决定使用C语言在Keil4的软件开发环境下对各部分程序进行编写。在仿真方面,利用Proteus8.0仿真软件,通过绘制原理图对其进行仿真,实现预设功能。

        本次所设计的八路抢答器所要实现的基本功能是支持选手抢答和相关显示。在抢答器接入电源,在主持人开始前,如果有选手提前抢答,则数码管将显示该选手编号和警告显示E,同时蜂鸣器持续报警,直至按下主持人按下复位按键。在主持人按下抢答按键后,蜂鸣器报警1s,数码管上显示进入10s抢答倒计时,最后1s内蜂鸣器再次报警,若最后无人抢答,则回合结束;如期间有人抢答,则数码管上显示选手编号,并且蜂鸣器报警提醒1s;每轮答题结束,主持人可通过复位按键进行重置。

2.2 各模块元器件选择

(1)单片机最小系统

元件选择:1个STC89C52单片机U1,1个九管脚排阻(102)R1;1个10uF电容C1,1个10K电阻R2,1个12M晶振,2个30pF电容C2、C3,1个按键K11。

其中,选择STC89C52单片机的原因是STC89C52体积小、使用方便、易于获取、性价比高、功能比AT89系列多,稳定性强;选择九管脚排阻的原因是由于引脚和单片机之间呈现高阻态,需要利用排阻的引脚电压输出5V,一个连接VCC,另八个引脚连接数码管段选端;选择12M晶振的原因是要每秒产生12000000个正弦波,保证定时时间。

(2)按键模块

元件选择:9个独立式按键K1~K9。

其中,按键K1~K8的选择是为了对应八个选手的抢答按钮,分别连接单片机的P1.0~P1.7引脚;按键K9代表开始抢答按键,连接单片机的P2.0的引脚。按键实物图如图所示,独立按键有四个管脚,在连接过程中,只需要连接相对的平行两个管脚即可。

(3)蜂鸣器模块

 speaker蜂鸣器能够在仿真中发声,因此选择。

(4)数码管模块

元件选择:1个四位共阴极数码管。

其中,选择四位数码管是为了满足设计功能需求,需要同时显示4位数字,其中包含选手编号、分割符、两位数倒计时等;采用共阴极数码管的目的是为了将公共端接地即可,使用方便快捷;此处采用数码管而没有使用液晶显示屏的原因是本次设计显示内容量相对较少,四位数码管就可以清楚展示相应内容,LCD屏相对来说浪费设计空间,成本过高,性价比低。数码管原理图和实物图如图所示。

   

(5)电源模块

元件选择:1个电源座J1;1个开关SW1。

其中,电源座选取最常见的即可,只需要连接电源,无过多功能要求;开关的引入是为了控制电路板通电情况,可随时断电通电,保证电路安全。

第3章 硬件系统设计


3.1 八路抢答器整体方案设计

3.1.1 系统概述

整个系统是以STC89C52单片机为核心,配合晶振、电阻、电容等构成单片机最小系统,其余模块分布周围配合单片机实现功能。该系统原理图如图所示。

系统输入:抢答器输入信号由两个部分发出,一个是主持人指令输入,通过按键模块中的抢答控制按键、电路复位按键对电路进行控制。另一个是选手抢答输入,八位选手通过按键模块中的八个抢答按键进行抢答输入。系统正常工作的前提是由电源模块提供的5V电压输入。

系统输出:抢答器系统通过蜂鸣器模块和数码管模块以声光两种方式输出。当出现违规、提醒状况时,蜂鸣器报警。当选手违规、抢答、以及倒计时显示时,通过数码管模块中的四位共阴极数码管来显示相关内容。

3.1.2 系统框图

如系统框图所示,本次设计的八路抢答器由五部分模块组成。以单片机最小系统模块为核心,其中包含STC89C52单片机、晶振电路和复位电路,输入部分由选手按键抢答模块、主持人控制模块和电源模块组成,输出部分由数码管显示模块和蜂鸣器报警模块组成。

3.2 单片机最小系统设计

3.2.2 最小系统模块

基于STC89C52单片机的最小系统原理图如图所示,整个模块由晶振电路、复位电路、排阻等部分组成。最小系统模块作为整个八路抢答器设计的核心,借由单片机引脚连接按键、数码管、蜂鸣器等模块,其中通过将软件程序输入到单片机中,实现各部分相应的功能。

1.        晶振电路:该电路包括一个12M的无源晶振X1,两个30pF的电容C2、电容C3。在放置连接方面,由于采用无源晶振,将晶振两端直接连接单片机18、19两个时钟引脚即可。此处,晶振采用12M,相当于每秒产生12000000个正弦波,单片机每收到12个正弦波执行一条指令。电容C2、C3的作用:利用充、放电功能帮助晶振起振,产生稳定的正弦波。


2.        复位电路:该电路包括一个10pF的电容C1,一个10K的电阻R2和一个复位按键K11。如图复位电路部分所示,单片机的RESET引脚接在电容和电阻之间,使其分为上下两部分。工作原理:开始通电的瞬间,电容导通,开始充电,RESET引脚接入+5V,单片机复位,程序中断。在极短的时间后,电容充满电,电路进入稳定态状态,电容起到隔离直流的作用,隔离了+5V,而左侧的复位按键K11是弹起状态,下边部分电路就没有电压差的产生,所以按键和电容C1以下部分的电位都是和GND相等的,也就是0 V。由于单片机是高电平复位,低电平正常工作,所以此时单片机处于正常运行状态。这也是仿真时,通电后要等待一小段时间,使整个系统处于稳定后再开始操作的原因。当复位按键按下时,电流绕过电容,通过按键将+5V接入RESET引脚,使单片机复位。松开后,单片机又进入正常工作状态。

        后面经过仿真发现R2的阻值过大会导致复位电路不能正常工作,因此改为500欧姆。


3.         引脚31:由于程序存储在了单片机内部,所以要接高电平,保证单片机是从内部读取程序去执行的。


4.          排阻:PO引脚和单片机之间呈现高阻态(电阻高,相当于与芯片断开,无法输出5V),所以引入排阻,使引脚电压为+5V。


3.3 按键模块设计


        按键模块采用独立式键盘的设计,每个按键各接一条I/O口线,按键之间相互独立,通过检测I/O引脚的电平状态,即可判断出哪个按键被按下。如图所示为独立式键盘,8个按键K1~K8分别连接到单片机的P1.0~P1.7的引脚上,K9连接到P2.0引脚。当某一按键被按下时,对应的I/O口引脚就变成了低电平,未被按下的按键I/O口引脚就会呈现高电平状态。因此,只要检测I/O口引脚的电平状态,判别是否为低电平,就可判断出被按下的按键是哪个。由于独立式键盘各按键相互独立,互不影响,因此识别所按键号的软件编写相对简单。其中,K1~K8分别对应八位抢答按键,K9为开始抢答按键。在操作时只需要摁下按键即可实现相对应的功能,对比矩阵式键盘的快速扫描法判断被按下的按键位置,独立式键盘虽然判断效率较慢,但针对本次设计按键情况,为保证条理清晰,软件程序编写简单,采用独立式键盘更为方便快捷。

其中用锁存器来进行按键消抖:

SR锁存器(Set-Reset Latch)属于静态存储单元的一种。一般由两个或非门或者与非门组成。
本文以或非门组成的SR锁存器为例,与非门组成的锁存器和或非门组成的锁存器原理、特性表相似。

a.电路图

其中Q和Q’称为输出端,并且定义Q=1、Q’=0为锁存器的1状态;反之,Q=0、Q’=1为锁存器的0状态。SD与RD称为输入端,SD称为置位端或置1输入端;RD称为复位端或置0输入端。


b.工作原理
(1)当RD=1、SD=0时,如图:

此时Q控制Q’,Q=0,则Q’=1,即锁存器处于0状态。


(2)当RD=0、SD=1时,如图:

此时Q’控制Q,Q’=0,则Q=1,即锁存器处于1状态。
(3)当RD=SD=0时,如下分析:

若状态(1)中的RD变为0,SD不变,即RD=SD=0时,如图:

此时,由于Q’端的高电平接回到G1的输入端,因而0状态保持不变,即Q=0、Q’=1。

若状态(2)中的SD变为0,RD不变,即RD=SD=0时,如图:

此时,由于Q端的高电平接回到G2的输入端,因而1状态保持不变,即Q=1、Q’=0。
(4)当RD=SD=1时,Q=Q’=0,既不是1状态,也不是0状态,属于不允许状态,所以SR锁存器的约束条件为RDSD=0。(此约束条件同样适用于与非门组成的SR锁存器)

三.特性表
a.特性表



其中Q代表原来锁存器的状态(初态),Q*代表锁存器新的状态(次态)。


b.对特性表的理解
由第二部分可知,当SD=1、RD=0时,锁存器置1状态;当SD=0、RD=1时,锁存器置0状态;当SD=RD=0时,锁存器状态保持不变。
因此当SD=RD=0时,Q=Q*;当SD=1、RD=0时,无论Q=0/1,Q*=1;当SD=0、RD=1时,无论Q=0/1,Q*=0。

由于本次按键设置较多,在proteus中的门电路元件又很大,难以排版,所以用D锁存器74LS373进行替代。

3.4 蜂鸣器模块设计


如图2.8所示,蜂鸣器模块以三极管、集成功率放大电路驱动蜂鸣器。其中,三极管的发射极接VCC,基极接单片机的P3.2引脚,集电极接到电路中。

在蜂鸣器模块内,利用三极管的开关作用,当管子的发射极电压大于基极电压时,三极管处于饱和状态,集电极和发射极导通,相当于闭合开关;当集电极电压大于发射极大于基极时,三极管处于截止状态,相当于断开开关。

蜂鸣器有源蜂鸣器与无源蜂鸣器的区别。这里的“源”不是指电源,而是指震荡源。有源蜂鸣器内部具有震荡源,在接入+5V电源后即可发出声响;而无源蜂鸣器内部不具有震荡源,当接入直流电源时,蜂鸣器无法正常工作,在设计电路时要采用2K-5K的方波去驱动它。本设计使用的是有源蜂鸣器。

OTL、OCL 和 BTL 电路均有各种不同输出功率和不同电压增益的集成电路。应当注意,在使用 OTL 电路时,需外接输出电容。为了改善频率特性,减小非线性失真,很多电路内部还引入深度负反馈。这里以低频功放为例。

一、集成功率放大电路的分析
1、LM386 内部电路
LM386 内部电路原理图如图9.4.1所示,与通用型集成运放相类似,它是一个三级放大电路,如点划线所划分。


2、LM386 的引脚图
LM386 的外形和引脚的排列如图所示。


引脚 2 为反相输入端,3 为同相输入端;引脚 5 为输出端;引脚 6 和 4 分别为电源和地;引脚 1 和 8 为电压增益设定端;使用时在引脚 7 和地之间接旁路电容,通常取 10   μF 

三、集成功率放大电路的应用
1、集成 OTL 电路的应用
图9.4.3所示为 LM386 的一种基本用法,也是外接元件最少的一种用法



 


图9.4.4所示为 LM386 电压增益最大时的用法


图9.4.5所示为 LM386 的一般用法

3.5 数码管模块设计


3.5.1 共阴极数码管

发光二极管在电路设计中至关重要,起到了指示系统的工作状态,传递电路信息等功能,在日常生活中也可用于制作小彩灯,玩具等。由于当下对于发光材料的优化,目前多数发光二极管的工作电流在1~5mA,其内阻为20~100欧。发光二极管工作电流越大,显示亮度也越高。

LED数码管(LED Segment Displays)是常见的显示器件,作为数码管的集合,将多个发光二极管封装在一起组成“8”字型的元器件,在其内部各引线规则连接,外部管脚分别对应它们的各个笔划和公共电极。数码管实际上是由七个发光管组成“8”字型,外加上右下角的小数点就构成八段。如图2.9所示,这些段分别由字母a、b、c、d、e、f、g、dp来表示。

七段数码管分为共阴极数码管和共阳极数码管。共阳极数码管的阳极为八个发光二极管的公共阳极,由一根公共引脚引出接+5V,将八个发光二极管的另一头接低电平,即可点亮发光二极管。共阴极数码管的阴极为八个发光二极管的公共阴极,由一根公共引脚引出接地,将八个发光二极管的另一头接入高电平,即可点亮发光二极管,进而与之相对应的数码管上显示其内容。其中,共阴极数码管的内部结构如图所示。

               

3.5.2 数码管的显示方式

单片机控制LED数码管有两种显示方式:静态显示和动态扫描显示。

静态显示就是指多位LED数码管同时处于显示状态。处于静态显示方式时,就共阴极数码管而言,各位的共阴极连接在一起并接地;每位数码管的段码线分别与单片机控制的8位I/O口引脚相连。当数码管已经受到程序控制显示相应的字符段码后,I/O口锁存器将保持该段码输出不变,直到送入下一个显示字符的段码。所以以静态显示方式工作的数码管,显示时并不会轮流点亮,显示亮度高。优点是对于四位数码管,在同一时间,每一位显示的字符可以各不相同。但是,静态显示方式占用的I/O口线较多,导致成本较高。

动态扫描显示就是将所有多为LED数码管的段码线的相应段并联在一起,由一个8位I/O端口控制,而各显示位的公共引脚分别由另一个独立的I/O端口线控制,优势在于可减少对I/O口和驱动电路口的占用,但不可同时点亮四位数码管。

3.5.3 数码管模块电路

本次设计中,数码管显示模块电路采用一个四位共阴极数码管,利用动态扫描显示的方式点亮数码管,如图所示。

单片机向I/O(P0.0~P0.7)端口发出欲显示字符的段码,而显示器的位点亮控制使用I/O(P2.4~P2.7)端口中的4位线,来控制数码管公共端电平,每一时刻,只有1位数码管公共引脚有效,即选中某一位显示,其他各位位选线都无效,不显示。每隔一定时间逐位地轮流点亮各数码管(扫描方式),由于数码管的快速闪烁的残影和人眼的视觉暂留效果,只要控制好每位数码管点亮的时间和显示的间隔,则可造成多位数码管同时亮起的假象,达到4位数码管同时显示的效果。动态扫描显示的实质是以执行程序的时间来换取I/O端口数目的减少,相比静态显示节省了I/O口数目,降低了成本。

3.6 电源模块设计

电源模块由一个电源座J1和一个控制开关SW1组成,如图2.12所示。采用+5V的直流电源供电,可使用充电宝,手机插头,电脑USB接口等设备进行供电。

第4章 系统软件设计

4.1 程序语言及开发环境


    本次软件设计方面,在Keil uVision4开发软件的开发调试环境里,采用C语言编写软件程序,输入到单片机中实现基本功能。

    C语言是一种既可以用来编写系统软件,也可以用来编写应用软件的程序设计语言。C语言是世界上最流行、使用最广泛的面向过程的高级程序设计语言。C语言通过编辑源程序、编译源程序、连接目标程序和运行可执行程序等几个步骤,实现相关设计。此外,C语言具有很多优于其他程序设计语言的特点,简洁紧凑,灵活方便,运算符丰富,语言结构化,执行效率高,语法限制小,程序设计自由度大等。

    Keil 4是一种可编写程序输入到单片机中的C语言软件开发系统。Keil 4软件提供丰富的库函数和功能强大的编译调试工具,生成目标代码的效率非常高,语句通俗易懂。

4.2 程序流程设计

编写框架:程序编写之初,先引入头文件,设置寄存器初值,定义蜂鸣器、数码管、按键等引脚,依次初始化定时器,编写8个选手抢答按键扫描程序,编写答题和抢答时间设置程序,编写定时器0和定时器1服务程序,最后进入主函数程序编写。

        

4.3代码编程实现

这里用vscode编程更丝滑,然后直接能保存进keil4,烧录到proteus里的单片机中

#include <REGX52.H>

unsigned char number[]={0x00,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,		//数码管从1到F,第一位是熄灭
                            0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

sbit 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 beef = P3^2;

sbit ctrl = P2^0;
 
sbit sel_1 = P2^4;
sbit sel_2 = P2^5;
sbit sel_3 = P2^6;
sbit sel_4 = P2^7;

void delay(unsigned int t){
	while(t--);
}

unsigned int cnt = 0;
unsigned int k = 0;

void Timer0_Init()		//10����@11.0592MHz          //定时器初始化:基本算是公式,TL0和TH0决定了循环一次是10ms
{														
	//AUXR &= 0x7F;			//��ʱ��ʱ��12Tģʽ		
	TMOD &= 0xF0;			//���ö�ʱ��ģʽ
	TMOD |= 0x01;			//���ö�ʱ��ģʽ
	TL0 = 0x00;				//���ö�ʱ��ʼֵ
	TH0 = 0xDC;				//���ö�ʱ��ʼֵ
	TF0 = 0;				//���TF0��־
	EA  = 1;
	//TR0 = 1;				//��ʱ��0��ʼ��ʱ
	ET0 = 1;				//ʹ�ܶ�ʱ��0�ж�
	//PT0	= 0;
}

unsigned char end = 0;
static run = 0;
static char key_value = 0;
static char beef_flag = 0;
void Timer0_Isr(void) interrupt 1					//外部中断,与上面定时器一起构成了定时器中断,这里cnt到1000代表过了10s
{
	TL0 = 0x00;				//���ö�ʱ��ʼֵ
	TH0 = 0xDC;				//���ö�ʱ��ʼֵ
	if(cnt == 1000){   //10s
		run = 0;
		key_value = 0;						  //确保顺利跳出循环
		end = 1;
		cnt = 0;
	}else {
		cnt++;
	}
}

void sel_ctrl(unsigned char i){			  //数码管位选 这里是低电平有效  一开始没注意到浪费了一些时间
	switch (i)
	{
		case 1:sel_1 = 0; sel_2 = 1; sel_3 = 1; sel_4 = 1; break;
		case 2:sel_1 = 1; sel_2 = 0; sel_3 = 1; sel_4 = 1; break;
		case 3:sel_1 = 1; sel_2 = 1; sel_3 = 0; sel_4 = 1; break;
		case 4:sel_1 = 1; sel_2 = 1; sel_3 = 1; sel_4 = 0; break;
		//default:sel_1 = 0; sel_2 = 0; sel_3 = 0; sel_4 = 0; break;
	}
}

void seg_ctrl(unsigned char i){					//数码管段选 
	P0 = number[i];
	delay(100);									//消影
	P0 = 0x00;
}

void smg_ctrl(unsigned char pos,unsigned char num){				//数码管主函数,结合位选和段选
	sel_ctrl(pos);
	seg_ctrl(num);
}

unsigned char run_flag = 0;
unsigned char key_scanf(){													
	static int key_flag = 0;
	if((k1==0 || k2==0 || k3==0 || k4==0 || k5==0 || k6==0 || k7==0 || k8==0) && key_flag == 0 && run_flag == 0){
		delay(1000);
		key_flag = 1; //按键消抖锁
		run_flag = 1; //按键抢答锁  不接收别的选手按键信号
		if(k1 == 0){
			return 1;
		}else if(k2 == 0){
			return 2;
		}else if(k3 == 0){
			return 3;
		}else if(k4 == 0){
			return 4;
		}else if(k5 == 0){
			return 5;
		}else if(k6 == 0){
			return 6;
		}else if(k7 == 0){
			return 7;
		}else if(k8 == 0){
			return 8;
		}
	}else if (k1==1 && k2==1 && k3==1 && k4==1 && k5==1 && k6==1 && k7==1 && k8==1)        
	{
		return 0;										//这里也要有返回值,下面if判断语句要用到,一开始没有返回值
		key_flag = 0;									//就一直返回!0
	}else {
		return 0;										//加了默认返回值才顺利显示
	}
}

static int begin_flag = 0;
void begin(){										//主持人按键,按了后run=1,以控制主函数中定时器、蜂鸣器、数码管的启动

	if((ctrl==0) && begin_flag == 0){
		delay(1000);
		begin_flag = 1;								//begin_flag是按键消抖锁  
		run = 1;
	}else if (ctrl==1)								//松开就变成1,解锁
	{
		begin_flag = 0;
	}
}


void main(){										//end初始为0,上面计时器计到10s后清零且end赋值为1;有选手按键抢答则end赋为1;
	unsigned char key = 0;

	int i,j;
	Timer0_Init();									//定时器初始化
	while (1)
	{
		begin();
							
		key = key_scanf();							//key_scanf得设返回值为0,不然就算是非0;
		if (begin_flag == 0 && key != 0)
		{
			while (!run)								//犯规抢答报警
			{
				key_value = key;
				smg_ctrl(3,key_value);
				delay(100);
				smg_ctrl(4,14);
				delay(100);

				beef = 1;							//此循环里蜂鸣器将一直报警,区别与两外两个只有1s,视为犯规
				delay(100);
				beef = 0;
				delay(100);	
			}
		}
							
		while (run)
		{
			TR0 = 1;								//定时器启动

			if (cnt/100 <1)							//run的前1秒蜂鸣器发声
			{
				beef = 1;								
				delay(200);
				beef = 0;
				delay(200);				
			}
										
			smg_ctrl(1,10-cnt/100);					//倒计时  不是特别特别精确 可能与程序运行速度有关
			if (10-cnt/100 <= 1)
			{
				beef = 1;								
				delay(200);
				beef = 0;
				delay(200);	
			}			

			key = key_scanf();						//按键扫描,看哪个选手抢答
			if(key != 0){							//如果有选手按键抢答,end=1,重新计时并跳出循环
				end = 1;
				key_value = key;					//不能直接用key,因为一直返回0;这里是把key不等于0时保存起来
				beef_flag =1;
			}
			else if(end == 1){						//这里真的奇怪,像进了语句又像一直没进
				TR0 = 0;
				cnt = 0;							
				run = 0;
				// key_value = 0;				

			}
		}
		
		smg_ctrl(3,key_value);						

		if (beef_flag == 1)								//如果表决结束,蜂鸣器就响1s,但10s一个循环未解决 而且必须复位才能开始下次流程
		{	
			TR0 = 1;
			if (cnt/100 < 1)
			{
				beef = 1;								
				delay(200);
				beef = 0;
				delay(200);	
			}
			
			
		}		
		run_flag = 0;								//按键抢答锁解锁
		end = 0;									
	}
}

第五章 仿真效果展示

犯规抢答:

主持人按键,开始倒计时​​​​​​:

这里用十六进制A来代表10。

正常选手抢答:

主持人复位按键:

仿真花絮:一开始数码管未实现理想效果,发现位选是低电平有效,更改位选函数代码后顺利解决。10s倒计时结束后数码管还会出现意外的乱闪,后面发现是因为控制段选的函数会从9数到0或负数,改为从10数到1后顺利解决。蜂鸣器一开始不响,后面查阅资料更换为SPEAKER型号后顺利解决。复位电路一开始是不管怎么按都不起作用,RST一直是高电平,而复位引脚是低电平有效,无法正常运行,后面把电阻阻值调小后顺利解决,按下过程中是高电平复位,松开后变为低电平,系统能够正常工作。其中抢答八个按键消抖,因为仿真中找不到RS锁存器,而由于按键较多,自行用门电路组装又难以排版,因此使用的软件自带的D锁存器74LS373。犯规抢答、正常抢答、主持人开始键这些在代码中自有逻辑体现,这里不再赘述。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值