找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1572|回复: 1
打印 上一主题 下一主题
收起左侧

本人第一次发帖,基于单片机的八路抢答器程序设计

[复制链接]
跳转到指定楼层
楼主
ID:781860 发表于 2020-6-17 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本次设计采用了LM016L 的显示器,用来显示10s倒计时和抢答选手号码,用来显示抢答中的选手号码。位选端分别与P2口的第七位,第六位以及第零位相接。通过上拉电阻接power,实现数码管的点亮。 8个选手按键接P2口,主持人按键接在P1.0~P1.4上
单片机程序如下
  1. #include<reg51.h>
  2. #include<lcd1602.h>
  3. sbit sjjia=P1^0;         //定义时间加按钮      
  4. sbit sjjian=P1^1;             //定义时间减按钮
  5. sbit kaishi=P1^2;             //定义开始按钮
  6. sbit fuwei=P1^3;             //定义复位按钮
  7. sbit soud=P1^4;                     //报警按钮
  8. sbit led_r=P1^5;              //定义抢答成功指示
  9. sbit led_y=P1^6;              //定义阐述时间到指示

  10. unsigned charnum[]={'0','1','2','3','4','5','6','7','8','9'},num2;
  11. unsigned char model,time,temp;

  12. void init()       //初始化函数
  13. {
  14.        TMOD=0x01;
  15.        TH0=(65536-50000)/256;
  16.        TL0=(65536-50000)%256;
  17.        ET0=1;
  18.        TR0=0;
  19.        EA=1;
  20.        P1=0x0f;
  21.        model=0;
  22.        time=30;
  23. }
  24. void delay(unsigned char i)   //延时函数
  25. {
  26.        unsignedchar j,k;
  27.        while(i--)
  28.               for(j=100;j>0;j--)
  29.                      for(k=100;k>0;k--);
  30. }
  31. void star() //启动
  32. {
  33.        lcd_xml(0x80);lcd_xsj("     welcome   ");
  34.        delay(100);
  35.        lcd_xml(0xc0);lcd_xsj("8 Way Responder");
  36.        delay(80);
  37. }
  38. void led_num() //刷新倒计时
  39. {
  40.        lcd_xml(0x80);lcd_xsj("Countdown :    ");
  41.        lcd_xml(0x8d);lcd_xsj2(num[time/10]);
  42.        lcd_xml(0x8e);lcd_xsj2(num[time%10]);
  43. }
  44. void reset()     //复位
  45. {
  46.        TR0=0;
  47.        P1=0x0f;
  48.        led_r=0;
  49.        led_y=0;
  50.        P2=0xff;
  51.        model=0;
  52.        time=10;
  53.        led_num();
  54.        lcd_xml(0xc0);lcd_xsj("   Not started ");
  55. }
  56. void Not_started()
  57. {
  58.        if(sjjia==0)
  59.        {
  60.               delay(10);
  61.               if(sjjia==0)
  62.               {
  63.                      time++;
  64.                      if(time==100)time=0;
  65.                      led_num();
  66.               }
  67.        }
  68.        if(sjjian==0)
  69.        {
  70.               delay(10);
  71.               if(sjjian==0)
  72.               {
  73.                      time--;
  74.                      if(time==0)time=99;
  75.                      led_num();
  76.               }
  77.        }
  78.        if(kaishi==0)
  79.        {
  80.               delay(10);
  81.               if(kaishi==0)
  82.               {
  83.                      model=1;
  84.                      TR0=1;
  85.                      lcd_xml(0xc0);lcd_xsj("Start Responder");
  86.                      soud=1;delay(10);soud=0;
  87.               }
  88.        }
  89. }

  90. void anjian()
  91. {
  92.        if(P2!= 0xff)
  93.        {
  94.               delay(5);
  95.               if(P2!= 0xff)
  96.               {
  97.                      temp=~P2;
  98.                      model=3;
  99.                      led_r=1;
  100.                      soud=1;delay(10);soud=0;     
  101.                      switch(temp)
  102.                      {
  103.                             case0x01:num2=1;break;
  104.                             case0x02:num2=2;break;
  105.                             case0x04:num2=3;break;
  106.                             case0x08:num2=4;break;
  107.                             case0x10:num2=5;break;
  108.                             case0x20:num2=6;break;
  109.                             case 0x40:num2=7;break;
  110.                             case0x80:num2=8;break;                    
  111.                      }
  112.                      lcd_xml(0xc0);lcd_xsj("Competitor:   ");
  113.                      lcd_xml(0xce);lcd_xsj2(num[num2]);

  114.                      time=60;
  115.                      P2=temp;
  116.               }     
  117.        }
  118. }

  119. void finish()
  120. {
  121.        if(!time)
  122.        {
  123.               led_y=1;
  124.               lcd_xml(0xc0);lcd_xsj("      End      ");   
  125.        }
  126. }
  127. void main()
  128. {
  129.        init();
  130.        lcd_init();
  131.        star();
  132.        reset();
  133.        while(1)
  134.        {
  135.               if(fuwei==0)   //复位键检测
  136.               {
  137.                      delay(1);
  138.                      if(fuwei==0)
  139.                             reset();
  140.               }
  141.               switch(model)
  142.               {
  143.                      case0:Not_started();break;
  144.                      case1:anjian();break;
  145.                      case2:finish();break;
  146.                      case3:break;
  147.                      default: model=0;break;      
  148.               }
  149.        }
  150. }
  151. void timee() interrupt 1  //1s函数中断
  152. {
  153.        unsignedchar a;
  154.        TH0=(65536-50000)/256;
  155.        TL0=(65536-50000)%256;
  156.        a++; //是否满1s
  157.        if(a==24)
  158.        {
  159.               a=0;
  160.               if(model==1|| model==3)
  161.               {
  162.                      time--;
  163.                      led_num();
  164.                      if(time==0)
  165.                      {
  166.                             model=2;
  167.                             soud=1;delay(20);soud=0;
  168.                      }
  169.               }
  170.        }
  171. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:787306 发表于 2020-6-23 08:43 | 只看该作者
有proteus仿真图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表