找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1498|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)定時器定時問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1002906 發(fā)表于 2022-2-19 00:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛學(xué)定時器,需要寫一個程序,就是按下S2(代碼里面的key1)之后讓led燈全亮,定時器定時5s之后讓led燈全部熄滅。我這樣子寫發(fā)現(xiàn)并不能熄滅,有沒有人給說一下問題并且給個思路?
  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. }

復(fù)制代碼


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

使用道具 舉報

沙發(fā)
ID:161164 發(fā)表于 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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

板凳
ID:1002906 發(fā)表于 2022-2-19 09:40 | 只看該作者

這樣子是解決了,不過這個 timer0Init() 寫在unsigned char msec前面和卸載您的這個位置有什么區(qū)別?
回復(fù)

使用道具 舉報

地板
ID:625730 發(fā)表于 2022-2-19 10:05 | 只看該作者
因為你的if(TF==1)語句嵌套在if(key1==0)里面了,松開按鍵后,燈亮了,如果不再按鍵就不會再進(jìn)入if(TF==1)條件語句里。下面的程序把兩個if語句并列了,都會被執(zhí)行到。
回復(fù)

使用道具 舉報

5#
ID:1002906 發(fā)表于 2022-2-19 10:52 | 只看該作者
TEC 發(fā)表于 2022-2-19 10:05
因為你的if(TF==1)語句嵌套在if(key1==0)里面了,松開按鍵后,燈亮了,如果不再按鍵就不會再進(jìn)入if(TF==1) ...

謝謝,我明白了,不過那個 timer0Init() 我寫在unsigned char msec 前面和樓上寫的位置有什么區(qū)別?另外,如果我把timer0Init 寫在兩個if中間為什么也不對?
回復(fù)

使用道具 舉報

6#
ID:161164 發(fā)表于 2022-2-19 12:50 | 只看該作者
AnRan_ 發(fā)表于 2022-2-19 10:52
謝謝,我明白了,不過那個 timer0Init() 我寫在unsigned char msec 前面和樓上寫的位置有什么區(qū)別?另外 ...

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

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表