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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

有倒計時功能的八路搶答器

  [復(fù)制鏈接]
ID:76686 發(fā)表于 2015-4-12 02:54 | 顯示全部樓層 |閱讀模式
     有倒計時功能的八路搶答器,適合單片機初學(xué)者進(jìn)行電子小制作練習(xí)用,顯示部分用LCD1602作顯示,四個控制按鍵,這個有倒計時功能的八路搶答器功能如下:
     1 八個人參賽,編號分號為0,1,2,3,4,5,6,7
     2 主持人按下開始鍵后,八人中搶先按下鍵者,液晶上顯示其對應(yīng)的編號,并鎖定顯示,后來按下者無效。
     3 按下開始鍵后蜂鳴器響起0.5s作提示
     4 主持人按下選擇鍵,可以選擇調(diào)整定時對象如分或秒,一次按鍵選中秒,二次按鍵選中分,三次按鍵恢復(fù)原狀
     5 按下選擇鍵后可按設(shè)定時間鍵來設(shè)定時間,秒是5s遞增,分是1分遞增。
     6 如果定時搶答時間到后卻沒有選手搶答,則本次搶答無效,系統(tǒng)短暫報警,并封鎖輸入電路禁止選手超時后搶答,時間在顯示器上顯示00:00
     7 主持人按下復(fù)位鍵后可以重新開始搶答。




