C及汇编延时程序课件.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C及汇编延时程序课件

有个好帖,从精度考虑,它得研究结果是: ?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,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。 那么用ulong?t呢? 一定很恐怖,不用看编译后的汇编代码了。。。 那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序: /*-------------------------------------------------------------------- 程序名称:50us?延时 注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振 例子提示:调用delay_50us(20),得到1ms延时 全局变量:无 返回:????无 --------------------------------------------------------------------*/ void?delay_50us(uint?t) { ?uchar?j;?? ?for(;t0;t--)??? ??for(j=19;j0;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晶振 例子提示:调用delay_50ms(20),得到1s延时 全局变量:无 返回:????无 --------------------------------------------------------------------*/ void?delay_50ms(uint?t) { ?uint?j;??? /**** 可以在此加少许延时补偿,以祢补大数值传递时(如delay_50ms(1000))造成的误差, 但付出的代价是造成传递小数值(delay_50ms(1))造成更大的误差。 因为实际应用更多时候是传递小数值,所以补建议加补偿! ****/ ?for

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档