找回密码
 立即注册
查看: 1819|回复: 20

要怎么样才能实现“非阻塞延时”?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:481
  • 最近打卡:2025-06-30 11:01:01

8

主题

73

回帖

656

积分

高级会员

积分
656
发表于 2024-5-27 09:27:29 | 显示全部楼层 |阅读模式
新手在学习单片机的时候,学习的延时函数都是“阻塞延时”,
MCU为了延时不停在做无用功,占用了算力、资源。
要怎么样才能做到“非阻塞延时”呢?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-07-01 09:00:47

33

主题

2439

回帖

5198

积分

论坛元老

积分
5198
发表于 2024-5-27 09:29:14 | 显示全部楼层
定时器,。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-07-01 09:00:47

33

主题

2439

回帖

5198

积分

论坛元老

积分
5198
发表于 2024-5-27 09:30:54 | 显示全部楼层
不需要特别精准的话,自己估算一下while循环一圈的时间 用一种软定时,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1837

积分

金牌会员

积分
1837
发表于 2024-5-27 09:58:08 | 显示全部楼层
以下是一个流水灯的两种写法
  1. void main()
  2. {
  3.         uchar i;
  4.         while(1)
  5.         {
  6.                 for(i=0;i<8;i++)
  7.                 {
  8.                         P2 = ~(0x01<<i);
  9.                         delay(200);
  10.                 }
  11.         }
  12. }
  13. void main()
  14. {
  15.         uchar i = 0;
  16.         uint DelayCnt = 2000;
  17.         while(1)
  18.         {
  19.                 DelayCnt++;
  20.                 if(DelayCnt>=2000)
  21.                 {
  22.                         DelayCnt = 0;
  23.                         P2 = ~(0x01<<i);
  24.                         i++;
  25.                         if(i>=8)i=0;
  26.                 }
  27.         }
  28. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-07-01 09:00:47

33

主题

2439

回帖

5198

积分

论坛元老

积分
5198
发表于 2024-5-27 10:08:23 | 显示全部楼层
Lkck*** 发表于 2024-5-27 09:58
以下是一个流水灯的两种写法

对对 软定时就是下面那种写法
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:277
  • 最近打卡:2025-07-01 06:54:43

62

主题

831

回帖

1475

积分

金牌会员

积分
1475
发表于 2024-5-27 10:08:51 | 显示全部楼层
新手就用阻塞延时就行  慢慢学习  你就会其他的
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:482
  • 最近打卡:2025-07-01 00:52:47
已绑定手机

19

主题

3233

回帖

5355

积分

论坛元老

积分
5355
发表于 2024-5-27 10:18:02 | 显示全部楼层
软件延时还是有一定必要要使用的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:579
  • 最近打卡:2025-07-01 07:56:05
已绑定手机

50

主题

1827

回帖

3212

积分

论坛元老

积分
3212
发表于 2024-5-27 10:36:16 | 显示全部楼层
定时器设置标志位,比如你需要1ms定时,就配置1ms的定时器,中断后置标志位,主程序用这个标志位让变量A+1,清零标志位,你需要定时多长时间,就让A加到多少数
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-07-01 01:32:50

0

主题

336

回帖

1664

积分

金牌会员

积分
1664
发表于 2024-5-27 11:45:55 | 显示全部楼层
不要直接使用毫秒级的延时函数,使用毫秒级延时的函数放到定时中断里去执行,但是微秒级的延时函数也还是不可避免阻塞,该用还是得用,不用太纠结,看实际情况再定呗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:493
  • 最近打卡:2025-07-01 00:00:17
已绑定手机

31

主题

142

回帖

1847

积分

金牌会员

积分
1847
发表于 2024-5-27 11:53:18 | 显示全部楼层
我最近也在学,可以用定时器进行延时,这是我做的用定时器和中断让LED闪烁的方案,while循环里添别的程序不干扰
void Timer0_Init(void)  //定时1ms
{
        AUXR |= 0x80;  //设置定时器为1T模式,即不分频
        TMOD &= 0xF0;  //保留高四位(定时器1),低四位全为0:设置定时器/计数器0为定时器、GATE置0、16位自动重装模式
        TL0 = 0x3F;           //初始值65535 - 24000 = 41535 = 1010 0010 0011 1111,即高8位为0xA2,低8位为0x3F
        TH0 = 0xA2;           //
        TF0 = 0;                    //清零TF0中断标志位
        TR0 = 1;                    //定时器开始计时
        ET0 = 1;       //开启定时器0中断
}

void main()
{
        P2M0 = 0x00; P2M1 = 0x00;   //P2口设为准双向口模式
        Timer0_Init();                    //初始化定时器0
        EA = 1;                                  //打开总中断
        P2 = 0x00;                  //P2口8个LED灯全亮
        while(1){}                  //死循环
}

static unsigned int Timer1_num = 0;         //初始化定时变量
void Timer0_interrupt(void) interrupt 1     //定时器0中断
{
        Timer1_num ++;                            //当定时器完成一次定时,即1ms,Timer1_num加一
        if(Timer1_num == 500)                     //延时500ms
        {
                Timer1_num = 0;                         //清零定时变量
                P2 = ~(P2);                             //反转P2口
        }
}
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-1 09:47 , Processed in 0.147367 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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