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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5690|回復: 1
收起左側

單片機八路搶答器設計(keil+Proteus仿真+PCB原理圖)

[復制鏈接]
ID:869449 發表于 2021-1-4 09:03 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png 51hei.png

單片機源程序如下:
  1. /*************************************************************
  2.                       八路搶答器系統

  3. 補充說明:
  4. ***************************************************************/
  5. #include<reg52.h>                   //頭文件
  6. #include<SMG.h>
  7. #include<EEPROM.h>
  8. #include<INTERRUPT.h>

  9. #define uchar unsigned char//宏定義
  10. #define uint unsigned int

  11. /**********************引腳定義************************/
  12. sbit key_zhu=P2^2;           //主持人鍵
  13. sbit key_jia=P2^1;           //加鍵
  14. sbit key_jian=P2^0;           //減鍵

  15. sbit key_1=P1^1;           //八位選手按鍵定義
  16. sbit key_2=P1^3;
  17. sbit key_3=P1^5;
  18. sbit key_4=P1^7;
  19. sbit key_5=P3^1;
  20. sbit key_6=P3^3;
  21. sbit key_7=P3^5;
  22. sbit key_8=P3^7;

  23. sbit led_1=P1^0;           //八位LED燈按鍵定義
  24. sbit led_2=P1^2;
  25. sbit led_3=P1^4;
  26. sbit led_4=P1^6;
  27. sbit led_5=P3^0;
  28. sbit led_6=P3^2;
  29. sbit led_7=P3^4;
  30. sbit led_8=P3^6;
  31. /**********************變量定義************************/
  32. uchar zhu_f=0;                   //比賽進行階段標記位,=0表示沒有按。=1表示在設置倒計時的時間。=2表示開始搶答
  33. uchar qiang_f=0;           //搶答犯規標記,=0沒有犯規。=1表示有人犯規
  34. uchar wan_f=0;                   //搶答完成標記,=0搶答沒完成后還沒有開始。=1表示搶答完成
  35. uchar time=30;                   //倒計時時間
  36. uchar T0_num;                   //定時器0計數
  37. uchar number;                   //搶答成功選手的編號,或犯規選手的編號。=0的時候表示沒有

  38. /********************************************************
  39. 函數名稱:void delayms(uint ms)
  40. 函數作用:毫秒延時函數
  41. 參數說明:
  42. ********************************************************/
  43. void delayms(uint ms)
  44. {
  45.         unsigned char i=100,j;
  46.         for(;ms;ms--)
  47.         {
  48.                 while(--i)
  49.                 {
  50.                         j=10;
  51.                         while(--j);
  52.                 }
  53.         }
  54. }
  55. /********************************************************
  56. 函數名稱:void bajing()
  57. 函數作用:搶答犯規報警提示
  58. 參數說明:
  59. ********************************************************/
  60. void bajing()
  61. {
  62.         buzz=0;                   //開蜂鳴器
  63.         delayms(10);
  64.         buzz=1;                   //關蜂鳴器
  65.         delayms(10);
  66. }
  67. /********************************************************
  68. 函數名稱:uchar qianda()
  69. 函數作用:搶答按鍵檢測,返回搶答編號
  70. 參數說明:
  71. ********************************************************/
  72. uchar qianda()
  73. {
  74.         uchar temp=0;
  75.         if(key_1==0)                                  //一號犯規,下同
  76.                 temp=1;                          //記錄1號
  77.         else
  78.                 if(key_2==0)
  79.                         temp=2;
  80.                 else
  81.                         if(key_3==0)
  82.                                 temp=3;
  83.                         else
  84.                                 if(key_4==0)
  85.                                         temp=4;
  86.                                 else
  87.                                         if(key_5==0)
  88.                                                 temp=5;
  89.                                         else
  90.                                                 if(key_6==0)
  91.                                                         temp=6;
  92.                                                 else
  93.                                                         if(key_7==0)
  94.                                                                 temp=7;
  95.                                                         else
  96.                                                                 if(key_8==0)
  97.                                                                         temp=8;       
  98.         return temp;       
  99. }
  100. /********************************************************
  101. 函數名稱:void led_kongzhi(uchar num,bit mode)
  102. 函數作用:LED燈控制
  103. 參數說明:num控制哪一個燈,k=1,點亮,=0關閉。mode=0全滅后在控制這個燈,=1單獨控制這個燈
  104. ********************************************************/
  105. void led_kongzhi(uchar num,bit k,bit mode)
  106. {
  107.         if(mode==0)
  108.         {
  109.                 led_1=1;           //八位LED燈全滅
  110.                 led_2=1;
  111.                 led_3=1;
  112.                 led_4=1;
  113.                 led_5=1;
  114.                 led_6=1;
  115.                 led_7=1;
  116.                 led_8=1;       
  117.         }       
  118.         if(k==1)
  119.         {
  120.                 switch (num)          //控制對應LED燈亮
  121.                 {
  122.                         case 1:led_1=0;
  123.                                 break;
  124.                         case 2:led_2=0;
  125.                                 break;
  126.                         case 3:led_3=0;
  127.                                 break;
  128.                         case 4:led_4=0;
  129.                                 break;
  130.                         case 5:led_5=0;
  131.                                 break;
  132.                         case 6:led_6=0;
  133.                                 break;
  134.                         case 7:led_7=0;
  135.                                 break;
  136.                         case 8:led_8=0;
  137.                                 break;
  138.                 }
  139.         }
  140.         else
  141.         {
  142.                 switch (num)          //控制對應LED燈滅
  143.                 {
  144.                         case 1:led_1=1;
  145.                                 break;
  146.                         case 2:led_2=1;
  147.                                 break;
  148.                         case 3:led_3=1;
  149.                                 break;
  150.                         case 4:led_4=1;
  151.                                 break;
  152.                         case 5:led_5=1;
  153.                                 break;
  154.                         case 6:led_6=1;
  155.                                 break;
  156.                         case 7:led_7=1;
  157.                                 break;
  158.                         case 8:led_8=1;
  159.                                 break;
  160.                 }       
  161.         }
  162. }
  163. /********************************************************
  164. 函數名稱:void scan(void)
  165. 函數作用:按鍵檢測函數
  166. 參數說明:
  167. ********************************************************/
  168. void scan(void)
  169. {       
  170.         uchar qiangda_num=0;
  171.         //主持人鍵
  172.         if(key_zhu==0)                   //按鍵按下
  173.         {
  174.                 delayms(7);                   //顯示消抖
  175.                 if(key_zhu==0&&zhu_f!=2&&qiang_f==0&&wan_f==0)//判斷是否有人犯規或者搶答是否開始或者搶答是否完成
  176.                 {
  177.                         zhu_f++;           //比賽階段標記+1
  178.                         if(zhu_f==2)   //比賽正式開始
  179.                         {
  180.                                 TR0=1;           //比賽開始,開啟定時
  181.                                 wan_f=0;   //清除比賽完成標志
  182.                                 bajing();  //提示比賽開始
  183.                         }                       
  184.                 }
  185.                 else
  186.                         if(key_zhu==0&&qiang_f==1)   //判斷是否有人犯規
  187.                         {
  188.                                 buzz=1;                                         //清除報警
  189.                                 qiang_f=0;                                 //清除搶答標志
  190.                                 number=0;                                 //清除選手編號
  191.                                 time=EEPROM_read(0x2000);//重新讀取存儲的搶答總時長
  192.                                 led_kongzhi(0,0,0);
  193.                         }
  194.                         else                                                 
  195.                                 if(key_zhu==0&&wan_f==1) //判斷是否有人完成
  196.                                 {
  197.                                         buzz=1;                                 //清除報警
  198.                                         wan_f=0;                         //清除完成標志
  199.                                         number=0;                         //清除選手編號
  200.                                         time=EEPROM_read(0x2000);//重新讀取存儲的搶答總時長
  201.                                         led_kongzhi(0,0,0);
  202.                                 }
  203.                                 else
  204.                                         if(key_zhu==0&&zhu_f==2) //暫停比賽
  205.                                         {
  206.                                                 TR0=0;                                 //關閉定時
  207.                                                 zhu_f=1;                         //重新回到設置比賽時間階段
  208.                                                 bajing();                         //提示暫停比賽
  209.                                         }
  210.                 while(!key_zhu);//檢測按鍵松開
  211.         }

  212.         //加值鍵,支持連按
  213.         if(key_jia==0&&zhu_f==1&&qiang_f==0)         //判斷是否在設置倒計時時間
  214.         {
  215.                 delayms(7);                                                         //延時消抖
  216.                 if(key_jia==0)                                                 //再次判斷按鍵按下
  217.                 {
  218.                         if(time<99)                             //比賽時間最大值99S
  219.                                 time++;                                                  //比賽時間+1S
  220.                         EEPROM_delete(0x2000);                         //擦除EEPROM煽區
  221.                         EEPROM_write(0x2000,time);                 //寫入【比賽時間】數據保存
  222.                         display(time/10,time%10,10,0);         //顯示設置比賽時間
  223.                 }
  224.         }

  225.         //減值鍵,支持連按
  226.         if(key_jian==0&&zhu_f==1&&qiang_f==0)         //判斷是否在設置倒計時時間
  227.         {
  228.                 delayms(7);                                                         //延時消抖
  229.                 if(key_jian==0)                                                 //再次判斷按鍵按下
  230.                 {
  231.                         if(time!=0)                                                   //比賽時間最小值0S
  232.                                 time--;                                 //比賽時間-1S
  233.                         EEPROM_delete(0x2000);                         //擦除EEPROM煽區
  234.                         EEPROM_write(0x2000,time);                 //寫入【比賽時間】數據保存
  235.                         display(time/10,time%10,10,0);         //顯示設置比賽時間
  236.                 }
  237.         }
  238.         //選手按鍵
  239.         qiangda_num=qianda();
  240.         if(qiangda_num!=0)                              //判斷是否有選手按下按鍵
  241.         {
  242.                 if(zhu_f!=2&&qiang_f==0&&wan_f==0)//如果還沒有開始搶答時按下
  243.                 {
  244.                         zhu_f=1;
  245.                         buzz=0;                                                  //蜂鳴器報警
  246.                         qiang_f=1;                                          //搶答犯規標記
  247.                         number=qiangda_num;
  248.                         led_kongzhi(number,1,0);
  249.                 }
  250.                 else
  251.                         if(zhu_f==2&&wan_f==0)                         //在開始搶答時按下
  252.                         {
  253.                                 wan_f=1;                                         //標記搶答完成
  254.                                 zhu_f=0;                                         //主持人標記復位
  255.                                 TR0=0;                                                 //關閉倒計時定時器
  256.                                 number=qiangda_num;
  257.                                 led_kongzhi(number,1,0);
  258.                                 bajing();                                         //提示有人搶答完成
  259.                         }
  260.         }  
  261. }

  262. /*********************************************************
  263. 函數名稱:void main()
  264. 函數作用:主函數函數
  265. 參數說明:
  266. *********************************************************/
  267. void main()
  268. {
  269.         uchar i=0;
  270.         T0_init();                                                 //定時器初始化
  271.         if(key_jian==0)          
  272.         {
  273.                 delayms(100);
  274.                 if(key_jian==0)
  275.                 {
  276.                         EEPROM_delete(0x2000);         //擦除EEPROM煽區
  277.                         EEPROM_write(0x2000,30); //寫入【比賽時間】數據保存
  278.                 }
  279.         }
  280.         time=EEPROM_read(0x2000);                 //讀取存儲的【比賽時間】數據

  281.         for(i=0;i<9;i++)
  282.         {
  283.                 led_kongzhi(i,1,1);
  284.                 delayms(10);       
  285.         }

  286.         for(i=9;i>0;i--)
  287.         {
  288.                 led_kongzhi(i-1,0,1);
  289.                 delayms(10);       
  290.         }
  291.         led_kongzhi(0,0,0);
  292.         while(1)                                                 //死循環
  293.         {
  294.                 scan();                                                 //按鍵檢測處理
  295.                 if(zhu_f==0&&wan_f==0)                 //判斷是否還沒進入比賽階段
  296.                         display(10,10,10,10);         //未進入,顯示"----"
  297.                 else
  298.                         if(zhu_f==0&&wan_f==1)         //進入比賽階段,并且處于設置比賽時間
  299.                                 display(time/10,time%10,10,number);//顯示設置比賽時間
  300.                         else
  301.                                 if(zhu_f!=0)                 
  302.                                 {               
  303.                                         if(qiang_f==1)   //設有人犯規
  304.                                                 display(11,11,10,number);                   //顯示FF-犯規編號
  305.                                         else
  306.                                                 display(time/10,time%10,10,number);//顯示比賽剩余時間和搶答者編號,未搶答顯示0
  307.                                 }               
  308.         }
  309. }
