1 / 16
文档名称:

C及汇编延时程序.doc

格式:doc   大小:58KB   页数:16页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C及汇编延时程序.doc

上传人:s1188831 2017/8/5 文件大小:58 KB

下载得到文件列表

C及汇编延时程序.doc

相关文档

文档介绍

文档介绍:有个好帖,从精度考虑,它得研究结果是:
 void delay2(unsigned char i) 
      {
        while(--i); 
        } 
为最佳方法。
分析:假设***12M(之后都是在这基础上讨论)
我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
delay2(0):延时518us         518-2*256=6
delay2(1):延时7us(原帖写“5us”是错的,^_^)
delay2(10):延时25us           25-20=5
delay2(20):延时45us           45-40=5
delay2(100):延时205us         205-200=5
delay2(200):延时405us         405-400=5
见上可得可调度为2us,而最大误差为6us。
精度是很高了!
但这个程序的最大延时是为518us 显然不
能满足实际需要,因为很多时候需要延迟比较长的时间。
那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。
void delay8(uint t)
{
 while(--t);
}
我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
delay8(0):延时524551us         524551-8*65536=263
delay8(1):延时15us
delay8(10):延时85us            85-80=5  
delay8(100):延时806us          806-800=6
delay8(1000):延时8009us        8009-8000=9
delay8(10000):延时80045us      80045-8000=45
delay8(65535):延时524542us     524542-524280=262
如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,。
那么用ulong t呢?
一定很恐怖,不用看编译后的汇编代码了。。。
那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:
/*---------------------------------
-----------------------------------
程序名称:50us 延时
注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振
例子提示:调用delay_50us(20),得到1ms延时
全局变量:无
返回:    无
--------------------------------------------------------------------*/
void delay_50us(uint t)
{
 uchar j;  
 for(;t>0;t--)   
  for(j=19;j>0;j--) 
   ;
}
我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:
delay_50us(1):延时63us             63-50=13
delay_50us(10):延时513us           503-500=13  
delay_50us(100):延时5013us         5013-5000=13
delay_50us(1000):延时50022us       50022-50000=22
赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。再说要求再精确的话,就算是用汇编也得改用定时器了。
/*--------------------------------------------------------------------
程序名称:50ms 延时
注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振
例子提示:调用de