關於郭天祥單片機書上第四十七頁延時函數的相關計算問題

關於郭天祥單片機書上第四十七頁延時函數的相關計算問題

 

因爲對郭天祥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

; }

 

 

發佈了29 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章