关于郭天祥单片机书上第四十七页延时函数的相关计算问题
因为对郭天祥51单片机书上的延时函数赶到费解,特撰此文。
程序:
Unsigned char j;
for( j = 0; j < 110; j++);
计算一个for循环的延时。
调试步骤:
第一步:程序运行到for语句之前花了0.00038900秒启动并定义变量j
第二步:程序运行完for语句共花了(0.00072100--0.0038900)秒
程序汇编代码为
for( j = 0; j < 110; j++);
?C0011:
INC R7 【R7自增(j++)】
CJNE R7,#06EH,?C0011 【判断并跳转,若R6=110继续往下执行,若不等,跳转 到?C0004(循环110次)】
一个指令周期 = 4个机器周期
一个机器周期 = 12个时钟周期
一个时钟周期 = 1/(12MHz)秒
执行for时间为:(0.00072100--0.0038900)= 0.00033200秒
时钟周期个数为:0.00033200/(1/12M)=332*12个
机器周期个数为:332个【机器周期定义为在一个操作周期内,单片机完成一项基本操作,如取指令,存储器读/写等】
上述汇编中
第一步:j = 0;【两条汇编指令,两个单周期单字节指令消耗两个机器周期】
第二步:循环110次【两条汇编指令,消耗三个机器周期(INC为单字节指令只消耗一个机器周期,而CJNE为双字节指令,消耗两个指令周期)】
消耗机器周期总数为:2+3*110 = 332个 与 调试结果相符!!!
即可得出结论:程序运行时间 = 绝对机器指令个数 * 晶振频率的倒数。
绝对机器指令个数是汇编指令展开后的机器指令 。
51单片机由一条总线构成,则不是哈佛结构,不会采用多级流水线来处理指令。【从目前这个角度来看,51单片机的内部指令运行方式不能依照《微机原理》分析,与80x86体系结构不同,内部指令编码格式,指令操作流程是不同的】
正常情况下完成一个汇编指令需要两步:取指令,执行指令。【机器周期定义为在一个操作周期内,单片机完成一项基本操作,如取指令,存储器读/写等】
CJNE R7,#06EH,?C0011需要两步完成
而INC R7 需要一步就可以完成
则完成for( j = 0; j < 110; j++);所用时间为 0.00033200秒
利用此种方式可以达到延时一秒的效果:
为什么郭天祥的单片机书上延时一秒的函数是
for( i = 0; i < 1000; i++)
for( j = 0; j < 110; j++);
原因是51书上定义的i和j变量类型为unsigned int。书上第四十七页讲到“因为变量类型不同,单片机运行所需时间就不同”。这可以从附录二《unsigned int》中看出定义int型变量时,汇编代码会多一些,对应的指令操作就多一些,再一展开,执行完延时函数对应的指令时间也能证明延时函数的准确性。
结论:程序运行时间 = 绝对机器指令个数 乘 晶振频率的倒数。
绝对机器指令个数是汇编指令展开后的机器指令 。
本人对于附录二里面有些指令不是很熟,目前无法解读。附录上的汇编指令在微机原理书上全部都有,感觉很对不起微机老师!还需加强学习!对于上文肯定有错误之处,希望读者之处,对于附录二的汇编指令若有兴趣,请为我解读一下。
Unsigned char【附录一】
?C0001:
; for( j = 0; j < 110; j++);
; SOURCE LINE # 10
;---- Variable 'j?041' assigned to Register 'R6' ----
CLR A
MOV R6,A
?C0004:
INC R6 【R6自增(j++)】
CJNE R6,#06EH,?C0004
【判断跳转,若R6=110继续往下执行,若不等,跳转到?C0004(循环110次)】
?C0003:
INC R7
CJNE R7,#06EH,?C0001
; }
Unsigned int【附录二】
?C0001:
; for( j = 0; j < 110; j++);
; SOURCE LINE # 10
;---- Variable 'j?041' assigned to Register 'R4/R5' ----
CLR A 【清零】
MOV R5,A
MOV R4,A
?C0004:
INC R5 【自增1】
CJNE R5,#00H,?C0008 【判断跳转,若R5=0继续往下执行,若不等,跳转到?C0008】
INC R4
?C0008:
MOV A,R5
XRL A,#06EH
【逻辑异或指令,即相对应的二进制位不同该位异或后的结果是1,相同则为0。】
【若R5为110,则A为0】
ORL A,R4 【ORL或指令,若。。。。。。】
JNZ ?C0004
?C0003:
INC R7
CJNE R7,#00H,?C0009
INC R6
?C0009:
MOV A,R7
XRL A,#06EH
ORL A,R6
JNZ ?C0001
; }