標(biāo)題: 請教用51單片機怎么做到長延時,延時幾分鐘甚至小時 [打印本頁]

作者: Kyrin    時間: 2022-10-3 09:24
標(biāo)題: 請教用51單片機怎么做到長延時,延時幾分鐘甚至小時
  1. #include <REGX52.H>
  2. void Delay1ms(unsigned int xms)                //@11.0592MHz
  3. {
  4.         unsigned char i, j;
  5.         while(xms)
  6.         {
  7.         i = 2;
  8.         j = 199;
  9.         do
  10.         {
  11.                 while (--j);
  12.         } while (--i);
  13.         xms--;
  14. }
  15.         }

  16. void main()
  17. {
  18.         
  19.         while(1)
  20.         {
  21.                 P2=0x55 ;
  22.                 Delay1ms(300000);
  23.                 P2=0xFF;
  24.                 Delay1ms(1000);
  25.         }
  26. }
復(fù)制代碼
像這樣寫2分鐘以內(nèi)測試還算正常,設(shè)定5分鐘就不對了,下載后實際測試只有幾十秒

作者: npn    時間: 2022-10-3 12:27
用定時器中斷(8位自動重裝初值模式)進行延時。
作者: 楊雪飛    時間: 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機一個勁的給你執(zhí)行延時命令是不是有點兒過分啊。
作者: wjhhhhh    時間: 2022-10-3 13:20
這一句 Delay1ms(300000); 會出問題。  void Delay1ms(unsigned int xms)里設(shè)定了xms是unsigned int ,不能超過65535。  可能是 300000/65535=4.577... ,執(zhí)行4個65535次后再有(0.577...x65535=)37860次。不會 匯編  看不懂匯編,不敢確定。
作者: angmall    時間: 2022-10-3 13:43
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

一個定時器產(chǎn)生不同時間心跳例子

http://www.torrancerestoration.com/bbs/forum.p ... 494&pid=1099428

作者: 188610329    時間: 2022-10-3 15:15
做個100ms的延時,循環(huán)執(zhí)行36000次為1小時
作者: rayin    時間: 2022-10-3 17:18
51單片機有T0,T1兩個定時器, 定時器加上計數(shù)就可以做到1s, 再用軟件計數(shù)方法就能夠分鐘,小時計數(shù)了。 精度要求不能太高。 對時間精度有要求,就要用到實時時鐘IC, 1302、DS887等。
作者: 624353765    時間: 2022-10-3 17:25
做個時鐘功能
作者: zhxiufan    時間: 2022-10-3 17:31
Delay1ms(300000);肯定不對的,你傳參是unsigned int,最大65535,所以這個調(diào)用的結(jié)果相當(dāng)于
Delay1ms(300000%65536);即:Delay1ms(37856);
作者: 大漠落日    時間: 2022-10-3 18:16
定時器做基本的中斷,加上時分秒,天,變量,就全有了
作者: 一事無成    時間: 2022-10-3 19:36
用定時器,和軟件定時也差不多,都是計數(shù),定時器是硬件,工作時CPU還可以干別的事,精度也更高,但是,定時器有8位/16位,同理軟件定時也有char int.....,所以理論上軟件定時只要把計數(shù)變量類型改大就能長時間定時,不夠還可以套娃,但誤差都會很大。另外定時器精度是和晶振掛鉤的,用時鐘芯片如果晶振精度不夠也一樣。
作者: wxxl    時間: 2022-10-3 20:23
unsigned int xms    改成 long xms
作者: 祥子陳    時間: 2022-10-4 01:01
利用定時器中斷,然后設(shè)定個全局變量,外部可以用while來判斷
代碼格式大概如下:
long timer_cnt=0;
//100ms 中斷
中斷{
    if (timer_cnt>0) timer_cnt++;
}

P2=0x55 ;
timer_cnt=1;    //使能計數(shù)
while(timer_cnt<3000);//等待計數(shù)到300秒
timer_cnt=0;   //停止計數(shù)
P2=0xFF;


作者: nanhaixiaodeng    時間: 2022-10-4 10:26
肯定要使用定時器 而且這種阻塞式的定時器 長時間延時不建議用
作者: 小樂天    時間: 2022-10-4 10:59
wxxl 發(fā)表于 2022-10-3 20:23
unsigned int xms    改成 long xms


unsigned int xms    改成 long xms  也是不對的,這樣改,那個延時1ms的函數(shù)就不是1ms了,肯定要慢了。


把主程序中:Delay1ms(300000);
改成
Delay1ms(60000);
Delay1ms(60000);
Delay1ms(60000);
Delay1ms(60000);
Delay1ms(60000);
用5個來代替
作者: coody_sz    時間: 2022-10-4 11:17
軟件實現(xiàn),你要延時幾年都可以。
作者: Kyrin    時間: 2022-10-4 20:04
npn 發(fā)表于 2022-10-3 12:27
用定時器中斷(8位自動重裝初值模式)進行延時。

好的,謝謝
作者: Kyrin    時間: 2022-10-4 20:06
楊雪飛 發(fā)表于 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機一個勁的給你執(zhí)行延時命令是不是有點兒過分啊。

哈哈,剛學(xué)還不太懂
作者: Kyrin    時間: 2022-10-4 20:06
wjhhhhh 發(fā)表于 2022-10-3 13:20
這一句 Delay1ms(300000); 會出問題。  void Delay1ms(unsigned int xms)里設(shè)定了xms是unsigned int ,不能 ...

好的,謝謝指教
作者: Kyrin    時間: 2022-10-4 20:07
angmall 發(fā)表于 2022-10-3 13:43
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

好的,謝謝
作者: Kyrin    時間: 2022-10-4 20:07
rayin 發(fā)表于 2022-10-3 17:18
51單片機有T0,T1兩個定時器, 定時器加上計數(shù)就可以做到1s, 再用軟件計數(shù)方法就能夠分鐘,小時計數(shù)了。 精 ...

好的,謝謝指教
作者: Kyrin    時間: 2022-10-4 20:11
謝謝大家指教,不一一回復(fù)了,剛?cè)腴T看來還要多學(xué)習(xí)下
作者: Hephaestus    時間: 2022-10-4 21:21
多用幾個變量,循環(huán)嵌套。

作者: danq    時間: 2022-10-5 09:08
笑死,一個簡單的小問題一群人重重復(fù)復(fù)的回復(fù),顯著自己了,樓主小白又不懂,估計也不懂定時器怎么開啟把!一步一個腳印,哪有一步登天的,人家只需要P口變化(也許是LED亮滅),就解決Delay1ms();所出現(xiàn)的問題就好了
作者: hhh402    時間: 2022-10-5 14:44
延時函數(shù)不是自己瞎琢磨,是用軟件自動生成的。用STC的燒錄軟件就有延時函數(shù),直接復(fù)制使用就行。
比如:89C52單片機,12M主頻。
最長9999ms
void Delay9999ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 76;
        j = 253;
        k = 255;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


作者: Kyrin    時間: 2022-10-5 15:44
wxxl 發(fā)表于 2022-10-3 20:23
unsigned int xms    改成 long xms

謝謝,這樣改最簡單,真是細(xì)節(jié)決定成敗
作者: DoneDone    時間: 2022-10-11 06:59
楊雪飛 發(fā)表于 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機一個勁的給你執(zhí)行延時命令是不是有點兒過分啊。

我也覺得。樓主可能自己都沒考慮清楚,應(yīng)用場景都沒說清楚,那么長的延時可能都可以通過外部計時休眠再喚醒了。




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