单片机智能抢答器的设计开题报告

毕业设计开题报告

 

第二篇:单片机智能抢答器综合设计报告

综合控制系统工程设计任务书

                       ——基于单片机的智能抢答器系统设计

一、设计任务

利用单片机的定时器/计数器定时和计数的原理,结合显LED数码管、按键和声光报警等相应的外围电路来设计一个智能抢答器系统。此抢答器可供8个代表队参加比赛,当主持人按键宣布开始时,各个选手开始在限定时间内可以进行按键抢答。若有选手按动抢答按钮,其相应的选手编号和倒计时时间显示在LED数码管上,同时伴随声音提示。此时禁止其他选手抢答,直到主持人将系统清零。

二、设计内容与要求

基于MCS-51系列单片机的抢答器基本要求如下:

1.系统支持8名选手或8个代表队参加比赛,编号为1、2、3、4、5、6、7、8,各用一个按钮控制;

2.  设置5个控制开关,分别控制系统清零、抢答的开始、抢答限制时间和答题限制时间以及各种时间的调节控制等(各个环节都有相应的时间限制如:抢答的时间设定为60秒,最后5秒有声音提示等)

3. 主持人按下抢答按钮后,倒计时开始,选手抢答方可开始。 在倒计时间内选手抢答实行优先锁存,抢答后显示优先抢答者序号,同时发出提示声音并在LED上显示抢答选手的编号,一直保持到主持人将系统恢复为止。

4 当抢答时间到,而无人抢答时,本次抢答无效,扬声器报警发出声音,并禁止抢答。LED显示无效编号0xFF。

5. 其他创新功能。

三、设计报告要求

1. 完成课程设计任务,提交完整的设计论文(字数3000-5000);

2. 系统方案设计

3. 系统硬件设计

4. 系统软件设计

5. 系统仿真与调试

6. 总结与设计体会     

参考文献


综合控制系统工程设计

——基于单片机的智能抢答器系统设计

一 设计概述

本综合控制系统工程设计的是较为复杂、更为实用的智能抢答器,具有时间限制、用时提醒、违规提醒等功能。且通过声光信号进行提示。其功能更为全面,实用性更强。

二 系统设计方案

基于单片机的智能抢答器系统设计主要采用于/2单片机带时间和声光提示的抢答器,由控制核心AT89S51单片机、8名选手按键、主持人按键、声光提示和数码显示等部分组成,系统框图如下图1 所示:

图1 基于AT89S51单片机的智能抢答器系统框图

三 系统硬件设计

    本设计基于AT89S51单片机为主控器,采用12M晶振。复位电路采用上电按键复位。抢答器用4位七段共阴的数码管与P1口和P2口相连作为显示装置。由P3.1口与P3.2口接74LS07后与一个蜂鸣器和一个发光二极管构成声光提示电路。其基于AT89S51单片机的智能抢答器的电路原理图如图2所示。

图2 智能抢答器原理图

三 系统软件设计

3.1 程序流程图

                     图3 基于AT89S51单片机的智能抢答器的程序流程图

程序见附录:程序清单

四 系统仿真与调试

五 总结

参考文献(3-5篇)

[1] 李广第等编著,单片机原理与应用,北京:北京航天航空大学出版社,2002.07

[2] ×××, ×××等,文章名称,发表的杂志,时间

(不要网页!)


附录:程序清单

# include<at89x51.h>

# define uchar unsigned char

# define uint unsigned int

char s;

uchar num=0;

char time=20;                                                   //抢答时间

char datitime=30;                                       //答题限时时间      

uint tt,t1;                                                  // T0、T1定时器定1s时

bit flag.s_falg=1,b_flag,fall_flag;            // 标志位

bit K_startcountflag,K_timecountflag;     // 时间调整标志位

sbit K0=P3^0;                                             

sbit beep=P3^7;                                                  // 蜂鸣器

sbit rled=P3^1;                                                   // 指示灯

sbit K1=P1^0;

sbit K2=P1^1;

sbit K3=P1^2;

sbit K4=P1^3;

sbit K5=P1^4;

