精确的延时函数,最大误差0.5%

精确的延时函数,最大误差0.5%

ID:13244394

大小:32.00 KB

页数:6页

时间:2018-07-21

精确的延时函数,最大误差0.5%_第1页
精确的延时函数,最大误差0.5%_第2页
精确的延时函数,最大误差0.5%_第3页
精确的延时函数,最大误差0.5%_第4页
精确的延时函数,最大误差0.5%_第5页
资源描述:

《精确的延时函数,最大误差0.5%》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、精确的延时函数,最大误差0.5%/*下面是一个精确的延时程序,延时范围为[1ms,255ms]误差范围为(0,0.5%],随着延时时间的增强,相对误差越来越低,在延时1毫秒时误差最大0.5%,在延时255毫秒时误差趋向于0下面就讲讲我是如何写出这个延时函数的:首先我要确定在延时函数里,用什么语法结构作为延时体有两类结构第一类,直接用for循环,格式如下这是最简单的一层,如果多重嵌套的话就很复杂了for(i=0;i<10;--i);汇编翻译代码如下C:0x1F22E4CLRAC:0x1F23FEMOVR6,AC:0x1F24EEMOVA

2、,R6C:0x1F25C3CLRCC:0x1F26940ASUBBA,#0x0AC:0x1F285003JNCC:1F2DC:0x1F2A1EDECR6C:0x1F2B80F7SJMPC:1F24第二类,用while循环或do...while循环,格式如下do//第一层{j=y;do//第二层{i=x;do//第三层,里面有N个_nop_(){_nop_();_nop_();_nop_();...}while(--i);}while(--j);}while(--btXms);汇编翻译代码如下C:0x1FBF7D02MOVR5,#0x0

3、2C:0x1FC27EA5MOVR6,#0xA5C:0x1FC400NOPC:0x1FC5DEFDDJNZR6,C:1FC4C:0x1FC7DDF9DJNZR5,C:1FC2C:0x1FC9DFF4DJNZR7,C:1FBF//从上面可以看到,第二类循环翻译成汇编最简单,整个三重循环就6条指令,平摊到每一个循环就两句话,由此我选择do...while作为延时体(当然你也可以用while循环),接下来就是计算出总延时,这个在C函数里是最难的:首先我们计算出第三层的延时总周期,C=nx+2x;第三层有N个_nop_()循环了x次所以是nx

4、个周期,DJNZ指令有x次每次两个周期,所以是2x个周期第二层的延时总周期,B=y+Cy+2y;第二层有个MOV赋值指令循环了y次所以是y个周期,DJNZ指令有y次每次两个周期,所以是2y个周期,第三层循环也循环了y次所以是Cy个周期第一层的延时总周期,A=btXms+BbtXms+2btXms;第一层也有个MOV赋值指令循环了btXms次所以是btXms个周期,DJNZ指令有btXms次每次两个周期,所以是2btXms个周期,第二层循环也循环了btXms次所以是BbtXms个周期由此可以得出中的循环周期为t=A+5;末尾的5个周期是

5、,传参MOV指令一个周期,函数返回RET两个周期,函数调用LCALL两个周期于是总的周期就出来了t=[3y+(2+n)xy+3]btXms+5如果晶振为12MHz那么每一个周期的时间为1us,于是总延时为T={[3y+(2+n)xy+3]btXms+5}(us)现在就是要求出当btXms为1时我们要保证延时是1000us,于是有等式为3y+(2+1)xy+3==1000//注意那额外的5个周期已经被忽略了,因为这个5个周期不会随着btXms德变化而变化,我们无法消除这5个周期的误差,为了使函数最简单,这里令n=1;于是有3y+3xy=

6、=997因为997无法整除3,所以这个等式xy没有整数解,那么我们能不能够造出一个等式使得xy有整数解呢,这就要我们仔细观察了。我们发现997不能出以3但996却可以,所以我们就想如果我们的延时函数执行总周期为t=[3y+(2+n)xy+4]btXms+5,那就一切OK了很快我们发现,变成这样很容易,最简单的就是在最外层循环中加上一个nop就行了,于是乎我们的延时函数,被稍微的修改如下do//第一层{j=y;_nop_();do//第二层{i=x;do//第三层,里面有N个_nop_(){_nop_();_nop_();_nop_()

7、;...}while(--i);}while(--j);}while(--btXms);t=[3y+(2+n)xy+4]btXms+5同样令n=1,最后化简变为3y+3xy==996y+xy==332这时我们很容易求得一组解x=165y=2;还有一组解为x=82y=4;至此我们的延时函数就出来了,就整个函数体来说,它延时刚才我们已经推导出来是绝对的延时btXms毫秒,没有任何误差,但由于多了那5个固定周期,使得函数整体来讲还是有5个周期的误差,但幸好这个误差是固定不变的,并且是很微小可以忽略不计的,相对误差为(5/10btXms)%它

8、会随着延时的增大而渐趋于0如果你觉得好,那就顶一下吧*/voidDelayXms(BYTEbtXms){BYTEi,j;do{j=2;_nop_();do{i=165;do{_nop_();}while(--i);}wh

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。