找回密码
 立即注册
查看: 162|回复: 9

这2个延时代码有什么不一样吗

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2026-07-01 22:51:25
已绑定手机

7

主题

8

回帖

55

积分

注册会员

积分
55
发表于 2026-6-4 16:44:37 | 显示全部楼层 |阅读模式

上面是通过AICUBE 产生的代码,这个代码是什么意思呀  如果我要延时1秒该怎么写

下面是用延时计算器产生的,这个大概能看懂

请问这2个底层逻辑有啥不一样吗

屏幕截图 2026-06-04 164235.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:849
  • 最近打卡:2026-07-05 00:00:31
已绑定手机

19

主题

3439

回帖

7456

积分

论坛元老

积分
7456
发表于 2026-6-4 19:02:40 | 显示全部楼层
一个时间800毫秒写死了,一个可以自定义延时多少毫秒
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:944
  • 最近打卡:2026-07-05 10:37:41
已绑定手机

61

主题

2089

回帖

3081

积分

论坛元老

积分
3081
发表于 2026-6-4 20:22:50 | 显示全部楼层
第一个与主频有关,修改主频后同样的实参传入后定时基本不变,第二个就有变化
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2026-07-01 22:51:25
已绑定手机

7

主题

8

回帖

55

积分

注册会员

积分
55
发表于 2026-6-4 21:10:28 | 显示全部楼层
so*** 发表于 2026-6-4 19:02
一个时间800毫秒写死了,一个可以自定义延时多少毫秒

怎么定义呢  再哪里定义
i = MAIN_Fosc / 6000   这个意思是晶振频率/6000
while (--i)    //i循环减一 到0跳出循环
while (--ms)  //这句怎么理解呢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:849
  • 最近打卡:2026-07-05 00:00:31
已绑定手机

19

主题

3439

回帖

7456

积分

论坛元老

积分
7456
发表于 2026-6-4 22:21:00 | 显示全部楼层
scl*** 发表于 2026-6-4 21:10
怎么定义呢  再哪里定义
i = MAIN_Fosc / 6000   这个意思是晶振频率/6000
while (--i)    //i循环减一  ...

while (--ms)  //这句怎么理解呢
do里面循环一次ms就自减一次直到ms=0
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2026-07-01 22:51:25
已绑定手机

7

主题

8

回帖

55

积分

注册会员

积分
55
发表于 2026-6-4 22:39:09 | 显示全部楼层
so*** 发表于 2026-6-4 22:21
while (--ms)  //这句怎么理解呢
do里面循环一次ms就自减一次直到ms=0

如果我要延迟1秒  这个该怎么写呢
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:849
  • 最近打卡:2026-07-05 00:00:31
已绑定手机

19

主题

3439

回帖

7456

积分

论坛元老

积分
7456
发表于 2026-6-4 22:42:58 | 显示全部楼层
scl*** 发表于 2026-6-4 22:39
如果我要延迟1秒  这个该怎么写呢

delay_ms(1000);
就是延时1s
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 2026-6-5 08:44:20 | 显示全部楼层
和主频挂钩的延时函数
方便调整时钟频率
自动适配主频
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:492
  • 最近打卡:2026-07-05 09:21:10
已绑定手机

6

主题

429

回帖

2187

积分

金牌会员

积分
2187
发表于 2026-6-5 09:24:50 | 显示全部楼层
一个可设定延时时间,一个是固定延时,底层没有区别
学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:939
  • 最近打卡:2026-07-04 02:00:58

14

主题

1389

回帖

7588

积分

论坛元老

积分
7588
发表于 2026-6-6 13:36:59 | 显示全部楼层
新手在学习单片机的时候,学习的延时函数都是“阻塞延时”,
MCU为了延时不停在做无用功,占用了算力、资源。
要怎么样才能做到“非阻塞延时”呢?

堵塞就是cpu啥也不干被卡住了
非堵塞就是延时的时候cpu跑去干别的的了。等延时时间到了再回来干活
实现上,堵塞一般是让cpu做无意义自加或者自减进行延时
非堵塞可以用多线程,软定时器,程序循环计数等方式实现

以下是一个流水灯的两种写法
  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. }
复制代码


定时器中断里面构建简易状态机,不要用傻循环式的delay,提高定时器中断频率,LED想闪都难。

这种用法一般都是配合定时器用,定时器每1ms发一个时钟标志位,主程序判断置位信号来运行,这样时间想对来说就可以计算了
定时器设置标志位,比如你需要1ms定时,就配置1ms的定时器,中断后置标志位,主程序用这个标志位让变量A+1,清零标志位,你需要定时多长时间,就让A加到多少数

软件延时还是有一定必要要使用的
不要直接使用毫秒级的延时函数,使用毫秒级延时的函数放到定时中断里去执行,但是微秒级的延时函数也还是不可避免阻塞,该用还是得用,不用太纠结,看实际情况再定呗




回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 14:04 , Processed in 0.077312 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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