找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2108|回复: 0
收起左侧

这个单片机倒计时程序如何添加一个蜂鸣器提示?

[复制链接]
ID:668610 发表于 2019-12-23 15:48 | 显示全部楼层 |阅读模式
我每次添加的时候,我的倒计时就不动了求解

  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit RS = P2^0;
  5. sbit RW = P2^1;
  6. sbit EN = P2^2;
  7. sbit K0 = P3^0;
  8. sbit K1 = P1^0;
  9. sbit K2 = P1^1;
  10. sbit K3 = P1^2;
  11. sbit K4 = P1^3;
  12. sbit K5 = P3^1;
  13. sbit K6 = P2^3;
  14. sbit K7 = P2^4;
  15. sbit K8 = P3^4;
  16. sbit Buzz = P3^7;
  17. sbit beep=P1^4;         //蜂鸣器
  18. uint cnt = 0;//记录中断次数
  19. uint cnt1= 0;
  20. uint sec = 20;//记录倒计时
  21. uchar num = 0;//记录抢答选手
  22. uchar flag = 1;//抢答标志
  23. uchar s_flag = 0;//开始标志
  24. uchar e_flag = 0;//结束标志
  25. uchar score[4]={0};
  26. void init1602();
  27. void Lcdshow(uchar x,uchar y,uchar *str);
  28. void KeyScan();   
  29. void Keycontrol() ;
  30. void Judge();
  31. uchar IntToString(uchar *str, int dat);

  32. void main()
  33. {
  34.         uchar str1[12];
  35.         uchar str2[12];
  36.         uchar len,len1;
  37.         EA = 1;
  38.         ET0 = 1;
  39.         TMOD = 0x11;//打开定时器T0,T1
  40.         TR0 = 0;
  41.         TH0 = 0xFC;
  42.         TL0 = 0x67;
  43.         
  44.         TR1 = 0;
  45.         TH1 = 0xFC;
  46.         TL1 = 0x67;
  47.         ET1 = 1;

  48.         init1602();
  49.         
  50.         
  51.         
  52.         Lcdshow(0,0,str1);
  53.         while(1)
  54.         {
  55.                 Keycontrol();
  56.                 KeyScan();
  57.                 len = IntToString(str1,sec);
  58.                 len1= IntToString(str2,num);
  59.                 if(e_flag==0)
  60.                 {
  61.                         Lcdshow(0,0,"Time:");
  62.                         Lcdshow(6,0,str1);
  63.                 }
  64.                 if(num!=0&&e_flag==0&&flag==0)//没有结束且有人按下按键
  65.                 {
  66.                         Lcdshow(0, 1, "answerer:");        
  67.                         Lcdshow(9, 1, str2);
  68.                 }
  69.                 if(e_flag==1)
  70.                 {
  71.                         Judge();
  72.                 }
  73.         }
  74. }

  75. /*等待液晶准备*/
  76. void Lcdready()
  77. {
  78.         uchar sta;
  79.         P0 = 0xFF;
  80.         RS = 0;
  81.         RW = 1;
  82.         do
  83.         {
  84.                 EN = 1;
  85.                 sta = P0;//读取状态字
  86.                 EN = 0;

  87.         }while(sta & 0x80);
  88. }
  89. /* 向 LCD1602 液晶写入命令,cmd-待写入命令值 */
  90. void WriteCmd(uchar cmd)
  91. {
  92.         Lcdready();
  93.         RS = 0;
  94.         RW = 0;
  95.         P0 = cmd;
  96.         EN = 1;
  97.         EN = 0;
  98. }
  99. /* 向 LCD1602 液晶写入数据,dat-待写入数据 */
  100. void WriteData(uchar dat)
  101. {
  102.         Lcdready();
  103.         RS = 1;
  104.         RW = 0;
  105.         P0 = dat;
  106.         EN = 1;
  107.         EN = 0;
  108. }
  109. /* 设置显示 RAM 起始地址(x,y)-对应屏幕上的字符坐标 */
  110. void Lcdaddr(uchar x,uchar y)
  111. {
  112.         uchar m;
  113.         if(y==0)
  114.                 m = 0x00+x;        //第一行字符地址从 0x00 起始
  115.         else
  116.                 m = 0x40+x;        //第二行字符地址从 0x40 起始
  117.         WriteCmd(m | 0x80);//设置 RAM 地址
  118. }
  119. /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
  120. void Lcdshow(uchar x,uchar y,uchar *str)
  121. {
  122.         Lcdaddr(x,y);
  123.         while(*str != '\0')
  124.         {
  125.                 WriteData(*str++);
  126.         }
  127. }
  128. /* 初始化 1602 液晶 */
  129. void init1602()
  130. {
  131.         WriteCmd(0x38);
  132.         WriteCmd(0x0C);
  133.         WriteCmd(0x06);
  134.         WriteCmd(0x01);
  135. }
  136. /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
  137. unsigned char IntToString(unsigned char *str, int dat)
  138. {
  139.     uchar i = 0;
  140.     unsigned char len = 0;
  141.     unsigned char buf[6];

  142.     if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号
  143.     {
  144.         dat = -dat;
  145.         *str++ = '-';
  146.         len++;
  147.     }
  148.     do                            //先转换为低位在前的十进制数组
  149.         {         
  150.         buf[i++] = dat % 10;
  151.         dat /= 10;
  152.     } while (dat > 0);
  153.     len += i;     //i最后的值就是有效字符的个数
  154.     while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  155.     {
  156.         *str++ = buf[i] + '0';
  157.     }
  158.     *str = '\0';  //添加字符串结束符

  159.     return len;   //返回字符串长度
  160. }
  161. /*简易延时*/
  162. void delay(uint x)
  163. {
  164.         uchar i,j;
  165.         for(i=x;i>0;i--)
  166.                 for(j=110;j>0;j--);
  167. }
  168. /*控制键扫描函数,开始结束*/
  169. void Keycontrol()   
  170. {
  171.         if(K0==0)        //开始键
  172.         {
  173.                  delay(10);
  174.             if(K0==0)
  175.             {
  176.                 while(!K0);
  177.                                 WriteCmd(0x01);
  178.                                 sec=20;
  179.                 TR0=~TR0;
  180.                                 e_flag=0;
  181.                                 flag=1;
  182.                                 s_flag = 1;//表示已经开始
  183.             }
  184.         }
  185.                 if(K5==0)
  186.                 {
  187.                         delay(10);
  188.                         if(K5==0 && flag==0)
  189.                         {
  190.                                 while(!K5);
  191.                                 e_flag =1;//表示结束
  192.                                 Buzz = 0;
  193.                                 Lcdshow(9,0,"Successed");
  194.                         }        
  195.                 }
  196.                 if(K8==0)         //查分键
  197.                 {
  198.                         uchar ch;
  199.                         delay(10);
  200.                         if(K8==0 && e_flag==1) //按键按下且此时已结束
  201.                         {
  202.                                 while(!K8);
  203.                                 WriteCmd(0x01);
  204.                                 Lcdshow(0,0,"P1:");
  205.                                 ch=(char) (score[1]+48);
  206.                                 WriteData(ch);
  207.                                 Lcdshow(10,0,"P2:");
  208.                                 ch=(char) (score[2]+48);
  209.                                 WriteData(ch);
  210.                                 Lcdshow(0,1,"P3:");
  211.                                 ch=(char) (score[3]+48);
  212.                                 WriteData(ch);
  213.                                 Lcdshow(10,1,"P4:");
  214.                                 ch=(char) (score[4]+48);
  215.                                 WriteData(ch);
  216.                         }        
  217.                 }
  218. }
  219. /*四路热键扫描(哪个键先按下,哪个优先级最高) */
  220. void KeyScan()               
  221. {
  222.         if( K1==0 && flag != 0 && s_flag==1)
  223.     {
  224.             delay(10);
  225.         if(K1==0)
  226.         {
  227.             while(!K1);
  228.             num=1;           //数码管显示1号"1"
  229.             TR0=0;           //关闭定时器0,时间停止            
  230.             TR1=1;                        //按下抢答器,蜂鸣器提醒           
  231.             flag=0;        //关闭开始键标志位,使再按其他三个键不会响应                                   
  232.         }        
  233.     }
  234.         if( K2==0 && flag != 0 && s_flag==1)          //以下三个按键同一
  235.     {
  236.             delay(10);
  237.         if(K2==0)
  238.         {
  239.             while(!K1);
  240.             num=2;         
  241.             TR0=0;                    
  242.             TR1=1;                 
  243.             flag=0;                                       
  244.         }        
  245.     }
  246.         if( K3==0 && flag != 0 && s_flag==1)         
  247.     {
  248.             delay(10);
  249.         if(K3==0)
  250.         {
  251.             while(!K1);
  252.             num=3;         
  253.             TR0=0;                    
  254.             TR1=1;                  
  255.             flag=0;                                       
  256.         }        
  257.     }
  258.         if( K4==0 && flag != 0 && s_flag==1)         
  259.     {
  260.             delay(10);
  261.         if(K4==0)
  262.         {
  263.             while(!K1);
  264.             num=4;         
  265.             TR0=0;                    
  266.             TR1=1;                  
  267.             flag=0;                                       
  268.         }        
  269.     }

  270. }
  271. void Judge()
  272. {
  273.         if( K6==0 )                    //Yes按键
  274.     {
  275.             delay(10);
  276.         if(K6==0)
  277.         {
  278.             while(!K6);         
  279.             WriteCmd(0x01);
  280.                         Lcdshow(0, 0, "Your answer is:");  
  281.                         Lcdshow(0, 1, "Right");
  282.                         score[num]++;//为选手加分                                    
  283.         }        
  284.     }
  285.         if( K7==0 )         
  286.     {
  287.             delay(10);
  288.         if(K7==0)
  289.         {
  290.             while(!K7);         
  291.             WriteCmd(0x01);
  292.                         Lcdshow(0, 0, "Your answer is:");  
  293.                         Lcdshow(0, 1, "Worry");                                    
  294.         }        
  295.     }        
  296. }

  297. void Time0 () interrupt 1
  298. {
  299.         TH0 = 0xFC;
  300.         TL0 = 0x67;//重赋值
  301.         cnt++;
  302.         if(cnt>=1000)
  303.         {
  304.                 cnt = 0;
  305.                 sec--;
  306.                 if(sec==0)
  307.                         TR0 = 0;
  308.         }

  309. }
  310. void Time1 () interrupt 3
  311. {
  312.         TH1=(65536-2000)/256;
  313.     TL1=(65536-2000)%256;
  314.     Buzz = ~Buzz;
  315.     cnt1++;
  316.     if(cnt1==1000)
  317.     {
  318.         cnt1=0;
  319.             TR1=0;
  320.     }
  321. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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