打印

单片机延时

[复制链接]
1722|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lovelyegle|  楼主 | 2009-12-2 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在单片机应用中,经常会遇到需要短时间延时的情况,一般都是几十到几百μs,并且需要很高的精度(比如用单片机驱动DS18B20时,误差容许的范围在十几μs以内,不然很容易出错);而某些情况下延时时间较长,用计时器往往有点小题大做。另外在特殊情况下,计时器甚至已经全部用于其他方面的定时处理,此时就只能使用软件定时了[1]。
        1 C语言程序延时
  Keil C51的编程语言常用的有2种: 一种是汇编语言;另一种是C 语言。用汇编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的是晶振频率为12 MHz的AT89C51,打算延时20 μs,51单片机的指令周期是晶振频率的1/12,即一个机器周期为1 μs;“MOV R0,#X”需要2个机器周期,DJNZ也需要2个机器周期,单循环延时时间t=2X+3(X为装入寄存器R0的时间常数)[2]。这样,存入R0里的数初始化为8即可,其精度可以达到1 μs。用这种方法,可以非常方便地实现512 μs以下时间的延时。如果需要更长时间,可以使用两层或更多层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。
  虽然汇编语言的机器代码生成效率很高,但可读性却并不强,复杂一点的程序就更难读懂;而C语言在大多数情况下,其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,且C 语言还可以嵌入汇编程序来解决高时效性的代码编写问题。就开发周期而言,中大型软件的编写使用C 语言的开发周期通常要比汇编语言短很多,因此研究C语言程序的精确延时性能具有重要的意义[3]。
  C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。
  2 单层循环延时精度分析
  下面是进行μs级延时的while程序代码。
  延时函数:
  void delay1(unsigned char i) {
    while(i );}
  主函数:
  void main() {
    while(1) {
      delay1(i);
    }
  }
  使用Keil C51的反汇编功能,延时函数的汇编代码如下:
  C:0x00E6AE07MOVR6,0x07
  C:0x00E81FDECR7
  C:0x00E9EEMOVA,R6
  C:0x00EA70FAJNZC:00E6
  C:0x00EC22RET
500)this.width=500" border=0>
图1 断点设置位置图
  通过对i赋值为10,在主程序中图1所示的位置设置断点。经过测试,第1次执行到断点处的时间为457 μs,再次执行到该处的时间为531 μs,第3次执行到断点处的时间为605 μs,10次while循环的时间为74 μs,整个测试结果如图2所示。
500)this.width=500" border=0>
沙发
Karlshen| | 2009-12-2 21:54 | 只看该作者
:handshake

使用特权

评论回复
板凳
suoma| | 2009-12-2 22:37 | 只看该作者
无图?

使用特权

评论回复
地板
lovelyegle|  楼主 | 2009-12-3 23:11 | 只看该作者
转发的···

使用特权

评论回复
5
wangwo| | 2009-12-6 18:42 | 只看该作者
顶了!只是缺少图片

使用特权

评论回复
6
love_life| | 2009-12-7 01:12 | 只看该作者
不错:)

使用特权

评论回复
7
laslison| | 2009-12-7 22:39 | 只看该作者
有些东西还是值得参考的,顶了

使用特权

评论回复
8
thf2008| | 2009-12-7 23:01 | 只看该作者
挺好的,适合初学者

使用特权

评论回复
9
lovelyegle|  楼主 | 2009-12-8 22:00 | 只看该作者
:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

640

帖子

1

粉丝