在溫度測量程序中,有如下代碼:
TMDAT = 0; //總線拉低
delay = 250;
while (--delay); //延時500us
TMDAT = 1; //拉高總線
而根據選用的晶振11.0592MHz,則晶振周期為Tosc = 1/fosc = 1/(11.0592*1000*1000) = 0.09042us,而機器周期為Tcy=12*Tosc=1.085us,一般一條指令執行周期是1到2個機器周期,也就是1.085us到2.170us。
上面代碼中延時程序部分,翻譯成匯編語言大致為:
mov r2,#0xFA // 250
mov r3,#0x00
00101$:
mov ar4,r2 2
mov ar5,r3 2
dec r2 1
cjne r2,#0xff,00108$ 2
dec r3 1
00108$:
mov a,r4 2
orl a,r5 1
jnz 00101$ 2
循環部分為13*250個機器周期,所以紅色代碼部分總共的機器周期為:13*250 + 4=3254個機器周期,所以延時大約為(13*250+4)*Tcy=3254*1.085=3530.59us,也就是延時了3500微秒,比注釋中的長大約7倍。
不知道我分析得對不對?
你分析得很對,對于c51的延時我們必須要轉化為匯編代碼后分析每一條指令的執行時間,而且最好是用12m 的晶振這樣便于計算一些.ds18b20的時序 不是太嚴格,所以大多數情況下11.0592 和 12m的都能用,
有一個方法可以粗略的驗證一下你的分析是否正確,就是把這個代碼調用1000次,然后對著手表看,是不是35秒執行完畢.
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |