關於郭天祥單片機書上第四十七頁延時函數的相關計算問題
因爲對郭天祥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
; }