EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
【51单片机】延时函数计算问题以及如何准确延时$ Y0 u7 k5 ]* ~% Q: W' t) t
h8 G$ X3 O0 a# G! X- o# [
几种周期介绍 周期名称 | 描述 | 时间 | 振荡(时钟) | 单片机提供时钟脉冲信号的振荡源的周期 | T=1/f | 状态 | 振荡周期经二分频后得到的 | 2T | 机器 | 在一个机器周期内,CPU可以完成一个独立的 操作 | 12T | 指令 | 指CPU完成一条操作所需的全部时间 | 12-12nT |
指令: 1、MUL、DIV:仅有的4周期指令 2、包含DPTR和PC的指令均为2周期指令 3、所有的绝对跳转和条件转移指令,均为2周期指令 4、所有包括A寄存器的指令,均为单周期指令 5、位操作指令中,ANL和ORL是2周期指令 6、所有包含立即地址的指令,除INC direct及DEC direct外,均为2周期指令 7、剩下的均为单周期指令。 STC-ISP软件查看各操作用时以及延时函数 ![]()
_nop_函数可以在keil软件的C51->HLP->C51lib.chm文档中查阅 (授人以鱼不如授人以渔) ![]()
延时函数计算 示例: [cpp] view plain copyvoid delay(uint z) { uint i,j; for(i=z;i>0;i--) for(j=0;j<921;j++); } 分析: 1.先计算你单片机的振荡(时钟)周期 T= 1/晶振(11.0592MHZ) 2.一次i--操作为12T 3.忽略变量定义,上述延时函数共需时间:921*z*12T 4.带入T:921*12*T*z 约为 z ms 计算出现误差的原因 1.软件仿真时,函数调用的时候入栈出栈操作的耗时。 2.指令周期随指令的不同而不同导致的误差。 3.中断的影响。 4.变量的范围超过,从而与预计时间不一样。 所以实际上我们应该只能算出估计值,根据最开始周期的信息来计算延时函数中延时的时长。 ! ?) K8 x$ k+ ~( l
|