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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4986|回復: 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或呢?
     


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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轉的匯編有些是真的很麻煩。
回復

使用道具 舉報

5#
ID:215268 發表于 2017-6-28 17:01 | 只看該作者
可能是編的程序不對
回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

7#
ID:215568 發表于 2017-6-28 18:01 | 只看該作者
//延時 void Delay(WORD n){              WORD x;          while(n--)           {      x=500;   while(x--);  }         }
回復

使用道具 舉報

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

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

使用道具 舉報

9#
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之間。
回復

使用道具 舉報

10#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区在线观看 | 日韩图区| 精品国产女人 | 久久中文一区二区 | 国产精品99久久久久久宅男 | 中文字幕视频在线看5 | 日韩电影免费在线观看中文字幕 | 成年免费大片黄在线观看一级 | 成人免费精品视频 | 亚洲乱码国产乱码精品精98午夜 | 91精品国产91久久久 | 青青草视频网站 | 精品免费国产一区二区三区 | 久草福利| 亚洲电影成人 | 欧美一级二级三级 | 91视视频在线观看入口直接观看 | 男人电影天堂 | 一区二区免费 | 一区二区三区精品视频 | 中文在线一区二区 | 男人的天堂在线视频 | 国产精品中文字幕在线观看 | 天堂va在线 | 久久久久久久国产 | 99精品国产一区二区青青牛奶 | 免费艹逼视频 | 91精品国产综合久久婷婷香蕉 | 国产精品美女久久久久久免费 | 欧美一区二区三区免费在线观看 | 日本aaa视频| 欧美久久精品一级黑人c片 91免费在线视频 | 国产日韩欧美在线播放 | 国产午夜精品福利 | 日韩av中文 | 国产aa| 亚洲精品一区二三区不卡 | 国产高清美女一级a毛片久久w | 在线免费亚洲视频 | 日韩精品一区二区三区在线播放 | 久久精品国产久精国产 |