找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1291|回复: 0
收起左侧

单片机四路抢答器怎么显示不了答题时间?求助!

[复制链接]
ID:865245 发表于 2021-5-14 12:47 | 显示全部楼层 |阅读模式
想知道我这个的答题时间为什么显示不了???求助各位大佬!!!
单片机代码如下:
  1. #include<at89x51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. char s,y,grade;
  5. uchar num=0;
  6. char time=20; //抢答时间
  7. char respond=30; //答题限时时间
  8. uint tt,t1; //T0,T1定时器定一秒时
  9. bit flag,s_flag,b_flag,fall_flag;      //标志位(开始键,答题键,蜂鸣器,违规)
  10. bit K_jiacountflag,K_jiancountflag;     //时间调整标志位
  11. sbit K0=P3^0;        //开始抢答
  12. sbit K_Time=P3^2;          //开始答题
  13. sbit beep=P3^7;         //蜂鸣器输出口
  14. sbit rled=P3^1;           //指示灯输出口
  15. sbit K1=P1^0;            
  16. sbit K2=P1^1;
  17. sbit K3=P1^2;
  18. sbit K4=P1^3;
  19. sbit K_jiacount=P3^3;  //分数调整加键
  20. sbit K_jiancount=P3^4; //分数调整减键
  21. void delay(uchar ms)     //延时函数
  22. {
  23.        uchary;
  24.        for(;ms>0;ms--)
  25.               for(y=120;y>0;y--);
  26. }
  27. uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,
  28. 0x66,0x6d,0x7d,0x07,
  29. 0x7f,0x6f,0x77,0x7c,
  30. 0x39,0x5e,0x79,0x71
  31. };      //共阴数码管0-15 (du  段选)
  32. uchar codetablewe[]={0XFE,0XFD,0XFB,0XF7};    //LED灯从左边亮到右边 (位选)
  33. void T0_Init(void)
  34. {
  35.        TMOD=0X01;
  36.        TH0=(65536-2000)/256;
  37.        TL0=(65536-2000)%256;
  38.        TH1=(65536-2000)/256;
  39.        TL1=(65536-2000)%256;
  40.        ET0=1;
  41.        ET1=1;
  42.        EA=1;
  43.        P0=0;
  44. }
  45. void Key_Scan(void)            //开始键扫描
  46. {
  47.        if(K0==0)
  48.        {
  49.               delay(10);
  50.               if(K0==0)
  51.               {
  52.                      while(!K0);
  53.                      TR0=1;
  54.                      s=time;
  55.                      tt=0;
  56.                      flag=1;
  57.                      s_flag=1;
  58.                      b_flag=1;
  59.                      num=0;
  60.                      beep=1;
  61.                      rled=1;
  62.                      fall_flag=0;    //清除违规标志位
  63.                      K_jiacountflag=0;
  64.                      K_jiancountflag=0;
  65.               }
  66.        }
  67.    if(K_Time==0)     //开始键按下之后,再按下答题键
  68.     {
  69.        delay(10);
  70.               if(K_Time==0)
  71.               {
  72.            while(!K_Time);
  73.                      TR0=1;
  74.                      y=respond;
  75.                      tt=0;
  76.                      flag=1;
  77.                      s_flag=1;
  78.                      b_flag=1;
  79.                      num=0;
  80.                      beep=1;
  81.                      rled=1;
  82.                      fall_flag=0;    //清除违规标志位
  83.                      K_jiacountflag=0;
  84.                      K_jiancountflag=0;
  85. }
  86.        }
  87. }
  88. void Scan(void)            //四路热键扫描(哪个键先按下,哪个优先级最高)
  89. {
  90.        if(K1==0)
  91.        {
  92.               delay(10);
  93.               if(K1==0)
  94.               {
  95.                      while(!K1);
  96.                      num=1;         //数码管显示1号"1"
  97.                      TR0=0;          //关闭定时器0,时间停止
  98.                      TR1=1;          //打开定时器1,使扬声器响一声
  99.                      s_flag=0; //关闭开始键标志位,使再按其他三个个键不会响应
  100.               }
  101.        }
  102.        if(K2==0)                    //下面七个键的处理同上
  103.        {
  104.               delay(10);
  105.               if(K2==0)
  106.               {
  107.                      while(!K2);
  108.                      num=2;         
  109.                      TR0=0;
  110.                      TR1=1;
  111.                      s_flag=0; //重要
  112.               }
  113.        }
  114.        if(K3==0)
  115.        {
  116.               delay(10);
  117.               if(K3==0)
  118.               {
  119.                      while(!K3);
  120.                      num=3;
  121.                      TR0=0;
  122.                      TR1=1;
  123.                      s_flag=0;
  124.               }
  125.        }
  126.        if(K4==0)
  127.        {
  128.               delay(10);
  129.               if(K4==0)
  130.               {
  131.                      while(!K4);
  132.                      num=4;
  133.                      TR0=0;
  134.                      TR1=1;
  135.                      s_flag=0;
  136.               }
  137.        }
  138. }
  139. void display(void)       //数码管显示函数     (答题时间显示函数)
  140. {
  141.        if(flag==1)            //开始键按下,开始计时抢答
  142.        {
  143.               if(num!=0)     //如果有人抢答,则显示相应的几号
  144.               {
  145.                      P0=tabledu[num]; //显示几号抢到了
  146.                      P2=tablewe[0];
  147.                      delay(2);
  148.                      P0=0;
  149.                      P2=0XFF;
  150.               }
  151.               else        //否则没人抢答,则前面不显示几号
  152.               {
  153.                      P0=0;            
  154.                      P2=0XFF;
  155.               }
  156.               P0=tabledu[s/10];        //下面为显示抢答倒计时(表示抢答时的剩余时间)
  157.               P2=tablewe[2];
  158.               delay(2);
  159.               P0=0;
  160.               P2=0XFF;
  161.               P0=tabledu[s%10];
  162.               P2=tablewe[3];
  163.               delay(2);
  164.               P2=0XFF;
  165.               P0=0;
  166.        }
  167.            else
  168.            {
  169.          if(s_flag==1)            //答题键按下,开始计时答题
  170.          {
  171.                             P0=tabledu[num]; //第一位数码管显示抢答队伍号
  172.                             P2=tablewe[0];
  173.                             delay(2);
  174.                             P0=0;
  175.                             P2=0XFF;
  176.                             P0=tabledu[y/10]; //下面显示答题倒计时
  177.                             P2=tablewe[2];
  178.                             delay(2);
  179.                             P0=0;
  180.                             P2=0XFF;
  181.                             P0=tabledu[y%10];
  182.                             P2=tablewe[3];
  183.                             delay(2);
  184.                             P0=0;
  185.                             P2=0XFF;
  186.                      }
  187.        else //如果开始键没有按下,则显示F FF(若有违规者,则显示违规号码及FF)
  188.        {
  189.               if(fall_flag==1)      //违规显示
  190.               {
  191.                      if(num!=0)
  192.                      {
  193.                             P0=tabledu[num]; //显示几号违规了
  194.                             P2=tablewe[0];
  195.                             delay(2);
  196.                             P0=0;
  197.                             P2=0XFF;
  198.                             P0=tabledu[15];          //下面显示 FF,表示违规了
  199.                             P2=tablewe[2];
  200.                             delay(2);
  201.                             P0=0;            //消隐
  202.                             P2=0XFF;
  203.                             P0=tabledu[15];
  204.                             P2=tablewe[3];
  205.                             delay(2);
  206.                             P0=0;
  207.                             P2=0XFF;
  208.                      }
  209.                      else        
  210.                      {
  211.                             P0=0;            
  212.                             P2=0XFF;
  213.                      }
  214.               }
  215.       
  216.               else //没有人违规才显示调整时间(答题完成,队伍按键才可以加减分数)
  217.               
  218.                      if(K_jiacountflag==1)
  219.                      {      
  220.                             P0=tabledu[num]; //第一位数码管显示抢答队伍号
  221.                             P2=tablewe[0];
  222.                             delay(2);
  223.                             P0=0;
  224.                             P2=0XFF;
  225.                             P0=tabledu[grade/10]; //下面显示调整队伍分数
  226.                             P2=tablewe[2];
  227.                             delay(2);
  228.                             P0=0;
  229.                             P2=0XFF;
  230.                             P0=tabledu[grade%10];
  231.                             P2=tablewe[3];
  232.                             delay(2);
  233.                             P0=0;
  234.                             P2=0XFF;
  235.                      }
  236.                      elseif(K_jiancountflag==1)
  237.                      {
  238.                             P0=tabledu[num];       //第一位数码管显示队伍号
  239.                             P2=tablewe[0];
  240.                             delay(2);
  241.                             P0=0;
  242.                             P2=0XFF;
  243.                             P0=tabledu[grade/10];    //(改)
  244.                             P2=tablewe[2];
  245.                             delay(2);
  246.                             P0=0;
  247.                             P2=0XFF;
  248.                             P0=tabledu[grade%10];   //(改)
  249.                             P2=tablewe[3];
  250.                             delay(2);
  251.                             P0=0;
  252.                             P2=0XFF;
  253.                      }
  254.                      else        //否则显示F FF
  255.                      {
  256.                             P0=tabledu[15];
  257.                             P2=tablewe[0];
  258.                             delay(2);
  259.                             P0=0;
  260.                             P0=tabledu[15];
  261.                             P2=tablewe[2];
  262.                             delay(2);
  263.                             P0=0;            //消隐
  264.                             P2=0XFF;
  265.                             P0=tabledu[15];
  266.                             P2=tablewe[3];
  267.                             delay(2);
  268.                             P0=0;
  269.                             P2=0XFF;
  270.                      }      
  271.               }      
  272.        }
  273. }
  274. void Grade_Scan(void)        //分数调整键扫描
  275. {
  276.        if(K_jiacount==0)         //分数加调整
  277.        {
  278.               delay(10);
  279.               if(K_jiacount==0)  
  280.               {
  281.                      while(!K_jiacount);
  282.                      grade++;                     
  283.                      if(grade==20)     //如果分数加到20,就不能再加了
  284.                      {
  285.                             grade=20;
  286.                      }
  287.                      K_jiacountflag=1;  //将分数加标志位置1
  288.                      K_jiancountflag=0; //同时关闭分数减标志位   (加减不能同时)
  289.               }
  290.        }
  291.        if(K_jiancount==0)       //分数减调整
  292.        {
  293.               delay(10);
  294.               if(K_jiancount==0)
  295.               {
  296.                      while(!K_jiancount);
  297.                      grade--;
  298.                      if(grade==0)
  299.                      {
  300.                             grade=0;
  301.                      }
  302.                      K_jiancountflag=1;
  303.                      K_jiacountflag=0;
  304.               }
  305.        }
  306. }
  307. void main(void)    //主函数
  308. {
  309.        T0_Init();
  310.        while(1)
  311.        {
  312.               Key_Scan();           //开始键扫描
  313.           if((flag==1)&(s_flag==0))//当开始键按下及有人抢答才进行开始回答计时倒计时
  314.               {
  315.                      if(K_Time==0)
  316.                      {
  317.                             delay(10);
  318.                             if(K_Time==0)
  319.                             {
  320.                                    while(!K_Time);
  321.                                    y=respond;
  322.                                    TR0=1;
  323.                                    tt=0;
  324.                                    TR1=1;
  325.                             }
  326.                      }
  327.               }      
  328.               if(flag==1&&s_flag==0)     //当开始键、答题键按下及没有人违规时,选手再一次按键表示答题完成,才可进行分数调整  (停止计时)
  329.               {
  330.             Scan();
  331.            if(num==0)
  332.                      {
  333.                delay(10);                           
  334.                             if(num==0)
  335.                             {
  336.                                    while(!num);
  337.                                    TR0=1;
  338.                                    tt=0;
  339.                                    TR1=1;
  340.                  }
  341.             }
  342.                      Grade_Scan();                 //  (答题完成才可调整分数)
  343.               }
  344.       
  345.               if((flag==0)&(s_flag==0))    //违规
  346.               {
  347.                      Scan();
  348.                      if(num!=0)            //开始键没有按下时,有人按下了抢答器,则置违规标志位
  349.                      {
  350.                             fall_flag=1;
  351.                             rled=0;
  352.                      }
  353.               }
  354.               if((flag==1)&(s_flag==1))    //如果开始键按下且抢答键没有人按下,则进行八路抢答键扫描
  355.               {
  356.                      Scan();
  357.               }      
  358.               display();        //显示到数码管上
  359.        }
  360. }
  361. void timer0(void) interrupt 1
  362. {
  363.        TH0=(65536-2000)/256;     //2ms
  364.        TL0=(65536-2000)%256;
  365.        if(b_flag) //开始(START)键按下,嘟一声(长1秒),表示开始抢答
  366.        {
  367.               beep=~beep;
  368.        }
  369.        else
  370.        beep=1;
  371.        if(s<5)    //抢答时间快到报警,隔1秒响一声且红灯闪烁,响三声
  372.        {
  373.               if(s%2==0)
  374.               {
  375.                      b_flag=1;
  376.                      rled=0;   
  377.               }
  378.               else
  379.               {
  380.                      b_flag=0;
  381.                      rled=1;
  382.               }
  383.        }
  384.        tt++;      
  385.        if(tt==500)           //1秒
  386.        {
  387.               tt=0;
  388.               s--;
  389.               b_flag=0;       //关闭开始键按下响一秒的嘟声
  390.               if(s==-1)
  391.               {
  392.                      s=20;     
  393.                      TR0=0;
  394.                      flag=0;   //显示F FF
  395.                      s_flag=1;
  396.                      num=0;
  397.                      rled=1;
  398.               }
  399.        }
  400. }
  401. void timer1(void) interrupt 3      //定时器1处理有人按下抢答器嘟一声(长1秒)
  402. {
  403.        TH1=(65536-2000)/256;
  404.        TL1=(65536-2000)%256;
  405.        beep=~beep;
  406.        t1++;
  407.        if(t1==500)
  408.        {
  409.               t1=0;
  410.               TR1=0;
  411.        }

  412. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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