ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:76.74KB ,
资源ID:23653441      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23653441.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于MCS51单片机四路抢答器.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于MCS51单片机四路抢答器.docx

1、基于MCS51单片机四路抢答器基于MCS-51单片机的四路抢答器抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难。本节介绍一种利用8051单片机作为核心部件进行逻辑控制及信号产生的四路抢答器。硬件设计硬件电路应能完成以下功能:参加竞赛者对主持人提出的问题要在最短的时间作出判断,并按下抢答按键回答问题。当第一个人按下按键后,则在显示器上显示此竞赛者的并进行声音提示,同时电路

2、将其他抢答按键封锁,使其不起作用。若有人在可以抢答之前按键,应该有违规提示。电路应该具有倒计时功能,倒计时时间可以设置并显示,在规定时间没有人抢答则本题作废。回答完或超时后,由主持人将所有按键恢复,重新开始下一轮。完成上述功能的电路包括时间设定开关、声光显示、按键控制以及按键锁存等部分,如图所示。各电路模块的功能如下。 单片机部分:通过读取P3.7P3.3的状态决定倒计时时间;通过读取P1.3P1.0的状态读取按键情况;通过P2.4P2.2控制显示模块以显示按键者的和倒计时所剩时间;通过P0.1控制蜂鸣器。 时间设定模块:以拨码开关U3作为倒计时时间的选择信号。若P3.7通过U3接地,倒计时时

3、间为10s;若P3.6通过U3接地,倒计时时间为8s,若P3.5通过U3接地,倒计时时间为6s,若P3.4通过U3接地,倒计时时间为4s。判断时P3.7优先级最高,P3.4优先级最低。 按键模块:KEY1KEY4的信息可以直接传输到P1.3P1.0。单片机一旦检测到有按键按下,立即将P1.4置为低电平,将按键信息锁存,以免后来的按键对其产生影响。KEY1KEY4为抢答按键,KEY5为主持人控制按键。 数码管显示模块:数码管显示模块由一片MAX7219和3个数码管组成。其中U5用来显示按键者的编号,U6、U7在倒计时时显示还有多长时间,如果有人犯规抢答,U6U7显示“FF”。 蜂鸣器模块:蜂鸣器

4、在主持人发出可以抢答信号、有人按下抢答按键和倒计时时间到等3种情况下发出蜂鸣声。程序设计抢答器工作过程如下。 首先主持人选定倒计时时间,单片机扫描U3以获取此信息。如果没有人为设置,默认为10s。 在按下抢答按键之前,3个数码管全部显示“0”。 按下抢答按键之后,蜂鸣器响一声,单片机开始倒计时,数码管U6和U7显示倒计时时间,数码管U5显示“0”。 如果有竞赛者率先在规定时间按键,则蜂鸣器响一声,数码管U5显示该竞赛者的编号,U6和U7停止更新。 如果在主持人未按下抢答按键的时候有选手抢答,则此时蜂鸣器响一声,U5显示犯规者的编号,U6和U7显示“FF”以指示有人犯规。 如果在规定时间无人按键

5、,则U5显示“0”,U6和U7显示“EE”以指示无人按键。 无论是在规定时间有人按键、在规定时间无人按键或者是有人犯规,都需要主持人再按一下抢答按键,之后单片机根据U3状态决定倒计时时间,3个数码管全部显示“0”,恢复到初始状态,准备下一轮抢答。程序流程如图所示。图 四路抢答器程序流程图程序如例1所示。【例1】用8051单片机控制的四路抢答器程序。限于篇幅,这里没有给出显示程序,参见节中例#include typedef unsigned char uchar;sbit LE=P14;sbit KEY5=P37;sbit DIN=P24; /定义P2.5控制MAX7219的串行数据输入端sbi

6、t LOAD=P23; /定义P2.4控制MAX7219的载入使能端sbit CLK=P22; /定义P2.3控制MAX7219的时钟信号sbit BUZ=P01;#define TIMER_HBYTE -50000/256 /定时50ms#define TIMER_LBYTE -50000%256uchar intr_counter; /设定的时间用需要产生的中断次数表示uchar bdata byte; /在bdata区定义一个变量,便于位操作sbit byte_7=byte7; bit foul_flg; /是否有人犯规标志bit time_over_flg; /是否倒计时超时标志bit

