亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的八路搶答器程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1172609 發表于 2026-6-4 14:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序是一個基于51單片機(STC89C52/AT89S52)的八路搶答器系統。系統支持6名參賽選手(編號1~6)、1個主持人控制端(開始鍵)和1個設置鍵,具備搶答計時、選手編號顯示、聲光提示等完整功能。

核心功能
功能描述
主持人控制按下"開始"鍵(KEY7)啟動一輪搶答
6路搶答選手16號按鍵(KEY1KEY6),先按先得
倒計時顯示4位數碼管顯示剩余時間和選手編號
聲光報警蜂鳴器提示音 + LED狀態指示
搶答鎖定一旦有選手搶答,鎖定其他選手按鍵
回答計時搶答成功后給予20秒回答時間

引腳詳細說明P2口 — 輸出控制口
引腳符號方向有效電平功能描述
P2.0BEEP輸出高電平蜂鳴器驅動,發聲提示
P2.1LED3輸出低電平LED指示燈3
P2.2LED2輸出低電平LED指示燈2
P2.3LED1輸出低電平LED指示燈1(超時報警)
P2.4DIG1輸出低電平第1位數碼管位選
P2.5DIG2輸出低電平第2位數碼管位選
P2.6DIG3輸出低電平第3位數碼管位選
P2.7DIG4輸出低電平第4位數碼管位選

P0口 — 數碼管段選
引腳符號功能
P0.0~P0.7duanPore共陰數碼管段選(a,b,c,d,e,f,g,dp),高電平有效
P1口 — 選手按鍵輸入
引腳符號功能
P1.0KEY11號選手搶答鍵
P1.1KEY22號選手搶答鍵
P1.2KEY33號選手搶答鍵
P1.3KEY44號選手搶答鍵
P1.4KEY55號選手搶答鍵
P1.5KEY66號選手搶答鍵

P3口 — 控制按鍵
引腳符號功能
P3.2KEY7主持人"開始"鍵
P3.3KEY8設置鍵(預留,代碼中未使用)
關鍵技術參數匯總
參數數值
系統時鐘12 MHz(假設)
機器周期1 μs
定時器0中斷周期10 ms
1秒計數閾值100次 × 10ms
搶答倒計時5 秒
回答倒計時20 秒
按鍵消抖延時10 ms
數碼管掃描間隔5 ms(每位)
數碼管刷新率≈ 50 Hz(每秒25輪完整掃描)
蜂鳴器提示時長300 ms

