用Cbob手机版网页体育51编写单片机延时函数
参考了51单片机 Keil C 延时程序的简单研究,自己也亲身测试和计算了一些已有的延时函数。这里假定单片机是时钟频率为12MHz,则一个机器周期为:1us.参考了51单片机 Keil C 延时程序的简单研究后,我们可知道, 在Keil C中获得最为准确的延时函数将是voiddelay(unsignedchart){while(--t);}反汇bob手机版网页体育编代码如下:执行DJNZ指令需要2个机器周期,RET指令同样需要2个机器周期,根据输入t,在不计算调用delay()所需时间的情况下,具体时间延时如下:tDelay Time (us)12×1+2 =422×2+2=6N2×N+2=2(N+1)当在main函数中调用delay(1)时, 进行反汇编如下:调用delay()时,多执行了两条指令,其中MOV R, #data需要1个机器周期,LJMP需要2个机器周期,即调用delay()需要3us.Keil C仿真截图与计算过程:bob手机版网页体育加上调用时间,准确的计算时间延时与Keil C仿真对比如下:(可见,仿真结果和计算结果是很接近的)tDelay Time (us)仿真11.0592Mhz时钟(us)13+2×1+2 =7 | 7.7(实际)7.6023+2×2+2=9 | 9.99.76N3+2×N+2=2N+5 | (2N+5)*1.1/311 | 12.111.941535 | 38.537.98100205 | 225.5222.44255515 | 566.5558.81也就是说,这个延时函数的精度为2us,最小的时间延时为7us,最大的时间延时为3+255×2+2=515us.实际中使用11.0592MHz的时钟,这个延时函数的精度将为2.2us,最小时间延时为7.7us, 最大时间延时为566.5us.这个时间延时函数,对于与DS18B20进行单总线通信,已经足够准确了。现在,我们将时钟换成11.0592MHz这个实际用到的频率,每个机器周期约为1.1us.现在让我们来分析一下这个之前用过的延时函数://延时函数,对于11.0592MHz时钟,例i=10,则大概延时10ms.voiddelayMs(unsignedinti){unsignedintj;while(i--){for(j=0;j0,跳转到C:000D19INCR4;1T20C:001BSJMPC:000D;2T21C:001DRET对于delayMs(1), 执行到第7行就跳到21行, 共需时12T, 即13.2us对于delayMs(2), 需时9T+13T+124×10T+7T+12T = 9T+13T+1240T+7T+12T =1281T =1409.1us.对于delayMs(3), 需时9T×(3-1)+(13T+124×10T+7T)×(3-1)+12T=1269T×(3-1)+12T=2550T=2805us.对于delayMs(N),N>1, 需时1269T×(N-1)+12T = 1269NT-1257T=(1395.9N-1382.7)us.利用Keil C仿真delayMs(1) = 0.00166558s = 1.67ms 截图如下:由分析可知具体的计算延时时间与Keil C仿真延时对比如下:iTime Delay仿真延时113.2us1.67ms21409.1us3.31ms32805us4.96msN(1395.9N-1382.7)us1012.6ms16.50ms2026.5ms32.98ms3040.5ms49.46ms5068.4ms82.43ms100138.2ms164.84ms200277.8ms329.56ms500696.6ms824.13ms10001394.5ms1648.54ms15002092.5ms2472.34ms20002790.4ms3296.47ms55.6ms8.26ms73100.5ms120.34ms7201003.7ms = 1s1186.74ms

计算delayMs(10)得到延时时间为:12576.3us约等于12.6ms,接近我们认为的10ms。Voiddelay(unsignedchart)计算delayMs(10),延迟时间是12576.3us,大概是12.6ms,接近我们想象的10ms。

本文引用地址:http://www.eepw.com.cn/article/201611/316096.htm计算结果和仿真结果只要delayMs(1)有很大出入, 其它都接近, 在接受范围内.经过以上分析,可见用C语言来做延时并不是不太准确,只是不容易做到非常准确而已,若有一句语句变了,延时时间很可能会不同,因为编译程序生成的汇编指令很可能不同。PS:对于每条51单片机汇编指令的字长和所需机器周期汇总如下:转自:http://bbs.mcustudy.com/printpage.asp?BoardID=2&ID=1454Appendix E - 8051 Instruction SetArithmetic OperationsMnemonicDescriptionSizeCyclesADD A,Rn Add register to Accumulator (ACC).11ADD A,direct Add direct byte to ACC.21ADD A,@Ri Add indirect RAM to ACC.11ADD A,#data Add immediate data to ACC.21ADDC A,Rn Add register to ACC with carry.11ADDC A,direct Add direct byte to ACC with carry.21ADDC A,@Ri Add indirect RAM to ACC with carry.11ADDC A,#data Add immediate data to ACC with carry.21SUBB A,Rn Subtract register from ACC with borrow.11SUBB A,direct Subtract direct byte from ACC with borrow21SUBB A,@Ri Subtract indirect RAM from ACC with borrow.11SUBB A,#data Subtract immediate data from ACC with borrow.21INC A Increment ACC.11INC Rn Increment register.11INC direct Increment direct byte.21INC @Ri Increment indirect RAM.11DEC A Decrement ACC.11DEC Rn Decrement register.11DEC direct Decrement direct byte.21DEC @Ri Decrement indirect RAM.11INC DPTR Increment data pointer.12MUL AB Multiply A and B Result: A
bob手机版网页体育
在线预约
TOP