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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6168|回復(fù): 3
收起左側(cè)

基于51單片機(jī)的4人搶答器代碼

[復(fù)制鏈接]
ID:498742 發(fā)表于 2019-4-30 19:37 | 顯示全部樓層 |閱讀模式
  1. /*
  2. 此程序?yàn)?人搶答器。
  3. 搶答者4人對應(yīng),K1-4的按鈕
  4. 裁判可操作Ks,Kr,Kc,Ka4個(gè)按鈕
  5. Ks:按下就進(jìn)入搶答倒計(jì)時(shí)
  6. Kr:按下復(fù)位,準(zhǔn)備下次搶答
  7. Kc,Ka:用于調(diào)整倒計(jì)時(shí)。
  8. 在復(fù)位之前使用,且當(dāng)前的操作是對復(fù)位之后的倒計(jì)時(shí)有用
  9. 保證沒有人按下除了Kc,Ka之外的按鈕。
  10. 最大設(shè)置為1分鐘,最小10s
  11. 按一次Kc加1s
  12. 操作步驟:按下Kr,后要按住Ka不松的狀態(tài)按Kc加時(shí)間,然后再次按下Kr

  13. 顯示器第一行顯示倒計(jì)時(shí)的時(shí)間
  14. 例如:countdown:10s
  15. 顯示器第二行顯示違規(guī)者和搶答成功者的對應(yīng)按鈕
  16. 例如:error:0 win:2  表示:無人違規(guī),2號搶答成功
  17. 例如:error:2 win:0  表示:有人違規(guī),2號違規(guī)
  18. */

  19. #include "reg52.h"
  20. #include "lcd.h"

  21. #define uchar unsigned char
  22. #define uint unsigned int

  23. sbit K1=P1^0;
  24. sbit K2=P1^1;
  25. sbit K3=P1^2;
  26. sbit K4=P1^3;
  27. sbit Ks=P3^0;   //按下就進(jìn)入搶答倒計(jì)時(shí)
  28. sbit Kr=P3^2;   //按下復(fù)位,準(zhǔn)備下次搶答
  29. sbit Kc=P3^3;   //按下調(diào)整倒計(jì)時(shí),注意事項(xiàng)見timeset()
  30. sbit Ka=P3^4;   //配合Kc
  31. sbit beep=P3^7;
  32. sbit led=P3^1;

  33. uchar fallflag=0,sflag=0,jflag=0,sjflag=0;
  34. uchar win,time=10;     //time為倒計(jì)時(shí)秒數(shù),num為程序中控制倒計(jì)時(shí)的變量,win為搶答成功的按鈕
  35. uchar num,numf;        //numf為配合num來顯示lcd

  36. uchar Disp1[16]="countdown:00s   ";
  37. uchar Disp2[16]="error:0 win:0   ";

  38. void judge();
  39. void search();

  40. void delay(uchar ms)
  41. {
  42.         uchar y;
  43.         for(;ms>0;ms--)
  44.                 for(y=120;y>0;y--);
  45. }



  46. void T0_Init()
  47. {
  48.         TMOD=0X11;
  49.         TH0=(65536-1000)/256;
  50.         TL0=(65536-1000)%256;
  51.         TH1=(65536-1000)/256;
  52.         TL1=(65536-1000)%256;
  53.         ET0=1;
  54.         ET1=1;
  55.                                 TR0=1;    //定時(shí)器0開
  56.                                 TR1=0;    //定時(shí)器1關(guān)
  57.         EA=1;
  58. }
  59. /*lcd1602顯示程序*/
  60. void display(uchar date1,uchar date2)
  61. {
  62.         uchar i,a;
  63.         LcdInit();
  64.         Disp1[10]=num/10+'0';
  65.         Disp1[11]=num%10+'0';
  66.         Disp2[6]=date1+'0';
  67.         Disp2[12]=date2+'0';
  68.         for(i=0;i<16;i++)
  69.         {
  70.                 LcdWriteData(Disp1[i]);        
  71.         }
  72.         LcdWriteCom(0x80+0x40);
  73.         for(a=0;a<16;a++)
  74.         {
  75.                 LcdWriteData(Disp2[a]);        
  76.         }
  77. }

  78. /*
  79. 開始準(zhǔn)備搶答,開始倒計(jì)時(shí)
  80. */
  81. void Ks_Scan()
  82. {
  83.         if(Ks==0)
  84.         {
  85.                 delay(10);
  86.                 if(Ks==0)
  87.                 {
  88.                         TR1=1;              //開啟倒計(jì)時(shí)
  89.                         sjflag=1;           //開啟犯規(guī)判斷
  90.                         while(num!=0)      //如果在期間有人搶答,fallflag=1,此程序執(zhí)行完后,后續(xù)程序會判犯規(guī)
  91.                         {
  92.                                 if(num==numf-1)
  93.                                 {
  94.                                         numf=numf-1;
  95.                                         display(0,0);  //不能顯示num=0時(shí)
  96.                                 }
  97.                         }
  98.                         sflag=1;       //搶答開始
  99.                         if(sjflag==0)  //有人犯規(guī)
  100.                         {
  101.                                 sflag=0;
  102.                         }
  103.                         sjflag=0;        //關(guān)閉犯規(guī)判斷
  104.                         display(0,0);    //顯示num=0時(shí)
  105.                         beep=0;             //蜂鳴
  106.                 }
  107.                 while(!Ks);
  108.         }
  109. }
  110. /*
  111. 復(fù)位
  112. */
  113. void restoration()
  114. {
  115.         if(Kr==0)
  116.         {
  117.                 delay(10);
  118.                 if(Kr==0)
  119.                 {
  120.                         sflag=0;
  121.                         sjflag=0;
  122.                         jflag=0;
  123.                         win=0;
  124.                         fallflag=0;
  125.                         TR1=0;
  126.                         num=time;
  127.                         numf=num;
  128.                         beep=1;
  129.                         led=1;
  130.                         display(0,0);              //清除顯示屏
  131.                 }
  132.                 while(!Kr);
  133.         }
  134. }
  135. /*
  136. 在復(fù)位之前使用,且當(dāng)前的操作是對復(fù)位之后的倒計(jì)時(shí)有用
  137. 保證沒有人按下除了Kc,Ka之外的按鈕。
  138. 最大設(shè)置為1分鐘,最小10s
  139. 按一次Kc加1s
  140. 操作步驟:按下Kr,后要按住Ka不松的狀態(tài)按Kc加時(shí)間,然后再次按下Kr
  141. */
  142. void timeset()   //改變搶答時(shí)間
  143. {
  144.         uchar a=0;
  145.         if(Ka==0)
  146.         {
  147.                 delay(10);
  148.                 if(Ka==0)
  149.                 {
  150.                         while(!Ka)
  151.                         {
  152.                         if(Kc==0)
  153.                         {
  154.                         delay(10);
  155.                         if(Kc==0)
  156.                         {
  157.                                 a++;
  158.                         }
  159.                         while(!Kc);
  160.                         }
  161.                         }
  162.                         time=time+a;
  163.                 }
  164.         }
  165.         if(time>=60)
  166.         {
  167.                 time=10;
  168.         }
  169. }


  170. void main()
  171. {
  172.         T0_Init();
  173.         while(1)
  174.         {
  175.                 Ks_Scan();
  176.                 if((sflag==0)&(fallflag==0))   //沒開始沒人搶答
  177.                 {
  178.                         timeset();
  179.                 }
  180.                 if((sflag==0)&(fallflag!=0))  //有人違規(guī)搶答
  181.                 {
  182.                         led=0;   //亮燈警告
  183.                         beep=1;  //關(guān)閉蜂鳴
  184.                         display(fallflag,0);         //顯示有人犯規(guī),并顯示犯規(guī)按鈕,根據(jù)fallflag
  185.                 }
  186.                 if((sflag==1)&(fallflag==0))   //無人違規(guī)
  187.                 {
  188.                         while(jflag==0)
  189.                         {
  190.                                 judge();
  191.                         }
  192.                         judge();  //防止jflag=1時(shí),judge()沒執(zhí)行
  193.                         beep=1;  //關(guān)閉蜂鳴
  194.                         display(0,win);         //顯示搶答成功按鈕,根據(jù)win
  195.                 }
  196.                 restoration();  //復(fù)位
  197.         }
  198. }

  199. /*不停的掃描k1-4的狀態(tài),每隔1ms掃描一次*/
  200. void timer0() interrupt 1
  201. {
  202.         TH0=(65536-1000)/256;
  203.   TL0=(65536-1000)%256;
  204.         search();
  205. }


  206. void timer1() interrupt 3
  207. {
  208.         static i;
  209.         TH0=(65536-1000)/256;
  210.   TL0=(65536-1000)%256;
  211.         i++;
  212.         if(i==1000)
  213.         {
  214.                 i=0;
  215.                 num--;
  216.                 //display(0,0);     //為什么此時(shí)加上這個(gè)程序就報(bào)warning
  217.                 if(num==0)          //放在內(nèi)部保證定時(shí)器的準(zhǔn)確性
  218.                 {
  219.                         TR1=0;
  220.                 }
  221.         }
  222. }




  223. //先丟后面的代碼


  224. /*
  225. 配合定時(shí)器0使用
  226. 如果k1-4有按鍵按下,fallflag=1
  227. */
  228. void search()
  229. {
  230.         if((K1==0)&(sjflag==1))   //按下Ks開始后(sjflag=1)如果有人按了K1就會進(jìn)入程序
  231.         {
  232.                 delay(10);
  233.                 if(K1==0)
  234.                 {
  235.                         fallflag=1;
  236.                         sjflag=0;             //互鎖,并配合Ks_Scan()中的犯規(guī)判斷語句
  237.                 }
  238.                 while(!K1);
  239.         }
  240.         if((K2==0)&(sjflag==1))
  241.         {
  242.                 delay(10);
  243.                 if(K2==0)
  244.                 {
  245.                         fallflag=2;
  246.                         sjflag=0;
  247.                 }
  248.                 while(!K2);
  249.         }
  250.         if((K3==0)&(sjflag==1))
  251.         {
  252.                 delay(10);
  253.                 if(K3==0)
  254.                 {
  255.                         fallflag=3;
  256.                         sjflag=0;
  257.                 }
  258.                 while(!K3);
  259.         }
  260.         if((K4==0)&(sjflag==1))
  261.         {
  262.                 delay(10);
  263.                 if(K4==0)
  264.                 {
  265.                         fallflag=4;
  266.                         sjflag=0;
  267.                 }
  268.                 while(!K4);
  269.         }
  270. }

  271. void judge()           
  272. {
  273.         if((K1==0)&(jflag==0))
  274.         {
  275.                 delay(10);
  276.                 if((K1==0)&(jflag==0))
  277.                 {
  278.                         win=1;
  279.                         jflag=1;    //鎖住其他按鈕
  280.                 }
  281.                 while(!K1);
  282.         }
  283.         if((K2==0)&(jflag==0))
  284.         {
  285.                 delay(10);
  286.                 if((K2==0)&(jflag==0))
  287.                 {
  288.                         win=2;
  289.                         jflag=1;    //鎖住其他按鈕
  290.                 }
  291.                 while(!K2);
  292.         }
  293.         if((K3==0)&(jflag==0))
  294.         {
  295.                 delay(10);
  296.                 if((K3==0)&(jflag==0))
  297.                 {
  298.                         win=3;
  299.                         jflag=1;    //鎖住其他按鈕
  300.                 }
  301.                 while(!K3);
  302.         }
  303.         if((K4==0)&(jflag==0))
  304.         {
  305.                 delay(10);
  306.                 if((K4==0)&(jflag==0))
  307.                 {
  308.                         win=4;
  309.                         jflag=1;    //鎖住其他按鈕
  310.                 }
  311.                 while(!K4);
  312.         }
  313. }

  314. 以下是“l(fā)cd.c”
  315. #include "lcd.h"

  316. /*******************************************************************************
  317. * 函 數(shù) 名         : Lcd1602_Delay1ms
  318. * 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)1ms
  319. * 輸    入         : c
  320. * 輸    出         : 無
  321. * 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
  322. *******************************************************************************/

  323. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  324. {
  325.     uchar a,b;
  326.         for (; c>0; c--)
  327.         {
  328.                  for (b=199;b>0;b--)
  329.                  {
  330.                           for(a=1;a>0;a--);
  331.                  }      
  332.         }
  333.             
  334. }

  335. /*******************************************************************************
  336. * 函 數(shù) 名         : LcdWriteCom
  337. * 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的命令
  338. * 輸    入         : com
  339. * 輸    出         : 無
  340. *******************************************************************************/
  341. #ifndef         LCD1602_4PINS         //當(dāng)沒有定義這個(gè)LCD1602_4PINS時(shí)
  342. void LcdWriteCom(uchar com)          //寫入命令
  343. {
  344.         LCD1602_E = 0;     //使能
  345.         LCD1602_RS = 0;           //選擇發(fā)送命令
  346.         LCD1602_RW = 0;           //選擇寫入
  347.         
  348.         LCD1602_DATAPINS = com;     //放入命令
  349.         Lcd1602_Delay1ms(1);                //等待數(shù)據(jù)穩(wěn)定

  350.         LCD1602_E = 1;                  //寫入時(shí)序
  351.         Lcd1602_Delay1ms(5);          //保持時(shí)間
  352.         LCD1602_E = 0;
  353. }
  354. #else
  355. void LcdWriteCom(uchar com)          //寫入命令
  356. {
  357.         LCD1602_E = 0;         //使能清零
  358.         LCD1602_RS = 0;         //選擇寫入命令
  359.         LCD1602_RW = 0;         //選擇寫入

  360.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  361.         Lcd1602_Delay1ms(1);

  362.         LCD1602_E = 1;         //寫入時(shí)序
  363.         Lcd1602_Delay1ms(5);
  364.         LCD1602_E = 0;

  365.         LCD1602_DATAPINS = com << 4; //發(fā)送低四位
  366.         Lcd1602_Delay1ms(1);

  367.         LCD1602_E = 1;         //寫入時(shí)序
  368.         Lcd1602_Delay1ms(5);
  369.         LCD1602_E = 0;
  370. }
  371. #endif
  372. /*******************************************************************************
  373. * 函 數(shù) 名         : LcdWriteData
  374. * 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
  375. * 輸    入         : dat
  376. * 輸    出         : 無
  377. *******************************************************************************/                  
  378. #ifndef         LCD1602_4PINS                  
  379. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  380. {
  381.         LCD1602_E = 0;        //使能清零
  382.         LCD1602_RS = 1;        //選擇輸入數(shù)據(jù)
  383.         LCD1602_RW = 0;        //選擇寫入

  384.         LCD1602_DATAPINS = dat; //寫入數(shù)據(jù)
  385.         Lcd1602_Delay1ms(1);

  386.         LCD1602_E = 1;   //寫入時(shí)序
  387.         Lcd1602_Delay1ms(5);   //保持時(shí)間
  388.         LCD1602_E = 0;
  389. }
  390. #else
  391. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  392. {
  393.         LCD1602_E = 0;          //使能清零
  394.         LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
  395.         LCD1602_RW = 0;          //選擇寫入

  396.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  397.         Lcd1602_Delay1ms(1);

  398.         LCD1602_E = 1;          //寫入時(shí)序
  399.         Lcd1602_Delay1ms(5);
  400.         LCD1602_E = 0;

  401.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  402.         Lcd1602_Delay1ms(1);

  403.         LCD1602_E = 1;          //寫入時(shí)序
  404.         Lcd1602_Delay1ms(5);
  405.         LCD1602_E = 0;
  406. }
  407. #endif
  408. /*******************************************************************************
  409. * 函 數(shù) 名       : LcdInit()
  410. * 函數(shù)功能                 : 初始化LCD屏
  411. * 輸    入       : 無
  412. * 輸    出       : 無
  413. *******************************************************************************/                  
  414. #ifndef                LCD1602_4PINS
  415. void LcdInit()                                                  //LCD初始化子程序
  416. {
  417.          LcdWriteCom(0x38);  //開顯示
  418.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  419.         LcdWriteCom(0x06);  //寫一個(gè)指針加1
  420.         LcdWriteCom(0x01);  //清屏
  421.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  422. }
  423. #else
  424. void LcdInit()                                                  //LCD初始化子程序
  425. {
  426.         LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
  427.         LcdWriteCom(0x28);         //在四位線下的初始化
  428.         LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
  429.         LcdWriteCom(0x06);  //寫一個(gè)指針加1
  430.         LcdWriteCom(0x01);  //清屏
  431.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  432. }
  433. #endif

  434. 以下是“l(fā)cd.h”
  435. #ifndef __LCD_H_
  436. #define __LCD_H_
  437. /**********************************
  438. 當(dāng)使用的是4位數(shù)據(jù)傳輸?shù)臅r(shí)候定義,
  439. 使用8位取消這個(gè)定義
  440. **********************************/
  441. //#define LCD1602_4PINS

  442. /**********************************
  443. 包含頭文件
  444. **********************************/
  445. #include <reg52.h>

  446. //---重定義關(guān)鍵詞---//
  447. #ifndef uchar
  448. #define uchar unsigned char
  449. #endif

  450. #ifndef uint
  451. #define uint unsigned int
  452. #endif

  453. /**********************************
  454. PIN口定義
  455. **********************************/
  456. #define LCD1602_DATAPINS P2
  457. sbit LCD1602_E=P0^7;
  458. sbit LCD1602_RW=P0^6;
  459. sbit LCD1602_RS=P0^5;

  460. /**********************************
  461. 函數(shù)聲明
  462. **********************************/
  463. /*在51單片機(jī)12MHZ時(shí)鐘下的延時(shí)函數(shù)*/
  464. void Lcd1602_Delay1ms(uint c);   //誤差 0us
  465. /*LCD1602寫入8位命令子函數(shù)*/
  466. void LcdWriteCom(uchar com);
  467. /*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/        
  468. void LcdWriteData(uchar dat)        ;
  469. /*LCD1602初始化子程序*/               
  470. void LcdInit();                                                  

  471. #endif
