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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機八路搶答器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:719206 發(fā)表于 2020-4-1 20:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //包含頭文件
  2. #include<reg51.h>
  3. #include <intrins.h>
  4. //宏定義
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #include "eeprom52.h"
  8. sbit start=P3^0;          //主持人按鍵開始
  9. sbit reset=P3^1;        //復(fù)位

  10. sbit add1=P3^2;           //搶答時間調(diào)整,加1
  11. sbit dec1=P3^3;           //搶答時間調(diào)整,減1
  12. sbit add2=P3^4;                   //答題時間調(diào)整,加1
  13. sbit dec2=P3^5;                //答題時間調(diào)整,減1

  14. sbit k1=P1^0;
  15. sbit k2=P1^1;
  16. sbit k3=P1^2;
  17. sbit k4=P1^3;
  18. sbit k5=P1^4;
  19. sbit k6=P1^5;      
  20. sbit k7=P1^6;
  21. sbit k8=P1^7;  //選手按鍵

  22. sbit beep=P3^6;   //蜂鳴器

  23. bit  qd;                        //搶答標(biāo)志位,=1時開啟搶答
  24. bit  dt;                        //答題標(biāo)志位,=1時開啟答題
  25. bit  disp_qd_dt;        //顯示搶答還是答題時間標(biāo)志位,=0時是顯示搶答時間,=1時是顯示答題時間                                

  26. //uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};  //0-9代碼
  27. unsigned char code tab[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7,  0xCE,0xC7,0xDC}; //數(shù)字0-9的編碼 和H q d
  28. uchar shiwei,gewei,xuanshou,count,p,second;
  29. uchar qd_time,dt_time;                                                //搶答時間,答題時間
  30. uint t,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;

  31. void Timer()
  32. {
  33.         TMOD=0x01;        //定義工作方式
  34.         TH0=0x3C;  //初值15536,計數(shù)50000次,每次1uS,總計50ms
  35.         TL0=0xB0;
  36.         IE=0x82;  //這里是中斷優(yōu)先級控制EA=1(開總中斷),ET0=1(定時器0允許中斷),這里用定時器0來定時
  37.         TR0=0;          //開啟定時器定時
  38. }

  39. void tim(void) interrupt 1 using 1  //為定時中斷T0
  40. {
  41.         TH0=0x3C;  //重新賦值
  42.         TL0=0xB0;
  43.         TR0=1;
  44.         count++;   //計數(shù)一次時50ms,20次為1s
  45.         if((second<=10)&&(count==10)&&(dt==1))        //計時到500ms時,根據(jù)需要蜂鳴器閃爍
  46.                 beep=0;
  47.         if(count==20) //20*50ms=1秒
  48.         {
  49.                 count=0;
  50.                 if(second>=1)
  51.                         second--; //秒減1
  52.                 else
  53.                         TR0=0;
  54.                 if((second<=10)&&(dt==1))                //當(dāng)秒見到10以下時,控制蜂鳴器閃爍鳴響
  55.                         beep=1;
  56.         }
  57. }

  58. void delay(uint z)  //延時函數(shù)
  59. {
  60.         uint x,y;
  61.         for(x=z;x>0;x--)
  62.                 for(y=110;y>0;y--);                        //約1ms
  63. }

  64. /******************把數(shù)據(jù)保存到單片機內(nèi)部eeprom中******************/
  65. void write_eeprom()
  66. {
  67.         SectorErase(0x2000);
  68.         byte_write(0x2000, qd_time);
  69.         byte_write(0x2001, dt_time);
  70.         byte_write(0x2060, a_a);        
  71. }

  72. /******************把數(shù)據(jù)從單片機內(nèi)部eeprom中讀出來*****************/
  73. void read_eeprom()
  74. {
  75.         qd_time = byte_read(0x2000);
  76.         dt_time = byte_read(0x2001);
  77.         a_a     = byte_read(0x2060);
  78. }

  79. /**************開機自檢eeprom初始化*****************/
  80. void init_eeprom()
  81. {
  82.         read_eeprom();                //先讀
  83.         if(a_a != 1)                //新的單片機初始單片機內(nèi)問eeprom
  84.         {
  85.                 qd_time = 30;
  86.                 dt_time = 60;
  87.                 a_a = 1;
  88.                 write_eeprom();           //保存數(shù)據(jù)
  89.         }        
  90. }

  91. void display (void) //顯示函數(shù)
  92. {
  93.         unsigned char shiwei,gewei,xuanshou;
  94.         shiwei=tab[second/10];                 //將秒數(shù)據(jù)拆開成兩個一位數(shù)
  95.         gewei=tab[second%10];
  96.         xuanshou=tab[p];        

  97.         P0=gewei;                //送入P0口的gewei數(shù)據(jù)
  98.         P2=0x7F;                //個位位選
  99.         delay(5);                //延時5ms
  100.         P2=0xFF;                //關(guān)閉位選,防止出現(xiàn)鬼影           下同

  101.         P0=shiwei;                //顯示十位
  102.         P2=0xBF;                   //打開顯示時間十位的位選
  103.         delay(5);
  104.         P2=0xFF;

  105.         P0=0x80;                //顯示橫線
  106.         P2=0xDF;                  
  107.         delay(5);
  108.         P2=0xFF;
  109.         
  110.         P0=xuanshou;
  111.         P2=0xEF;            //選手位選
  112.         delay(5);
  113.         P2=0xFF;
  114. }


  115. void keyscan(void)           //按鍵掃描函數(shù)
  116. {
  117.         if(add1==0)                   //判斷搶答時間加鍵是否按下
  118.         {
  119.                 display();           //延時去抖
  120.                 if(add1==0)           //再次判斷按鍵是否按下
  121.                 {
  122.                         p=11;           //顯示q 代表搶答時間設(shè)置
  123.                         disp_qd_dt=0;        //顯示搶答時間
  124.                         qd_time++;                //搶答時間加
  125.                         if(qd_time>=99)        //最大值可以加到99
  126.                                 qd_time=99;
  127.                 }
  128.                 second=qd_time;                //將搶答時間賦值秒數(shù)據(jù),用于計時
  129.                 do
  130.                         display();                //調(diào)用顯示函數(shù)
  131.                 while(add1==0);                //按鍵釋放
  132.                 write_eeprom();                           //保存數(shù)據(jù)
  133.         }

  134.         if(dec1==0)                                //鍵按鍵是否按下
  135.         {
  136.                 display();                        //用顯示函數(shù)代替延時去抖,防止按下按鍵時屏幕的閃爍
  137.                 if(dec1==0)                        //再次判斷按鍵是否按下
  138.                 {
  139.                         p=11;                        //顯示q
  140.                         disp_qd_dt=0;        //標(biāo)志位置0
  141.                         qd_time--;                //搶答時間減
  142.                         if(qd_time<=1)        //時間減最低值1
  143.                                 qd_time=1;
  144.                 }
  145.                 second=qd_time;                //將搶答時間賦值秒,用于倒計時
  146.                 do
  147.                         display();                //調(diào)用顯示函數(shù)
  148.                 while(dec1==0);                //按鍵釋放
  149.                 write_eeprom();                           //保存數(shù)據(jù)
  150.         }
  151.         if(add2==0)                                //答題時間設(shè)置參照搶答時間設(shè)置部分注釋
  152.         {
  153.                 display();
  154.                 if(add2==0)
  155.                 {
  156.                         p=12;
  157.                         disp_qd_dt=1;
  158.                         dt_time++;
  159.                         if(dt_time>=99)
  160.                                 dt_time=99;
  161.                 }
  162.                 second=dt_time;
  163.                 do
  164.                         display();
  165.                 while(add2==0);
  166.                 write_eeprom();                           //保存數(shù)據(jù)
  167.         }

  168.         if(dec2==0)
  169.         {
  170.                 display();
  171.                 if(dec2==0)
  172.                 {
  173.                         p=12;
  174.                         disp_qd_dt=1;
  175.                         dt_time--;
  176.                         if(dt_time<=1)
  177.                                 dt_time=1;
  178.                 }
  179.                 second=dt_time;
  180.                 do
  181.                         display();
  182.                 while(dec2==0);
  183.                 write_eeprom();                           //保存數(shù)據(jù)
  184.         }
  185. }

  186. void init()                                                   //初始化函數(shù)
  187. {   
  188.         t=0;
  189.         beep=1;
  190.         p=10;                                                        //選手號初始為顯示H,表示等待
  191.         second=qd_time;                                        //將搶答時間賦值秒
  192. }

  193. void main()                                                        //主函數(shù)
  194. {
  195.         uchar i;
  196.         init_eeprom();  //開始初始化保存的數(shù)據(jù)
  197.     init();                                                        //調(diào)用初始化函數(shù)
  198.         Timer();                                                //定時器設(shè)置
  199.         while(1)                                                //循環(huán)
  200.         {
  201.                 if((qd==0)&&(dt==0))               
  202.                         keyscan();                                //掃描按鍵
  203.                 display();                                        //顯示函數(shù)

  204.                 if(start==0)                                  //主持人按下開始鍵
  205.                 {
  206.                         if((qd==0)&&(dt==0))        //在非搶答,非答題狀態(tài)下
  207.                         {
  208.                                 p=10;                                //顯示H
  209.                                 disp_qd_dt=0;                //標(biāo)志位置0
  210.                                 second=qd_time;                //搶答時間賦值秒
  211.                                 qd=1;                                //開始搶答
  212.                         }
  213.                         beep=0;                                        //蜂鳴器長響一聲
  214.                         for(i=0;i<20;i++)                //此處用于延時
  215.                         {
  216.                                 display();
  217.                         }
  218.                         beep=1;                                        //關(guān)閉蜂鳴器
  219.                         TR0=~TR0;                                //定時器開關(guān)取反(就是一個開關(guān),按一個就計時,再按一下就停止)

  220.                         do
  221.                                 display();                        //調(diào)用顯示函數(shù)
  222.                         while(!start);                        //等待釋放按鍵        
  223.                 }

  224.                 if(reset==0)                                //復(fù)位按鍵按下時
  225.                 {
  226.                         display();                                //顯示函數(shù)用做延時去抖
  227.                         if(reset==0)                        //再次判斷按鍵是否按下
  228.                         {
  229.                                 disp_qd_dt=0;                //標(biāo)志位置0
  230.                                 second=qd_time;
  231.                                 t=0;
  232.                                 p=10;                                //顯示H
  233.                                 TR0=0;                                //停止計時
  234.                                 beep=1;
  235.                                 qd=0;
  236.                                 dt=0;                                //停止搶答和答題計時
  237.                         }
  238.                         do
  239.                                 display();
  240.                         while(!reset);
  241.                 }
  242.                 if(qd==1)                                        //開始搶答后,才檢測選手按鍵的狀態(tài)
  243.                 {
  244.                          if(k1==0)                         //1號選手按下時
  245.                         {
  246.                                 display();                //顯示函數(shù)用作延時去抖
  247.                                 if(k1==0)                //再次判斷按鍵是否按下
  248.                                 {
  249.                                         t=1;                        //搶答序號置1
  250.                                         qd=0;                        //停止搶答,該位置0后,選手按鍵按下無效
  251.                                         dt=1;                        //準(zhǔn)備答題
  252.                                 }
  253.                         }
  254.                         else if(k2==0)                 //其他選手按鍵掃描參考1號選手按鍵注釋
  255.                         {
  256.                                 display();
  257.                                 if(k2==0)
  258.                                 {
  259.                                         t=2;
  260.                                         qd=0;
  261.                                         dt=1;
  262.                                 }
  263.                         }
  264.                         else if(k3==0)
  265.                         {
  266.                                 display();
  267.                                 if(k3==0)
  268.                                 {
  269.                                         t=3;
  270.                                         qd=0;
  271.                                         dt=1;
  272.                                 }
  273.                         }
  274.                         else if(k4==0)
  275.                         {
  276.                                 display();
  277.                                 if(k4==0)
  278.                                 {
  279.                                         t=4;
  280.                                         qd=0;
  281.                                         dt=1;
  282.                                 }
  283.                         }
  284.                         else if(k5==0)
  285.                         {
  286.                                 display();
  287.                                 if(k5==0)
  288.                                 {
  289.                                         t=5;
  290.                                         qd=0;
  291.                                         dt=1;
  292.                                 }
  293.                         }
  294.                         else if(k6==0)
  295.                         {
  296.                                 display();
  297.                                 if(k6==0)
  298.                                 {
  299.                                         t=6;
  300.                                         qd=0;
  301.                                         dt=1;
  302.                                 }
  303.                         }
  304.                         else if(k7==0)
  305.                         {
  306.                                 display();
  307.                                 if(k7==0)
  308.                                 {
  309.                                         t=7;
  310.                                         qd=0;
  311.                                         dt=1;
  312.                                 }
  313.                         }
  314.                         else if(k8==0)
  315.                         {
  316.                                 display();
  317.                                 if(k8==0)
  318.                                 {
  319.                                         t=8;
  320.                                         qd=0;
  321.                                         dt=1;
  322.                                 }
  323.                         }
  324.                         if(t)                                        //有選手按下按鍵時,t的值不為0,進入此if語句
  325.                         {
  326.                                 switch(t)                        //判斷t的值
  327.                                 {
  328.                                         case 1:                        //t的值為1時,就是選手1按下按鍵
  329.                                                 {
  330.                                                         TR0=0;        //停止計時
  331.                                                         p=1;        //數(shù)碼管顯示選手號碼
  332.                                                         second=dt_time;          //答題時間賦值秒
  333.                                                         beep=0;                          //蜂鳴器響
  334.                                                         for(i=0;i<20;i++) //此處用于延時
  335.                                                         {
  336.                                                                 display();
  337.                                                         }
  338.                                                         beep=1;                          //蜂鳴器延時后關(guān)閉
  339.                                                         qd=0;break;                  //qd置0,搶答環(huán)節(jié)結(jié)束,跳出switch語句
  340.                                                 }
  341.                                         case 2:                                         //t為2時就是2號選手按下按鍵
  342.                                                 {
  343.                                                         TR0=0;                         //以下參考1號選手注釋/|\即可
  344.                                                         p=2;
  345.                                                         second=dt_time;
  346.                                                         beep=0;
  347.                                                         for(i=0;i<20;i++)
  348.                                                         {
  349.                                                                 display();
  350.                                                         }
  351.                                                         beep=1;
  352.                                                         qd=0;break;
  353.                                                 }
  354.                                         case 3:
  355.                                                 {
  356.                                                         TR0=0;
  357.                                                         p=3;
  358.                                                         second=dt_time;
  359.                                                         beep=0;
  360.                                                         for(i=0;i<20;i++)
  361.                                                         {
  362.                                                                 display();
  363.                                                         }
  364.                                                         beep=1;
  365.                                                         qd=0;break;
  366.                                                 }
  367.                                         case 4:
  368.                                                 {
  369.                                                         TR0=0;
  370.                                                         p=4;
  371.                                                         second=dt_time;
  372.                                                         beep=0;
  373.                                                         for(i=0;i<20;i++)
  374.                                                         {
  375.                                                                 display();
  376.                                                         }
  377.                                                         beep=1;
  378.                                                         qd=0;break;
  379.                                                 }
  380.                                         case 5:
  381.                                                 {
  382.                                                         TR0=0;
  383.                                                         p=5;
  384.                                                         second=dt_time;
  385.                                                         beep=0;
  386.                                                         for(i=0;i<20;i++)
  387.                                                         {
  388.                                                                 display();
  389.                                                         }
  390.                                                         beep=1;
  391.                                                         qd=0;break;
  392.                                                 }
  393.                                         case 6:
  394.                                                 {
  395.                                                         TR0=0;
  396.                                                         p=6;
  397.                                                         second=dt_time;
  398.                                                         beep=0;
  399.                                                         for(i=0;i<20;i++)
  400.                                                         {
  401.                                                                 display();
  402.                                                         }
  403.                                                         beep=1;
  404.                                                         qd=0;break;
  405.                                                 }
  406.                                         case 7:
  407.                                                 {
  408.                                                         TR0=0;
  409.                                                         p=7;
  410.                                                         second=dt_time;
  411.                                                         beep=0;
  412.                                                         for(i=0;i<20;i++)
  413.                                                         {
  414.                                                                 display();
  415.                                                         }
  416.                                                         beep=1;
  417.                                                         qd=0;break;
  418.                                                 }
  419.                                         case 8:
  420.                                                 {
  421.                                                         TR0=0;
  422.                                                         p=8;
  423.                                                         second=dt_time;
  424.                                                         beep=0;
  425.                                                         for(i=0;i<20;i++)
  426.                                                         {
  427.                                                                 display();
  428.                                                         }
  429.                                                         beep=1;
  430.                                                         qd=0;break;
  431.                                                 }
  432.         
  433.                                 }
  434.                         }

  435.                         if(dt==1)                        //答題標(biāo)志開啟時
  436.                         {
  437.                                 if(start==0)        //開始按鍵此時按下時
  438.                                 {
  439.                                         display();
  440.                                         if(start==0)
  441.                                         {
  442.                                                 beep=0;                          //蜂鳴器鳴響一聲
  443.                                                 for(i=0;i<20;i++)
  444.                                                 {
  445.                                                         display();
  446.                                                 }
  447.                                                 beep=1;
  448.                                                 TR0=1;                          //開啟定時器計時答題時間
  449.                                         }
  450.                                 }
  451.                         }
  452.                 }

  453.                 if(second==0)                         //為0時報警
  454.                 {
  455.                         beep=0;                                //蜂鳴器報警
  456.                         qd=0;
  457.                         dt=0;                                //搶答和答題標(biāo)志清零
  458.                 }
  459.         }
  460. }
