在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,那就是延时程序。下面我凭记忆来讲解延时程序。
课本上讲,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,如此反复。
上一篇:mcs-51单片机 扫描矩阵键盘程序
下一篇:51单片机多字节的除法
推荐阅读最新更新时间:2024-03-16 13:06
设计资源 培训 开发板 精华推荐
- 我国科学家建立生成式模型为医学AI训练提供技术支持
- Diodes 推出符合车用标准的电流分流监测器,通过高精度电压感测快速检测系统故障
- Power Integrations面向800V汽车应用推出新型宽爬电距离开关IC
- 打破台积电垄断!联电夺下高通先进封装订单
- Ampere 年度展望:2025年重塑IT格局的四大关键趋势
- 存储巨头铠侠正式挂牌上市:首日股价上涨超10%
- Vishay 推出新款精密薄膜MELF电阻,可减少系统元器件数量,节省空间,简化设计并降低成本
- 芯原推出新一代高性能Vitality架构GPU IP系列 支持DirectX 12和先进的计算能力
- NXP 2.5亿美元收购Aviva,但车载SerDes领域依然处于战国时期
- 应对 AI 时代的云工作负载,开发者正加速向 Arm 架构迁移