用单片机C语言精确延时(定时)的方法
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。那么用单片机C语言精确延时(定时)的方法都是怎样的呢?以下仅供参考!
由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。C语言下,延时程序主要有以下几种:
一:
void delay(unsigned char k)
{
unsigned char i,k; //定义变量
for(i=0;i<k;i++); //for循环语句
}
该程序在Keil环境下,会先将C语言转化成汇编语言,那么我们就可以根据汇编语言来计算出精确的时间,转化具体步骤如下:
CLR A ;指令1
MOV R7,A ;指令2
LOOP:
INC R7 ;指令3
CJNE R7,k,LOOP ;指令4
这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查文末附录表),而在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
关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算。
-
C语言自增(++)和自减(--)
C语言源自KenThompson发明的B语言,那么大家知道C语言自增(++)和自减(--)是什么呢?下面一起来看看!一个整数自身加一可以这样写:a+=1;它等价于a=a+1;。但是在C语言中还有一种更简单的写法,就是a++;或者++a;。这种写法叫做自加或自增;意思很明确,就是自身加一。相应...
-
c#实现sunday算法实例
Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符,下面小编为大家整理了c#实现sunday算法实例,希望能帮到大家!因正则表达式搜索总是出现死循环,开始考虑改为其他搜索方式,因为自带的IndexOf默认只能找到第一个或最后一...
-
C++跳转语句之Goto对变量定义的影响详解
goto语句也称为无条件转移语句,以下是为大家分享的C++跳转语句之Goto对变量定义的影响详解,供大家参考借鉴,欢迎浏览!前言goto语句也称为无条件转移语句,其基本形式如下:语句标号由一个有效地标识符和符号";"组成,其中,标识符的命名规则与变量名称相同,即由字母、数字...
-
如何在c语言中调用Linux脚本
如何在c语言中调用Linux脚本呢?你知道如何在c语言中调用Linux脚本吗?下面是小编为大家带来的如何在c语言中调用Linux脚本的知识,欢迎阅读。一、引言对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系...