找回密码
 立即注册
楼主: consoleyou

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-06-16 19:04:45
已绑定手机

31

主题

142

回帖

1779

积分

金牌会员

积分
1779
发表于 2024-5-27 11:54:44 | 显示全部楼层
xxxe*** 发表于 2024-5-27 11:45
不要直接使用毫秒级的延时函数,使用毫秒级延时的函数放到定时中断里去执行,但是微秒级的延时函数也还是不 ...

微秒延时用定时器是不是也可以
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-06-16 00:53:18

0

主题

336

回帖

1628

积分

金牌会员

积分
1628
发表于 2024-5-27 16:44:47 | 显示全部楼层
当然可以,不过延时太短用定时中断没多大必要了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:470
  • 最近打卡:2025-06-16 10:08:02

8

主题

72

回帖

770

积分

高级会员

积分
770
发表于 2024-5-28 09:47:48 | 显示全部楼层
jw*** 发表于 2024-5-27 10:36
定时器设置标志位,比如你需要1ms定时,就配置1ms的定时器,中断后置标志位,主程序用这个标志位让变量A+1 ...

我目前是用的这种方法。但是需要在主程序里面写代码,不能直接写成一个延时函数调用。哈哈哈,可能因为我水平不够。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-04 11:33:11

12

主题

124

回帖

529

积分

高级会员

积分
529
发表于 2024-9-28 16:57:22 | 显示全部楼层
本帖最后由 DHBT2023 于 2024-9-28 17:01 编辑
未元*** 发表于 2024-5-27 11:53
我最近也在学,可以用定时器进行延时,这是我做的用定时器和中断让LED闪烁的方案,while循环里添别的程序不 ...

你这个可以吗?我发现论坛里面发的有些程序在While里面是无法运行的。包括 ++    到一定数值定时,在While里面就无法实现。你这个定时器程序在while外面
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:478
  • 最近打卡:2025-06-16 19:04:45
已绑定手机

31

主题

142

回帖

1779

积分

金牌会员

积分
1779
发表于 2024-9-29 13:00:28 | 显示全部楼层
DHBT*** 发表于 2024-9-28 16:57
你这个可以吗?我发现论坛里面发的有些程序在While里面是无法运行的。包括 ++    到一定数值定时,在While ...

是不是变量++溢出导致的,char字符型最大255,int整型最大65535
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:141
  • 最近打卡:2025-06-15 10:42:58

13

主题

165

回帖

421

积分

中级会员

积分
421
发表于 2024-10-3 21:24:19 | 显示全部楼层
用定时器,定时到了置标志位,主循环查询标志位,做到定时器只负责计时定时,任务都在主循环里面执行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:546
  • 最近打卡:2025-06-16 00:12:17
已绑定手机

1

主题

838

回帖

1687

积分

金牌会员

积分
1687
发表于 2024-10-4 08:06:36 | 显示全部楼层
学不可以已
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:176
  • 最近打卡:2025-02-19 17:24:49

15

主题

265

回帖

1387

积分

金牌会员

积分
1387
发表于 2024-10-4 08:34:38 | 显示全部楼层
未元*** 发表于 2024-5-27 11:53
我最近也在学,可以用定时器进行延时,这是我做的用定时器和中断让LED闪烁的方案,while循环里添别的程序不 ...

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口
        }
}
改为如下更好,可以设置若干个标志位,让不同的主程序使用
static unsigned int Timer1_num1 = 0;         //初始化定时变量
static unsigned int Timer1_num2 = 0;         //初始化定时变量


void Timer0_interrupt(void) interrupt 1     //定时器0中断
{
        Timer1_num1 ++;                            //当定时器完成一次定时,即1ms,Timer1_num1加一
        Timer1_num2 ++;                            //当定时器完成一次定时,即1ms,Timer1_num2加一

        if(Timer1_num == 500)                     //延时500ms
        {
                Timer1_num = 0;                         //清零定时1变量
               flag1=1;                             //设置标志位,让主程序利用后清零。
        }
    if(Timer1_num2 == 800)                     //延时800ms
        {
                Timer1_num2 = 0;                         //清零定时2变量
               flag2=1;                             //设置标志位,让主程序利用后清零。
        }

}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:566
  • 最近打卡:2025-06-16 07:52:44

113

主题

2027

回帖

5810

积分

论坛元老

积分
5810
发表于 2024-10-4 11:51:30 | 显示全部楼层
我一般能用软定时的情况下就用软定时,必要的时候才用到定时器进行非阻塞定时。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:75
  • 最近打卡:2025-01-05 14:16:57

30

主题

132

回帖

214

积分

中级会员

积分
214
发表于 2024-10-5 11:40:34 | 显示全部楼层
未元*** 发表于 2024-5-27 11:53
我最近也在学,可以用定时器进行延时,这是我做的用定时器和中断让LED闪烁的方案,while循环里添别的程序不 ...

加油
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 19:55 , Processed in 0.183905 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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