KeilC51精确延时程序设计.docVIP

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

摘要 针对C语言代码的执行时间的可预见性差,结合Keil C51开发工具,分析了在Keil C51开发工具中利用C语言实现精确的延时程序的设计,指出了常用延时方法优缺点。并通过一些实例分析了延时时间的计算方法,使C语言代码的延时时间可以被预见。C语言中嵌套汇编语言是一种有效的方法,可以充分发挥出各语言的优势特点、提高开发效率。 关键词 Keil C51;C语言;软件延时;单片机 C语言具有较强的数据处理能力、语言功能齐全、使用灵活方便、开发效率高,被广泛应用于在单片机系统开发应用中。在单片机幕统开发的过程中,经常需要使用到延时程序,但C语言代码执行时间。的可预见性和实时性较差,在开发一些具有严格通信时序要求的系统时,往往需要反复调试延时代码,给开发者带来了较大困难。比如使用DS18B20进行温度测控时,必须按照其单总线通信协议,否则无法读取温度数据。针对上述问题,结合Keil C51开发工具和Proteus仿真软件,介绍在Keil C51开发系统中,利用C语言编写的延时程序设计及其运行的时间的计算方法。 1 常用延时程序的设计方法 1.1 利用定时器/计数器延时 利用C51单片机内部2个16位定时器/计数器实现精确的程序,由于定时器/计数器不占用CPU的运行时间,可以提高CPU的使用效率。但假设使用12 MHz晶振,定时器工作在方式1模式下,其最长定时时间也只能达到65.53 ms,由此,可以采用中断方式进行溢出次数累加的方法进行长时间的延时程序设计。但在开发过程中要考虑C51自动对断点的保护和重装初值所带来的延时误差,也可以使用定时器工作在方式2模式下,减少重装初值所带来的误差。 1.2 利用空操作实现延时 当所需的延时非常短,可以利用Keil C51自带intrins.h头文件中的_nop_()函数实现函数延时。 当主程序调用delay()函数时,首先执行LCALL指令,占用2个机器周期,然后执行_nop_()函数,它相当于汇编中的NOP指令,占用一个指令周期,最后执行一个RET返回指令,一共占用5个机器周期。若要增加延时时间,可以在delay()函数中增加_nop_()函数的数目。但利用这种方法进行长时间的延时,会降低成程序的可读性。 1.3 利用C语言中嵌套汇编程序实现延时 与C语言相比,在编写汇编程序的时候可以清楚地知道执行每一条指令所需的机器周期,从而精确确定其执行时间。Keil C51开发环境可以实现C语言中嵌入汇编语言,可以在延时程序设计时,结合汇编语言的优点,精确确定延时时间。C语言中嵌入汇编程序的方法: #pragma asm ;汇编程序代码 #pragma endasm 以12 MHz晶振为例,介绍C语言嵌套汇编语言设计延时程序: delay函数采用单循环延时,主函数调用delay函数时,首先执行LJMP指令占用2个指令,delay函数执行结束后,执行一个RET返回指令。而DJNZ执行占用2个机器周期,一共执行了10次,所以在12 MHz晶振下,延时函数执行的时间为△t=2×10+1+2+2=25μs。如果需要进行长时间延时,可以采用多重循环嵌套实现。 1.4 利用for循环实现延时 在单片机开发过程中,for语句和while语句也经常用于延时程序的设计。设晶振频率为12 MHz,在调用延时函数时,一共需要18个机器周期。当delay函数中的实参改变时,函数的延长时间变长,具体的延时时间△t=3×i+5×(i+1)+5。由于delay函数中变量的类型为unsigned char,最大值为255,不能进行长时间延时。可以通过改变变量的类型和利用for语句嵌套,实现长时间延时,但是延时时间的计算和delay函数有差异。 如表1所示,在设计延时程序时,应该考虑延时的长短,开发系统的资源利用与二次开发等情况进而确定设计延时程序设计的方法。 2 延时时间的精确计算 在开发过程中,经常需要知道代码执行的时间,以确定延时时间。在单片机开发中经常使用硬件或Keil C51中的一些功能来确定延时时间。下面通过在频率12 MHz晶振下的一些实例进行分析。 2.1 利用示波器确定延时时间 单片机系统开发应用中,经常用示波器来确定代码执行的时间,如在延时后面进行IO口中的某位电平翻转,用示波器来观察IO中某位输出的标准PWM波形来确定延时时间,但是此方法必须是用来计算延时时间为毫秒级别的延时程序,否则会存在误差因为在进行IO口电平翻转和程序执行结束跳转到while函数入口,需要占几μm的时间。例如上面介绍的for循环编写的延时程序中,假设实参为249,则△t=3×249+5×(249+1)+5=2 002

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档