单片机延时计算.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机延时计算

单片机C51延时时间怎样计算? C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned?char类型具有比unsigned?int更优化的代码,在使用时应该使用unsigned?char作为延时变量。?以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。 void delay__ms(void) //x,y,z位固定值,故不能接受参数 { unsigned char i,j,k; for(i=x;i0;i--) for(j=y;j0;j--) for(k=z;k0;k--); } 【Delay_Time=[(2z+3)*y+3]*x+5】 一.?500ms延时子程序 程序: ?????void?delay500ms(void) ???????{ ???????unsigned?char?i,j,k; ?????????for(i=15;i0;i--) ?????????for(j=202;j0;j--) ?????????for(k=81;k0;k--); ???????} 计算分析: ?????程序共有三层循环 ?????一层循环n:R5*2?=?81*2?=?162us???????????????????DJNZ???2us ?????二层循环m:R6*(n+3)?=?202*165?=?33330us???????????DJNZ???2us?+?R5赋值?1us?=?3us ?????三层循环:?R7*(m+3)?=?15*33333?=?499995us?????????DJNZ???2us?+?R6赋值?1us?=?3us ?????循环外:???5us?????????????子程序调用?2us?+?子程序返回?2us?+?R7赋值?1us???=?5us ?????延时总时间?=?三层循环?+?循环外?=?499995+5?=?500000us?=500ms 计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5 ?????二.?200ms延时子程序 程序: void?delay200ms(void) { ???????unsigned?char?i,j,k; ?????????for(i=5;i0;i--) ?????????for(j=132;j0;j--) ?????????for(k=150;k0;k--); } ?????三.?10ms延时子程序 程序: void?delay10ms(void) { ???????unsigned?char?i,j,k; ?????????for(i=5;i0;i--) ?????????for(j=4;j0;j--) ?????????for(k=248;k0;k--); } ?????四.?1s延时子程序 程序: void?delay1s(void) { ???????unsigned?char?h,i,j,k; ?????????for(h=5;h0;h--) ?????????for(i=4;i0;i--) ?????????for(j=116;j0;j--) ?????????for(k=214;k0;k--); } ?应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。 ????以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要: ????????mov?????r0,?#09h loop:???djnz????r0,?loop 51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov?r0,?#09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。 ????现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档