汇编语言写c51延时程序,单片机延时程序实例讲解

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

课本上讲,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

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,如此反复。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值