源程序如下:
  1. //有倒訂時功能的八路搶答器C語言程序:
  2. #include "AT89X52.h"
  3. #define  uint unsigned int
  4. #define  uchar unsigned char

  5. #define  LCDPORT P2  //LCD數(shù)據(jù)線
  6. #define  KEY   P3   //八路搶答按鍵
  7. #define  NO_KEY   25   //八路搶答按鍵
  8. sbit lcdrs=P1^0;
  9. sbit lcden=P1^1;
  10. sbit speaker=P1^2;  //控制蜂鳴器
  11. sbit  select=P1^3;  //選擇分或秒的調(diào)整位
  12. sbit light=P1^4;
  13. sbit  begin=P1^5; //開始鍵
  14. sbit rst=P1^6;   //復(fù)位鍵
  15. sbit set=P1^7;   //設(shè)置時間鍵

  16. uchar table[]="00:15"; //初始值的設(shè)定

  17. void delay(uint z);    //延時z毫秒
  18. void write_com(uchar com);  //寫指令
  19. void write_data(uchar date);  //寫數(shù)據(jù)
  20. void lcd_init();   //液晶初始化
  21. void  timer_init();        //定時器初始化
  22. void  display(uchar miao);           //顯示時間
  23. void  display1(uchar fen);
  24. void  restart();
  25. void  set_time(uchar temp);
  26. uchar keyscan();        //鍵盤掃描程序

  27. uint aa,bb,cc,dd;   //用于計數(shù)
  28. uchar start;   //開始標(biāo)志
  29. uchar stop;   //結(jié)束標(biāo)志
  30. uchar reset;   //復(fù)位標(biāo)志
  31. uchar miao=15;
  32. uchar fen;
  33. bit  lockflag;   //鎖定標(biāo)志,標(biāo)志著已經(jīng)有人搶答成功
  34. bit spflag;   //開始聲響標(biāo)示
  35. bit  ovflag;//超時聲響標(biāo)志
  36. void main()
  37. {
  38.    uchar a;
  39.    lcd_init();
  40.    timer_init();
  41.    while(1)
  42.    {
  43.        a= keyscan();
  44.     if(a!=NO_KEY)
  45.      {   
  46.      set_time(a);   //設(shè)定時間
  47.         if(a==10)    //按下開始鍵
  48.        {
  49.       start=1;   //第一次按下就要開始搶答
  50.       light=0;  //燈亮表示開始
  51.       TR0=1;     //啟動定時器
  52.       TR1=1;
  53.       spflag=1;   //標(biāo)志開始的聲響
  54.      }
  55.      if(a==9)   //按下復(fù)位鍵
  56.        {
  57.       
  58.        restart();  //復(fù)原到初始狀態(tài)
  59.     }
  60.      
  61.      if(start) //已經(jīng)按下開始鍵后才作下面處理
  62.       {
  63.       if(a>=0&&a<8&&lockflag==0)
  64.        {
  65.         write_com(0x80+0x40) ;
  66.         write_data(0x30+a);
  67.      TR0=0;  //關(guān)閉定時器停止計時
  68.      lockflag=1;  //鎖定
  69.     }  
  70.    }
  71.     }
  72.    }
  73. }
  74. /******設(shè)定時間*******/
  75. void  set_time(uchar temp)
  76. {
  77.     if(temp==8)   //調(diào)整時間
  78.       {
  79.       if(cc==1)  //調(diào)整秒
  80.       {
  81.         miao+=5;
  82.      if(miao==60)
  83.        miao=0;
  84.      display(miao);  //更新顯示數(shù)據(jù)
  85.      write_com(0x80+4);
  86.         write_com(0x0f); //出現(xiàn)光標(biāo)并讓光標(biāo)閃爍
  87.       }
  88.      if(cc==2)  //調(diào)整分
  89.       {
  90.         fen++;
  91.      if(fen==5)
  92.       {
  93.         fen=0;
  94.       }
  95.       display1(fen);   //更新顯示數(shù)據(jù)
  96.       write_com(0x80+1); //起到固定光標(biāo)位置的作用
  97.          write_com(0x0f); //出現(xiàn)光標(biāo)并讓光標(biāo)閃爍
  98.       }
  99.    }
  100.     if(temp==11)    //選擇調(diào)整分或秒位
  101.      {
  102.           TR0=0;
  103.           if(cc==1)    //調(diào)整秒時間
  104.      {
  105.                    write_com(0x80+4);
  106.         write_com(0x0f); //出現(xiàn)光標(biāo)并讓光標(biāo)閃爍
  107.      }
  108.     if(cc==2)   //調(diào)整分時間
  109.      {
  110.                    write_com(0x80+1);
  111.         write_com(0x0f); //出現(xiàn)光標(biāo)并讓光標(biāo)閃爍
  112.      }
  113.      if(cc==3)
  114.      {
  115.         write_com(0x0c); //讓光標(biāo)消失
  116.    
  117.      }
  118.      }   
  119. }

  120. void restart()
  121. {
  122.    uchar num;
  123.    start=0;
  124.    TR0=0;    //關(guān)閉定時器才能停止計時
  125.    TR1=0;
  126.    miao=0;
  127.    fen=0;
  128.    spflag=0;
  129.    ovflag=0;
  130.    lockflag=0;  //各種標(biāo)志清零
  131.    write_com(0x80) ;
  132.    for(num=0;num<5;num++)
  133. {
  134.      write_data(table[num]) ;   //顯示清零
  135. }
  136.     write_com(0x80+0x40) ;
  137.     write_data(' ');
  138. }


  139. /*****顯示秒*******/
  140. void  display(uchar miao)
  141. {
  142.    uchar shi,ge;
  143.   shi=miao/10;
  144.   ge=miao%10;
  145.   write_com(0x80+3) ;
  146.   write_data(0x30+shi);
  147.   write_data(0x30+ge);
  148. }
  149. /*****顯示分*****/
  150. void  display1(uchar fen)
  151. {
  152.    uchar shi,ge;
  153.   shi=fen/10;
  154.   ge=fen%10;
  155.   write_com(0x80) ;
  156.   write_data(0x30+shi);
  157.   write_data(0x30+ge);
  158. }
  159. /******定時器0的中斷服務(wù)程序******/
  160. void  timer0()  interrupt   1
  161. {
  162.   TH0=(65536-50000)/256;
  163.   TL0=(65536-50000)%256;
  164.   aa++;
  165.   if(aa==20)
  166.    {
  167.       aa=0;
  168.    miao--;
  169.    if(miao==0)
  170.      {
  171.      
  172.      if(fen==0)
  173.      {
  174.          
  175.       stop=1;  //時間到了,搶答超時
  176.       TR0=0;   //關(guān)閉定時器
  177.       light=1;  //把燈也關(guān)了
  178.       TR1=1;    //開啟定時器1,響聲
  179.       ovflag=1;   //超時標(biāo)志
  180.      }
  181.      else
  182.       {
  183.      miao=59;
  184.      fen--;
  185.    }
  186.    
  187.   }
  188.   display(miao);  //更新顯示數(shù)據(jù)
  189.   display1(fen);
  190.    }
  191. }
  192. /*******定時器1的中斷服務(wù)程序*******/
  193. void  timer1()  interrupt   3
  194. {
  195.   TH1=(65536-500)/256;
  196.   TL1=(65536-500)%256;    //重裝初值
  197.   if(spflag)   //開始時先響500ms
  198.    {
  199.      speaker=!speaker;
  200.   dd++;
  201.   if(dd>1000)
  202.    {
  203.      dd=0;
  204.   TR1=0;    //停止定時器
  205.    }
  206.    }
  207.    
  208.   if(ovflag) //超時聲響
  209.    {
  210.      dd++;
  211.   if(dd>3000)
  212.     {
  213.        dd=0;
  214.     TR1=0;
  215.     }
  216.   if(dd%2==0)
  217.    {
  218.      speaker=!speaker;
  219.    }
  220.    }
  221.   


  222.       
  223.   
  224. }
  225. /******定時器初始化*******/
  226. void  timer_init()
  227. {
  228.   TMOD=0x11;   //工作方式的選擇
  229.   TH0=(65536-50000)/256;
  230.   TL0=(65536-50000)%256; //50ms
  231.   ET0=1;

  232.   TH1=(65536-500)/256;
  233.   TL1=(65536-500)%256;   //0.5ms
  234.   ET1=1;

  235.   EA=1;
  236.   TR0=0;
  237.   TR1=0;
  238. }

  239. /*****鍵盤掃描程序********/
  240. uchar keyscan()
  241. {
  242.     uchar key=NO_KEY;
  243.     if(KEY!=0xff)
  244.    {
  245.        delay(5);  //延時5m作消抖處理
  246.     if(KEY!=0xff) //確認(rèn)有按鍵按下
  247.       {
  248.        key=KEY;
  249.        switch(key)
  250.       {
  251.        case  0xfe:    key=0;
  252.          break;
  253.      case  0xfd:    key=1;
  254.          break;
  255.      case  0xfb:    key=2;
  256.          break;
  257.      case  0xf7:    key=3;
  258.          break;
  259.       case  0xef:    key=4;
  260.          break;
  261.      case  0xdf:    key=5;
  262.          break;
  263.      case  0xbf:    key=6;
  264.          break;
  265.                     case  0x7f:    key=7;
  266.          break;
  267.        }
  268.        while(KEY!=0xff) ;  //等待松手
  269.      
  270.    }
  271.    }
  272. if(set==0)
  273.    {
  274.       delay(5);  //延時5m作消抖處理
  275.    if(set==0)
  276.     {
  277.        key=8;
  278.     while(!set) ;
  279.     }
  280.    }
  281. if(rst==0)
  282.    {
  283.       delay(5);  //延時5m作消抖處理
  284.    if(rst==0)
  285.     {
  286.        key=9;
  287.     while(!rst) ;
  288.     }
  289.    }
  290. if(begin==0)
  291.    {
  292.       delay(5);  //延時5m作消抖處理
  293.    if(begin==0)
  294.     {
  295.        key=10;
  296.     while(!begin) ;
  297.     }
  298.    }
  299.   if(select==0)
  300.    {
  301.       delay(5);  //延時5m作消抖處理
  302.    if(select==0)
  303.     {
  304.        cc++;
  305.     if(cc==4)
  306.       {
  307.          cc=0;
  308.       }
  309.        key=11;
  310.     while(!select) ;
  311.     }
  312.    }
  313.   return(key) ;
  314. }
  315. /****延時z毫秒*******/
  316. void delay(uint z)
  317. {
  318.    uint x,y;
  319.    for(x=z;x>0;x--)
  320.       for(y=110;y>0;y--) ;
  321. }
  322. /***液晶寫指令******/
  323. void write_com(uchar com)
  324. {
  325.   lcdrs=0;
  326. P2=com;
  327. delay(1);
  328. lcden=1;
  329. delay(1);
  330. lcden=0;
  331. }
  332. /****液晶寫數(shù)據(jù)******/
  333. void write_data(uchar date)
  334. {
  335.   lcdrs=1;
  336. P2=date;
  337. delay(1);
  338. lcden=1;
  339. delay(1);
  340. lcden=0;
  341. }
  342. /***液晶初始化********/
  343. void lcd_init()
  344. {
  345.     uchar num;
  346.   lcden=0;
  347. write_com(0x38) ; //初始化
  348. write_com(0x0c) ; //打開光標(biāo)    0x0c不顯示光標(biāo)   0x0e光標(biāo)不閃,0x0f光標(biāo)閃

  349. write_com(0x01) ;  //清顯示
  350. write_com(0x80) ;
  351. for(num=0;num<5;num++)
  352. {
  353.      write_data(table[num]) ;
  354. }

  355. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +1 收起 理由
尼古丁的味道 + 1 過來看看--

查看全部評分

回復(fù)

使用道具 舉報

ID:97471 發(fā)表于 2015-12-22 15:14 | 顯示全部樓層
過來看看~
回復(fù)

使用道具 舉報

ID:107352 發(fā)表于 2016-6-20 11:38 | 顯示全部樓層
過來看看~
回復(fù)

使用道具 舉報

ID:476271 發(fā)表于 2019-7-25 09:46 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:282095 發(fā)表于 2019-7-25 11:01 | 顯示全部樓層
51單片機的8路搶答器
回復(fù)

使用道具 舉報

ID:371844 發(fā)表于 2019-7-29 10:46 | 顯示全部樓層
圖文不符
回復(fù)

使用道具 舉報

ID:736988 發(fā)表于 2020-5-4 17:12 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩日韩日韩日韩日韩日韩日韩 | 天天干视频网 | 久久精品亚洲欧美日韩久久 | 麻豆av一区二区三区久久 | 欧美自拍第一页 | 天堂在线1| 高清av电影 | 亚洲精品视频在线 | 精品国产精品三级精品av网址 | 99色综合| 九九热在线视频观看这里只有精品 | 亚洲视频精品在线 | www.干| 日韩欧美在线一区 | 亚洲精品久久久蜜桃 | 天堂av资源 | 精久久久 | 日韩一区二区三区av | av网站在线播放 | 日日干日日射 | 成人1区2区 | 中文字幕一二三 | 欧美日韩国产传媒 | 亚洲精品成人av久久 | 国内久久精品 | 精品久久久久久久久久久 | 天天草天天爱 | 欧美激情一区二区三级高清视频 | av网址在线 | 国产一区二区三区四区三区四 | 91在线网站 | 国产h视频 | 精品在线观看一区二区 | 国产日韩欧美二区 | 日本一区二区三区四区 | 精品中文字幕在线观看 | 日韩欧美国产一区二区三区 | 天天躁日日躁狠狠躁白人 | 91免费观看 | 成人在线视频免费观看 | 国产区在线看 |