久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1504|回復: 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. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚欧精品 | 美女在线一区二区 | 最新国产精品精品视频 | 91精品国产91久久久久久不卞 | 欧美一级片中文字幕 | 羞羞视频在线观看网站 | 中文字幕久久精品 | www国产成人免费观看视频,深夜成人网 | 精品一区二区久久久久久久网站 | tube国产| 超黄视频网站 | 久久久久久久国产 | 91xx在线观看 | 色综合欧美 | 亚洲精品在线观 | 91极品视频 | 欧美在线视频网站 | 成人做爰www免费看视频网站 | 九热在线| 亚洲欧美日韩精品久久亚洲区 | 久久国产精品免费 | 成人网在线 | 99国产精品久久久 | 日韩资源 | 日韩精品一区二区三区 | 欧美一级二级在线观看 | 日韩一区二区三区视频 | 国产精品久久久久无码av | 精品欧美激情在线观看 | 99视频免费 | 91麻豆精品一区二区三区 | 欧美日韩亚洲国产综合 | 欧美亚洲国产一区 | 亚洲午夜精品视频 | av片在线观看网站 | 久久69精品久久久久久久电影好 | 中文字幕精品一区 | 女女爱爱视频 | 亚洲精品综合一区二区 | 亚洲精品福利视频 | www..99re |