基于MCS-51单片机的四路抢答器

  • 格式:doc
  • 大小:117.00 KB
  • 文档页数:9

下载文档原格式

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

基于MCS-51单片机的四路抢答器

基于MCS-51单片机的四路抢答器

抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难。本节介绍一种利用8051单片机作为核心部件进行逻辑控制及信号产生的四路抢答器。

硬件设计

硬件电路应能完成以下功能:参加竞赛者对主持人提出的问题要在最短的时间内作出判断,并按下抢答按键回答问题。当第一个人按下按键后,则在显示器上显示此竞赛者的号码并进行声音提示,同时电路将其他抢答按键封锁,使其不起作用。若有人在可以抢答之前按键,应该有违规提示。电路应该具有倒计时功能,倒计时时间可以设置并显示,在规定时间内没有人抢答则本题作废。回答完或超时后,由主持人将所有按键恢复,重新开始下一轮。

完成上述功能的电路包括时间设定开关、声光显示、按键控制以及按键锁存等部分,如图所示。

各电路模块的功能如下。

·单片机部分:通过读取P3.7~P3.3的状态决定倒计时时间;通过读取P1. 3~P1.0的状态读取按键情况;通过P2.4~P2.2控制显示模块以显示按键者的号码和倒计时所剩时间;通过P0.1控制蜂鸣器。

·时间设定模块:以拨码开关U3作为倒计时时间的选择信号。若P3.7通过U3接地,倒计时时间为10s;若P3.6通过U3接地,倒计时时间为8s,若P3.5通过U3接地,倒计时时间为6s,若P3.4通过U3接地,倒计时时间为4s。判断时P3.7优先级最高,P3.4优先级最低。

·按键模块:KEY1~KEY4的信息可以直接传输到P1.3~P1.0。单片机一旦检测到有按键按下,立即将P1.4置为低电平,将按键信息锁存,以免后来的按键对其产生影响。KEY1~KEY4为抢答按键,KEY5为主持人控制按键。

·数码管显示模块:数码管显示模块由一片MAX7219和3个数码管组成。其中U5用来显示按键者的编号,U6、U7在倒计时时显示还有多长时间,如果有人犯规抢答,U6~U7显示“FF”。

·蜂鸣器模块:蜂鸣器在主持人发出可以抢答信号、有人按下抢答按键和倒计时时间到等3种情况下发出蜂鸣声。

程序设计

抢答器工作过程如下。

·首先主持人选定倒计时时间,单片机扫描U3以获取此信息。如果没有人为设置,默认为10s。

·在按下抢答按键之前,3个数码管全部显示“0”。

·按下抢答按键之后,蜂鸣器响一声,单片机开始倒计时,数码管U6和U7显示倒计时时间,数码管U5显示“0”。

·如果有竞赛者率先在规定时间内按键,则蜂鸣器响一声,数码管U5显示该竞赛者的编号,U6和U7停止更新。

·如果在主持人未按下抢答按键的时候有选手抢答,则此时蜂鸣器响一声,U 5显示犯规者的编号,U6和U7显示“FF”以指示有人犯规。

·如果在规定时间内无人按键,则U5显示“0”,U6和U7显示“EE”以指示无人按键。

·无论是在规定时间内有人按键、在规定时间内无人按键或者是有人犯规,都需要主持人再按一下抢答按键,之后单片机根据U3状态决定倒计时时间,3个数码管全部显示“0”,恢复到初始状态,准备下一轮抢答。

程序流程如图所示。

图四路抢答器程序流程图

程序如例1所示。

【例1】用8051单片机控制的四路抢答器程序。限于篇幅,这里没有给出显示程序,参见节中例

#include

typedef unsigned char uchar;

sbit LE=P1^4;

sbit KEY5=P3^7;

sbit DIN=P2^4; //定义P2.5控制MAX7219的串行数据输入端

sbit LOAD=P2^3; //定义P2.4控制MAX7219的载入使能端

sbit CLK=P2^2; //定义P2.3控制MAX7219的时钟信号

sbit BUZ=P0^1;

#define TIMER_HBYTE -50000/256 //定时50ms

#define TIMER_LBYTE -50000%256

uchar intr_counter; //设定的时间用需要产生的中断次数表示

uchar bdata byte; //在bdata区定义一个变量,便于位操作

sbit byte_7=byte^7;

bit foul_flg; //是否有人犯规标志

bit time_over_flg; //是否倒计时超时标志

bit key_flg; //是否有人在规定时间内按键标志

void max7219_reset(void); //初始化MAX7219

void write_reg(uchar,uchar); //向控制寄存器写数据

void write_digit(uchar,uchar); //向字型寄存器写数据

void send_data(uchar); //底层的硬件驱动

uchar set_time(void); //函数功能:设置倒计时时间

bit control_key(void); //函数功能:检测主持人是否按键

uchar get_key_num(void); //函数功能:检测哪个参赛者按键

void display_time(void); //函数功能:显示倒计时剩余时间

void foul_handle(uchar); //函数功能:犯规处理

void key_handle(uchar); //函数功能:按键处理

void time_over_handle(void); //函数功能:超时处理

void init_t0(void); //函数功能:初始化T0定时器

void delay_20ms(void); //函数功能:延时20ms,按键去抖动

void buz_on(void) //函数功能:蜂鸣器响500ms

void main(void)

{

uchar key_number;

max7219_reset(); //初始化MAX7219

while(1)

{

foul_flg=0; //设置初始环境

time_over_flg=0;

TR0=0; //禁止T0运行

write_digit(DIGIT0,LED_code[0x0]);//上电后3个数码管全部显示0

write_digit(DIGIT1,LED_code[0x0]);