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

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

 

因为对郭天祥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   R需要一步就可以完成

 

 

 

 

 

 

 

则完成for( j = 0; j < 110; j++);所用时间为 0.00033200

利用此种方式可以达到延时一秒的效果:

 

 

 

 

 

为什么郭天祥的单片机书上延时一秒的函数是

for( i = 0; i < 1000; i++)

for( j = 0; j < 110; j++);

原因是51书上定义的ij变量类型为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

【若R5110,则A0

   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

; }

 

 

你可能感兴趣的:(89C51)