<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

      單片機匯編延時程序的理解

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2017-5-20

      單片機匯編實現延遲的程序代碼:

      DELAY: MOV R7,#250 ;

      D1: MOV R6,#250 ;

      D2: DJNZ R6,D2 ;

      DJNZ R7,D1 ;

      RET

       

              如果用高級語言編程,只需要簡單地調用延時函數就可以實現,但是計算機具體是怎么實現的呢?要想知其所以然,還得從匯編開始學起。

              冒號前面的“DELAY”、“D1”、“D2”為語句行的名字,是為了程序的條件語句跳轉用的,分號后面為注釋,計算機執行時將過濾掉這些信息,最大限度減少代碼長度,提高效率。

      DELAY: MOV R7,#250 ; 名字為“DELAY”的語句:意思是將CPU內部內存RAM的R7位置填寫為250(原來為0,為什么是0呢?因為任何程序開始執行前都要復位,就像我們打算盤要將算子復位一樣,或者我們用沙盤寫字,要將沙盤抹平類似)

      D1: MOV R6,#250 ; 名字為“D1”的語句:將R6位置填寫為250

      D2: DJNZ R6,D2 ; 名字為“D2”的語句:將R6位置的250減1,如果為0就繼續執行下一條,不為0就繼續執行D2這一句,因為R6=250,所以這個語句要原地踏步執行250次!

      DJNZ R7,D1 ; 這句沒有名字,因為沒有別的語句要跳到這里,所以就省略了。R7同樣等于250,但它不是原地踏步,而是跳回了D1,這么干,D!、D2和本句將被循環執行250遍,需要強調的是:D2語句自身每次都要執行250遍,也就是執行了250*250=62500遍!

      RET ;子程序結束(因為延時程序一般不作為獨立程序存在,它只是一個子程序,也就是高級語言中的一個函數,看到這個字符,子程序將跳回到母程序,進行下一步)。

       

              這個子程序這么反復地循環指令,到底有什么意義呢?又是怎么實現的延時程序呢?說起來計算機真是有點笨,它是*數程序執行的次數來累加時間的!也就是說語句本身就是為了浪費時間!哈哈,可笑吧?這就像你沒有鐘表,但是你知道你跑操場一圈是一分鐘,然后就繞著操場跑了60圈,時間過了正好一小時一樣。

              如果是人的話,誰也不會笨到干這么累的活兒來計時,但計算機不一樣,它不論靜止還是運動,程序總是一拍一拍地運行著,所以它不累。

       

              那么,計算機執行一個語句耗費的時間是多少呢?

              以51型單片機為例:如果采用12MHz的晶振,運行一個機器周期為1微秒,具體為什么暫時不管。單片機的指令系統分為單周期、雙周期和三周期指令(三周期實際上占用四個周期,多余一個周期浪費掉),這是有指令的內容決定的,內容多的單周期執行不完,肯定要延長了。子程序里面的MOV是單周期、DJNZ是雙周期。

       

              這樣,我們就可以算算這個子程序累計進行了多少個周期,然后乘以1微秒,就算出它占用的時間,也就是延時的時長了!

              第一句:DELAY: MOV R7,#250 ;執行了一次,沒有任何語句跳轉給它,單周期。1

              第二句:D1: MOV R6,#250 ;執行了250次,全部是第四句跳過來的,單周期。250

              第三句:D2: DJNZ R6,D2 ;原地執行了250次,從第二句順延(第二句執行完,沒有其它跳轉的話肯定要執行第三句)過來250次,也就是250*250=62500次,雙周期*2。125000

              第四句:DJNZ R7,D1 ; 從第三句順延過來250次,雙周期*2。500

              總計:1+250+125000+500=1257501次,乘以1微秒,換算約為0.13秒。

              我們可以通過調整R6、R7的數值來調整延時的長度。事實上,8位計算機中,R6之類的工作寄存器地址最大只能放下255的十進制數值,因此要通過上述程序達到更長的延時是辦不到的。

              那怎么辦呢?

              我們可以再增加一個R4,讓上述的程序最多可以循環255遍,這樣,0.13秒的200多倍就是30秒上下了,不夠的話再增加循環,又可以擴大200多倍,當然,工作寄存器的數量是有限的,因此這個延時程序也是有限的,如果還不夠用怎么辦呢,就目前我所學的知識,只能在母程序里面設置循環了,也就是讓這個子程序在母程序里面繼續循環......
       

      Tags:單片機匯編延時程序的理解,單片機教程  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 九色综合狠狠综合久久| 久久婷婷五月综合尤物色国产| 伊伊人成亚洲综合人网7777| 色与欲影视天天看综合网| 亚洲婷婷第一狠人综合精品| 色综合久久天天综合观看| 亚洲综合一区二区精品导航| 色天天综合色天天看| 亚洲精品综合一二三区在线| 国产精品免费综合一区视频| 色综合久久综合中文综合网| 老色鬼久久综合第一| 国产香蕉久久精品综合网| 久久―日本道色综合久久| 一本一道久久a久久精品综合| 亚洲香蕉网久久综合影视| 色综合无码AV网站| 亚洲综合久久精品无码色欲| 一本色道久久99一综合| 综合无码一区二区三区| 亚洲a无码综合a国产av中文| 色综合久久最新中文字幕| 老色鬼久久亚洲AV综合| 狠狠色丁香婷婷综合久久来| 综合网日日天干夜夜久久| 一本丁香综合久久久久不卡网站| 一本一道久久综合久久| 亚洲精品综合久久中文字幕| 婷婷久久香蕉五月综合加勒比| 精品无码综合一区| 亚洲人成伊人成综合网久久久| 免费国产综合视频在线看| 色综合久久88色综合天天 | 天天做.天天爱.天天综合网| 色噜噜狠狠色综合成人网| 狠狠爱天天综合色欲网| 久久影视综合亚洲| 国产婷婷综合丁香亚洲欧洲| 麻豆久久婷婷五月综合国产| 三级韩国一区久久二区综合| 久久乐国产精品亚洲综合|