找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1972|回复: 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://www.51hei.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 单片机教程网

快速回复 返回顶部 返回列表