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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

有倒計(jì)時(shí)功能的單片機(jī)八路搶答器Proteus仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
搶答器正常情況下使用很ok,并且可以調(diào)節(jié)倒計(jì)時(shí)時(shí)間于LCD1602顯示。
非正常情況下,會(huì)有些漏洞存在,感興趣的朋友可以進(jìn)一步完善。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. //有倒計(jì)時(shí)功能的八路搶答器C語言程序:
  2. #include<reg52.h>
  3. #define  LCDPORT P0                  //LCD數(shù)據(jù)線
  4. #define  KEY            P3                   //八路搶答按鍵
  5. typedef        unsigned char uchar;
  6. typedef        unsigned int  uint;
  7. sbit  begin=P1^1;                        //開始鍵
  8. sbit  set=P1^2;                          //設(shè)置時(shí)間鍵
  9. sbit  add=P1^3;                         
  10. sbit  dec=P1^4;                               
  11. sbit  rst=P1^5;                         //復(fù)位鍵
  12. sbit  light=P1^6;                   //開始指示燈
  13. sbit  speaker=P1^7;                   //控制蜂鳴器
  14. sbit  lcdrs=P2^0;
  15. sbit  lcdrw=P2^1;
  16. sbit  lcden=P2^2;
  17. uchar code table[]="00:15";        //初始值的設(shè)定
  18. uint  aa=0,bb=0,cc=0,dd=0;  //用于計(jì)數(shù)
  19. uchar start;                                   //開始標(biāo)志
  20. uchar stop;                                   //結(jié)束標(biāo)志
  21. uchar reset;                                   //復(fù)位標(biāo)志
  22. uchar miao=15;
  23. uchar fen=0;
  24. bit   lockflag=0;                   //鎖定標(biāo)志,標(biāo)志著已經(jīng)有人搶答成功
  25. bit   spflag=0;                           //開始聲響標(biāo)示
  26. bit   ovflag=0;                                //超時(shí)聲響標(biāo)志
  27. /****延時(shí)z毫秒*******/
  28. void delay(uint z)
  29. {
  30. uchar x,y;
  31. for(x=z;x>0;x--)
  32.      for(y=250;y>0;y--);        //晶振為12MHZ:4*250*z=z ms
  33. }
  34. /***液晶寫地址******/
  35. void write_com(uchar com)
  36. {
  37. lcdrs=0;
  38. lcdrw=0;
  39. P0=com;
  40. lcden=1;
  41. delay(3);
  42. lcden=0;
  43. }
  44. /****液晶寫數(shù)據(jù)******/
  45. void write_data(uchar date)
  46. {
  47. lcdrs=1;
  48. lcdrw=0;
  49. P0=date;
  50. lcden=1;
  51. delay(3);
  52. lcden=0;
  53. }
  54. /***液晶初始化********/
  55. void lcd_init()
  56. {
  57. uchar num;
  58. write_com(0X38);                         //初始化
  59. write_com(0X0c);                         //打開光標(biāo) 0x0c不顯示光標(biāo),0x0e光標(biāo)不閃,0x0f光標(biāo)閃
  60. write_com(0X06);                          //清顯示
  61. write_com(0X80);                        //顯示第一行,第二行為(0x80+0x40)
  62. for(num=0;num<5;num++)
  63.     {
  64.          write_data(table[num]);
  65.          delay(5);
  66.         }
  67. }
  68. /******定時(shí)器初始化*******/
  69. void timer_init()
  70. {
  71.   TMOD=0x11;                             //工作方式的選擇
  72.   TH0=(65536-50000)/256;
  73.   TL0=(65536-50000)%256;  //50ms
  74.   ET0=1;

  75.   TH1=(65536-500)/256;
  76.   TL1=(65536-500)%256;    //0.5ms
  77.   ET1=1;

  78.   EA=1;
  79.   TR0=0;
  80.   TR1=0;
  81. }
  82. /*****顯示分*****/
  83. void  display1(uchar fen)
  84. {
  85.   uchar shi,ge;
  86.   shi=fen/10;
  87.   ge=fen%10;
  88.   write_com(0X80);
  89.   write_data(0X30+shi);                 //這里要注意,顯示的是ASCII碼!
  90.   write_data(0X30+ge);
  91. }
  92. /*****顯示秒*******/
  93. void display(uchar miao)
  94. {
  95.   uchar shi,ge;
  96.   shi=miao/10;
  97.   ge=miao%10;
  98.   write_com(0X80+3) ;
  99.   write_data(0X30+shi);                //這里要注意,顯示的是ASCII碼!
  100.   write_data(0X30+ge);
  101. }
  102. /******定時(shí)器0的中斷服務(wù)程序******/
  103. //倒計(jì)時(shí)
  104. void timer0() interrupt 1
  105. {
  106.   TH0=(65536-50000)/256;
  107.   TL0=(65536-50000)%256;
  108.   aa++;
  109.   if(aa==20)                                //20*50ms=1s
  110.    {
  111.     aa=0;
  112.     miao--;
  113.     if(miao==0)
  114.       {
  115.        if(fen==0)
  116.          {         
  117.           stop=1;                          //時(shí)間到了,搶答超時(shí)
  118.           TR0=0;                           //關(guān)閉定時(shí)器
  119.           light=1;                  //把燈也關(guān)了
  120.           TR1=1;                    //開啟定時(shí)器1,響聲
  121.           ovflag=1;                   //超時(shí)標(biāo)志
  122.          }
  123.             else
  124.               {
  125.                    fen--;
  126.                miao=59;               
  127.           }
  128.        }
  129.    display(miao);                          //更新顯示數(shù)據(jù)
  130.    display1(fen);
  131.   }
  132. }
  133. /*****鍵盤掃描程序********/
  134. uchar keyscan()
  135. {
  136. uchar keyn;
  137. if(KEY!=0xff)
  138.    {
  139.     delay(5);                            //延時(shí)5ms作消抖處理
  140.     if(KEY!=0xff)                  //確認(rèn)有按鍵按下
  141.       {
  142.        switch(KEY)
  143.                       {
  144.                        case 0xfe:keyn=0;break;
  145.                        case 0xfd:keyn=1;break;
  146.                        case 0xfb:keyn=2;break;
  147.                        case 0xf7:keyn=3;break;
  148.                        case 0xef:keyn=4;break;
  149.                        case 0xdf:keyn=5;break;
  150.                        case 0xbf:keyn=6;break;
  151.                        case 0x7f:keyn=7;break;
  152.                       }
  153.        while(KEY!=0xff); //等待松手
  154.              }
  155.    }
  156.   if(begin==0)
  157.    {
  158.      delay(5);                  //延時(shí)5m作消抖處理
  159.      if(begin==0)
  160.        {
  161.         keyn=8;
  162.         while(!begin);
  163.        }
  164.     }
  165.   if(set==0)
  166.     {
  167.      delay(5);                          //延時(shí)5m作消抖處理
  168.      if(set==0)
  169.        {
  170.         while(!set);
  171.             delay(5);
  172.             while(!set);
  173.             bb++;
  174.            }
  175.          }
  176.   if(bb==1)
  177.     {
  178.            write_com(0x80+4);
  179.      write_com(0x0f);
  180.     }
  181.   if(bb==2)
  182.     {
  183.            write_com(0x80+1);
  184.      write_com(0x0f);
  185.     }
  186.   if(add==0)
  187.     {
  188.      delay(5);                          //延時(shí)5m作消抖處理
  189.      if(add==0)
  190.        {
  191.         while(!add);
  192.             delay(5);
  193.             while(!add);
  194.                 //修改秒,增加1
  195.                 if(bb==1)
  196.                   {
  197.                    uchar ge,shi;
  198.                    miao++;
  199.                    shi=miao/10;
  200.                    ge=miao%10;
  201.                    //秒的修整
  202.                    if(miao==60)
  203.                             {
  204.                           ge=0;
  205.                              shi=0;
  206.                          }
  207.                    //顯示修整值
  208.                    miao=shi*10+ge;
  209.                    display(miao);
  210.                    write_com(0x80+4);//把光標(biāo)位置移回來
  211.                   }
  212.                  //修改分鐘,加一
  213.                  if(bb==2)
  214.                     {
  215.                      uchar ge,shi;
  216.                      fen++;
  217.                      shi=fen/10;
  218.                      ge=fen%10;
  219.                          if(fen==60)
  220.                            {
  221.                             ge=0;
  222.                                 shi=0;
  223.                            }
  224.                      fen=shi*10+ge;
  225.                      display1(fen);
  226.                      write_com(0x80+1);
  227.                     }
  228.                 }
  229.         }
  230.   if(dec==0)
  231.     {
  232.      delay(5);                          //延時(shí)5m作消抖處理
  233.      if(dec==0)
  234.        {
  235.         while(!dec);
  236.             delay(5);
  237.             while(!dec);  
  238.                 if(bb==1)
  239.                         {
  240.                                 uchar ge,shi;
  241.                                 miao--;
  242.                                 shi=miao/10;
  243.                                 ge=miao%10;
  244.                                 if(miao==-1)
  245.                                   {
  246.                                         shi=5;
  247.                                         ge=9;       
  248.                                   }
  249.                                 miao=shi*10+ge;                                                                                               
  250.                                 display(miao);
  251.                                 write_com(0x80+4);
  252.                           }
  253.                         //修改分鐘
  254.                         if(bb==2)
  255.                           {
  256.                                 uchar ge,shi;
  257.                                 fen--;
  258.                                 shi=fen/10;
  259.                                 ge=fen%10;
  260.                                 if(fen==-1)
  261.                                   {
  262.                                    shi=5;
  263.                                    ge=9;
  264.                                   }
  265.                                 fen=shi*10+ge;
  266.                                 display1(fen);
  267.                                 write_com(0x80+1);
  268.                           }
  269.               }
  270.    }
  271. if(bb==3)
  272.    {
  273.     bb=0;
  274.     write_com(0x0c);
  275.    }
  276. if(rst==0)
  277.    {
  278.     delay(5);                          //延時(shí)5m作消抖處理
  279.     if(rst==0)
  280.     {
  281.      keyn=9;
  282.      while(!rst);
  283.     }
  284.    }   
  285. return(keyn);
  286. }
  287. /*******定時(shí)器1的中斷服務(wù)程序*******/
  288. //喇叭聲響
  289. void timer1() interrupt 3
  290. {
  291.   TH1=(65536-500)/256;
  292.   TL1=(65536-500)%256;    //重裝初值
  293.   if(spflag)                     //開始時(shí)先響500ms
  294.     {
  295.      speaker=!speaker;
  296.      dd++;
  297.      if(dd>1000)                  //0.5ms*1000=500ms
  298.        {
  299.         dd=0;
  300.         TR1=0;                      //停止定時(shí)器
  301.                 spflag=0;
  302.        }
  303.     }  
  304.   if(ovflag)                   //超時(shí)聲響
  305.     {
  306.      dd++;
  307.          if(dd%4==0){speaker=!speaker;}
  308.      if(dd>3000)
  309.        {
  310.         dd=0;
  311.         TR1=0;
  312. //                ovflag=0;
  313.        }     
  314.     }
  315. }
  316. void restart()
  317. {
  318.   uchar num;
  319.   start=0;
  320.   TR0=0;                                    //關(guān)閉定時(shí)器才能停止計(jì)時(shí)
  321.   TR1=0;
  322.   miao=0;
  323.   fen=0;
  324.   spflag=0;
  325.   ovflag=0;
  326.   lockflag=0;                                  //各種標(biāo)志清零
  327.   P1=0XFF;
  328.   P3=0XFF;  
  329.   miao=15;
  330.   fen=0;
  331.   lcd_init();
  332.   timer_init();
  333.   write_com(0x80+0x40);
  334.   write_data(' ');
  335. }
  336. void main()
  337. {
  338.    uchar a;
  339.    lcd_init();
  340.    timer_init();
  341.    while(1)
  342.    {
  343.     a=25;
  344.     a=keyscan();
  345.     if(a!=25)
  346.       {   
  347.        if(a==8)                            //按下開始鍵
  348.          {
  349.           start=1;                   //第一次按下就要開始搶答
  350.           light=0;                  //燈亮表示開始
  351.           spflag=1;                   //標(biāo)志開始的聲響
  352.                   EA=1;                                //啟動(dòng)定時(shí)器
  353.                   TR0=1;            
  354.           TR1=1;         
  355.          }   
  356.        while(start)                         //已經(jīng)按下開始鍵后才作下面處理
  357.          {
  358.           a=keyscan();
  359.                   if(a>=0&&a<8&&lockflag==0&&ovflag==0)
  360.              {
  361.               write_com(0x80+0x40) ;
  362.               write_data(0x30+a);
  363.               TR0=0;                  //關(guān)閉定時(shí)器停止計(jì)時(shí)
  364.               lockflag=1;          //鎖定
  365.                           start=0;
  366.              }
  367.                   if(lockflag==1)start=0;  
  368.          }
  369.                 if(a==9)restart(); //按下復(fù)位鍵
  370.        }
  371.      }
  372. }

