单片机延时程序的实现

第一种方法:

https://blog.youkuaiyun.com/leizi_chn/article/details/7257714
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i–)
for(j=202;j>0;j–)
for(k=81;k>0;k–);
}

产生的汇编:

C:0x0800    7F0F     MOV      R7,#0x0F
C:0x0802    7ECA     MOV      R6,#0xCA
C:0x0804    7D51     MOV      R5,#0x51
C:0x0806    DDFE     DJNZ     R5,C:0806
C:0x0808    DEFA     DJNZ     R6,C:0804
C:0x080A    DFF6     DJNZ     R7,C:0802
C:0x080C    22      RET     

计算分析:

程序共有三层循环
一层循环n:R5*2 = 81*2 = 162us                  DJNZ  2us
二层循环m:R6*(n+3) = 202*165 = 33330us          DJNZ  2us + R5赋值 1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us        DJNZ  2us + R6赋值 1us = 3us
循环外:   5us            子程序调用 2us + 子程序返回 2us + R7赋值 1us  = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

第二种方法

https://blog.youkuaiyun.com/leizi_chn/article/details/7257714
在keil C51中,直接调用库函数:
#include<intrins.h> // 声明了void nop(void);

nop(); // 产生一条NOP指令

作用:对于延时很短的,要求在us级的,采用“nop”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。

第三种方法

https://blog.youkuaiyun.com/xqn2017/article/details/78141710
头文件中加入#inlude <stdio.h>
定义一个内联函数,然后调用这个函数,不过得测一下平台调用内联函数的开销,而不仅仅是nop指令的个数,在自己的测试中,调用大概是9个cycle,而nop指令是1个cycle,所以我假设为9倍的线性关系进行打桩,每个平台会不一样,包括用到的器件的主频等等,这里只是提供一种参考方法

#inluce <stdio.h>
assembly inline void insert_nop()
{
asm_begin
nop
asm_end
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值