单片机c语言长定时,【跟豆子一起学单片机】用单片机C语言精确延时(定时)的方法...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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

一:

void delay(unsigned char k)

{

unsigned char i,k; //定义变量

for(i=0;i

}

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

CLR A   ;指令1

MOV R7,A ;指令2

LOOP:

INC R7  ;指令3

CJNE  R7,k,LOOP    ;指令4

这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查此表得知:http://tieba.baidu.com/p/3466487836),而在12M的晶振下一个机器周期是1us,在这个过程中,指令1和指令2分别执行1次,即消耗1+1us,而指令3和指令4分别执行了k次,那么这样加起来,这个延时子程序所消耗的具体时间就是t=1+1+(1+2)*k=3k+2us。

呵呵,这样说来,如果我们定义的k为100的话,这个延时子程序的精确时间就是302us。

二:

void delay(unsigned char i)

{

while(--i)

{;}

}

同样的道理,将其反汇编,可以看到,只有一条语句:DJNZ  i,$;

该语句消耗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经过10H(16)次循环减为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语句执行的时间,具体方法可以看这里:http://tieba.baidu.com/p/3465324461

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值