找回密码
 立即注册
楼主: 杨为民

C51语言中的微秒、毫秒软件延迟函数探讨

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-10-15 12:06:48 | 显示全部楼层
康辉*** 发表于 2024-10-15 11:10
经过仔细查看汇编代码,感觉C涵数内嵌入的汇编代码,参数是固定传给R6和R7的,且高位在R6,低位在R7。
我这 ...

谢谢你的提问,我想这也是其他网友想了解的知识。

(1)C51/C251和金水151编译器的函数调用规范之一,如果函数只有一个参数:如果参数是字节型的,放在R7中,如果参数是2字节型的,放在R6R7中,其中R6是高位字节,如果参数是4字节型的,放在R4R5R6R7中,其中R4是最高位字节,R7是最低位字节。
(2)关于对R7判断和R6加1,原因是第76和77行的指令“DJNZ”先将参数减1,然后再判断其是否等于0来进行转移。比如如果双字节变量R6R7只循环1次,那么R6=0、R7=1,按照程序被修改为R6=1、R7=1
执行第76行程序时,R7减1,R7=0,不转移,然后执行第77行程序时,R6减1等于0,不转移,正好执行了1次循环。
如果R6不加1还是R6=0,则执行第77行程序时,R6减1等于255,肯定转移到前面开始循环。而再次执行第76行程序时,R7=0减1等于255,则会转移,这样将循环255x256+1次循环,不符合函数的要求了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:383
  • 最近打卡:2025-04-30 09:42:19

40

主题

194

回帖

601

积分

高级会员

积分
601
发表于 2024-10-15 15:27:57 | 显示全部楼层
好的,谢谢解答,明白了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:14
  • 最近打卡:2025-04-17 23:22:52

2

主题

14

回帖

110

积分

注册会员

积分
110
发表于 2024-10-26 10:48:00 来自手机 | 显示全部楼层
晓飛飛 发表于 2024-10-14 22:05
定时器周期中断+软定时器+状态机,能解决90%以上需要延时的场合,非阻塞、高效、扩展性能好。 ...

能周期1us中断吗,我要1us延时

点评

1us延迟用nop好了,而且不一定能精确  详情 回复 发表于 2024-10-26 11:28
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-10-26 11:28:11 | 显示全部楼层
电子*** 发表于 2024-10-26 10:48
能周期1us中断吗,我要1us延时

1us延迟用nop好了,而且不一定能精确
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-11-4 17:29:55 | 显示全部楼层
定时器不用不也浪费了吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-4 17:46:51 | 显示全部楼层
汇编延时代码的传入参数和实际延时时间的关系虽然不是正比例的(传0延时0,传10延时10,传100延时100)

但是我猜至少是线性的吧?那么能否在代码中进行一些offset修正,达到传10延时10,传100延时100,传1000延时1000的效果呢?

点评

(1)肯动脑筋,值得点赞。 (2)你猜的原则上是正确的,对于模拟延迟电路肯定是正确,但是对于数字延时电路和软件数字延迟函数不一定正确。原因是模拟电路我们可以假设模拟量(比如可变电阻的阻值)是连续的实数,  详情 回复 发表于 2024-11-4 22:51
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-11-4 22:51:17 | 显示全部楼层
VC*** 发表于 2024-11-4 17:46
汇编延时代码的传入参数和实际延时时间的关系虽然不是正比例的(传0延时0,传10延时10,传100延时100)

但 ...

(1)肯动脑筋,值得点赞。
(2)你猜的原则上是正确的,对于模拟延迟电路肯定是正确,但是对于数字延时电路和软件数字延迟函数不一定正确。原因是模拟电路我们可以假设模拟量(比如可变电阻的阻值)是连续的实数,其精度是无限高的,但对于数字电路和数字延时程序变量的值是离散的,其精度是有限的。

(3)由于STC单片机的速度已经很高了,在千分之一的精度上,本文毫秒延迟已经很精确了。所以需要改进的是微秒延时函数。
(4)对于微秒延时函数,以24MHz主频为例,R2=24000/3500=6.8≈7, 如果R2减1或者加1都将产生15%的误差。而对输入参数uS加减Offset,对于几个微秒的延时将产生巨大的误差。所以本文选择使得在0~10微秒的区间内的延时误差小于1微秒,比如用于SPI和IIC速率控制。
(5)如果用户在实际使用中,微秒延时参数不为0,并且只在一个较小的范围,用户就可以采用你的方法来保证这个区间的微秒延时精度。





点评

学习了!感谢杨老师的进一步解答。我此前几乎没有使用过微秒级延时函数,仔细想想,确实如此!  发表于 2024-11-4 23:43
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:199
  • 最近打卡:2025-05-02 00:28:39
已绑定手机

24

主题

345

回帖

1633

积分

金牌会员

积分
1633
发表于 2024-11-5 11:15:10 | 显示全部楼层
晓*** 发表于 2024-10-14 22:05
定时器周期中断+软定时器+状态机,能解决90%以上需要延时的场合,非阻塞、高效、扩展性能好。 ...

什么是状态机

点评

这是个最简单的基于中断驱动的状态机,执行一次,P0.0的状态就翻转一次,如果这两句代码放在周期为0.5s的定时器中断里面,就能控制接在P0.0端口的LED按1Hz频率闪烁。 这里只有两个状态和一个跳转条件,实际中的状态  详情 回复 发表于 2024-11-5 11:34
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-5 11:34:24 | 显示全部楼层
  1. if(P00)  P00 = 0;
  2. else P00 = 1;
复制代码
这是个最简单的基于中断驱动的状态机,执行一次,P0.0的状态就翻转一次,如果这两句代码放在周期为0.5s的定时器中断里面,就能控制接在P0.0端口的LED按1Hz频率闪烁。
这里只有两个状态和一个跳转条件,实际中的状态机可能有多个状态和多个跳转条件,总体的特点是逻辑清晰,运行周期准确,占用系统机器周期少,效率极高。
这比N层循环嵌套的傻delay强多了不是?



点评

对于下面例子,你能对下面的例子写个采用状态机方法的程序介绍给大家吗?包括定时器中断ISR的程序: while(1){ P0=~0x011; DelayMS(300);// 延迟300毫秒 P0=~0x55; DelayMS(200);// 延迟200毫秒  详情 回复 发表于 2024-11-5 20:12
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:199
  • 最近打卡:2025-05-02 00:28:39
已绑定手机

24

主题

345

回帖

1633

积分

金牌会员

积分
1633
发表于 2024-11-5 13:23:01 | 显示全部楼层
晓*** 发表于 2024-11-5 11:34
这是个最简单的基于中断驱动的状态机,执行一次,P0.0的状态就翻转一次,如果这两句代码放在周期为0.5s的 ...

明白了,感谢!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 08:51 , Processed in 0.195048 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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