復(fù)制代碼

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:518357 發(fā)表于 2019-5-6 08:20 | 顯示全部樓層
感覺不錯(cuò)哦,謝謝大佬分享
回復(fù)

使用道具 舉報(bào)

ID:743691 發(fā)表于 2020-6-20 22:23 | 顯示全部樓層
寫的很詳細(xì)了,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:785570 發(fā)表于 2020-6-21 10:39 | 顯示全部樓層
有仿真圖嗎?

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 凹凸日日摸日日碰夜夜 | 成人在线精品视频 | 精品一区二区观看 | 日韩在线不卡 | 国产亚洲一区精品 | 日本不卡视频在线播放 | 中文字幕精品一区 | 国产999精品久久久久久绿帽 | 欧美国产视频 | 日韩精品免费 | 国产日韩欧美一区二区 | 三级成人在线 | 欧美极品少妇xxxxⅹ免费视频 | 国产精品久久久久久亚洲调教 | 国产一区三区视频 | 美日韩精品 | 中文字幕精品一区久久久久 | 91视频在线看 | 99久久免费精品国产免费高清 | 国色天香综合网 | 亚洲日本乱码在线观看 | 国产综合精品一区二区三区 | 亚洲午夜精品一区二区三区他趣 | 日本aⅴ中文字幕 | 国产一区二区中文字幕 | 欧美自拍日韩 | 99视频在线免费观看 | 在线三级网址 | 日本免费在线 | 国产一区视频在线 | 一级黄色影片在线观看 | 人人色视频 | 青青草av| 一区二区福利视频 | 欧美日韩视频一区二区 | 国产精品一区二区久久 | 免费一级毛片 | 中文字幕 欧美 日韩 | 九九热在线免费视频 | 丁香六月伊人 | 国产区在线看 |