配套光盘提供入门所需的多个实例(有原理说明及相关知识点),几乎每个实例都有视频演示(个别以图片形式呈现)。
源代码一览:
配套光盘对实例的分析示例:
实验目的:
利用指令执行时间固定的原理实现精确延时,用数码管显示0~9秒计时。
在《定时器实验—利用定时器延时》中我们得用定时器来实现了比较精确的延时,我们还可以利用指令执行时间得到非常精确的延时,其实在之前的好几个实例中都用到了利用指令执行时间来延时,只是没有精确进行计算过而已。
不同的指令执行的时间都固定,比如执行MOVA,#35H这条指令所需时间为1个机器周期,执行DJNZ指令的时间均为2个机器周期,而机器周期=12/晶振频率,如果使用12MHz的晶振,则机器周期=12/12000000=1us。
我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到10时,就自动返回到0,从新计数。一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1秒时间为0.9983秒(以12MHz晶振为例)。产生一秒延时的程序如下:
- DELY1S:
- MOV R5,#100
- D2:
- MOV R6,#20
- D1:
- MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- DJNZ R5,D2
对于C语言实现软件延时的难点在于需要确定编译后生成的代码是什么,例如下面一段C程序:
- unsigned char a;
- for(a=3;a>0;a--);
在Keil环境下编译后得到如下汇编代码:
- MOV R7,#0x03
- LOOP:
- DJNZ R7,LOOP
计算此汇编代码的执行时间为10us(晶振11.0592MHz)。
根据这一原理,出现了一些自动生成延时代码的工具,使用非常方便,这里给出其中一个工具:单片机工具集
辅助资料:
汇编指令及其执行时间
流程图:
结果演示:(配套光盘才可播放视频)