基于单片机的四路抢答器设计资料内容摘要:

a(uchar byte) //MAX7219 的驱动程序 {} 基于 MCS51 单片机的四路抢答器 抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。 能够实现抢答器功能的方式有多种。 曾经咱们用的是 可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难。 本次我们 单片机作为核心部件进行逻辑控制及信号产 生的四路抢答器。 硬件设计 硬件电路应能完成以下功能:参加竞赛者对主持人提出的问题要在最短的时间内作出判断,并按下抢答按键回答问题。 当第一个人按下按键后,则在显示器上显示此竞赛者的号码并进行声音提示, 同时电路将其他抢答按键封锁,使其不起作用。 若有人在可以抢答之前按键,应该有违规提示。 电路应该具有倒计时功能,倒计时时间可以设置并显示,在规定时间内没有人抢答则本题作废。 回答完或超时后,由主持人将所有按键恢复,重新开始下一轮。 完成上述功能的电路如图 所示。 各电路模块的功能如下。 单片机部分:通过读取 ~ 的状态决定倒计时时间;通过读取 P1.3~ 的状态读取按键情况;通过 ~ 控制显示模块以显示按键者的号码和倒计时所剩时间;通过 控制蜂鸣器。 时间设定模块:以拨码开关 U3 作为倒计时时间的选择信号。 若 通过U3接地,倒计时时间为 10s;若 通过 U3 接地,倒计时时间为 8s,若 通过 U3 接地,倒计时时间为 6s,若 通过 U3接地,倒计时时间为 4s。 判断时 优先级最高, 优先级最低。 按键模块: KEY1~ KEY4的信息可以直接传输到 ~。 单片机一旦检测到有按键按下,立即将 置为低电平,将按键信息锁存,以免后来的按键对其产生影响。 KEY1~ KEY4 为抢答按键, KEY5 为主持人控制按键。 数码管显示模块:数码管显示模块由一片 MAX7219 和 3 个数码管组成。 其中 U5 用来显示按键者的编号, U U7 在倒计时时显示还有多长时间,如果有人犯规抢答, U6~ U7 显示 “FF”。 蜂鸣器模块:蜂鸣器在主持人发出可以抢答信号、有人按下抢答按键和倒计时时间到等 3种情况下发出蜂鸣声。 程序设计 抢答器工作过程如下。 首先主持人选定倒计时时间,单片机扫描 U3以获取此信息。 如果没有人为设置,默认为 10s。 在按下抢答按键之前, 3个数码管全部显示 “0”。 按下抢答按键之后,蜂鸣器响一声,单片机开始倒计时,数码管 U6 和 U7显示倒计时时间,数码管 U5 显示 “0”。 如果有竞赛者率先在规定时间内按键,则蜂鸣器响一声,数码管 U5显示该竞赛者的编号, U6 和 U7 停止更新。 如果在主持人未按下抢答按键的时候有选手抢答,则此时蜂鸣器响一声, U5显示犯规者的编号, U6和 U7显示 “FF” 以指示有人犯规。 如果在规定时间内无人按键,则 U5 显示 “0” , U6 和 U7显示 “EE” 以指示无人按键。 无论是在规定时间内有人按键、在规定时间内无人按键或者是有人犯规,都需要主持人再按一下抢答按键,之后单片机根据 U3状态决定倒计时时间, 3个数码管全部显示 “0” ,恢复到初始状态,准备下一轮抢答。 程序流程如图 所示。 图 四路抢答器程序流程图 程序如例 134所示。 【例 134】用 8051 单片机控制的四路抢答 器程序。 限于篇幅,这里没有给出显示程序,参见 节中例 125。 include typedef unsigned char uchar。 sbit LE=P1^4。 sbit KEY5=P3^7。 sbit DIN=P2^4。 //定义 控制 MAX7219 的串行数据输入端 sbit LOAD=P2^3。 //定义 控制 MAX7219 的载入使能端 sbit CLK=P2^2。 //定义 控制 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])。 write_digit(DIGIT2,LED_code[0x0])。 while((control_key()==1)amp。 amp。 (foul_flg==0)) //如果主持人没有按键 { key_number=getkey_num()。 //检查是否有人犯规 if(key_number==0) //如果没有,进行下一次循环 continue。 else //如果有人犯规 { foul_handle()。 //犯规处理 foul_flg=1。 //设置犯规标志 } } if(foul_flg==1) //如果有人犯规 { while(control_key()==1)。 //等待主持人按键以进入下一轮 continue。 //主持人按键后进入下一轮 } else //如果没有人犯规,必定是主持人允许答题 { intr_counter=set_time()。 //读取倒计时时间 init_t0()。 //定时器 T0 开始计时 buz_on()。 //蜂鸣器响 500ms while(time_over_flg==0amp。 amp。 key_flg==0) { key_number=getkey_num()。 //在规定时间内检查是否 有按键 if(key_number!=0) //如果有 { key_handle(key_number)。 //按键处理 key_flg=1。 //设置有人按键答题标志 TR0=0。 //停止 T0 运行 } else //否则循环检测 { display_time()。 //并显示剩余时间 continue。 } } if(key_flg==1) //如果有人在规定时间内答题 { while(control_key==1)。 //等待主持人按键以进入下一轮 continue。 //主持人按键后进入下一轮 } else //倒计时时间到仍无人按键 { time_over_handle()。 //超时处理 while(control_key==1)。 //等待主持人按键以进入下一轮 continue。 //主持人按键后进入下一轮 } } } } bit control_key(void) //检测主持人是否按键 { if(KEY5==1) //如果 KEY5 为高,说明没有按键 return 1。 //返回 1,表示没有按键动作 else //如果 KEY5 为低,说明可能有按键动作 delay_20ms()。 //延时 20ms,去抖动 if(KEY。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。