AT89C51单片机的抢答器的设计(2位一体共阳)

1.设计目的作用

1、掌握51单片机最小系统的设计;

2、掌握硬件电路的设计方法;

3、掌握C51的编程方式。

2.设计要求

基于AT89C51单片机设计制作一个抢答器,具体要求如下:

设计一个智力竞赛抢答器,可同时共8名选手参加比赛,编号为1、2、3、4、5、6、7、8,各用一个按键。

用一个按键作为主持人总开关,用来控制系统的清零和抢答的开始。

抢答器开始后,数码管开始10秒倒计时,若有选手按动抢答按钮,在LED数码管上显示选手的编号,同时灯亮且伴随声音提示;倒计时完成后,选手不能再抢答;有人抢答成功后,要禁止其他选手抢答,同时开始显示60秒回答时间倒计时提示;最先抢答选手的编号一直保留到主持人将系统清零。

仿真图(Proteus 8.6版本)

 源代码:

 #include<at89x51.h>
  sbit zkey=P3^5;        //    主持人按键
  sbit zkey1=P3^6;
  sbit beep=P3^7;        //    蜂鸣器
  sbit led=P3^4;        //指示灯
  sbit shiwei=P3^0;
  sbit gewei=P3^1;
  sbit  ge=P3^3;       //数码管的位选
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90};//共阳数码管段选值
  unsigned char people;         //    抢答结果
  unsigned char counter;     //    counter每100,minite加1
  unsigned char second;         // 秒表计数值
  unsigned char time1;         //    10秒倒计时
  unsigned char time2;         //    60秒倒计时 
  void delay(unsigned int z) //延时函数
  {
    unsigned i,j;
    for(i=z;i>0;i--)
    for(j=120;j>0;j--);
  }
  void time_display(unsigned char x)//函数功能:时间显示
  {
    unsigned char shi,ge;
    
    shi=x/10;
    ge=x%10;
    shiwei=1;gewei=0;
    P0=seg[ge];
    delay(20);
    shiwei=0;gewei=1;
    P0=seg[shi];
    delay(20);
    shiwei=0;gewei=0;delay(20);
  }
  void xuanshou_display(unsigned char y)//函数功能:选手编号显示
  {
    shiwei=1;gewei=0;
    P2=seg[y];
  }
    unsigned char keyscan()          //键盘扫描函数
  {
    unsigned char keyvalue,temp;    
    keyvalue=0;
    P1=0xff;               //P1口8位置1,作输入
    temp=P1;               //读P1口,送入temp中
    delay(10);               //消抖
    if(~(P1&temp))        
    {
      switch(temp)
      {
        case 0xfe: keyvalue=1; break;
        case 0xfd: keyvalue=2; break;
        case 0xfb: keyvalue=3; break;
        case 0xf7: keyvalue=4; break;
        case 0xef: keyvalue=5; break;
        case 0xdf: keyvalue=6; break;
        case 0xbf: keyvalue=7; break;
        case 0x7f: keyvalue=8; break;
        default: keyvalue=0; break;
      }
    }
    return keyvalue;
  }
  void timer_init()  //定时器T0初始化
 {
   EA=1;
   ET0=1;
   TMOD=0x01;        //定时器T0方式1定时
   TH0=0xd8;        //装入定时器定时常数,设定10ms中断一次
   TL0=0xef;
 }
 void init()          //初始化函数
 {   
     people=0;         //    抢答结果
     counter=0;         //    counter每100,minite加1
     second=0;         // 秒表计数值
     time1=10;         //    10秒倒计时
     time2=60;         //    60秒倒计时 
     P0=seg[0];
     P2=seg[0];
 }
  void main()          //主函数
  {
    init();
    timer_init(); 
    led=0;
    while(1)
    {
      if(zkey==0)             //总开关第一次闭合
      {
      delay(10);                   //消抖
      if(zkey==0)            //总开关第一次闭合
      {
        second=time1;   
        while(second)
        {                 
          TR0=1; 
          time_display(second);      //十秒倒计时显示        
          people=keyscan();           //将抢答结果送入people
          while(people!= 0)                //判断有按键按下
          {            
            TR0=0;                        //停止10秒倒计时                
            led=1;                        //灯亮            
            xuanshou_display(people);   //显示对应选手编号
            beep=0;                        //蜂鸣器响
            delay(2000);
            beep=1;    
            led=0;                        
            second=time2;                //60秒倒计时
            while(second)
            {                
                TR0=1;
                time_display(second);
                if(zkey1==0)                   //总开关第二次闭合
                {
                 delay(10);               //消抖
                if(zkey1==0)                   //总开关第二次闭合
                   init();                
                 }
                }
                }                                                                            
             }
            TR0=0;
            people=0;                   //抢答结果清零,终止循环
            }
       }    
     }
    }             
 void timer0() interrupt 1      //定时器T0中断函数
 {
   if(counter<100)
   {
     counter++;
   }
   else
   {
     counter=0;
     second=second-1;
   }
   TH0=0xd8;              //重新装载
   TL0=0xef;
   TR0=1;
 }

元件清单

元件名称

型号

单位

数量

51最小开发板

STC89C52

1

AC/DC电源

每班5个

万用板

9X15cm(3连孔)

1

按键开关

6*6*5MM/直插/4脚

12

单排插针

1*40P、2.54mm间距

1

电阻

10k/1/8W

13

杜邦线

母对母/1P对1P/20CM/40根一排

半排

红色LED

ø5

1

排母

1*16、2.54mm间距

1

排阻

4.7K(9脚)

1

三极管

9015

3

数码管

2位一体共阳

2

有源蜂鸣器

有源/5V/电磁式/ YHE12-05

1

  • 2
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值