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

单片机·延时程序小结

作者:佚名   来源:本站原创   点击数:  更新时间:2011年04月10日   【字体:

在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,那就是延时程序。下面我凭记忆来讲解延时程序。

课本上讲,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,如此反复。

关闭窗口

相关文章