四路抢答器的工作过程如下。
(1)主持人通过拨码开关选定倒计时时间,默认为10s。主持人按下启动按键之后,蜂鸣器响一声,开始倒计时,DS2和DS3显示倒计时剩余时间,DS1显示“0”。
(2)若有参赛者率先在规定时间内按下抢答按键,则蜂鸣器响一声,DS1显示该参赛者的编号。
(3)若在主持人未按下启动按键时,有参赛者抢答,则蜂鸣器响一声,DS1显示犯规者的编号,DS2~DS3显示“FF”,以指示有参赛者犯规。
(4)若在规定时间内无参赛者按下抢答按键,则DS1显示“0”,DS2~DS3显示“EE”。
(5)在答题完毕后,主持人需按下清除按键,3个LED数码管全部显示“0”,四路抢答器恢复初始状态,进入下一轮抢答。
四路抢答器的程序分为显示程序、按键扫描程序、报警程序及主程序等。
1.显示程序
显示程序主要通过MAX7219实现,此处不再具体介绍,只给出所引用子程序的功能介绍。
2.按键扫描程序
按键扫描程序的主要功能是扫描键盘,读取按键值,程序包括检测主持人是否按下启动按键,检测按下抢答按键的参赛者号码,以及对抢答按键进行处理的子程序。
control_key()用于检测主持人是否按下启动按键。当其检测到单片机P37引脚变为低电平后,延时去抖。程序返回1,说明主持人按下了启动按键;否则,程序返回0。control_key()的代码如下。
子程序get_key_num()用于检测按下抢答按键的参赛者号码。其读取P1口的值,按照P10~P13的顺序逐个检测,当某个引脚为低电平时,表明有抢答按键被按下。get_key_num()的代码如下。
子程序key_handle()用于对抢答按键进行处理。当参赛者按下抢答按键时,其控制数码管显示参赛者号码,并控制蜂鸣器发声。key_handle()的代码如下。
3.报警程序
报警程序的主要功能是控制蜂鸣器发声,包括以下子程序。
子程序buz_on()用于控制蜂鸣器发声500ms,代码如下。
子程序foul_handle()用于参赛者犯规时的报警处理。其调用write_digit()函数显示犯规者号码,同时控制蜂鸣器发声,代码如下。
子程序time_over_handle()用于处理超时情况。主持人按下启动按键后,若预设的倒计时时间到,仍然没有参赛者按下抢答按键,则子程序调用相关函数显示0,同时控制蜂鸣器发声,代码如下。
4.主程序
主程序主要调用相关子程序实现系统初始化、按键扫描、信息显示等功能。
子程序set_time()根据拨码开关状态设置倒计时时间,代码如下。
子程序init_t0()用于初始化定时器T0。T0工作于方式1,16位定时器模式,定时时间为50ms。init_t0()的代码如下。
子程序isr_t0()是T0的中断服务程序。当定时时间到时,该程序被执行,重新装载T0的计数初值,并判断倒计时时间是否到。isr_t0()的代码如下。
四路抢答器主程序的流程图如图2-4所示。
图2-4 四路抢答器主程序的流程图
四路抢答器主程序的代码如下。