找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3202|回复: 1
收起左侧

基于89C51单片机8位抢答器/带蜂鸣器提示/lcd1602/proteus

[复制链接]
ID:851585 发表于 2020-12-9 00:18 | 显示全部楼层 |阅读模式
主要功能:
        key9:主持人键           黄灯
        key1~8:抢答人键   红灯
        只有主持人按下后,抢答才有效,都有声音提示
        主持人按下前:lcd显示  SUSPEND  暂停
        主持人按下,抢答人按下前://lcd显示  START  开始  // D9亮//时间开始倒计时
        抢答人按下:lcd显示  AND   结束  相应灯亮//时间停止
        抢答结束所有按键不再起作用

Proteus仿真原理图:
抢答器1602.PNG


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.         延时函数  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指令写入函数
  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数据写入函数
  40. *************************************************************/
  41. void write_date(uchar date)
  42. {
  43.     P0=date;
  44.         rs=1;//rs高,数据
  45.         rw=0;//低,写
  46.         lcden=0;
  47.         delay(5);
  48.         lcden=1;
  49.         delay(5);
  50.         lcden=0;
  51. }
  52. /*************************************************************
  53.         lcd1602初始化函数
  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.         显示状态函数
  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.         初始化时间函数
  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.         显示时间函数
  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.         按键检测并时实还回按键号数
  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函数
  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, 下载次数: 64)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:861871 发表于 2020-12-17 12:32 | 显示全部楼层
为什么这个代码我复制了,但是创建不了,麻烦大神求救!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表