AVR延时函数.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文档。上传文档
查看更多
AVR延时函数

AVR的精确延时程序(2009-12-28 06:41:30) 1.毫秒级的延时 延时1ms; void delay_1ms(void) { ? unsigned int i; ? for(i=1;i(unsigned int)(xtal*143-2_;i++) ?; } 在上式中,xtal为晶振频率,单位为MHz. ??? 当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs. ??? 如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。 ??? 下面的函数可以获得1ms的整数倍的延时时间: void delay(unsigned int n) { ? unsigned int i; ? for(i=0;in;i++) ? delay_1ms(); } ?????如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值. 2.微秒延时 晶振频率为8MHz时1μs延时函数: void delay_1us(void) { ? asm(nop); } 当然也可以使用宏定义来实现1μs延时: #define delay_1us(); asm(nop);asm(nop);asm(nop);asm(nop);asm(nop);asm(nop);asm(nop);asm(nop) 如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇编 asm(nop); 语句实现延时。 在程序中需要微秒级的延时时,可以用以下函数实现。 void delay_us(unsigned int n) { ? unsigned int i; ? for(i=0;in;i++) ? delay_1us(); } ??? 说明:如果需要准确的延时时间,则还必须关中断,并通过软件仿真后,再确定循环的次数及循环初值. ??? 强调:在实际应用中一般不直接使用软件进行长时间的延时,因为MCU一直停留延时函数中(称为阻断),不能再干其它的事睛(除了中断外),只有非常简单的应用或者简单的演示时才能使用延时函数实现长时间延时。实际应用中,对长时间(较简单任务一般指几十毫秒以上,对于复杂的应用,一般指几毫秒以上)的延时,应采用非阻断式的延时方式,或者使用定时器中断来完成延时。 WINAVR自带延时函数说明 delay.h文件位于X:\WinAVR\avr\include\avr中。? delay.h中有两个函数--------_delay_ms(double __ms)和_delay_us(double __us),分别延时__ms*F_CPU毫秒、__us*F_CPU微秒,(单片机晶振是F_CPU MHZ)两函数的原型分别如下:? 1、_delay_us(double __us)? static __inline__ void? _delay_us(double __us)? {? uint8_t __ticks;? double __tmp = ((F_CPU) / 3e6) * __us;? if (__tmp 1.0)? __ticks = 1;? else if (__tmp 255)? __ticks = 0; /* i.e. 256 */? else? __ticks = (uint8_t)__tmp;? _delay_loop_1(__ticks);? }? 其中,该函数延时的最大时间是768/F_CPU微秒。? 2、_delay_ms(double __ms)? static __inline__ void? _delay_ms(double __ms)? {? uint16_t __ticks;? double __tmp = ((F_CPU) / 4e3) * __ms;? if (__tmp 1.0)? __ticks = 1;? else if (__tmp 65535)? __ticks = 0; /* i.e. 65536 */? else? __ticks = (uint16_t)__tmp;? _delay_loop_2(__ticks);? }? 其中,该函数延时的最大时间是262.14/F_CPU毫秒。? delay_ms,delay_us延时函数在不同工作频下的最大值 GCC中delay_ms,delay_us延时函数在不同工作频(常用)下的最大值如下:? _delay_ms(double _

文档评论(0)

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

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

1亿VIP精品文档

相关文档