(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> MCU设计实例 >> 浏览文章

用单片机C语言精确延时(定时)的方法

作者:51hei   来源:原创   点击数:x  更新时间2009年09月29日   字体

最近在忙着单片机的项目偶尔停下来小结了一下最近的收获还是有不少可贵的收益的

本人在闲暇的时候对单片机C语言下的各类延时程序做了下总结由于单片机C语言下利用软件延时不容易做到精确的定时所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间C语言下延时程序主要有以下几种

void delay(unsigned char k)
{

unsigned char i,k;  //定义变量
for(i=0;i<k;i++);      //for循环语句

}

该程序在Keil环境下会先将C语言转化成汇编语言那么我们就可以根据汇编语言来计算出精确的时间转化具体步骤如下

CLRA指令1
MOVR7,A指令2
LOOP:
   INCR7指令3
   CJNER7,k,LOOP指令4

这里指令1指令2和指令3各消耗1个机器周期指令4消耗两个机器周期可查此表得知

void delay(unsigned char i)
{
while(--i)
{;}
}

同样的览将其反汇编可以看到只有一条语句DJNZi,$;

该语句消耗2us一共执行i次所以总共消耗时间t=i*2us

下面的将形位为整形int这样的话反汇编所执行的语句完全不同用个具体的数字做例子

void delay()
{
 unsigned int i=10000;
 while(--i)
;
}

反汇编后

     4:         unsigned int i=10000;

C:0x0003    7F10     MOV      R7,#0x10
C:0x0005    7E27     MOV      R6,#0x27

     5:         while(--i)
     6: ;
C:0x0007    EF       MOV      A,R7
C:0x0008    1F       DEC      R7
C:0x0009    7001     JNZ      C:000C
C:0x000B    1E       DEC      R6
C:0x000C    14       DEC      A
C:0x000D    4E       ORL      A,R6
C:0x000E    70F7     JNZ      C:0007

具体计算如下

1.R7经过10H16次循环减为0
t1=10H*1+1+2+1+1+2
2.R6经过27H*256次循环减为0
t2=27H*256*1+1+2+1+1+2+27H*1
3.最后R7的是变为255因此还要多出255次的循环
t3=255*1+1+2+1+1+2
4.由之前消耗的2us总消耗时间
T=2+10H*1+1+2+1+1+2+27H*256*1+1+2+1+1+2+27H*1+255*1+1+2+1+1+2
=2+16*7+39*256*7+39*1+255*7
=71826us
大约为72ms吧
如果定义一个unsigned int i,那么延时计算公式为T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算

如果你懒得计算我还给大家推荐一个简单的方法就是用keil的软件仿真功能来仿真出C语句执行的时间具体方法可以看这里

发表评论告诉好友收藏此文关闭窗口

文章评论

相关文章

ձһhƬձƵ ձƵɫwww ձƵ:ɫ