您的位置:首页 > 其它

关于郭天祥单片机书上第四十七页延时函数的相关计算问题

2013-10-09 19:59 239 查看
关于郭天祥单片机书上第四十七页延时函数的相关计算问题

 

因为对郭天祥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
; }
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息