找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請教用51單片機(jī)怎么做到長延時,延時幾分鐘甚至小時

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:699948 發(fā)表于 2022-10-3 09:24 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  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分鐘就不對了,下載后實(shí)際測試只有幾十秒
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:57657 發(fā)表于 2022-10-3 12:27 | 只看該作者
用定時器中斷(8位自動重裝初值模式)進(jìn)行延時。
回復(fù)

使用道具 舉報(bào)

板凳
ID:97554 發(fā)表于 2022-10-3 12:56 | 只看該作者
長時間的需要時鐘芯片了吧?你這樣讓單片機(jī)一個勁的給你執(zhí)行延時命令是不是有點(diǎn)兒過分啊。
回復(fù)

使用道具 舉報(bào)

地板
ID:91150 發(fā)表于 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次。不會 匯編  看不懂匯編,不敢確定。
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2022-10-3 13:43 | 只看該作者
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

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

http://www.torrancerestoration.com/bbs/forum.p ... 494&pid=1099428
回復(fù)

使用道具 舉報(bào)

6#
ID:624769 發(fā)表于 2022-10-3 15:15 來自觸屏版 | 只看該作者
做個100ms的延時,循環(huán)執(zhí)行36000次為1小時
回復(fù)

使用道具 舉報(bào)

7#
ID:517951 發(fā)表于 2022-10-3 17:18 | 只看該作者
51單片機(jī)有T0,T1兩個定時器, 定時器加上計(jì)數(shù)就可以做到1s, 再用軟件計(jì)數(shù)方法就能夠分鐘,小時計(jì)數(shù)了。 精度要求不能太高。 對時間精度有要求,就要用到實(shí)時時鐘IC, 1302、DS887等。
回復(fù)

使用道具 舉報(bào)

8#
ID:526108 發(fā)表于 2022-10-3 17:25 | 只看該作者
做個時鐘功能
回復(fù)

使用道具 舉報(bào)

9#
ID:121859 發(fā)表于 2022-10-3 17:31 | 只看該作者
Delay1ms(300000);肯定不對的,你傳參是unsigned int,最大65535,所以這個調(diào)用的結(jié)果相當(dāng)于
Delay1ms(300000%65536);即:Delay1ms(37856);
回復(fù)

使用道具 舉報(bào)

10#
ID:195496 發(fā)表于 2022-10-3 18:16 | 只看該作者
定時器做基本的中斷,加上時分秒,天,變量,就全有了
回復(fù)

使用道具 舉報(bào)

11#
ID:1007932 發(fā)表于 2022-10-3 19:36 | 只看該作者
用定時器,和軟件定時也差不多,都是計(jì)數(shù),定時器是硬件,工作時CPU還可以干別的事,精度也更高,但是,定時器有8位/16位,同理軟件定時也有char int.....,所以理論上軟件定時只要把計(jì)數(shù)變量類型改大就能長時間定時,不夠還可以套娃,但誤差都會很大。另外定時器精度是和晶振掛鉤的,用時鐘芯片如果晶振精度不夠也一樣。
回復(fù)

使用道具 舉報(bào)

12#
ID:46065 發(fā)表于 2022-10-3 20:23 | 只看該作者
unsigned int xms    改成 long xms
回復(fù)

使用道具 舉報(bào)

13#
ID:235438 發(fā)表于 2022-10-4 01:01 | 只看該作者
利用定時器中斷,然后設(shè)定個全局變量,外部可以用while來判斷
代碼格式大概如下:
long timer_cnt=0;
//100ms 中斷
中斷{
    if (timer_cnt>0) timer_cnt++;
}

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

回復(fù)

使用道具 舉報(bào)

14#
ID:1046594 發(fā)表于 2022-10-4 10:26 | 只看該作者
肯定要使用定時器 而且這種阻塞式的定時器 長時間延時不建議用
回復(fù)

使用道具 舉報(bào)

