欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3133|回復: 26
收起左側

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

  [復制鏈接]
ID:699948 發表于 2022-10-3 09:24 | 顯示全部樓層 |閱讀模式
  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. }
復制代碼
像這樣寫2分鐘以內測試還算正常,設定5分鐘就不對了,下載后實際測試只有幾十秒
回復

使用道具 舉報

ID:57657 發表于 2022-10-3 12:27 | 顯示全部樓層
用定時器中斷(8位自動重裝初值模式)進行延時。
回復

使用道具 舉報

ID:97554 發表于 2022-10-3 12:56 | 顯示全部樓層
長時間的需要時鐘芯片了吧?你這樣讓單片機一個勁的給你執行延時命令是不是有點兒過分啊。
回復

使用道具 舉報

ID:91150 發表于 2022-10-3 13:20 | 顯示全部樓層
這一句 Delay1ms(300000); 會出問題。  void Delay1ms(unsigned int xms)里設定了xms是unsigned int ,不能超過65535。  可能是 300000/65535=4.577... ,執行4個65535次后再有(0.577...x65535=)37860次。不會 匯編  看不懂匯編,不敢確定。
回復

使用道具 舉報

ID:155507 發表于 2022-10-3 13:43 | 顯示全部樓層
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

一個定時器產生不同時間心跳例子

http://m.raoushi.com/bbs/forum.p ... 494&pid=1099428
回復

使用道具 舉報

ID:624769 發表于 2022-10-3 15:15 來自觸屏版 | 顯示全部樓層
做個100ms的延時,循環執行36000次為1小時
回復

使用道具 舉報

ID:517951 發表于 2022-10-3 17:18 | 顯示全部樓層
51單片機有T0,T1兩個定時器, 定時器加上計數就可以做到1s, 再用軟件計數方法就能夠分鐘,小時計數了。 精度要求不能太高。 對時間精度有要求,就要用到實時時鐘IC, 1302、DS887等。
回復

使用道具 舉報

ID:526108 發表于 2022-10-3 17:25 | 顯示全部樓層
做個時鐘功能
回復

使用道具 舉報

ID:121859 發表于 2022-10-3 17:31 | 顯示全部樓層
Delay1ms(300000);肯定不對的,你傳參是unsigned int,最大65535,所以這個調用的結果相當于
Delay1ms(300000%65536);即:Delay1ms(37856);
回復

使用道具 舉報

ID:195496 發表于 2022-10-3 18:16 | 顯示全部樓層
定時器做基本的中斷,加上時分秒,天,變量,就全有了
回復

使用道具 舉報

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

使用道具 舉報

ID:46065 發表于 2022-10-3 20:23 | 顯示全部樓層
unsigned int xms    改成 long xms
回復

使用道具 舉報

ID:235438 發表于 2022-10-4 01:01 | 顯示全部樓層
利用定時器中斷,然后設定個全局變量,外部可以用while來判斷
代碼格式大概如下:
long timer_cnt=0;
//100ms 中斷
中斷{
    if (timer_cnt>0) timer_cnt++;
}

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

回復

使用道具 舉報

ID:1046594 發表于 2022-10-4 10:26 | 顯示全部樓層
肯定要使用定時器 而且這種阻塞式的定時器 長時間延時不建議用
回復

使用道具 舉報

ID:1046596 發表于 2022-10-4 10:59 | 顯示全部樓層
wxxl 發表于 2022-10-3 20:23
unsigned int xms    改成 long xms


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


把主程序中:Delay1ms(300000);
改成
Delay1ms(60000);
Delay1ms(60000);
Delay1ms(60000);
Delay1ms(60000);
Delay1ms(60000);
用5個來代替
回復

使用道具 舉報

ID:1034262 發表于 2022-10-4 11:17 | 顯示全部樓層
軟件實現,你要延時幾年都可以。
回復

使用道具 舉報

ID:699948 發表于 2022-10-4 20:04 | 顯示全部樓層
npn 發表于 2022-10-3 12:27
用定時器中斷(8位自動重裝初值模式)進行延時。

好的,謝謝
回復

使用道具 舉報

ID:699948 發表于 2022-10-4 20:06 | 顯示全部樓層
楊雪飛 發表于 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機一個勁的給你執行延時命令是不是有點兒過分啊。

哈哈,剛學還不太懂
回復

使用道具 舉報

ID:699948 發表于 2022-10-4 20:06 | 顯示全部樓層
wjhhhhh 發表于 2022-10-3 13:20
這一句 Delay1ms(300000); 會出問題。  void Delay1ms(unsigned int xms)里設定了xms是unsigned int ,不能 ...

好的,謝謝指教
回復

使用道具 舉報

ID:699948 發表于 2022-10-4 20:07 | 顯示全部樓層
angmall 發表于 2022-10-3 13:43
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

好的,謝謝
回復

使用道具 舉報

ID:699948 發表于 2022-10-4 20:07 | 顯示全部樓層
rayin 發表于 2022-10-3 17:18
51單片機有T0,T1兩個定時器, 定時器加上計數就可以做到1s, 再用軟件計數方法就能夠分鐘,小時計數了。 精 ...

好的,謝謝指教
回復

使用道具 舉報

ID:699948 發表于 2022-10-4 20:11 | 顯示全部樓層
謝謝大家指教,不一一回復了,剛入門看來還要多學習下
回復

使用道具 舉報

ID:883242 發表于 2022-10-4 21:21 | 顯示全部樓層
多用幾個變量,循環嵌套。
回復

使用道具 舉報

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

使用道具 舉報

ID:491577 發表于 2022-10-5 14:44 | 顯示全部樓層
延時函數不是自己瞎琢磨,是用軟件自動生成的。用STC的燒錄軟件就有延時函數,直接復制使用就行。
比如: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);
}

回復

使用道具 舉報

ID:699948 發表于 2022-10-5 15:44 | 顯示全部樓層
wxxl 發表于 2022-10-3 20:23
unsigned int xms    改成 long xms

謝謝,這樣改最簡單,真是細節決定成敗
回復

使用道具 舉報

ID:310441 發表于 2022-10-11 06:59 來自觸屏版 | 顯示全部樓層
楊雪飛 發表于 2022-10-3 12:56
長時間的需要時鐘芯片了吧?你這樣讓單片機一個勁的給你執行延時命令是不是有點兒過分啊。

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表