sbit K6=P1^5;

sbit K7=P1^6;

sbit K8=P1^7;                                              

sbit K_Time=P3^2;                                      // 答题计时键

sbit K_startcount=P3^3;                                //开始抢答时间调整键

sbit K_timecount=P3^4;                                //答题即使时间调整键

void delay(uchar ms)                                   

{

     uchar y;

        for(;ms>0;ms--)

            for(y=120;y>0;y--)

}                                                                   

uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71                                                                                       

};

uchar code tablewe[]={0XFE,0XFD,0XFB,0XF7};

void T0_Init(void)

{                                                                                 

TMOD=0X01;

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;

TH1=(65536-2000)/256;

TL1=(65536-2000)%256;

ET0=1;

ET1=1;

EA=1;

P0=0;

}

void Key_Scan(void)                                          //开始键扫描

{

    if (K0==0)

       { 

           delay(10);

              if(K0==0)

              {

                   while (!K0);

                      TR0=1;

                      s=time;

                      tt=0;

                      flag=1;

                      s_flag=1;

                      b_flag=1;

                      num=0;

                      beep=1;

                      rled=1;                                    //清楚违规标志为

                      fall_flag=0;

                      K_startcountflag=0;

                      K_timecountflag=0;

              }

       }

}

void Scan(void)                                                  //8路热键扫描(哪个键先按下,哪个优先级最高)

{

    if(K1==0)

       {

            delay(10);

               if(K1==0);

               {

                    while(!K1);                      //数码管显示1号"1"

                       num=1;                            //关闭定时器0,时间停止

                       TR0=0;                            /打开定时器1.使扬声器响一声

                       TR1=1;                            //关闭开始键标志位,使再按其他7个键不会响应

                       s_flag=0;

                }

        }

if (K2==0)                                                        //下面7个键的处理同上

   {

     delay(10);

        if(K2==0)

           {

                 while(!K2);

                       num=2;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

            }

    }

 if (K3==0);

    {

     delay(10);

        if(K3==0)

            {

                 while(!K3);

                       num=3;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

                }

         }

if (K4==0);

    {

     delay(10);

        if(K4==0)

            {

                 while(!K4);

                       num=4;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

                }

         }

if (K5==0);

    {

     delay(10);

        if(K5==0)

            {

                 while(!K5);

                       num=5;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

                }

         }

 if (K6==0);

    {

     delay(10);

        if(K6==0)

            {

                 while(!K6);

                       num=6;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

                }

         }

if (K7==0);

    {

     delay(10);

        if(K7==0)

            {

                 while(!K7);

                       num=7;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

                }

         }

if (K8==0);

    {

     delay(10);

        if(K8==0)

            {

                 while(!K8);

                       num=8;

                       TR0=0;

                       TR1=1;

                       s_flag=0;

                }

         }

}      

   void display(void)

   {

         if(flag==1)                                                           //开始键按下,开始计时抢答

               {

                       if(num!=0)                                           //如果有人抢答,则显示相应的记号

                             {

                                     P0=tabledu[num];

                                           P2=tablewe[0];                                 //显示几号抢到了

                                           delay(2);

                                           P0=0;

                                           P2=0XFF;

                              } 

                              else                                        //否则没人抢答,则前面不显示几号

                              {

                                     P0=0;

                                           P2=0XFF;

                              }

                              P0=tabledu[s/10];                                         //下面为显示抢答倒计时

                              P2=tablewe[2];

                              delay(2);

                              P0=0;

                              P2=0XFF;

                              P0=tabledu[s%10];

                              P2=tablewe[3];

                              delay(2);

                              P2=0XFF;

                              P0=0;

}                                                              

else                      //如果开始键没有按下,则

//显示F FF(若有违规者,则显示违规号码及FF)

                                                              //或者时间调整

        {                                                                                    //违规显示

            if(fall_flag==1)

            {

                        if(num!=0)

                            {                                                                //显示几号违规了

                                P0=tabledu[num];

                                   P2=tablewe[0];

                                   delay(2);

                                   P0=0;

                                   P2=0XFF; 

                                                                                            //下面显示FF,表示违规了

                                   P0=tabledu[15];

                                P2=tablewe[2];

                                delay(2);

                                P0=0;                                                   //消隐

                                P2=0XFF;

                                P0=tabledu[15];

                                P2=tablewe[3];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                            }

                            else

                            {

                                P0=0;

                                P2=0XFF;

                            }

                     }

                     else                                                                    //没有人违规才显示调整时间

                     {

                         if(K_startcountflag==1)

                                                           )                                                                                         

                                   P0=0X6D;           //第一位数码管显示5(s)(表示抢答时间调整 

                                P2=tablewe[0];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                P0=tabledu[time/10];                            //下面显示调整的抢答时间

                                P2=tablewe[2];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                   P0=tabledu[time%10];

                                P2=tablewe[3];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                     }

                     else if(K_startcountflag==1)

                     {

                             P0=0X07; //第一位与第二位数码管合起来显示T,表示答题时间调整

                                P2=tablewe[0];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                  

                                   P0=0X31;

                                P2=tablewe[1];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                  

                                   P0=tabledu[datitime/10];

                                P2=tablewe[2];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                  

                                   P0=tabledu[datitime%10];

                                P2=tablewe[3];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                       }

                       else                                                                             //否则显示“F FF”

                       {

                             P0=tabledu[15];

                                P2=tablewe[0];

                                delay(2);

                                P0=0;

                                   P0=tabledu[15];

                                   P2=tablewe[2];

                                   delay(2);

                                P0=0;                                                                 //消隐

                                P2=0XFF;

                                   P0=tabledu[15];

                                   P2=tablewe[3];

                                   delay(2);

                                P0=0;

                                P2=0XFF;

                            }

                     }

              }

}