復(fù)制代碼

1-程序.rar

44.86 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5

2-原理圖.rar

211.74 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5

4-制作過程照片.rar

2.46 MB, 下載次數(shù): 4, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区视频在线 | 精品一区二区三区在线观看国产 | 日本字幕在线观看 | 偷拍亚洲色图 | 久久aⅴ乱码一区二区三区 91综合网 | 99精品一区二区三区 | 久久精品亚洲一区二区三区浴池 | 国产精品不卡视频 | 午夜不卡福利视频 | 在线观看亚洲专区 | 精品欧美一区二区三区久久久 | 国产精品日日做人人爱 | 天天色图 | 在线看h | 国产综合视频 | 亚洲啊v在线 | 欧美中文字幕一区二区三区亚洲 | 伊人网综合在线观看 | 男人av网| 日日摸天天添天天添破 | 欧美一区二区激情三区 | 亚洲综合大片69999 | www.久久 | 国产电影一区二区 | 欧美专区在线视频 | 国产亚洲一区二区三区 | 国产成人短视频在线观看 | 亚洲日韩中文字幕 | 少妇一区在线观看 | 精品亚洲一区二区 | 无人区国产成人久久三区 | 午夜视频在线观看网站 | 国际精品鲁一鲁一区二区小说 | 91精品国产欧美一区二区成人 | 久久爆操 | 国产成人精品一区二区三区视频 | www.日韩| 国产精品美女久久久久久免费 | 久久久人| 国产国拍亚洲精品av | 乳色吐息在线观看 |