基于MCS51单片机的四路抢答器Word格式.docx
- 文档编号:4492809
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:17
- 大小:294.67KB
基于MCS51单片机的四路抢答器Word格式.docx
《基于MCS51单片机的四路抢答器Word格式.docx》由会员分享,可在线阅读,更多相关《基于MCS51单片机的四路抢答器Word格式.docx(17页珍藏版)》请在冰点文库上搜索。
数码管显示模块:
数码管显示模块由一片MAX7219和3个数码管组成。
其中U5用来显示按键者的编号,U6、U7在倒计时时显示还有多长时间,如果有人犯规抢答,U6~U7显示“FF”。
蜂鸣器模块:
蜂鸣器在主持人发出可以抢答信号、有人按下抢答按键和倒计时时间到等3种情况下发出蜂鸣声。
13.3.2
程序设计
typedefunsignedcharuchar;
sbitLE="
P1"
^4;
sbitKEY5=P3^7;
sbitDIN="
P2"
//定义P2.5控制MAX7219的串行数据输入端
sbitLOAD="
^3;
//定义P2.4控制MAX7219的载入使能端
sbitCLK="
^2;
//定义P2.3控制MAX7219的时钟信号
sbitBUZ="
P0"
^1;
#defineTIMER_HBYTE-50000/256
//定时50ms
#defineTIMER_LBYTE-50000%256
ucharintr_counter;
//设定的时间用需要产生的中断次数表示
ucharbdatabyte;
//在bdata区定义一个变量,便于位操作
sbitbyte_7=byte^7;
bitfoul_flg;
//是否有人犯规标志
bittime_over_flg;
//是否倒计时超时标志
bitkey_flg;
//是否有人在规定时间内按键标志
voidmax7219_reset(void);
//初始化MAX7219
voidwrite_reg(uchar,uchar);
//向控制寄存器写数据
voidwrite_digit(uchar,uchar);
//向字型寄存器写数据
voidsend_data(uchar);
//底层的硬件驱动
ucharset_time(void);
//函数功能:
设置倒计时时间
bitcontrol_key(void);
检测主持人是否按键
ucharget_key_num(void);
检测哪个参赛者按键
voiddisplay_time(void);
显示倒计时剩余时间
voidfoul_handle(uchar);
犯规处理
voidkey_handle(uchar);
按键处理
voidtime_over_handle(void);
超时处理
voidinit_t0(void);
初始化T0定时器
voiddelay_20ms(void);
延时20ms,按键去抖动
voidbuz_on(void)
蜂鸣器响500ms
voidmain(void)
{
ucharkey_number;
max7219_reset();
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)&
&
(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);
//等待主持人按键以进入下一轮
//主持人按键后进入下一轮
//如果没有人犯规,必定是主持人允许答题
intr_counter=set_time();
//读取倒计时时间
init_t0();
//定时器T0开始计时
buz_on();
//蜂鸣器响500ms
while(time_over_flg==0&
key_flg==0)
key_number=getkey_num();
//在规定时间内检查是否有按键
if(key_number!
=0)
//如果有
key_handle(key_number);
//按键处理
key_flg=1;
//设置有人按键答题标志
//停止T0运行
//否则循环检测
display_time();
//并显示剩余时间
if(key_flg==1)
//如果有人在规定时间内答题
while(control_key==1);
//倒计时时间到仍无人按键
time_over_handle();
//超时处理
bitcontrol_key(void)
//检测主持人是否按键
if(KEY5==1)
//如果KEY5为高,说明没有按键
return1;
//返回1,表示没有按键动作
//如果KEY5为低,说明可能有按键动作
delay_20ms();
//延时20ms,去抖动
//如果20ms后KEY5变为高电平,是干扰
//返回1
//如果20ms后仍为低电平,确认有按键动作
return0;
//返回0
ucharset_time(void)
//根据设置决定倒计时时间
ucharintr_counter;
if(P3^6==0)intr_counter=200;
//10s
elseif(P3^5==0)intr_counter=160;
//8s
elseif(P3^4==0)intr_counter=120;
//6s
elseif(P3^3==0)intr_counter=80;
//4s
elseintr_counter=200;
//如果没有设置,默认为10s
returnintr_counter;
ucharget_key_num()
//检测哪个参赛者按键
ucharkey_state=0;
key_state=P1;
key_state&
=0x0f;
//读取P1端口的低4位
if(key_state==0x0f)
//若均为高电平,说明无人按键
return0;
else
key_state^=0xff;
if(key_state&
0x01)return1;
//如果KEY1被按下,返回1
elseif(key_state&
0x02)return2;
//如果KEY2被按下,返回2
0x04)return3;
//如果KEY3被按下,返回3
elsereturn4;
//如果KEY4被按下,返回4
voidfoul_handle(ucharkey_number)
write_digit(DIGIT0,key_number);
//显示犯规者号码
write_digit(DIGIT1,0x0f);
//显示“FF”
write_digit(DIGIT2,0x0f);
//蜂鸣器响
voidtime_over_handle(void)
write_digit(DIGIT0,0x0);
//显示“0”
write_digit(DIGIT1,0x0e);
//显示“EE”
write_digit(DIGIT2,0x0e);
voidkey_handle(ucharkey_number)
//按键处理
//显示按键者号码
voiddisplay_time(void)
//显示倒计时剩余时间
ucharnumber;
write_digit(DIGIT0,LED_code[0]);
number="
int"
_counter/20;
//秒数
write_digit(DIGIT1,number/10);
//秒数的十位数字
write_digit(DIGIT2,number%10);
//秒数的个位数字
uchari;
BUZ="
0"
;
//开蜂鸣器
for(i=1;
i<
=25;
i++)
//延时500ms
delay_20ms;
1"
//关蜂鸣器
voidinit_t0(void)
TMOD="
0x01"
//T0选择工作方式1,16位定时器
TH0=TIMER_HBYTE;
//定时时间为50ms
TL0=TIMER_LBYTE;
EA="
//使能CPU中断
ET0=1;
//使能T0溢出中断
TR0=1;
//T0运行
voidisr_t0(void)interrupt1
//T0中断服务函数
{
intr_counter--;
//中断次数
if(intr_counter==0)
//倒计时时间到
time_over_flg=1;
//设置超时标志
//禁止T0运行
voiddelay_20ms(void)
//延时20ms
{}
voidmax7219_reset(void)
voidwrite_reg(ucharreg,ucharsdata)
//写入命令
voidwrite_digit(uchardigit,ucharnumber)
//显示数字
voidsend_data(ucharbyte)
//MAX7219的驱动程序
电子抢答器已被人们所熟知,在一些电子类的杂志中也经常介绍,许多电子抢答器都采用了逻辑电路进行设计,在本文中,我们介绍一款利用51系列单片机作为主控制器的单片机6路抢答器的制作。
当系统工作后,6路抢答者中只要有一人按下抢答键,系统的数码管便显示按键者的编号,同时喇叭中响起动听的音乐声,表示抢答成功。
当有几个人同时按键时,由于在时间上必定存在先后,系统将对第一个按下者进行锁存,显示的编号也是第一个按下者,其他按键者将不能响应,以便公平地选择第一个抢答者。
当确定了抢答成功者后,裁判只要按下复位键,系统便停止音乐,返回到抢答状态,进行下一轮抢答。
一、设计与分析
从设计所要完成的任务与要求来看,需要显示6路输入,用一只数码管便可以完成,对于7段数码管,占用7个单片机的I/O口,考虑6路输入,占用6个I/O端口,一个端口用于控制音乐电路的工作,这样,只需14个I/O便可以完成电路硬件的安排。
为此,我们可以选用51系列单片机中的简易型产品AT89C2051来作为中央处理器。
这款单片机的I/O作为输出时,具有较大的吸收电流能力,因此我们可以选用共阳型数码管,这样由单片机的I/O就可以直接驱动,能简化硬件电路的设计。
经以上分析,我们设计出这款多路抢答器的电路原理图如图1:
图2为电源部分原理图。
图1
根据原理图,我们设计的PCB线路板图如图3:
二、硬件电路的制作与调试
在电子产品的制作中,如能按较佳的安装与调试步骤进行制作,将大大提高制作成功的概率。
特别是对一些初学者,还不具备分析电路中的故障能力时,这一点尤为重要。
1、电源部分的制作。
按图2的原理图,将电源部分的各元件焊上,注意极性不要搞错,对于1N4007二极管,电流从没有白线处流向有白线处,对于电解电容,有一条白线且标有"
-"
的为负极,元件在没有剪脚前,长的为正,短的为负。
发光二极管也是长的为正,短的为负。
这部分元件焊好后,不要忙于焊其他元件,先进行测试。
接上电源变压器,用万用表测整流后的电压值,即7905的1、2脚之间电压值,正常应为10到14V间。
然后再测7905第1、3脚间的电压值,正常应为:
4.9到5.1V间。
同时查看发光二极管是否亮。
由于发光二极管(集成电路)容易被静电击穿,因此在焊接时的时间不要太长,最好将电烙铁的外壳接地。
若两处电压异常,仔细查看整流二极管有没有接反或虚焊,三端稳压管有没有插反;
若两处电压正常,而发光管不亮,查看发光管有没有接反,经以上检测后,若都正常,说明电源部分制作完成且工作正常,接下来就可以制作其他单元电路了。
2、显示电路的制作。
将R3到R9及共阳数码管焊好,再将20脚的集成电路插座焊上,这样这部分电路就制作完成了。
接下来对这部分电路进行测试,接上电源,数码管全灭,用一导线的一端与地线相连,另一端依次碰集成电路插座的19脚到13脚,一边碰一边查看数码管,正常时可以看到每碰一个脚,对应一段数码管灯亮。
若不亮,仔细查看与该脚相连的电阻及数码管是否虚焊。
3、音乐电路的制作。
音乐集成电路是CMOS电路,很容易受到静电攻击而损坏,因此在焊接时动作一定要快,时间过长一则容易使铜皮脱落,再则容易损坏器件。
先将两只三极管及相关的电阻焊好,最后再焊音乐集成电路。
在焊音乐电路时,先用剪下来的电阻引脚将音乐片上标有B、E处及电源正端引出,然后再焊到线路板上。
焊好后的音乐芯片见图4。
这部分元件焊好后,进行音乐电路部分的调试。
先不接喇叭,用一导线一端接地,另一端碰20脚插座的第11脚,此时用万用表测量CW1两端电压,正常应在3.4到3.65V间。
若电压不正常,查看9012三极管有没有焊反,相应的元件是否有虚焊。
正常后,断电,接上喇叭。
再次上电,用同样的方法进行测试,应听到喇叭发出音乐声。
若只听到"
吱、吱、吱"
的声音,说明音乐片损坏,换一完好的音乐芯片即可。
4、整机调试
将烧录好程序的AT89C2051芯片插上(我们提供的芯片中已烧录好程序),注意方向不要插错(反插容易损坏芯片),芯片上有一个小三角的标记处为1脚。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MCS51 单片机 四路 抢答