void display(void)

   {

         if(flag==1)                                                           //开始键按下,开始计时抢答

               {

                       if(num!=0)                                           //如果有人抢答,则显示相应的记号

                             {

                                     P0=tabledu[num];

                                           P2=tablewe[0];                                 //显示几号抢到了

                                           delay(2);

                                           P0=0;

                                           P2=0XFF;

                              } 

                              else                                                             //否则没人抢答,则前面不显示几号

                              {

                                     P0=0;

                                           P2=0XFF;

                              }

                              P0=tabledu[s/10];                                         //下面为显示抢答倒计时

                              P2=tablewe[2];

                              delay(2);

                              P0=0;

                              P2=0XFF;

                              P0=tabledu[s%10];

                              P2=tablewe[3];

                              delay(2);

                              P2=0XFF;

                              P0=0;

                     }                                                                           //如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及FF)

  else                                                                                         //或者时间调整

        {                                                                                    //违规显示

            if(fall_flag==1)

            {

                        if(num!=0)

                            {                                                                //显示几号违规了

                                P0=tabledu[num];

                                   P2=tablewe[0];

                                   delay(2);

                                   P0=0;

                                   P2=0XFF; 

                                                                                            //下面显示FF,表示违规了

                                   P0=tabledu[15];

                                P2=tablewe[2];

                                delay(2);

                                P0=0;                                                   //消隐

                                P2=0XFF;

                                P0=tabledu[15];

                                P2=tablewe[3];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                            }

                            else

                            {

                                P0=0;

                                P2=0XFF;

                            }

                     }

                     else                                                                    //没有人违规才显示调整时间

                     {

                         if(K_startcountflag==1)

                                                                                                //第一位数码管显示5(s)(表示抢答时间调整)

                                                                                                   

                                   P0=0X6D;

                                P2=tablewe[0];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                P0=tabledu[time/10];                            //下面显示调整的抢答时间

                                P2=tablewe[2];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                   P0=tabledu[time%10];

                                P2=tablewe[3];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                     }

                     else if(K_startcountflag==1)

                     {

                             P0=0X07;                                                   //第一位与第二位数码管合起来显示T,表示答题时间调整

                                P2=tablewe[0];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                  

                                   P0=0X31;

                                P2=tablewe[1];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                  

                                   P0=tabledu[datitime/10];

                                P2=tablewe[2];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                                  

                                   P0=tabledu[datitime%10];

                                P2=tablewe[3];

                                delay(2);

                                P0=0;

                                P2=0XFF;

                       }

                       else                                                                             //否则显示“F FF”

                       {

                             P0=tabledu[15];

                                P2=tablewe[0];

                                delay(2);

                                P0=0;

                                   P0=tabledu[15];

                                   P2=tablewe[2];

                                   delay(2);

                                P0=0;                                                                 //消隐

                                P2=0XFF;

                                   P0=tabledu[15];

                                   P2=tablewe[3];

                                   delay(2);

                                P0=0;

                                P2=0XFF;

                            }

                     }

              }

}                                                                                                             //调整时间键扫描

