标题: 关于单片机定时器定时问题 [打印本页]

作者: AnRan_    时间: 2022-2-19 00:07
标题: 关于单片机定时器定时问题
刚学定时器,需要写一个程序,就是按下S2(代码里面的key1)之后让led灯全亮,定时器定时5s之后让led灯全部熄灭。我这样子写发现并不能熄灭,有没有人给说一下问题并且给个思路?
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit key1=P3^0;

  4. void delay(unsigned char z)//zms延时
  5. {
  6.         unsigned char i, j;
  7.         while(z>0)
  8.         {
  9.                 _nop_();
  10.                 i = 2;
  11.                 j = 199;
  12.                 do
  13.                 {
  14.                         while (--j);
  15.                 } while (--i);
  16.                 z--;
  17.         }
  18. }

  19. void timer0Init()  //50ms
  20. {
  21.         TR0=1;
  22.         TMOD=0X01;
  23.         TH0=(65535-46082)/256;
  24.         TL0=(65535-46082)%256;
  25. }
  26. void main()
  27. {
  28.         unsigned char msec;
  29.         timer0Init();
  30.         while(1)
  31.         {
  32.                 if(key1==0)
  33.                 {       
  34.                         delay(20); //消抖
  35.                         if(key1==0)
  36.                                 P1=0x00;       
  37.                         if(TF0==1)
  38.                         {
  39.                                 TF0=0;
  40.                                 msec++;
  41.                                 TH0=(65535-46082)/256;
  42.                                 TL0=(65535-46082)%256;
  43.                                 if(msec==100)
  44.                                         P1=0XFF;                       
  45.                         }       
  46.                         while(!key1) ;//松手检测               
  47.                 }
  48.         }
  49. }

复制代码



作者: lkc8210    时间: 2022-2-19 09:20

  1. void main()
  2. {
  3.         unsigned char msec;
  4.         while(1)
  5.         {
  6.                 if(key1==0)
  7.                 {      
  8.                         delay(20); //消抖
  9.                         if(key1==0)        
  10.                                 while(!key1) ;//松手检测
  11.                                 P1=0x00;
  12.                                 timer0Init();               
  13.                 }      
  14.                         if(TF0==1)
  15.                         {
  16.                                 TF0=0;
  17.                                 msec++;
  18.                                 TH0=(65535-46082)/256;
  19.                                 TL0=(65535-46082)%256;
  20.                                 if(msec==100)
  21.                                 {
  22.                                         P1=0XFF;                       
  23.                                         TR0 = 0;                        
  24.                                         msec=0;                     
  25.                                  }
  26.                         }
  27.         }
  28. }
复制代码

作者: AnRan_    时间: 2022-2-19 09:40
lkc8210 发表于 2022-2-19 09:20

这样子是解决了,不过这个 timer0Init() 写在unsigned char msec前面和卸载您的这个位置有什么区别?
作者: TEC    时间: 2022-2-19 10:05
因为你的if(TF==1)语句嵌套在if(key1==0)里面了,松开按键后,灯亮了,如果不再按键就不会再进入if(TF==1)条件语句里。下面的程序把两个if语句并列了,都会被执行到。
作者: AnRan_    时间: 2022-2-19 10:52
TEC 发表于 2022-2-19 10:05
因为你的if(TF==1)语句嵌套在if(key1==0)里面了,松开按键后,灯亮了,如果不再按键就不会再进入if(TF==1) ...

谢谢,我明白了,不过那个 timer0Init() 我写在unsigned char msec 前面和楼上写的位置有什么区别?另外,如果我把timer0Init 写在两个if中间为什么也不对?
作者: lkc8210    时间: 2022-2-19 12:50
AnRan_ 发表于 2022-2-19 10:52
谢谢,我明白了,不过那个 timer0Init() 我写在unsigned char msec 前面和楼上写的位置有什么区别?另外 ...

你弄明timer0Init ()里那几句代码的意思就知到为什么了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1