延时函数
什么是延时函数
所谓延时函数就是在函数中设置了几个空操作的动作,每次操作都需要消耗一定的时间,动作结束了,就会跳出延时函数继续做其他事情了。
为什么要延时
为了使CPU某些芯片的时序而采用的一些机制,比如独立按键、LED灯闪烁等
单片机时序
单片机时序就是CPU在执行指令命令时所需控制信号的时间顺序,为了保证各部件间的同步工作,单片机内部电路在唯一的时钟信号下严格的控制时序进行工作。
振荡周期:为单片机提供定时信号的振荡源的周期又称时钟周期
状态周期:2个振荡周期为1个状态周期,
机器周期:1个机器周期含6个状态周期,12个振荡周期。在一个机器周期内,CPU可以完成一个独立的操作。
指令周期:它是指CPU完成一条操作的所需的全部时间。,它以机器周期为单位
nop指令
执行一个_nop_() ,就是一个空操作,占用一个机器周期,也就是12个时钟周期。
一个机器周期=12/12MHz=1us
#include<intrins.h>
Void delay10us() //调用此函数需要执行LACLL指令耗时2个机器周期
{
nop();
nop();
nop();
nop();
nop();
nop();
} //结束执行一次RET指令耗时2个机器周期
Delay10us( )函数中共用了6个NOP ( )语句,每个语句执行时间为1 us。主函数调用Delay10us( )时,先执行个LCALL指令 (2 us),然后执行6个NOP ()语句(6 μs),最后执行了一个RET指令(2μs),所以执行上述函数时共需要10 uS。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时,但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 us。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2μs) , 然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us(),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84μs) ,所以,实际延时时间为86 us。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 us。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。
分号“;”和nop指令
1、两个语句的相同点是都不会有实质上的控制操作;
2、两个语句的不同点是nop语句执行了就相当于延时一个机器周期(尽管一个机器周期很短),而;仅仅相当于一个格式上的字符,不会执行任何语句,也不会延时,和没有代码的作用一致。
注:;含义意指在for和while循环中常用。
Void delay(u16 i) void delay(u16 i)
{ {
for(;i>0;i–) for(;i>0;i–)
; nop();
} }
keil4精确计算时间
1.设置成开发板晶振,比如12MHz;
2.设置断点,进入时间仿真,并把时间复位
(设置断点时,要把你想仿真的语句的前后两个语句都设置成断点,这就好比,一段绳子,切成三段,而我取的是中间那一段,进入仿真按照截图标号依次点击)
3.开始运行(断点上的箭头是蓝色时代表未开始运行,当变成黄色时代表已运行一次,黄色箭头所指语句代表还未执行此语句,只是执行了箭头上面的语句)
4.再次运行,计算delay的运行时间
注意:这种计算延时时间有一定的误差,因为每次调用延时函数时会浪费一定的时间,每次执行语句达到的延时效果,还要额外加上调用函数所延时的时间,所以与自己设置的延时时间误差值为调用函数所产生的时间,理想设置延时时间=执行两次延时语句-执行一次延时语句,调用函数时间=执行一次延时语句-理想设置延时时间。通过反汇编也可以计算时间,在前面的nop指令,有简单介绍。
stc烧录软件延时函数
可以根据自己的需求设置时间,优点:生成代码速度快精准,缺点:不能在代码上灵活的修改延时的时间。
今天的文章延时函数分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/4736.html