亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 51單片機延時 [打印本頁]

作者: sirius2015    時間: 2017-6-28 10:46
標(biāo)題: 51單片機延時
void delay(unsigned int n)
{
    while(n--);
}

void main()
{
   delay(10);       
}

delay(10)是延時多長時間的?在晶振是12M的情況下


我用KEIL 查,轉(zhuǎn)成的匯編如下:

main 函數(shù)

C:0x0020    7F03     MOV      R7,#0x03
C:0x0022    7E00     MOV      R6,#0x00
C:0x0024    020003   LJMP     delay(C:0003)
C:0x0027    00       NOP      
C:0x0028    00       NOP   


     3: void delay(unsigned int n)
     4: {
     5:         while(n--);
C:0x000F    EF       MOV      A,R7
C:0x0010    1F       DEC      R7
C:0x0011    AC06     MOV      R4,0x06
C:0x0013    7001     JNZ      C:0016
C:0x0015    1E       DEC      R6
C:0x0016    4C       ORL      A,R4
C:0x0017    70F6     JNZ      delay(C:000F)
     6: }
     7:  
C:0x0019    22       RET      


從上述匯編中可以看到,n每次執(zhí)行一遍,需要大概4條單周期指令+2條雙周期指令,也就沒每次延時 8μ秒
所以10次的話,那就是 8*10 + 4 + 2
其中4為函數(shù)參數(shù)入棧和跳轉(zhuǎn),2位函數(shù)返回。

問題
1)不知道這樣理解對不對?
2)另外,不知道KEIL生產(chǎn)hex的時候,會不會對匯編再進(jìn)行優(yōu)化?
2)C:0x0011    AC06     MOV      R4,0x06 沒看明白這條匯編有什么用,為什么將0x06放入R4,為什么是0x06,為什么是R4?
     C:0x0016    4C       ORL      A,R4. 這條也不明白,直接判斷A是否為0不就得了,為什么還要與R4或呢?
     



作者: hzlsw1    時間: 2017-6-28 13:04
你簡單問題復(fù)雜化,你用調(diào)試模式直接可以看大概延時多久有必要這樣嗎
作者: zhczlzhang    時間: 2017-6-28 16:11
1)delay(10)是延時多長時間的,首先我可以告訴你,不知道。
為什么呢?那是因為在你的這個程序中,delay是做變量運算的,你的單片機是高速單片機,這個delay10就快,是低速單片機就慢。
所以它不是精確延時,只能說是模糊延時,想精確延時,就用定時器,這樣可以算出來具體時間。
2)KEIL生產(chǎn)hex的時候,會不會對匯編再進(jìn)行優(yōu)化?這個問題keil只是對你的程序進(jìn)行匯編,至于優(yōu)化在51版本里,我沒聽說過,在MDK版本里我聽說過。所以要看版本。
3)你的匯編我不太懂,建議你去看匯編語言這本書,里面有詳細(xì)講解。
作者: ahshmj    時間: 2017-6-28 16:59
keil轉(zhuǎn)的匯編有些是真的很麻煩。
作者: adidlas    時間: 2017-6-28 17:01
可能是編的程序不對
作者: 夢孤城    時間: 2017-6-28 17:43
延時要根據(jù)晶振頻率來計算,12M的晶振也即是時鐘周期為83.3ns,然后再根據(jù)數(shù)據(jù)的讀取延時來計算準(zhǔn)確的延時時間。在單片機中,一個時鐘節(jié)拍執(zhí)行一條代碼,執(zhí)行10次也即是833ns,再根據(jù)板上布線延時,所以延時時間還會更長一些。但是在51中想要知道確切的延時的話,使用仿真芯片在Keil中進(jìn)行仿真就可以了
作者: 柳千刀    時間: 2017-6-28 18:01
//延時 void Delay(WORD n){              WORD x;          while(n--)           {      x=500;   while(x--);  }         }
作者: sirius2015    時間: 2017-6-29 10:40
夢孤城 發(fā)表于 2017-6-28 17:43
延時要根據(jù)晶振頻率來計算,12M的晶振也即是時鐘周期為83.3ns,然后再根據(jù)數(shù)據(jù)的讀取延時來計算準(zhǔn)確的延時 ...

嗯,12M晶振的話,對于C51來說,一個指令周期=一個機器周期=12個時鐘周期,也就是1μs。加上些線的延時,可能稍微延長些。
作者: sirius2015    時間: 2017-6-29 10:47
zhczlzhang 發(fā)表于 2017-6-28 16:11
1)delay(10)是延時多長時間的,首先我可以告訴你,不知道。
為什么呢?那是因為在你的這個程序中,delay ...

我其實也沒要求很精確,就一個模糊的值,就行。我再看吳鑒英C51開發(fā)板里面的DS18B20的代碼,里面有很多關(guān)于時序的操作,要延時多長時間。

delay(5); 說是延時大概44us
delay(20); 說是延時大概140us
delay(80); 說是延時大概530us

我感覺每一個是6-9之間的樣子,相差是不是有點大。我原以為應(yīng)該在8-9之間。

作者: yzwzfyz    時間: 2017-6-30 01:18
關(guān)于“MOV      R4,0x06”
因為沒有:MOV   R4, R6 這條指令,而0x06在CPU復(fù)位后,與R6是等價的。

關(guān)于“ORL      A,R4. 這條也不明白,直接判斷A是否為0不就得了,為什么還要與R4或呢?”
因為:前面A取的是R7,如果直接判斷A,就是看R7是否為0,“與R4或”之后,就是判斷R7、R4同時為0。

C在編譯時(轉(zhuǎn)匯編)是很“蠢”的,不如自己寫的爽。




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1