單片機源程序如下:
  1. #include <reg52.h>

  2. //------------------------- 引腳定義 --------------------------//
  3. sbit BEEP = P2^0;        //蜂鳴器控制引腳,高電平有效

  4. sbit LED1 = P2^3;        //LED1,控制引腳,低電平有效
  5. sbit LED2 = P2^2;        //LED2,控制引腳,低電平有效
  6. sbit LED3 = P2^1;        //LED3,控制引腳,低電平有效

  7. //數碼管引腳定義
  8. #define duanPore        P0                //數碼管段控制端口,高電平有效
  9. sbit DIG1 = P2^4;                        //數碼管第1位位選控制端口,低電平有效
  10. sbit DIG2 = P2^5;                        //數碼管第2位位選控制端口,低電平有效
  11. sbit DIG3 = P2^6;                        //數碼管第3位位選控制端口,低電平有效
  12. sbit DIG4 = P2^7;                        //數碼管第4位位選控制端口,低電平有效

  13. //按鍵引腳定義
  14. sbit KEY1 = P1^0;                //1號選手
  15. sbit KEY2 = P1^1;                //2號選手
  16. sbit KEY3 = P1^2;                //3號選手
  17. sbit KEY4 = P1^3;                //4號選手
  18. sbit KEY5 = P1^4;                //5號選手
  19. sbit KEY6 = P1^5;                //6號選手
  20. sbit KEY7 = P3^2;                //主持人鍵
  21. sbit KEY8 = P3^3;                //設置鍵



  22. //---------------------- 全局變量定義 --------------------//

  23. //數碼管段碼表,適用于共陰數碼管
  24. unsigned char code tab_duan[18] =
  25. {
  26.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,        //0~9
  27.         0x77,0x7c,0x39,0x5e,0x79,0x71,                //A~F
  28.         0x40,0x00                                                        //'-',關閉顯示
  29. };
  30. unsigned char dat_buf[4] = {17, 17, 0, 5};        //顯示數據緩存區,默認上電顯示"  05"
  31. int time = 5;                                //倒計時時間
  32. unsigned char i = 0;
  33. unsigned int count = 0;                //計數緩存變量
  34. bit flag_lock = 1;                         //鍵盤鎖定標志,1:不鎖定,0:鎖定




  35. //------------------------------- 函數聲明 ------------------------------------//
  36. void DelayMs(unsigned int ms);                //延時函數,單位:ms
  37. void dig_scan(unsigned char *dat);
  38. unsigned char KeyScan(void);                //獨立按鍵掃描
  39. void InitTimer0(void);                                //定時器0初始化
  40. void alarm(void);                //報警函數
  41. void AnswerTask(void);        //搶答任務




  42. /* 主函數 */
  43. void main(void)
  44. {
  45.         BEEP = 0;                        //上電默認關閉蜂鳴器
  46.         LED1 = 1;
  47.         InitTimer0();                //定時器0初始化        

  48.         while(1)
  49.         {
  50.                 if(KeyScan() == 7)        //如果主持人鍵按下,則進行搶答
  51.                 {
  52.                         alarm();                //蜂鳴器響一聲
  53.                         AnswerTask();        //進行搶答任務
  54.                 }

  55.                 dig_scan(dat_buf);        //測試數碼管顯示        
  56.         }
  57. }

  58. /* 延時函數,單位:ms */
  59. void DelayMs(unsigned int ms)
  60. {
  61.         unsigned char a,b,c;

  62.         while(--ms)
  63.         {
  64.             for(c=1;c>0;c--)
  65.                 for(b=142;b>0;b--)
  66.                     for(a=2;a>0;a--);        
  67.         }
  68. }

  69. /* 數碼管顯示掃描 */
  70. void dig_scan(unsigned char *dat)
  71. {
  72.         /* 動態掃描處理 */
  73.         switch(i)
  74.         {
  75.                 case 0:
  76.                 {
  77.                         duanPore = tab_duan[dat[0]];        //顯示第1位數碼管內容        
  78.                         DIG1 = 0;
  79.                         break;
  80.                 }
  81.                 case 1:
  82.                 {
  83.                         duanPore = tab_duan[dat[1]];        //顯示第2位數碼管內容        
  84.                         DIG2 = 0;                                                //選通第2位數碼管
  85.                         break;
  86.                 }
  87.                 case 2:
  88.                 {
  89.                         duanPore = tab_duan[dat[2]];        //顯示第3位數碼管內容        
  90.                         DIG3 = 0;                                                //選通第3位數碼管
  91.                         break;
  92.                 }
  93.                 case 3:
  94.                 {
  95.                         duanPore = tab_duan[dat[3]];        //顯示第4位數碼管內容        
  96.                         DIG4 = 0;                                                //選通第4位數碼管
  97.                         break;
  98.                 }
  99.                 default: break;        
  100.         }
  101.         DelayMs(5);                //掃描延時10ms,根據實際情況適當修改改延時時間
  102.         DIG1 = 1;                        //消隱
  103.         DIG2 = 1;
  104.         DIG3 = 1;
  105.         DIG4 = 1;
  106.         ++i;                                //掃描變量循環
  107.         if(i > 3)
  108.                 i = 0;        
  109. }

  110. /* 獨立按鍵掃描 */
  111. unsigned char KeyScan(void)
  112. {
  113.         if(KEY1 == 0)                //如果按鍵1按下
  114.         {
  115.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  116.                 if(KEY1 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  117.                         return 1;        //輸出按鍵值1
  118.         }
  119.         if(KEY2 == 0)                //如果按鍵2按下
  120.         {
  121.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  122.                 if(KEY2 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  123.                         return 2;        //輸出按鍵值2
  124.         }
  125.         if(KEY3 == 0)                //如果按鍵3按下
  126.         {
  127.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  128.                 if(KEY3 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  129.                         return 3;        //輸出按鍵值3
  130.         }
  131.         if(KEY4 == 0)                //如果按鍵4按下
  132.         {
  133.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  134.                 if(KEY4 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  135.                         return 4;        //輸出按鍵值4
  136.         }
  137.         if(KEY5 == 0)                //如果按鍵5按下
  138.         {
  139.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  140.                 if(KEY5 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  141.                         return 5;        //輸出按鍵值5
  142.         }
  143.         if(KEY6 == 0)                //如果按鍵6按下
  144.         {
  145.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  146.                 if(KEY6 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  147.                         return 6;        //輸出按鍵值6
  148.         }
  149.         if(KEY7 == 0)                //如果按鍵7按下
  150.         {
  151.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  152.                 if(KEY7 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  153.                         return 7;        //輸出按鍵值7
  154.         }
  155.         if(KEY8 == 0)                //如果按鍵8按下
  156.         {
  157.                 DelayMs(10);        //延時10ms去除按鍵抖動        
  158.                 if(KEY8 == 0)        //再確認一次按鍵按下,表示到這按鍵已經穩定了
  159.                         return 8;        //輸出按鍵值8
  160.         }
  161.         
  162.         return 0;                        //無按鍵按下輸出0
  163. }

  164. /* 定時器0初始化 */
  165. void InitTimer0(void)
  166. {
  167.     TMOD = 0x01;        //配置定時器0為工作模式1,16位定時器
  168.     TH0 = (65536 - 10000) / 256;        //定時10ms
  169.     TL0 = (65536 - 10000) % 256;
  170.     EA = 1;                        //打開總中斷
  171.     ET0 = 1;                //打開定時器0中斷
  172.     TR0 = 0;                //上電默認關閉定時器0
  173. }
  174. /* 定時器0中斷服務函數,10ms進一次中斷 */
  175. void Timer0Interrupt(void) interrupt 1
  176. {
  177.     TH0 = (65536 - 10000) / 256;        //定時10ms,重新裝載計數值
  178.     TL0 = (65536 - 10000) % 256;
  179.            
  180.         ++count;
  181.         if(count > 100)                                 //1s時間計算:10ms * 100 = 1s
  182.         {
  183.                 count = 0;                                        //計數值清零
  184.                 --time;                                                //倒計時時間減一次
  185.                 if(time <= 0)                                //如果倒計時結束,則關閉定時器0,停止倒計時,并聲光報警和鎖定鍵盤
  186.                 {
  187.                         TR0 = 0;                                //關閉定時器0
  188.                         BEEP = 1;                                //聲光報警
  189.                         LED1 = 0;
  190.                         flag_lock = 0;                        //鎖定鍵盤                                
  191.                 }                                
  192.         }
  193. }
  194. /* 報警函數 */
  195. void alarm(void)
  196. {
  197.         BEEP = 1;                //蜂鳴器響一下
  198.         DelayMs(300);        //延時300ms
  199.         BEEP = 0;
  200. }
  201. /* 實現搶答任務 */
  202. void AnswerTask(void)
  203. {
  204.         unsigned char key_val;                //按鍵值緩存

  205.         time = 5;                                        //倒計時5s
  206.         TR0 = 1;                                        //啟動定時器0,開始倒計時
  207.         while(1)
  208.         {
  209.                 if(flag_lock == 1)
  210.                 {
  211.                         key_val = KeyScan();                //獲取按鍵值
  212.                         switch(key_val)
  213.                         {
  214.                                 case 1:
  215.                                 {
  216.                                         dat_buf[0] = key_val;        //第1位數碼管顯示1號
  217.                                         dat_buf[1] = 16;                //顯示'-'
  218.                                         time = 20;                                //倒計時20s,選手回答時間
  219.                                         alarm();                                //蜂鳴器響一下
  220.                                         flag_lock = 0;                        //鎖定鍵盤
  221.                                         break;
  222.                                 }
  223.                                 case 2:
  224.                                 {
  225.                                         dat_buf[0] = key_val;        //第2位數碼管顯示2號
  226.                                         dat_buf[1] = 16;                //顯示'-'
  227.                                         time = 20;                                //倒計時20s,選手回答時間
  228.                                         alarm();                                //蜂鳴器響一下
  229.                                         flag_lock = 0;
  230.                                         break;
  231.                                 }
  232.                                 case 3:
  233.                                 {
  234.                                         dat_buf[0] = key_val;        //第3位數碼管顯示3號
  235.                                         dat_buf[1] = 16;                //顯示'-'
  236.                                         time = 20;
  237.                                         alarm();                                //蜂鳴器響一下
  238.                                         flag_lock = 0;
  239.                                         break;
  240.                                 }
  241.                                 case 4:
  242.                                 {
  243.                                         dat_buf[0] = key_val;        //第4位數碼管顯示4號
  244.                                         dat_buf[1] = 16;                //顯示'-'
  245.                                         time = 20;
  246.                                         alarm();                                //蜂鳴器響一下
  247.                                         flag_lock = 0;
  248.                                         break;
  249.                                 }
  250.                                 case 5:
  251.                                 {
  252.                                         dat_buf[0] = key_val;        //第5位數碼管顯示5號
  253.                                         dat_buf[1] = 16;                //顯示'-'
  254.                                         time = 20;
  255.                                         alarm();                                //蜂鳴器響一下
  256.                                         flag_lock = 0;
  257.                                         break;
  258.                                 }
  259.                                 case 6:
  260.                                 {
  261.                                         dat_buf[0] = key_val;        //第6位數碼管顯示6號
  262.                                         dat_buf[1] = 16;                //顯示'-'
  263.                                         time = 20;
  264.                                         alarm();                                //蜂鳴器響一下
  265.                                         flag_lock = 0;
  266.                                         break;
  267.                                 }
  268.                                 default: break;
  269.                         }
  270.                 }
  271.                   
  272.                 dat_buf[2] = time / 10;                //取出倒計時的十位數
  273.                 dat_buf[3] = time % 10;                //取出倒計時的個位數
  274.                 dig_scan(dat_buf);                        //數碼管顯示內容
  275.         }
  276. }
復制代碼

keil代碼: 1.【單片機實訓】搶答器程序設計(已完成基本要求).zip (49.03 KB, 下載次數: 0)
電路原理圖:無
仿真:無

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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