7、 key_flg; /是否有人在规定时间按键标志void max7219_reset(void); /初始化MAX7219void 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_ti

8、me(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) /函数功能:蜂鸣器响500msvoid main(void) uchar key_number; max7219_reset(); /初始化MAX7

9、219 while(1) foul_flg=0; /设置初始环境 time_over_flg=0; TR0=0; /禁止T0运行 write_digit(DIGIT0,LED_code0x0);/上电后3个数码管全部显示0 write_digit(DIGIT1,LED_code0x0); write_digit(DIGIT2,LED_code0x0); while(control_key()=1)&(foul_flg=0) /如果主持人没有按键 key_number=getkey_num(); /检查是否有人犯规 if(key_number=0) /如果没有,进行下一次循环 continue;

10、 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=0&key_flg=0) key_number=getkey_num();

11、/在规定时间检查是否有按键 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

12、=1); /等待主持人按键以进入下一轮 continue; /主持人按键后进入下一轮 bit control_key(void) /检测主持人是否按键 if(KEY5=1) /如果KEY5为高,说明没有按键 return 1; /返回1,表示没有按键动作 else /如果KEY5为低,说明可能有按键动作 delay_20ms(); /延时20ms,去抖动 if(KEY5=1) /如果20ms后KEY5变为高电平,是干扰 return 1; /返回1 else /如果20ms后仍为低电平,确认有按键动作 return 0; /返回0uchar set_time(void) /根据设置决定倒计时时

13、间 uchar intr_counter; if(P36=0) intr_counter=200; /10s else if(P35=0) intr_counter=160; /8s else if (P34=0) intr_counter=120; /6s else if (P33=0) intr_counter=80; /4s else intr_counter=200; /如果没有设置,默认为10s return intr_counter;uchar get_key_num() /检测哪个参赛者按键 uchar key_state=0; key_state=P1; key_state&=

14、0x0f; /读取P1端口的低4位 if(key_state=0x0f) /若均为高电平,说明无人按键 return 0; /返回1 else key_state=0xff; if(key_state&0x01) return 1; /如果KEY1被按下,返回1 else if(key_state&0x02) return 2; /如果KEY2被按下,返回2 else if(key_state&0x04) return 3; /如果KEY3被按下,返回3 else return 4; /如果KEY4被按下,返回4 void foul_handle(uchar key_number) /犯规处理

15、 write_digit(DIGIT0,key_number); /显示犯规者 write_digit(DIGIT1,0x0f); /显示“FF” write_digit(DIGIT2,0x0f); buz_on(); /蜂鸣器响void time_over_handle(void) /超时处理 write_digit(DIGIT0,0x0); /显示“0” write_digit(DIGIT1,0x0e); /显示“EE” write_digit(DIGIT2,0x0e); buz_on(); /蜂鸣器响void key_handle(uchar key_number) /按键处理 writ

16、e_digit(DIGIT0,key_number); /显示按键者 buz_on();void display_time(void) /显示倒计时剩余时间 uchar number; write_digit(DIGIT0,LED_code0); number=int_counter/20; /秒数 write_digit(DIGIT1,number/10); /秒数的十位数字 write_digit(DIGIT2,number%10); /秒数的个位数字 void buz_on(void) uchar i; BUZ=0; /开蜂鸣器 for(i=1;i=25;i+) /延时500ms del

17、ay_20ms; BUZ=1; /关蜂鸣器void init_t0(void) TMOD=0x01; /T0选择工作方式1,16位定时器 TH0=TIMER_HBYTE; /定时时间为50ms TL0=TIMER_LBYTE; EA=1; /使能CPU中断 ET0=1; /使能T0溢出中断 TR0=1; /T0运行 void isr_t0(void) interrupt 1 /T0中断服务函数 TH0=TIMER_HBYTE; /定时时间为50ms TL0=TIMER_LBYTE; intr_counter-; /中断次数 if(intr_counter=0) /倒计时时间到 time_over_flg=1; /设置超时标志 TR0=0;/禁止T0运行 void delay_20ms(void) /延时20msvoid max7219_reset(void) /初始化MAX7219void write_reg(uchar reg,uchar sdata) /写入命令void write_digit(uchar digit,uchar number) /显示数字void send_data(uchar byte) /MAX7219的驱动程序

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1