找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2980|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)四路搶答器(倒計(jì)時(shí))基于51單片機(jī)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:627904 發(fā)表于 2019-11-10 12:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 123456ld 于 2019-11-11 15:09 編輯

基于c51的四路搶答器,本實(shí)驗(yàn)通過(guò)數(shù)碼管結(jié)合矩陣按鍵及獨(dú)立按鍵組成四路搶答器。對(duì)不同選手的判斷從而在數(shù)碼管上顯示那位選手搶答成功暫停計(jì)時(shí),或哪三位選手犯規(guī)觸發(fā)蜂鳴器報(bào)警。其中倒計(jì)時(shí)的開始由獨(dú)立按鍵K1實(shí)現(xiàn),對(duì)搶答或倒計(jì)時(shí)的恢復(fù)由獨(dú)立按鍵K3實(shí)現(xiàn)。程序源碼為本人自創(chuàng),如有不懂,請(qǐng)留言發(fā)問(wèn)。篇幅有限僅提供部分代碼。詳情請(qǐng)下載后查閱。

該程序適用stc89c51單片機(jī)

單片機(jī)源程序如下:
  1. /****************************************************
  2. *                    實(shí)驗(yàn)內(nèi)容
  3. *                   四路搶答器
  4. **************************************************/

  5. #include <reg52.h>

  6. typedef unsigned int u16;
  7. typedef unsigned char u8;

  8. /***********************************************
  9. *
  10. *               變量及引腳定義聲明
  11. *************************************************/
  12. sbit AA = P2^2;
  13. sbit BB = P2^3;
  14. sbit CC = P2^4;
  15. sbit k3 = P3^2;
  16. sbit k4 = P3^3;
  17. sbit beep = P1^5;
  18. int i=0;      //初始狀態(tài)控制毫秒的兩位數(shù)碼管為0
  19. int j=10;     //初始狀態(tài)控制秒的兩位數(shù)碼管為10
  20. int jishu=0;  //以10ms為一個(gè)劑量,精準(zhǔn)控制毫秒的99-0
  21. int cishu=0; //消除最后一秒帶來(lái)的影響
  22. int xuanshou=0;  //選手編號(hào)
  23. int biaozhi=1;    //控制搶答開始后只有一個(gè)人可以被記錄
  24. int wei1=0 , wei2=0 , wei3=0;
  25. enum position {zero, one, two, three, four, five, six, seven};

  26. u16 code duanxuan[16] = { 0x3f,0x06,0x5b,0x4f,
  27.                           0x66,0x6d,0x7d,0x07,
  28.                                               0x7f,0x6f,0x77,0x7c,
  29.                           0x39,0x5e,0x79,0x71};

  30. /*****************************************************
  31. *
  32. *                   子函數(shù)申明
  33. ******************************************************/                                                                                                        
  34. void delay(u16 i);      //延時(shí)函數(shù)         
  35. void jvzhen();                        //矩陣鍵盤選手確定                                                
  36. void weixuan( u16 i );  //數(shù)碼管位選
  37. void timer0();          //定時(shí)器初始化
  38. void xianshi();         //數(shù)碼管倒計(jì)時(shí)顯示
  39. void int0();            //中斷0倒計(jì)時(shí)開始
  40. void int1();                        //中斷1問(wèn)題結(jié)束恢復(fù)數(shù)碼管                                                        
  41. void panduan();         //答題選手的判斷
  42. void qiangda();         //選手搶答時(shí)的判斷
  43.                                                                                                 
  44. /*****************************************************
  45. *                     主函數(shù)
  46. *******************************************************/                                                                                                        
  47. void main()
  48. {
  49.         int0();
  50.         int1();
  51.         timer0();        
  52.         while(1)
  53.         {
  54.                 xianshi();
  55.                 jvzhen();
  56.                 panduan();
  57.                 qiangda();
  58.         }
  59. }

  60. void qiangda()
  61. {
  62.         if( j==10&&xuanshou!=0 )
  63.         {
  64.         wei1 = xuanshou;
  65.         while(1)
  66.         {
  67.             xianshi();
  68.             weixuan(7);
  69.             P0 = duanxuan[wei1];           
  70.             delay(1);
  71.             P0 = 0x00;
  72.             
  73.             beep=~beep;
  74.             delay(1);
  75.             jvzhen();
  76.             if( xuanshou!=wei1 )
  77.             {
  78.                 break;
  79.             }
  80.             if( k4==0 )
  81.             {               
  82.                 break;
  83.             }
  84.         }
  85.         wei2 = xuanshou;
  86.         while(1)
  87.         {
  88.             xianshi();
  89.             
  90.             weixuan(7);
  91.             P0 = duanxuan[wei2];           
  92.             delay(1);
  93.             P0 = 0x00;
  94.          
  95.             weixuan(6);
  96.             P0 = duanxuan[wei1];
  97.             delay(1);
  98.             P0 = 0x00;
  99.             
  100.             beep=~beep;
  101.             delay(1);
  102.             jvzhen();
  103.             if( xuanshou!=wei2 )
  104.             {
  105.                 break;
  106.             }
  107.             if( k4==0 )
  108.             {               
  109.                 break;
  110.             }
  111.         }
  112.         wei3 = xuanshou;
  113.         while(1)
  114.         {
  115.             xianshi();
  116.             
  117.             weixuan(7);
  118.             P0 = duanxuan[wei3];           
  119.             delay(1);
  120.             P0 = 0x00;
  121.          
  122.             weixuan(6);
  123.             P0 = duanxuan[wei2];
  124.             delay(1);
  125.             P0 = 0x00;
  126.             
  127.             weixuan(5);
  128.             P0 = duanxuan[wei1];
  129.             delay(1);
  130.             P0 = 0x00;
  131.             
  132.             beep=~beep;
  133.             delay(1);
  134.             jvzhen();
  135.             if( k4==0 )
  136.             {               
  137.                 break;
  138.             }
  139.         }     
  140.         }        
  141. }

  142. /*        延時(shí)           */
  143. void delay(u16 i)
  144. {
  145.         u16 a;
  146.         while(i--)
  147.         {
  148.                 for(a = 0; a < 100; a++)
  149.                 {
  150.                         ;
  151.                 }               
  152.         }        
  153. }

  154. /* 顯示哪位選手按鍵暫停     */
  155. void panduan()
  156. {
  157.         if( i!=0 && xuanshou!=0 )
  158.         {
  159.                 switch( xuanshou )
  160.                 {
  161.                         case 1 : TR0=0; weixuan(7); P0=duanxuan[1]; delay(1); P0 = 0x00; break;
  162.                         case 2 : TR0=0; weixuan(7); P0=duanxuan[2]; delay(1); P0 = 0x00; break;
  163.                         case 3 : TR0=0; weixuan(7); P0=duanxuan[3]; delay(1); P0 = 0x00; break;
  164.                         case 4 : TR0=0; weixuan(7); P0=duanxuan[4]; delay(1); P0 = 0x00; break;
  165.                 }
  166.                 biaozhi=0;
  167.         }
  168. }

  169. /*      矩陣鍵盤選手確定        */
  170. void jvzhen()
  171. {
  172.         P1 = 0x0f;
  173.         if( (P1!=0x0f&&biaozhi==1) )
  174.         {               
  175.                 delay(5);
  176.                 if( (P1!=0x0f)  )
  177.                 {
  178.                         switch( P1 )
  179.                         {
  180.                                 case 0x07 : xuanshou = 1; break;
  181.                                 case 0x0b : xuanshou = 2; break;
  182.                                 case 0x0d : xuanshou = 3; break;
  183.                                 case 0x0e : xuanshou = 4; break;
  184.                         }
  185.                         P1=0xf0;
  186.                         switch( P1 )
  187.                         {
  188.                                 case (0x70) : xuanshou = xuanshou;    break;        
  189.                         }
  190.                 }
  191.         }        
  192. }

  193. /* 數(shù)碼管位選*/
  194. void weixuan( u16 i )
  195. {
  196.         switch(i)
  197.         {
  198.                 case (zero):  CC = 0; BB = 0; AA = 0; break;        //第零位
  199.                 case (one):          CC = 0; BB = 0; AA = 1; break;        //第一位
  200.                 case (two):   CC = 0; BB = 1; AA = 0; break;        //第二位
  201.                 case (three): CC = 0; BB = 1; AA = 1; break;        //第三位
  202.                 case (four):  CC = 1; BB = 0; AA = 0; break;        //第四位
  203.                 case (five):  CC = 1; BB = 0; AA = 1; break;        //第五位
  204.                 case (six):   CC = 1; BB = 1; AA = 0; break;        //第六位
  205.                 case (seven): CC = 1; BB = 1; AA = 1; break;        //第七位
  206.         }
  207. }

  208. /* 定時(shí)器初始化*/
  209. void timer0()
  210. {
  211.         TMOD =0x01;
  212.         TH0 = (65536-1000)/256;
  213.         TL0 = (65536-1000)%256; //1ms
  214.         ET0 = 1;
  215.         EA = 1;
  216. }

  217. /* 倒計(jì)時(shí)顯示 */
  218. void xianshi()
  219. {
  220.                 weixuan(0);
  221.                 P0 = duanxuan[i%10];                        
  222.                 delay(1);
  223.                 P0 = 0x00;
  224.    
  225.                 weixuan(1);
  226.                 P0 = duanxuan[i/10];                        
  227.                 delay(1);
  228.                 P0 = 0x00;

  229.                 weixuan(2);
  230.                 P0 = 0x40;                        
  231.                 delay(1);
  232.                 P0 = 0x00;
  233.                
  234.                 weixuan(3);
  235.                 P0 = duanxuan[j%10];                        
  236.                 delay(1);
  237.                 P0 = 0x00;
  238.                
  239.                 weixuan(4);
  240.                 P0 = duanxuan[j/10];                        
  241.                 delay(1);
  242.                 P0 = 0x00;               
  243. }

  244. /* 倒計(jì)時(shí)開始 */
  245. void int0()
  246. {
  247.         EA=1;
  248.         IT0=1;
  249.         EX0=1;
  250. }

  251. /*  數(shù)碼管復(fù)位 */
  252. void int1()
  253. {
  254.         EX1=1;
  255.         IT1=1;
  256.         EA=1;
  257. }





復(fù)制代碼

所有資料51hei提供下載:
四路搶答器(倒計(jì)時(shí)).zip (35.3 KB, 下載次數(shù): 39)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-11-10 21:14 | 只看該作者
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表