15#
ID:1046596 發(fā)表于 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個來代替
回復(fù)

使用道具 舉報(bào)

16#
ID:1034262 發(fā)表于 2022-10-4 11:17 | 只看該作者
軟件實(shí)現(xiàn),你要延時幾年都可以。
回復(fù)

使用道具 舉報(bào)

17#
ID:699948 發(fā)表于 2022-10-4 20:04 | 只看該作者
npn 發(fā)表于 2022-10-3 12:27
用定時器中斷(8位自動重裝初值模式)進(jìn)行延時。

好的,謝謝
回復(fù)

使用道具 舉報(bào)

18#
ID:699948 發(fā)表于 2022-10-4 20:06 | 只看該作者
楊雪飛 發(fā)表于 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機(jī)一個勁的給你執(zhí)行延時命令是不是有點(diǎn)兒過分啊。

哈哈,剛學(xué)還不太懂
回復(fù)

使用道具 舉報(bào)

19#
ID:699948 發(fā)表于 2022-10-4 20:06 | 只看該作者
wjhhhhh 發(fā)表于 2022-10-3 13:20
這一句 Delay1ms(300000); 會出問題。  void Delay1ms(unsigned int xms)里設(shè)定了xms是unsigned int ,不能 ...

好的,謝謝指教
回復(fù)

使用道具 舉報(bào)

20#
ID:699948 發(fā)表于 2022-10-4 20:07 | 只看該作者
angmall 發(fā)表于 2022-10-3 13:43
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

好的,謝謝
回復(fù)

使用道具 舉報(bào)

21#
ID:699948 發(fā)表于 2022-10-4 20:07 | 只看該作者
rayin 發(fā)表于 2022-10-3 17:18
51單片機(jī)有T0,T1兩個定時器, 定時器加上計(jì)數(shù)就可以做到1s, 再用軟件計(jì)數(shù)方法就能夠分鐘,小時計(jì)數(shù)了。 精 ...

好的,謝謝指教
回復(fù)

使用道具 舉報(bào)

22#
ID:699948 發(fā)表于 2022-10-4 20:11 | 只看該作者
謝謝大家指教,不一一回復(fù)了,剛?cè)腴T看來還要多學(xué)習(xí)下
回復(fù)

使用道具 舉報(bào)

23#
ID:883242 發(fā)表于 2022-10-4 21:21 | 只看該作者
多用幾個變量,循環(huán)嵌套。
回復(fù)

使用道具 舉報(bào)

24#
ID:740383 發(fā)表于 2022-10-5 09:08 | 只看該作者
笑死,一個簡單的小問題一群人重重復(fù)復(fù)的回復(fù),顯著自己了,樓主小白又不懂,估計(jì)也不懂定時器怎么開啟把!一步一個腳印,哪有一步登天的,人家只需要P口變化(也許是LED亮滅),就解決Delay1ms();所出現(xiàn)的問題就好了
回復(fù)

使用道具 舉報(bào)

25#
ID:491577 發(fā)表于 2022-10-5 14:44 | 只看該作者
延時函數(shù)不是自己瞎琢磨,是用軟件自動生成的。用STC的燒錄軟件就有延時函數(shù),直接復(fù)制使用就行。
比如:89C52單片機(jī),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);
}

回復(fù)

使用道具 舉報(bào)

26#
ID:699948 發(fā)表于 2022-10-5 15:44 | 只看該作者
wxxl 發(fā)表于 2022-10-3 20:23
unsigned int xms    改成 long xms

謝謝,這樣改最簡單,真是細(xì)節(jié)決定成敗
回復(fù)

使用道具 舉報(bào)

27#
ID:310441 發(fā)表于 2022-10-11 06:59 來自觸屏版 | 只看該作者
楊雪飛 發(fā)表于 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機(jī)一個勁的給你執(zhí)行延時命令是不是有點(diǎn)兒過分啊。

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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