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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5307|回復: 1
打印 上一主題 下一主題
收起左側

我的單片機51單片機多路搶答器設計 源碼程序 仿真圖

[復制鏈接]
跳轉到指定樓層
樓主
至少六路搶答器,每路配備LED和搶答鍵,數碼管顯示倒計時,蜂鳴器發出提示音。
1.“開始鍵”按下,啟動20s倒計時,20s內無人搶答,一次長音提示,禁止搶答;
2.20s倒計時內有搶答鍵按下,對應LED點亮,一次短音提示,其他搶答鍵禁用;
3.若第一次搶答選手答錯,可二次搶答,但第一次搶答選手不可二次搶答;
4.“開始鍵”未按下,若“搶答鍵”按下,對應LED點亮,三次短音提示犯規;
5.加分項:選手搶答成功10s后,啟動回答倒計時60s功能,倒計時結束兩次短音提示。

這周做的搶答器,一鍵到底
不用按復位
五個功能都實現,可以穿插實現,代碼有注釋
就是寫的長了些,沒有分塊,在一個.c里

下面放了一個今天剛拍的照片
  1. #include <reg52.h> //頭文件
  2. #include <intrins.h>
  3. #define uchar unsigned char //uchar 代替 unsigned char
  4. #define uint  unsigned int  //同上
  5. void delayms(uint);                        //延時函數ms
  6. void display(uchar,uchar);//數碼管顯示
  7. void keypros();        //鍵盤(包含全功能)
  8. void delays(uint xs);//延時s
  9. void Play(uchar t);//提示音
  10. /*譯碼器*/
  11. sbit LSA=P1^5;
  12. sbit LSB=P1^6;
  13. sbit LSC=P1^7;  

  14. /*按鍵*/
  15. sbit key_tt=P1^4; //正確
  16. sbit key_start=P3^6; //一次
  17. sbit key_start_second=P3^7; //二次
  18. sbit key1=P3^0;                //選手1
  19. sbit key2=P3^1;
  20. sbit key3=P3^2;
  21. sbit key4=P3^3;
  22. sbit key5=P3^4;
  23. sbit key6=P3^5;                //選手6

  24. /*蜂鳴器*/
  25. sbit beep=P2^6;

  26. /*LED*/
  27. sbit led1=P2^0; //選手1
  28. sbit led2=P2^1;
  29. sbit led3=P2^2;
  30. sbit led4=P2^3;
  31. sbit led5=P2^4;
  32. sbit led6=P2^5; //選手6

  33. uchar num1,num=60,miaoshi,miaoge,m=1,n=1,p=0,d=0,w1=1,w2=1,w3=1,w4=1,w5=1,w6=1;
  34. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  35.                                                                                 0x66,0x6d,0x7d,0x07,//共陰極數碼管數組 包含0~F
  36.                                                                                 0x7f,0x6f,0x77,0x7c,
  37.                                                                                 0x39,0x5e,0x79,0x71};


  38. void shumaguan(int i)   //數碼管位選譯碼器
  39. {
  40.                         switch(i)
  41.                         {
  42.                                 case 0:
  43.                                         LSA=0;LSB=0;LSC=0;break;
  44.                                 case 1:
  45.                                         LSA=1;LSB=0;LSC=0;break;
  46.                                 case 2:
  47.                                         LSA=0;LSB=1;LSC=0;break;
  48.                                 case 3:
  49.                                         LSA=1;LSB=1;LSC=0;break;
  50.                                 case 4:                                             
  51.                                         LSA=0;LSB=0;LSC=1;break;
  52.                                 case 5:
  53.                                         LSA=1;LSB=0;LSC=1;break;
  54.                                 case 6:
  55.                                         LSA=0;LSB=1;LSC=1;break;
  56.                                 case 7:
  57.                                         LSA=1;LSB=1;LSC=1;break;               
  58.                         }
  59. }
  60.                                                                                 
  61. void Play(uchar t)//提示音
  62. {
  63.          uint i;
  64.         for(i=0;i<500;i++)
  65.         {
  66.                  beep = ~beep;
  67.                 delayms(t);
  68.         }
  69.         beep = 0;
  70. }                                                                                
  71.                                                                                 
  72. void delayms(uint xms)   //延時ms 不準確
  73. {
  74.         uint i,j;
  75.         for(i=xms;i>0;i--)
  76.                 for(j=110;j>0;j--);
  77. }                                                                                
  78.                                        
  79. void delays(uint xs)   //延時2s 不準確
  80. {
  81.                 uint i,z;

  82.                 uchar j; //定義兩個循環變量i、j
  83. for(z=xs;z>0;z--)
  84. for (i = 4165; i > 0; i--) //外層循環1000次

  85. for (j = 1240; j > 0; j--) ; //內層循環124次
  86. }                 


  87. void main()
  88. {        
  89.         
  90.         TMOD=0x01;   //設置定時器0為工作方式1
  91.   TH0=(65536-45872)/256; //裝初值
  92.         TL0=(65536-45872)%256;
  93.         EA=1;                                //開總中斷
  94.         ET0=1;                        //開定時器0中斷                        
  95.         TR0=1;                        //啟動定時器0
  96.         
  97.         while(1)
  98.         {
  99.                 //加分項    這里為了方便查看效果,60秒倒計時 改為18秒倒計時
  100.                 if(num==53&&(d==1||d==2||d==3||d==4||d==5||d==6))
  101.                 {
  102.                                         Play(1);
  103.                                                         delayms(500);
  104.                                                                 Play(1);
  105.                                                                 delayms(500);
  106.                         
  107.         EA=0;                                //開總中斷
  108.                 }
  109.                
  110.         display(miaoshi,miaoge);
  111.         keypros();                                //按鍵函數
  112.         }

  113. }


  114. void display(uchar miaoshi,uchar miaoge)//顯示子函數
  115. {
  116.                 miaoshi=num/10;
  117.                 miaoge=num%10;
  118.         
  119.                 shumaguan(0);
  120.                 P0=table[miaoshi];   
  121.                 delayms(1);
  122.                  P0=0x00;

  123.                 shumaguan(1);
  124.                 P0=table[miaoge];   
  125.                 delayms(1);
  126.                   P0=0x00;
  127. }


  128. void keypros()                                //按鍵函數
  129. {
  130.         
  131.         /*正常情況*/
  132.         if (key_start==0)                //檢測按鍵是否按下
  133.         {
  134.                 delayms(10);                         //消除抖動
  135.                 if(key_start==0)        //再次判斷按鍵是否按下,“開始鍵”按下
  136.                 {
  137.                                 led1=1;
  138.                 led2=1;
  139.                 led3=1;
  140.                 led4=1;
  141.                 led5=1;
  142.                 led6=1;
  143.                         TR0=1;
  144.                         m=0;//初始值為1 只有按下開始鍵  m=0  不按下開始鍵 就搶答,犯規
  145.                         num=20;
  146.                         n=0;//標志位 只允許一個人搶答
  147.                         EA=1;
  148.                 }
  149.                 while(!key_start) //檢測按鍵是否松開
  150.                 display(miaoshi,miaoge);
  151.         }
  152.                                                 
  153.                          if(num==0)//功能1  p標志位 只進行一次
  154.                          {
  155.                                  if(p==0)
  156.                                          {
  157.                                                                 Play(1);
  158.                                                         
  159.                                                                 Play(1);
  160.                                                                
  161.                                                                                 Play(1);
  162.                                                                 delayms(500);
  163.                                  TR0=0;//無人搶答 關閉倒計時
  164.                                         n=1;//關閉搶答
  165.                                                  p=1;
  166.                                  }
  167.                          }
  168.                         
  169.                          if(n==0)//只允許一個人搶答
  170.                          {
  171.                          m=0;//
  172.                                                 
  173.                                  if(key1==0&&n==0)                  //檢測按鍵是否按下  只有n=0才能搶答,保證只有一個人搶答
  174.                         {               
  175.                                         delayms(10);   //消除抖動
  176.                                         if(key1==0&&n==0)         //再次判斷按鍵是否按下
  177.                                         {
  178.                                                 if(w1==1)// w1初始值為1;如果按下了二次搶答按鈕,w1=0,則不執行以下程序
  179.                                                 {
  180.                                                         TR0=0;
  181.                                                         led1=0;
  182.                                                         Play(1);
  183.                                                         n=1;//按下按鈕,標志位為1,不執行其他搶答程序
  184.                                                         
  185.                                                                 /*以下 加分項*/
  186.                                                         delays(5);
  187.                                                 
  188.                                                         num=60;
  189.                                                         TR0=1;
  190.                                                         d=1;//說明 選手1 按下按鈕
  191.                                                 }
  192.                                         }
  193.                
  194.                         }

  195.                                  if(key2==0&&n==0)                  //檢測按鍵是否按下
  196.                         {               
  197.                                         delayms(10);   //消除抖動
  198.                                         if(key2==0&&n==0)         //再次判斷按鍵是否按下
  199.                                         {
  200.                                                         if(w2==1)//如果二次按鈕按下,w2=0  說明答錯了 不進行下一次搶答
  201.                                                         {
  202.                                                         TR0=0;
  203.                                                         led2=0;
  204.                                                         Play(1);
  205.                                                         n=1;
  206.                                                         delays(1);
  207. //這個時間要改 5  才是10秒
  208.                                                         num=60;
  209.                                                         TR0=1;
  210.                                                         d=2; //選手2按下按鈕
  211.                                                         }
  212.                                         }
  213.                
  214.                         }
  215.                         
  216.          if(key3==0&&n==0)                  //檢測按鍵是否按下
  217.                         {        
  218.                                         delayms(10);   //消除抖動
  219.                                         if(key3==0&&n==0)         //再次判斷按鍵是否按下
  220.                                         {
  221.                                                         if(w3==1)
  222.                                                         {        
  223.                                                         TR0=0;
  224.                                                         led3=0;
  225.                                                         Play(1);
  226.                                                         n=1;
  227.                                                         delays(1);
  228. //這個時間要改 5  才是10秒
  229.                                                         num=60;
  230.                                                         TR0=1;
  231.                                                         d=3;
  232.                                                         }
  233.                                         }
  234.                
  235.                         }
  236.                         
  237.          if(key4==0&&n==0)                  //檢測按鍵是否按下
  238.                         {               
  239.                                         delayms(10);   //消除抖動
  240.                                         if(key4==0&&n==0)         //再次判斷按鍵是否按下
  241.                                         {
  242.                                                         if(w4==1)
  243.                                                         {
  244.                                                         TR0=0;
  245.                                                         led4=0;
  246.                                                         Play(1);
  247.                                                         n=1;
  248.                                                         delays(1);
  249. //這個時間要改 5  才是10秒
  250.                                                         num=60;
  251.                                                         TR0=1;
  252.                                                         d=4;
  253.                                                         }
  254.                                         }
  255.                
  256.                         }
  257.                         
  258.          if(key5==0&&n==0)                  //檢測按鍵是否按下
  259.                         {               
  260.                                         delayms(10);   //消除抖動
  261.                                         if(key5==0&&n==0)         //再次判斷按鍵是否按下
  262.                                         {
  263.                                                         if(w5==1)
  264.                                                         {
  265.                                                         TR0=0;
  266.                                                         led5=0;
  267.                                                         Play(1);
  268.                                                         n=1;
  269.                                                         delays(1);
  270. //這個時間要改 5  才是10秒
  271.                                                         num=60;
  272.                                                         TR0=1;
  273.                                                         d=5;
  274.                                                         }
  275.                                         }
  276.                
  277.                         }
  278.                         
  279.          if(key6==0&&n==0)                  //檢測按鍵是否按下
  280.                         {        
  281.                                         delayms(10);   //消除抖動
  282.                                         if(key6==0&&n==0)         //再次判斷按鍵是否按下
  283.                                         {
  284.                                                         if(w6==1)
  285.                                                         {        
  286.                                                         TR0=0;
  287.                                                         led6=0;
  288.                                                         Play(1);
  289.                                                         n=1;
  290.                                                         delays(1);
  291. //這個時間要改 5  才是10秒
  292.                                                         num=60;
  293.                                                         TR0=1;
  294.                                                         d=6;
  295.                                                         }
  296.                                         }
  297.                
  298.                         }
  299.                         
  300.                                 }
  301.         

  302. /*犯規情況功能4*/
  303. if(m==1)//不按下開始鍵 m=1
  304.                 {
  305. if (key_start!=0)                //檢測按鍵是否按下  未按下則執行下面
  306.         {
  307.                 led1=1;
  308.                 led2=1;
  309.                 led3=1;
  310.                 led4=1;
  311.                 led5=1;
  312.                 led6=1;
  313.                         if(key1==0&&key_start!=0)                  //開始鍵未按下,按下搶答器 執行下面
  314.                         {        
復制代碼

111122.jpg (4.26 MB, 下載次數: 66)

主程序流程圖

主程序流程圖

431.jpg (4.95 MB, 下載次數: 61)

課設要求

課設要求

11.png (131.72 KB, 下載次數: 64)

bmp

bmp

22.png (49.88 KB, 下載次數: 78)

proteus

proteus

仿真程序.7z

33.84 KB, 下載次數: 88, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:335743 發表于 2020-1-7 11:23 | 只看該作者
本帖最后由 chb704125391 于 2020-1-7 16:51 編輯

新人第一次正兒八經發帖
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久九九 | 精品免费国产一区二区三区四区 | 91一区二区在线观看 | 99在线免费观看 | 伊人网影院 | 国产黄视频在线播放 | 亚洲欧美精品久久 | 四虎影院在线观看免费视频 | 亚洲精品欧美一区二区三区 | 成人夜晚看av | 国产精品www | 国产一区二区三区在线视频 | 久久久久国产一区二区三区 | 精品亚洲一区二区 | 免费v片| 亚洲精品4 | 久久影院一区 | 欧美亚洲另类丝袜综合网动图 | 免费黄网站在线观看 | 免费视频一区二区 | 成人国产精品久久 | 久久久久久久久久久丰满 | 在线视频一区二区三区 | 91性高湖久久久久久久久_久久99 | 成人国产在线观看 | 国产精品视频久久久久久 | 日本三级精品 | 黄网站在线播放 | 91精品国产日韩91久久久久久 | 色视频在线播放 | 91久久精品 | 好姑娘高清在线观看电影 | 免费人成激情视频在线观看冫 | 国产东北一级毛片 | 欧美日韩专区 | 国产在线不卡 | www.色午夜.com | 色吧综合网 | 无码日韩精品一区二区免费 | 国产高清性xxxxxxxx | 亚洲综合视频 |