找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3627|回復: 1
打印 上一主題 下一主題
收起左側

基于89C51單片機8位搶答器/帶蜂鳴器提示/lcd1602/proteus

[復制鏈接]
跳轉到指定樓層
樓主
ID:851585 發(fā)表于 2020-12-9 00:18 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
主要功能:
        key9:主持人鍵           黃燈
        key1~8:搶答人鍵   紅燈
        只有主持人按下后,搶答才有效,都有聲音提示
        主持人按下前:lcd顯示  SUSPEND  暫停
        主持人按下,搶答人按下前://lcd顯示  START  開始  // D9亮//時間開始倒計時
        搶答人按下:lcd顯示  AND   結束  相應燈亮//時間停止
        搶答結束所有按鍵不再起作用

Proteus仿真原理圖:



C程序代碼:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P3^5;
  5. sbit rw=P3^6;
  6. sbit lcden=P3^7;
  7. sbit button=P3^0;
  8. sbit D9=P3^1;
  9. sbit beep=P3^2;
  10. uchar table1[]="SUSPEND";//暫停   //要顯示的字表
  11. uchar table2[]="START  ";//開始
  12. uchar table3[]="AND    ";//結束
  13. uchar table4[]="    00:03:00";//搶答時間
  14. uchar fen,miao,sfmshi,sfmge,count,temp,flag,num,aa,bb,cc;
  15. /*************************************************************
  16.         延時函數(shù)  ms
  17. *************************************************************/
  18. void delay(uint t)
  19. {
  20.     uint x,y;
  21.         for(x=t;x>0;x--)
  22.         for(y=110;y>0;y--);
  23. }
  24. /*************************************************************
  25.         lcd1602指令寫入函數(shù)
  26. *************************************************************/
  27. void write_com(uchar com)
  28. {
  29.     P0=com;
  30.         rs=0;//rs低,指令
  31.         rw=0;//低,寫
  32.         lcden=0;
  33.         delay(5);
  34.         lcden=1;
  35.         delay(5);
  36.         lcden=0;
  37. }
  38. /*************************************************************
  39.         lcd1602數(shù)據(jù)寫入函數(shù)
  40. *************************************************************/
  41. void write_date(uchar date)
  42. {
  43.     P0=date;
  44.         rs=1;//rs高,數(shù)據(jù)
  45.         rw=0;//低,寫
  46.         lcden=0;
  47.         delay(5);
  48.         lcden=1;
  49.         delay(5);
  50.         lcden=0;
  51. }
  52. /*************************************************************
  53.         lcd1602初始化函數(shù)
  54. *************************************************************/
  55. void init()
  56. {
  57.         fen=3;
  58.         miao=0;        

  59.         write_com(0x38);//選擇16x2顯示,5x7點陣
  60.         delay(5);
  61.         write_com(0x0f);//開顯示,開光標,光標閃爍
  62.         delay(5);
  63.         write_com(0x06);//讀或寫后,指針加一,光標加一
  64.         delay(5);
  65.         write_com(0x01);//清屏
  66.         delay(5);
  67. /***********************************
  68.         中斷初始化
  69. ************************************/
  70.         TMOD=0x01;//定時器T0,方式1                                 
  71.         TH0=(65536-50000)/256;//裝高8位初值
  72.         TL0=(65536-50000)%256;//裝低8位初值
  73.         EA=1;//總中斷開
  74.         ET0=1;
  75.         TR0=0;//定時器T0關閉,待主持按下
  76. }
  77. /*************************************************************
  78.         顯示狀態(tài)函數(shù)
  79. *************************************************************/                                                         
  80. void display1()                                 
  81. {
  82.     uchar i;
  83.     write_com(0x80);//lcd1602第一行第一位  指令
  84.         delay(5);
  85.         for(i=0;i<7;i++)
  86.         {
  87.            if(flag==0)
  88.            write_date(table1[i]);
  89.            if(flag==1)
  90.            write_date(table2[i]);
  91.            if(flag==2)
  92.            write_date(table3[i]);
  93.            delay(5);
  94.         }
  95. }
  96. /*************************************************************
  97.         初始化時間函數(shù)
  98. *************************************************************/
  99. void display2()                                 
  100. {
  101.          uchar i;
  102.         write_com(0x80+0x40);//lcd1602第二行第一位  指令
  103.         delay(5);
  104.         for(i=0;i<12;i++)
  105.         {
  106.            write_date(table4[i]);
  107.            delay(5);
  108.         }
  109. }
  110. /*************************************************************
  111.         顯示時間函數(shù)
  112. *************************************************************/
  113. void sfm(uchar com,uchar date)                  
  114. {
  115.         sfmshi=date/10;
  116.         sfmge=date%10;
  117.     write_com(0xc0+com);
  118.         delay(5);
  119.         write_date(0x30+sfmshi);
  120.         delay(5);
  121.         write_date(0x30+sfmge);
  122.         delay(5);
  123.         write_com(0x80+17);        
  124. }
  125. /*************************************************************
  126.         按鍵檢測并時實還回按鍵號數(shù)
  127. *************************************************************/
  128. uchar keyscan()
  129. {
  130.         if(P2!=0xff)
  131.         {
  132.                 delay(5);//消抖
  133.                 if(P2!=0xff)
  134.                 switch(P2)
  135.                 {
  136.                          case 0xfe:num=1;break;
  137.                         case 0xfd:num=2;break;
  138.                         case 0xfb:num=3;break;
  139.                         case 0xf7:num=4;break;
  140.                         case 0xef:num=5;break;
  141.                         case 0xdf:num=6;break;
  142.                         case 0xbf:num=7;break;
  143.                         case 0x7f:num=8;break;
  144.                         default:break;
  145.                 }
  146.                 while(P2!=0xff);//松手檢測
  147.         }
  148.         if(button==0)
  149.         {
  150.                 delay(5);
  151.                 if(button==0&&cc==0)
  152.                 {
  153.                         while(button==0);
  154.                         num=9;
  155.                         TR0=1;
  156.                         cc=1;
  157.                         beep=0;
  158.                         delay(500);
  159.                         beep=1;
  160.                 }
  161.                
  162.         }
  163.         return num;
  164. }
  165. /*************************************************************
  166.         main函數(shù)
  167. *************************************************************/
  168. void main()
  169. {
  170.     init();
  171.     display1();
  172.         display2();
  173.         write_com(0x0c);//開顯示,關閉光標,不閃爍
  174.         delay(5);
  175.         while(1)
  176.         {         
  177.                 keyscan();
  178.                 if(num==9&&TR0!=0)
  179.                 {display1();aa=1;}
  180.                 if(aa==1)
  181.                 {
  182.                         D9=0;
  183.                         flag=1;
  184.                         switch(num)
  185.                         {
  186.                                  case 1:
  187.                                 {P1=0xfe;TR0=0;flag=2;display1();aa=0;break;}
  188.                                 case 2:
  189.                                 {P1=0xfd;TR0=0;flag=2;display1();aa=0;break;}
  190.                                 case 3:
  191.                                 {P1=0xfb;TR0=0;flag=2;display1();aa=0;break;}
  192.                                 case 4:
  193.                                 {P1=0xf7;TR0=0;flag=2;display1();aa=0;break;}
  194.                                 case 5:
  195.                                 {P1=0xef;TR0=0;flag=2;display1();aa=0;break;}
  196.                                 case 6:
  197.                                 {P1=0xdf;TR0=0;flag=2;display1();aa=0;break;}
  198.                                 case 7:
  199.                                 {P1=0xbf;TR0=0;flag=2;display1();aa=0;break;}
  200.                                 case 8:
  201.                                 {P1=0x7f;TR0=0;flag=2;display1();aa=0;break;}
  202.                                 default:break;
  203.                         }        
  204.                 }
  205.                 if(flag==2&&bb==0)
  206.                 {
  207.                          write_com(0x80+12);
  208.                         write_date(0x30+num);
  209.                         write_date(0x50+7);
  210.                         write_date(0x40+9);
  211.                         write_date(0x40+14);
  212.                         bb=1;
  213.                         beep=0;
  214.                         delay(500);
  215.                         beep=1;        
  216.                 }
  217.         }
復制代碼

因文章限制,全部資料在下面壓縮包中........
多路搶答器.zip (94.28 KB, 下載次數(shù): 64)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:861871 發(fā)表于 2020-12-17 12:32 | 只看該作者
為什么這個代碼我復制了,但是創(chuàng)建不了,麻煩大神求救!
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表