void Time_Scan(void)                                                                    

{                                                                                                              //抢答时间调整

       if(K_startcountflag==0)

          {

                delay(10);

                      if(K_startcountflag==0)

                      {

                             while(!K_startcount);

                                   time++;

                                   if(time==50)

                                   {

                                        time=20;                                                          //将抢答时间标志位置1

                                   }

                                   K_startcountflag=1;                                                 //同时关闭答题时间标志位

                                   K_timecountflag=0;

                            }

                      }                                                                                        //答题时间调整

                      if(K_timecount==0)

                      {

                             delay(10);

                                   if(K_timecount==0)

                                   {

                                     while(!K_startcount);

                                     time++;

                                     if(time==60)

                                     {

                                           datitime=30;

                                     }

                    K_startcountflag=1;                                                

                                   K_timecountflag=0;

                      

                      

                      }          

              }

              void main(void)

              {

                  T0_Init();

                     while(1)

                     {

                           Key_Scan();                                                          //开始键扫描

                              if((flag==0)&(s_flag==1))                             //当开始键没按下及没有人违规时才可进行时间调整

                              {

                                  Time_Scan();

                              }

                                 if(K_Time==0)                                              //当开始键按下及有人抢答才进行开始回答即使倒计时

                                    {

                                        while(!K_Time);

                                           s=datitime;

                                           TR0=1;

                                           tt=0;

                                           TR1=1;

                                   }

                                     }

                            }

                            if((flag==0)&(s_flag==1))

                            {                                                                       //违规

                                Scan();

                                   if(num!=0)                                                 //开始键没有按下时,有人按下了抢答器,则置违规标志位

                                   {

                                        fall_flag==1;

                                           rled=0;

                                   }

                            }

                            if((flag==0)&(s_flag==1))                           //如果开始键按下且抢答键没有人按下,则进行8路抢答键扫描

                           

                            {

                              Scan();

                             }

                             display();                                                         //显示到数码管上

                     }

}

void timer0(void)  interrupt 1

{                                                                                                  //2ms

     TH0=(65536-2000)/256;

        TL0=(65536-2000)%256;

        if(b_flag)                                                                              //开始(START)键按下,“嘟”的一声(长1s)表示开始抢答

        {

           beep=~beep;

         }

         else

         beep=1;

         if(s<5);                                                                               //抢答时间快到时报警,隔1s响一声且红灯闪烁,响3声

         {

             if(s%2==0)

                {

                    b_flag=1;

                       rled=0;

                 }

                 else

                 {

                    b_flag=0;

                       rled=1;

                     }

          }

          tt++;

          if(tt==500)                                                                               //1s

          {

              tt=0;

                 s--;

                 b_flag=0;                                                                   //关闭开始键按下响1s的嘟声

                 if(s==-1)

                 {

                       s=20;

                             TR0=0;

                             flag=0;                                                            //显示“F FF”

                             s_flag=1;

                             num=0;

                             rled=1;

                     }

              }

  }

  void timer1(void)interrupt 3                                                      //定时器1处理有人按下抢答器发出“嘟”的一声(长1s)

  {

     TH1=(65536-2000)/256;

        TL1=(65536-2000)%256;

        beep=~beep;

        t1++;

        if(t1==500)

        {

           t1=0;

              TR1=0;

        }

}

相关推荐