久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4941|回復: 9
收起左側

51單片機延時

[復制鏈接]
ID:208445 發表于 2017-6-28 10:46 | 顯示全部樓層 |閱讀模式
void delay(unsigned int n)
{
    while(n--);
}

void main()
{
   delay(10);       
}

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


我用KEIL 查,轉成的匯編如下:

main 函數

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每次執行一遍,需要大概4條單周期指令+2條雙周期指令,也就沒每次延時 8μ秒
所以10次的話,那就是 8*10 + 4 + 2
其中4為函數參數入棧和跳轉,2位函數返回。

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


回復

使用道具 舉報

ID:207702 發表于 2017-6-28 13:04 來自手機 | 顯示全部樓層
你簡單問題復雜化,你用調試模式直接可以看大概延時多久有必要這樣嗎

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:214628 發表于 2017-6-28 16:11 | 顯示全部樓層
1)delay(10)是延時多長時間的,首先我可以告訴你,不知道。
為什么呢?那是因為在你的這個程序中,delay是做變量運算的,你的單片機是高速單片機,這個delay10就快,是低速單片機就慢。
所以它不是精確延時,只能說是模糊延時,想精確延時,就用定時器,這樣可以算出來具體時間。
2)KEIL生產hex的時候,會不會對匯編再進行優化?這個問題keil只是對你的程序進行匯編,至于優化在51版本里,我沒聽說過,在MDK版本里我聽說過。所以要看版本。
3)你的匯編我不太懂,建議你去看匯編語言這本書,里面有詳細講解。

評分

參與人數 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:7485 發表于 2017-6-28 16:59 | 顯示全部樓層
keil轉的匯編有些是真的很麻煩。
回復

使用道具 舉報

ID:215268 發表于 2017-6-28 17:01 | 顯示全部樓層
可能是編的程序不對
回復

使用道具 舉報

ID:215559 發表于 2017-6-28 17:43 | 顯示全部樓層
延時要根據晶振頻率來計算,12M的晶振也即是時鐘周期為83.3ns,然后再根據數據的讀取延時來計算準確的延時時間。在單片機中,一個時鐘節拍執行一條代碼,執行10次也即是833ns,再根據板上布線延時,所以延時時間還會更長一些。但是在51中想要知道確切的延時的話,使用仿真芯片在Keil中進行仿真就可以了

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:215568 發表于 2017-6-28 18:01 | 顯示全部樓層
//延時 void Delay(WORD n){              WORD x;          while(n--)           {      x=500;   while(x--);  }         }
回復

使用道具 舉報

ID:208445 發表于 2017-6-29 10:40 | 顯示全部樓層
夢孤城 發表于 2017-6-28 17:43
延時要根據晶振頻率來計算,12M的晶振也即是時鐘周期為83.3ns,然后再根據數據的讀取延時來計算準確的延時 ...

嗯,12M晶振的話,對于C51來說,一個指令周期=一個機器周期=12個時鐘周期,也就是1μs。加上些線的延時,可能稍微延長些。
回復

使用道具 舉報

ID:208445 發表于 2017-6-29 10:47 | 顯示全部樓層
zhczlzhang 發表于 2017-6-28 16:11
1)delay(10)是延時多長時間的,首先我可以告訴你,不知道。
為什么呢?那是因為在你的這個程序中,delay ...

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

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

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

使用道具 舉報

ID:123289 發表于 2017-6-30 01:18 | 顯示全部樓層
關于“MOV      R4,0x06”
因為沒有:MOV   R4, R6 這條指令,而0x06在CPU復位后,與R6是等價的。

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久国产一区二区 | 国产91精品久久久久久久网曝门 | 国产精品成人一区二区三区吃奶 | 狠狠干av | 日韩欧美精品 | 成人不卡在线 | 成人字幕网zmw | 欧美成人精品一区二区三区 | 天堂久久一区 | 久久久福利 | 亚洲一区二区电影网 | 婷婷久| 欧美激情久久久 | 91精品国产乱码久久久久久久久 | 91资源在线播放 | 在线视频一区二区 | 精品一区二区久久久久久久网站 | 国产高清视频 | 中文字幕91av | 91精品国产91久久久久福利 | 色视频在线免费观看 | 国产成人精品久久二区二区91 | 一级黄色片网址 | 国产婷婷在线视频 | 日韩免费高清视频 | 欧美成人一区二区 | 在线观看中文字幕 | 中文字幕综合 | 久草在线免费资源 | 亚洲午夜av久久乱码 | 亚洲激情一区二区 | 国产一区二区三区免费观看视频 | a视频在线播放 | 精品国产乱码久久久久久中文 | 国产精品久久久久久久7777 | 色综合一区二区三区 | 黄色a视频 | 久久伊人免费视频 | 99热热精品| 国产农村一级片 | 91精品国产乱码久久久久久久 |