復制代碼

所有資料51hei提供下載(仿真PCB與代碼):
八人搶答器51hei設計.zip (1.14 MB, 下載次數: 190)

評分

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

查看全部評分

回復

使用道具 舉報

ID:1071489 發表于 2023-4-13 16:23 | 顯示全部樓層
可以說一下主要的功能嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片免费观看 | 日韩成人精品一区二区三区 | 午夜一级做a爰片久久毛片 精品综合 | 久久精品免费 | 欧美九九九| 美女黄网| 国产小u女发育末成年 | 7777精品伊人久久精品影视 | 欧美性大战久久久久久久蜜臀 | www.久久久久久久久久久 | 亚洲精品欧美 | 9久9久 | 91影院| 久久成| 久久精品免费 | 国产精品久久久久久久久久免费看 | 91九色麻豆 | 国产精品久久久久一区二区三区 | 黄色av网站在线免费观看 | 玖玖视频免费 | 成人特级毛片 | 91亚洲精品在线观看 | 日韩av成人在线 | 亚洲自拍偷拍av | 99久久精品视频免费 | 午夜男人视频 | 一区二区三区av夏目彩春 | 亚洲vs天堂 | 天天爱爱网 | 成人性视频免费网站 | 国产精品一区一区三区 | 中文字幕亚洲一区 | 日韩天堂av | 又黑又粗又长的欧美一区 | 91高清视频| 亚洲第一区国产精品 | 国产一级一片免费播放 | 欧美日韩成人 | 一区二区三区国产精品 | 国产精品久久久久久一区二区三区 | 久久久久久久久精 |