在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,那就是延时程序。下面我凭记忆来讲解延时程序。
课本上讲,1个机器周期=6个状态周期=12个时钟周期,而这个时钟周期与晶振频率有关。我们接下来要上的实验基本都是以12MHz的晶振。12M的频率,得其周期为1/12乘10的-6方s,那么1个机器周期就是它的12倍,即1us,而一般语句需要2个机器周期,例如
MOV R6,#20
DNJZ R6,$
每一次执行时,每一个过程就需要2个机器周期,为1us乘2。.同样C语言中for循环语句没执行一次也是2个机器周期,即2us。下面我会以每个语句执行一次用时的2us为基本单位,不会再细化了。
汇编语言最基本延时:
MOV R6,#20
D1:MOV R7,#248
DNJZ R7,$//循环248次,共用248X2us,
DNJZ R6,D1
我开始也是搞不懂怎么算它到底延时多少,现在给大家写它表达式:
我觉得应该从最后往前算,在MOR R7,#248执行一次前提下,用时1X2us,然后循环减248,用时248X2us,故共用时[2+2X248]us。
然而又由于DNJZ R6,D1,上面的过程又循环20次,故上面的循环最终用时20X[2+2X248]us。
接着注意到单纯DNJZ R6,D1会用时20X2=40us。
最后注意过执行唯一一次的 MOV R6,#20会用时1X2us。
所有,最终表达式为:1X2us+20X[2+2X248]us+20X2=10002us=10ms=0.01s。
同理,用c51编的延时程序要了解它必须也要写出它的表达式,下面的C51延时程序可以试着自己写出表达式:
void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}
我还是把表达式写在这,[(248X2+2)X20+2]X20=199240=199.24ms=0.2s
再给一个我验证过的程序,这是个比较典型和基本的延时程序应用例子:
#include<reg51.h>
sbit L1=P0^0;
void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
L1=1;
delay02s();
}
}
能看出它的功能么?他就是让一个灯不停的闪啊闪,亮个0.2s,又熄个0.2s,如此反复。
本文由:蒋匿 奉献
如若复制、转载请注明原文地址:http://mtoou.info/danpianji-yanshichengxu/