用C语言实现精确的延时

用C语言实现精确的延时

ID:38257542

大小:29.50 KB

页数:3页

时间:2019-06-07

用C语言实现精确的延时_第1页
用C语言实现精确的延时_第2页
用C语言实现精确的延时_第3页
资源描述:

《用C语言实现精确的延时》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、怎么用C语言做单片机的精确延时在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了[1]。1  C语言程序延时  KeilC51的编程语言常用的有2种:一种是汇编语言;另一种是C语言。用汇编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的是晶振频率为1

2、2MHz的AT89C51,打算延时20μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1μs;“MOVR0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。这样,存入R0里的数初始化为8即可,其精度可以达到1μs。用这种方法,可以非常方便地实现512μs以下时间的延时。如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。  虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更

3、难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C语言还可以嵌入汇编程序来解决高时效性的代码编写问题。就开发周期而言,中大型软件的编写使用C语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义。  C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsignedchar类型具有比unsignedint更优化的代码,在使用时应该使用unsignedchar作为延时变量。2  单层循环延时精度分析  下面是进行μs级延时

4、的while程序代码。  延时函数:  voiddelay1(unsignedchari){  while(i);}  主函数:  voidmain(){  while(1){    delay1(i);  }  }  使用KeilC51的反汇编功能,延时函数的汇编代码如下:  C:0x00E6AE07MOVR6,0x07  C:0x00E81FDECR7  C:0x00E9EEMOVA,R6  C:0x00EA70FAJNZC:00E6  C:0x00EC22RET图1  断点设置位置图  通过对i赋值为10,在主

5、程序中图1所示的位置设置断点。经过测试,第1次执行到断点处的时间为457μs,再次执行到该处的时间为531μs,第3次执行到断点处的时间为605μs,10次while循环的时间为74μs,整个测试结果如图2所示。图2  使用i--方式测试仿真结果图  通过对汇编代码分析,时间延迟t=7X+4(其中X为i的取值)。测试表明,for循环方式虽然生成的代码与用while语句不大一样,但是这两种方法的效率几乎相同。C语言中的自减方式有两种,前面都使用的是i--的方式,能不能使用--i方式来获得不同的效果呢?将前面的主函数保持

6、不变,delay1函数修改为下面的方式:  voiddelay1(unsignedchari){  while(--i);}  同样进行反汇编,得到如下结果:  C:0x00E3DFFEDJNZR7,  C:00E3C:0x00E522RET  比较发现,--i的汇编代码效率明显高于i--方式。由于只有1条语句DJNZ,执行只需要2个时钟周期,1个时钟周期按1μs计算,其延时精度为2μs;另外,RET需要2个时钟周期,能够达到汇编语言代码的效率。按前面的测试条件进行测试,第1次执行到断点处的时间为437μs,再次执行

7、到该处的时间为465μs,第3次执行到断点处的时间为493μs,10次while循环的时间为28μs,整个测试结果如图3所示。图3  使用--i方式测试仿真结果图  调整i的取值,i取8时延时时间为24μs,i取9时延时时间为26μs。通过分析得出,10次循环为28μs是由于外层循环造成的,其精度可以达到2μs。在设计时应该考虑参数传递和RET语句执行所需要的时间周期。实验分析发现,for语句使用--i方式,同样能够达到与汇编代码相同的精度。i取不同值时延时仿真结果如图4所示。图4  i取不同值时延时仿真结果图3  

8、多重嵌套下的C程序延时  在某些情况下,延时较长,仅使用单层循环方式是不能完成的。此时,只能使用多层循环方式,那么多重循环条件下,C程序的精度如何呢?下面是一个使用for语句实现1s延时的函数。  延时函数  voiddelay1s(void){  for(k=100;k>0;k--)//定时1s  for(i=20;i>0;i--)  for

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

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

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