欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2991|回復: 2
收起左側

單片機實現八路搶答器+查看分數+加減分源程序

[復制鏈接]
ID:752027 發表于 2020-5-14 20:25 | 顯示全部樓層 |閱讀模式
基于單片機的八路搶答器
一、主要內容
通過利用數碼管顯示,并自動復位的思路,運用單片機的運行產生輸出信號,通過數碼管顯示對應的通道,實現了一個以單片機為核心的8路搶答器,
并且具有查看選手分數和進行加減分的功能。

二、具體操作
2、主持人按下開始鍵選手等待時間計完聽到滴聲后才可以搶答,若提前搶到則
視為犯規。
3、搶答成功后別的選手再搶到也是沒有用的。
4、顯示屏上顯示哪位選手搶到,并開始對答題時間進行倒計時。
5、顯示答題時間,在答題時間小于 5S 時報警電路會發生作用。
7、當主持人按下 RESET 鍵則進行下一輪的比賽。

二、程序用什么軟件查看?   

打開程序的軟件是Keil

單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit smg1=P2^0;                //定義數碼管第一位
  6. sbit smg3=P2^2;                //定義數碼管第三位
  7. sbit smg4=P2^3;                //定義數碼管第四位
  8. sbit keyks=P3^5;               //定義開始按鍵
  9. sbit keytz=P3^4;               //定義停止按鍵
  10. sbit keyqc=P3^3;               //定義清除按鍵

  11. sbit beep=P3^6;                //定義蜂鳴器
  12. uchar k;
  13. uchar keyvalue=0;
  14. uint a;
  15. int djs=20,js=0;                   //djs和bt是初始倒計時時間,可修改
  16. int table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  17. int zhunbei[] = {0x92,0x99,0xb0,0xa4,0xf9,0xc0};//準備搶答
  18. int fenshu[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19. char fs[8];

  20. uchar mode=0;              //主持人的按鍵模式
  21. //  mode=0:顯示選手1的分數  mode=1:顯示選手2的分數....../////////



  22. void delayzb(uint z)//準備搶答延時
  23. {
  24.          uint x,y;//局部變量定義
  25.          for(x = z;x>0;x--)//此for循環100次
  26.          for(y = 144;y>0;y--);//此for循環144次,100*144次循環正好是100ms.
  27. }

  28. void delay()
  29. {
  30.         uchar m,n,s;
  31.         for(m = 20;m>0;m--);
  32.         for(n = 20;n>0;n--);
  33.         for(s = 248;s>0;s--);
  34. }


  35. void delayms(uint z)
  36. {
  37.                 uint x,y;
  38.                 for(x=z;x>0;x--)
  39.                 for(y=110;y>0;y--);
  40. }



  41. void Getch ()        //取鍵值函數
  42. {
  43.         //keyvalue=0;
  44.    P1=0xf0; //先對P3 置數 列掃描
  45.   if(P1!=0xf0) //判斷是否有鍵按下
  46.   {
  47.           delay(); //延時,軟件去干擾
  48.            if(P1!=0xf0) //確認按鍵按下
  49.           {
  50.                         switch (P1) //判斷鍵值(哪一列被按下)
  51.                         {                                
  52.                                         case 0xe0: keyvalue=1; break; //第一列被按下
  53.                                         case 0xd0: keyvalue=2; break; //第二列被按下
  54.                                         case 0xb0: keyvalue=3; break; //被三列被按下
  55.           case 0x70: keyvalue=4; break; //被四列被按下
  56.                         }
  57.                         P1 = 0x0f;   //行掃描
  58.                         switch (P1)  //判斷哪一行被按下
  59.                         {
  60.                                         case 0x0e: keyvalue=keyvalue; break; //第一行被按下
  61.                                         case 0x0d: keyvalue=keyvalue + 4; break; //第二行被按下
  62.                                         case 0x0b: keyvalue=keyvalue + 8; break; //第三行被按下
  63.                                   case 0x07: keyvalue=keyvalue + 12; break; //第四行被按下
  64.                         }   
  65.                         while (P1 != 0x0f);  //松手檢測
  66.                  }
  67.          }
  68. }



  69. void Timer0_init()                        //定時器0初始化
  70. {
  71.                 js=0;
  72.                 TMOD=0x01;                   //TR0=1;//IT1=1;   //T0為定時器方式1   //EX1=1;
  73.                 TH0=0x4c;             //每50ms溢出一次
  74.                 TL0=0x00;                        
  75.                 ET0=1;
  76.                 EA=1;        
  77. }


  78. void timer0() interrupt 1 using 1        //定時器0中斷服務函數
  79. {
  80.         TF0=0;
  81.         TH0=0x4c;                                        //每50ms溢出一次
  82.         TL0=0x00;                                        //賦初值
  83.         js++;
  84.          if(js==20)                                      //20*50=1000ms=1s
  85.         {
  86.                 js=0;
  87.                 djs--;                                        //產生1s的倒計時
  88.   }
  89.         if(djs==5)
  90.         {
  91.                 beep = 0;                          //倒計時后5s報警
  92.                 delay();
  93.                 beep = 1;
  94.                 delay();
  95.         }
  96.   if(djs==0)
  97.         {        
  98.                 P2 = 0xff;
  99.                 TR0=0;                            //倒計時結束,關閉定時器

  100.   }
  101. }








  102. void djsxs()                                   //顯示倒計時函數
  103. {        
  104.                 int shi,ge;
  105.                 shi=djs/10;
  106.                 ge=djs%10;                                  // 將倒計時時間分成高低位

  107.                 P2=0XFF;         
  108.                 smg4 = 0;
  109.                 P0=table[ge];
  110.                 smg4 = 0;
  111.                 delayms(2);
  112.                 P2=0XFF;


  113.                 smg3 = 0;
  114.                 P0=table[shi];
  115.                 smg3 = 0;
  116.                 delayms(2);
  117.                 P2=0XFF;
  118. }


  119. void djsxs22()   //顯示- --                              
  120. {
  121.                 P2=0XFF;
  122.                 P0=0xbf;
  123.                 smg1 = 0;
  124.                 delayms(3);
  125.                 P2=0XFF;                                        //第一位數碼管顯示-

  126.                 P0=0xbf;
  127.                 smg3 = 0;
  128.                 delayms(3);                           //第三位數碼管顯示-
  129.                 P2=0XFF;

  130.                 P0=0xbf;
  131.                 smg4 = 0;
  132.                 delayms(3);
  133.                 P2=0XFF;                                //第四位數碼管顯示-
  134. }





  135. void playerxs()
  136. {
  137.     P0=table[keyvalue];
  138.     smg1=0;
  139.     delayms(3);
  140.     smg1=1;
  141. }        //第一位數碼管顯示





  142. void main()
  143. {
  144.                 int djs1=20;              
  145.                 Timer0_init();         //初始化定時器中斷
  146.                 beep=1;                //蜂鳴器不響
  147.                 djs=20;                     //倒計時賦值

  148.         
  149.          while(1)
  150.         {
  151.                 LOOP1:
  152.     Getch();               
  153.                 djs=djs1;
  154.                 djsxs22();        //LOOP1是標號,顯示 -  --
  155.                 keyvalue = 0;
  156. //                beep=1;                //蜂鳴器不響
  157.                 djs=20;                     //倒計時賦值
  158.                 TR0 = 0;
  159.                
  160.                
  161.                  if(keyks==0)//開始按鍵
  162.            {
  163.                          beep=0;//蜂鳴器響
  164.                          delayms(3);          //去除按鍵抖動
  165.                      if(keyks==0)   //確定開始按下
  166.                          {         
  167.                                  
  168.                                          while(!keyks);       //松手檢測        
  169.                                         {
  170.                                                 beep=1;
  171.                                                 for(a = 0;a<6;a++) //5s倒計時準備搶答
  172.                                                 {
  173.                                                         P2 = 0xf7;//1111 0111       //第四位數碼管顯示5s倒計時
  174.                                                         P0 = zhunbei[a];
  175.                                                         delayzb(800);
  176.                                                         P2 = 0xff;
  177.                                                 }
  178.                                         }
  179.                                        
  180.                                          while(1)
  181.                                   {
  182.                                                            Getch();
  183.                                                 
  184.                                                if(keyqc == 0)
  185.                                                            {
  186.                                                                          delayms(3);                   //去除抖動
  187.                                            if(keyqc == 0)
  188.                                                                         {
  189.                                                                                  while(!keyqc); //如果按下清除鍵,則回到- --狀態
  190.                                                                                  goto LOOP1;                  //goto語句,回到loop1表號處
  191.                                                                         }
  192.                                                           }
  193.                                                                  

  194.                                                                           
  195.                                                          
  196.                                 /*以下是八個選手搶答,key1表示1號選手,依次類推,注釋只寫第一位選手,其他和第一個完全一致*/

  197.                                                                        
  198.                                                                  if((keyvalue>=1)&&(keyvalue<=8)&&(TR0==0))        //在定時器關閉狀態下,key1==0 則說明1號選手按下按
  199.                                                                 {
  200.                                                                          beep=0;                 //蜂鳴器響
  201.                                          
  202.                                                                                         //while(!key1);          //去除按鍵抖動后,重新在判斷,是否確實按下
  203.                                                                                         beep=1;                  //蜂鳴器不響
  204.                                                                                         TR0=1;                   //定時器開始
  205.                                                                                         while(1)
  206.                                                                                         {
  207.                                                                                                 mode = keyvalue;
  208.                                                                                                 playerxs();            //顯示選手編號
  209.                                                                                                 djsxs();                //顯示剩余倒計時時間
  210.                                                                                                 //keyvalue = 1;
  211.                                                                                                 
  212.                                                                                                  if(keyqc == 0)
  213.                                                                                                  {         
  214.                                                                                                          delayms(3);                   //去除抖動
  215.                                                                                                          if(keyqc == 0)
  216.                                                                                                                 {
  217.                                                                                                                          while(!keyqc); //如果按下清除鍵,則回到- --狀態
  218.                                                                                                                          goto LOOP1;                  //goto語句,回到loop1表號處
  219.                                                                                                                 }
  220.                                                                                                  }
  221.                                                                                                         if(keytz == 0)          //暫停按下按下
  222.                                                                                                         {        
  223.                                                                                                                  delayms(3);                   //去除抖動
  224.                                                                                                                  if(keytz == 0)           //再次判斷是否按下復位按鍵
  225.                                                                                                                  {
  226.                                                                                                                                 while(!keytz) //如果按下復位鍵,則回到- --狀態
  227.                                                                                                                                 TR0=0;                                       
  228.                                                                                                                         }
  229.                                                                                                          }                                                                                 
  230.                                                                                                         if(keyks == 0)//開始按鍵
  231.                                                                                                         {
  232.                                                                                                                                                                                  
  233.                                                                                                                   beep=0;//蜂鳴器響
  234.                                                                                                                  delayms(30);          //去除按鍵抖動
  235.                                                                                                                  if(keyks == 0)   //確定開始按下
  236.                                                                                                                  {
  237.                                                                                                                         while(!keyks);       //松手檢測
  238.                                                                                                                  {
  239.                                                                                                                                 beep=1;                                                                                                                         //蜂鳴器不響
  240.                                 delay();
  241.                                                                                                                                                 
  242.                                                                                                                                 TR0 = 1;                                                
  243.                                                                                                                   }        
  244.                                                                                                                  }
  245.                                                                                                          }
  246.                                                                                                         if(djs == 0)
  247.                                                                                                         
  248.                                                                                                          break;
  249.                                                                                                         
  250.                                                                                                  }
  251.                                                                                         }                                                                                       
  252.                                                                         
  253.                                                         if (mode!=0)
  254.                                                         {
  255.                                               TR0 = 0;
  256.                                                                                 
  257.                                                                                 while(1)
  258.                                                                                 {
  259.                                                                                                 P0=table[mode];
  260.                                                                                                 smg1=0;
  261.                                                                                                 delayms(3);
  262.                                                                                                 smg1=1;              //顯示選手編號                                                                                
  263.                                                                                     P0=table[fs[mode]];
  264.                                                                                     smg4=0;
  265.                         delayms(3);
  266.                                                                                     smg4=1;

  267.                                                                                                 Getch();
  268.                                                                                                 if(keyvalue == 9)
  269.                                                                                                 {
  270.                                                                                                         keyvalue = 0;
  271.                                                                                                                  mode++;
  272.                                                                                                                 if(mode>8)
  273.                                                                                                                 {
  274.                                                                                                                         mode=0;
  275.                                                                                                                 }                                                        
  276.                                                                                                 }
  277.                                                                                                 else if(keyvalue == 10)   //加分
  278.                                                                                                 {
  279.                           keyvalue = 0;
  280.                                                                                                         fs[mode]++;
  281.                                                                                                         if(fs[mode] == 10)
  282.                                                                                                         fs[mode] = 9;                                                
  283.                                                                                                 }
復制代碼

八路搶答器last.zip

32.09 KB, 下載次數: 36, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:779675 發表于 2020-6-15 17:12 | 顯示全部樓層
那個能把原理圖發一下嗎
回復

使用道具 舉報

ID:785533 發表于 2020-6-21 08:54 | 顯示全部樓層
程序不對吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表