復(fù)制代碼

所有資料51hei提供下載:
有倒計(jì)時(shí)功能的八路搶答器.zip (57.34 KB, 下載次數(shù): 49)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品视频一区二区三区 | 国产精品99久久久久久久久久久久 | 久久av一区二区三区 | 欧美国产免费 | 中文字幕亚洲视频 | 中文亚洲视频 | 久久久国产一区二区三区 | 在线天堂免费中文字幕视频 | 欧美一区二区在线观看视频 | 国产美女精品 | 鲁大师一区影视 | 久久精品欧美一区二区三区不卡 | 国产成人在线视频 | 亚洲成人精品国产 | 国产欧美一区二区三区在线看 | 亚洲天堂一区 | 九色综合网 | 在线观看成人av | 毛片软件| 黄色一级电影在线观看 | 天天天操天天天干 | 成人视屏在线观看 | 玖玖色在线视频 | 丝袜一区二区三区 | 精品欧美一区二区三区久久久 | 国产一区欧美 | 午夜精品视频在线观看 | 亚洲精品视频网站在线观看 | 国产精品久久久久久久久免费 | av电影一区| 免费在线精品视频 | 日本久久久久久久久 | 9191在线播放 | 男人的天堂在线视频 | 国产一区二区中文字幕 | 一区二视频 | 亚洲精品视频免费 | 欧美精品成人影院 | 一区二区三 | 久草新视频 | 成人在线精品视频 |