杨为民 发表于 2024-10-15 12:06:48

康辉55AA 发表于 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次循环,不符合函数的要求了。

康辉55AA 发表于 2024-10-15 15:27:57

好的,谢谢解答,明白了。{:victory:}

电子小陈 发表于 2024-10-26 10:48:00

晓飛飛 发表于 2024-10-14 22:05
定时器周期中断+软定时器+状态机,能解决90%以上需要延时的场合,非阻塞、高效、扩展性能好。 ...

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

晓飛飛 发表于 2024-10-26 11:28:11

电子小陈 发表于 2024-10-26 10:48
能周期1us中断吗,我要1us延时

1us延迟用nop好了,而且不一定能精确

bkeuqoaq 发表于 2024-11-4 17:29:55

定时器不用不也浪费了吗

VCC 发表于 2024-11-4 17:46:51

汇编延时代码的传入参数和实际延时时间的关系虽然不是正比例的(传0延时0,传10延时10,传100延时100)

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

杨为民 发表于 2024-11-4 22:51:17

VCC 发表于 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,并且只在一个较小的范围,用户就可以采用你的方法来保证这个区间的微秒延时精度。





angalp 发表于 2024-11-5 11:15:10

晓飛飛 发表于 2024-10-14 22:05
定时器周期中断+软定时器+状态机,能解决90%以上需要延时的场合,非阻塞、高效、扩展性能好。 ...

什么是状态机

晓飛飛 发表于 2024-11-5 11:34:24

angalp 发表于 2024-11-5 11:15
什么是状态机

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



angalp 发表于 2024-11-5 13:23:01

晓飛飛 发表于 2024-11-5 11:34
这是个最简单的基于中断驱动的状态机,执行一次,P0.0的状态就翻转一次,如果这两句代码放在周期为0.5s的 ...

明白了,感谢!
页: 1 [2] 3
查看完整版本: C51语言中的微秒、毫秒软件延迟函数探讨