標(biāo)題: 關(guān)于單片機(jī)定時(shí)器定時(shí)問題 [打印本頁]

作者: AnRan_    時(shí)間: 2022-2-19 00:07
標(biāo)題: 關(guān)于單片機(jī)定時(shí)器定時(shí)問題
剛學(xué)定時(shí)器,需要寫一個(gè)程序,就是按下S2(代碼里面的key1)之后讓led燈全亮,定時(shí)器定時(shí)5s之后讓led燈全部熄滅。我這樣子寫發(fā)現(xiàn)并不能熄滅,有沒有人給說一下問題并且給個(gè)思路?
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sbit key1=P3^0;

  4. void delay(unsigned char z)//zms延時(shí)
  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) ;//松手檢測(cè)               
  47.                 }
  48.         }
  49. }

復(fù)制代碼



作者: lkc8210    時(shí)間: 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) ;//松手檢測(cè)
  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. }
復(fù)制代碼

作者: AnRan_    時(shí)間: 2022-2-19 09:40
lkc8210 發(fā)表于 2022-2-19 09:20

這樣子是解決了,不過這個(gè) timer0Init() 寫在unsigned char msec前面和卸載您的這個(gè)位置有什么區(qū)別?
作者: TEC    時(shí)間: 2022-2-19 10:05
因?yàn)槟愕膇f(TF==1)語句嵌套在if(key1==0)里面了,松開按鍵后,燈亮了,如果不再按鍵就不會(huì)再進(jìn)入if(TF==1)條件語句里。下面的程序把兩個(gè)if語句并列了,都會(huì)被執(zhí)行到。
作者: AnRan_    時(shí)間: 2022-2-19 10:52
TEC 發(fā)表于 2022-2-19 10:05
因?yàn)槟愕膇f(TF==1)語句嵌套在if(key1==0)里面了,松開按鍵后,燈亮了,如果不再按鍵就不會(huì)再進(jìn)入if(TF==1) ...

謝謝,我明白了,不過那個(gè) timer0Init() 我寫在unsigned char msec 前面和樓上寫的位置有什么區(qū)別?另外,如果我把timer0Init 寫在兩個(gè)if中間為什么也不對(duì)?
作者: lkc8210    時(shí)間: 2022-2-19 12:50
AnRan_ 發(fā)表于 2022-2-19 10:52
謝謝,我明白了,不過那個(gè) timer0Init() 我寫在unsigned char msec 前面和樓上寫的位置有什么區(qū)別?另外 ...

你弄明timer0Init ()里那幾句代碼的意思就知到為什么了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1