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

上传人:b****2 文档编号:2414988 上传时间:2023-05-03 格式:DOCX 页数:17 大小:294.67KB
下载 相关 举报
基于MCS51单片机的四路抢答器.docx_第1页
第1页 / 共17页
基于MCS51单片机的四路抢答器.docx_第2页
第2页 / 共17页
基于MCS51单片机的四路抢答器.docx_第3页
第3页 / 共17页
基于MCS51单片机的四路抢答器.docx_第4页
第4页 / 共17页
基于MCS51单片机的四路抢答器.docx_第5页
第5页 / 共17页
基于MCS51单片机的四路抢答器.docx_第6页
第6页 / 共17页
基于MCS51单片机的四路抢答器.docx_第7页
第7页 / 共17页
基于MCS51单片机的四路抢答器.docx_第8页
第8页 / 共17页
基于MCS51单片机的四路抢答器.docx_第9页
第9页 / 共17页
基于MCS51单片机的四路抢答器.docx_第10页
第10页 / 共17页
基于MCS51单片机的四路抢答器.docx_第11页
第11页 / 共17页
基于MCS51单片机的四路抢答器.docx_第12页
第12页 / 共17页
基于MCS51单片机的四路抢答器.docx_第13页
第13页 / 共17页
基于MCS51单片机的四路抢答器.docx_第14页
第14页 / 共17页
基于MCS51单片机的四路抢答器.docx_第15页
第15页 / 共17页
基于MCS51单片机的四路抢答器.docx_第16页
第16页 / 共17页
基于MCS51单片机的四路抢答器.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《基于MCS51单片机的四路抢答器.docx》由会员分享,可在线阅读,更多相关《基于MCS51单片机的四路抢答器.docx(17页珍藏版)》请在冰点文库上搜索。

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

基于MCS51单片机的四路抢答器

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

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

抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,广泛应用于各种知识竞赛、文娱活动等场合。

能够实现抢答器功能的方式有多种,可以采用前期的模拟电路、数字电路或模拟与数字电路相结合的方式,但这种方式制作过程复杂,而且准确性与可靠性不高,成品面积大,安装、维护困难。

本节介绍一种利用8051单片机作为核心部件进行逻辑控制及信号产生的四路抢答器。

13.3.1 硬件设计

硬件电路应能完成以下功能:

参加竞赛者对主持人提出的问题要在最短的时间内作出判断,并按下抢答按键回答问题。

当第一个人按下按键后,则在显示器上显示此竞赛者的号码并进行声音提示,同时电路将其他抢答按键封锁,使其不起作用。

若有人在可以抢答之前按键,应该有违规提示。

电路应该具有倒计时功能,倒计时时间可以设置并显示,在规定时间内没有人抢答则本题作废。

回答完或超时后,由主持人将所有按键恢复,重新开始下一轮。

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

各电路模块的功能如下。

· 单片机部分:

通过读取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种情况下发出蜂鸣声。

 

           

 

13.3.2 程序设计

typedefunsignedcharuchar;

sbitLE="P1"^4;

sbitKEY5=P3^7;

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

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

sbitCLK="P2"^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();                    //初始化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)&&(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==0&&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;                //主持人按键后进入下一轮

           }

       }

   }

}

bitcontrol_key(void)                  //检测主持人是否按键

{

   if(KEY5==1)                         //如果KEY5为高,说明没有按键

       return1;                       //返回1,表示没有按键动作

   else                                //如果KEY5为低,说明可能有按键动作

       delay_20ms();                   //延时20ms,去抖动

   if(KEY5==1)                         //如果20ms后KEY5变为高电平,是干扰

       return1;                       //返回1

   else                                //如果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;                       //返回1

   else

   {

       key_state^=0xff;

       if(key_state&0x01)return1;    //如果KEY1被按下,返回1

          elseif(key_state&0x02)return2; //如果KEY2被按下,返回2

       elseif(key_state&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);

   buz_on();                           //蜂鸣器响

}

voidtime_over_handle(void)           //超时处理

{

   write_digit(DIGIT0,0x0);        //显示“0”

   write_digit(DIGIT1,0x0e);           //显示“EE”

   write_digit(DIGIT2,0x0e);

   buz_on();                           //蜂鸣器响

}

voidkey_handle(ucharkey_number)      //按键处理

{

   write_digit(DIGIT0,key_number);     //显示按键者号码

   buz_on();

}

voiddisplay_time(void)                //显示倒计时剩余时间

{

   ucharnumber;

   write_digit(DIGIT0,LED_code[0]);

   number="int"_counter/20;              //秒数

   write_digit(DIGIT1,number/10);      //秒数的十位数字

   write_digit(DIGIT2,number%10);      //秒数的个位数字 

}

voidbuz_on(void)              

{

   uchari;

   BUZ="0";                              //开蜂鸣器

   for(i=1;i<=25;i++)                  //延时500ms

       delay_20ms;

   BUZ="1";                              //关蜂鸣器

}

voidinit_t0(void)

{

   TMOD="0x01";                          //T0选择工作方式1,16位定时器

   TH0=TIMER_HBYTE;                    //定时时间为50ms

   TL0=TIMER_LBYTE;        

   EA="1";                              //使能CPU中断

   ET0=1;                              //使能T0溢出中断

   TR0=1;                              //T0运行       

}

voidisr_t0(void)interrupt1          //T0中断服务函数

{  

   TH0=TIMER_HBYTE;                    //定时时间为50ms

   TL0=TIMER_LBYTE;

   intr_counter--;                     //中断次数

   if(intr_counter==0)                 //倒计时时间到

   {

       time_over_flg=1;                //设置超时标志

       TR0=0;//禁止T0运行

   }

}

voiddelay_20ms(void)                  //延时20ms

{}

voidmax7219_reset(void)               //初始化MAX7219

{}

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脚。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2