<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 談?wù)?1單片機延時子程序

          談?wù)?1單片機延時子程序

          作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          延時程序在單片機編程中使用非常廣泛,但一些讀者在學(xué)習(xí)中不知道延時程序怎么編程,不知道機器

          周期和指令周期的區(qū)別,不知道延時程序指令的用法, ,本文就此問題從延時程序的基本概念、機器周期和指

          本文引用地址:http://www.ex-cimer.com/article/201611/321877.htm

          令周期的區(qū)別和聯(lián)系、相關(guān)指令的用法等用圖解法的形式詳盡的回答讀者

          我們知道程序設(shè)計是單片機開發(fā)最重要的工作,而程序在執(zhí)行過程中常常需要完成延時的功能。例如

          在交通燈的控制程序中,需要控制紅燈亮的時間持續(xù)30秒,就可以通過延時程序來完成。延時程序是如何

          實現(xiàn)的呢?下面讓我們先來了解一些相關(guān)的概念。

          一、機器周期和指令周期

          1.機器周期是指單片機完成一個基本操作所花費的時間,一般使用微秒來計量單片機的運行速度,

          51 單片機的一個機器周期包括12 個時鐘振蕩周期,也就是說如果51 單片機采用12MHz 晶振,那么執(zhí)行

          一個機器周期就只需要1μs;如果采用的是6MHz 的晶振,那么執(zhí)行一個機器周期就需要2 μs。

          2 .指令周期是指單片機執(zhí)行一條指令所需要的時間,一般利用單片機的機器周期來計量指令周期。

          在51 單片機里有單周期指令(執(zhí)行這條指令只需一個機器周期),雙周期指令(執(zhí)行這條指令只需要兩個

          機器周期),四周期指令(執(zhí)行這條指令需要四個機器周期)。除了乘、除兩條指令是四周期指令,其余均

          為單周期或雙周期指令。也就是說,如果51 單片機采用的是12MHz 晶振,那么它執(zhí)行一條指令一般只需

          1~2 微秒的時間;如果采用的是6MH 晶振,執(zhí)行一條指令一般就需2~4 微秒的時間。

          現(xiàn)在的單片機有很多種型號,但在每個型號的單片機器件手冊中都會詳細(xì)說明執(zhí)行各種指令所需的機

          器周期,了解以上概念后,那么可以依據(jù)單片機器件手冊中的指令執(zhí)行周期和單片機所用晶振頻率來完成

          需要精確延時時間的延時程序。

          二、延時指令

          在單片機編程里面并沒有真正的延時指令,從上面的概念中我們知道單片機每執(zhí)行一條指令都需要一

          定的時間,所以要達(dá)到延時的效果,只須讓單片機不斷地執(zhí)行沒有具體實際意義的指令,從而達(dá)到了延時

          的效果。

          1.?dāng)?shù)據(jù)傳送指令 MOV

          數(shù)據(jù)傳送指令功能是將數(shù)據(jù)從一個地方復(fù)制、拷貝到另一個地方。

          如:MOV R7,#80H;將數(shù)據(jù)80H 送到寄存器R7,這時寄存器R7 里面存放著80H,就單這條

          指令而言并沒有任何實際意義,而執(zhí)行該指令則需要一個機器周期。

          2.空操作指令 NOP

          空操作指令功能只是讓單片機執(zhí)行沒有意義的操作,消耗一個機器周期。

          3.循環(huán)轉(zhuǎn)移指令 DJNZ

          循環(huán)轉(zhuǎn)移指令功能是將第一個數(shù)進(jìn)行減1 并判斷是否為0,不為0 則轉(zhuǎn)移到指定地點;為0 則往下執(zhí)行。

          如:DJNZ R7,KK ;將寄存器R7 的內(nèi)容減1 并判斷寄存器R7 里的內(nèi)容減完1 后是否為0,如果

          不為0 則轉(zhuǎn)移到地址標(biāo)號為KK 的地方;如果為0 則執(zhí)行下一條指令。這條指令需要2 個機器周期。

          利用以上三條指令的組合就可以比較精確地編寫出所需要的延時程序。

          三、1 秒延時子程序、流程圖及時間計算 (以單片機晶振為12MHz 為例,1 個機器周期需要1μs)

          了解了以上的內(nèi)容,現(xiàn)在讓我們來看看

          程序總共所需時間:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S

          在這里運行這段程序共需998433 μs,還差1567μs 才達(dá)到1S 的,所以想要達(dá)到完美的1S 延時,需

          要在返回指令RET 前再添加一些指令讓它把1567μs 的延時完成。有興趣的讀者可以自己試著添加完成。

          最后補充一點,編寫程序時一般將延時程序編寫成獨立的子程序,而所謂子程序也就是一個實現(xiàn)某個功能

          的小模塊。這樣在主程序中就可以方便地反復(fù)調(diào)用編寫好的延時子程序。

          小提示:循環(huán)轉(zhuǎn)移指令(DJNZ )除了可以給定地址標(biāo)號讓其跳轉(zhuǎn)外,還可以將地址標(biāo)號改成$,這樣

          程序就跳回本指令執(zhí)行。例如:

          DJNZ R7,$ ;R7 內(nèi)容減1 不為0,則再次執(zhí)行本指令;為0 則往下執(zhí)行,當(dāng)R7 的值改為10

          時,則執(zhí)行完該條程序所需的時間為2*10=20 μs。

          51單片機匯編延時程序算法詳解

          將以12MHZ晶振為例,詳細(xì)講解MCS-51單片機中匯編程序延時的精確算法。   

          指令周期、機器周期與時鐘周期

            指令周期:CPU執(zhí)行一條指令所需要的時間稱為指令周期,它是以機器周期為單位的,指令不同,所需的機器周期也不同。

            時鐘周期:也稱為振蕩周期,一個時鐘周期 =晶振的倒數(shù)。

            MCS-51單片機的一個機器周期=6個狀態(tài)周期=12個時鐘周期。

            MCS-51單片機的指令有單字節(jié)、雙字節(jié)和三字節(jié)的,它們的指令周期不盡相同,一個單周期指令包含一個機器周期,即12個時鐘周期,所以一條單周期指令被執(zhí)行所占時間為12*(1/12000000)=1μs。

            程序分析

            例1 50ms 延時子程序:

            DEL:MOV R7,#200 ①

            DEL1:MOV R6,#125 ②

            DEL2:DJNZ R6,DEL2 ③

            DJNZ R7,DEL1 ④

            RET ⑤

            精確延時時間為:1+(1*200)+(2*125*200)+(2*200)+2

            =(2*125+3)*200+3 ⑥

            =50603μs

            ≈50ms

            由⑥整理出公式(只限上述寫法)延時時間=(2*內(nèi)循環(huán)+3)*外循環(huán)+3 ⑦

          詳解:DEL這個子程序共有五條指令,現(xiàn)在分別就 每一條指令 被執(zhí)行的次數(shù)和所耗時間進(jìn)行分析。

            第一句:MOV R7,#200 在整個子程序中只被執(zhí)行一次,且為單周期指令,所以耗時1μs

            第二句:MOV R6,#125 從②看到④只要R7-1不為0,就會返回到這句,共執(zhí)行了R7次,共耗時200μs

            第三句:DJNZ R6,DEL2 只要R6-1不為0,就反復(fù)執(zhí)行此句(內(nèi)循環(huán)R6次),又受外循環(huán)R7控制,所以共執(zhí)行R6*R7次,因是雙周期指令,所以耗時2*R6*R7μs。

            例2 1秒延時子程序:

            DEL:MOV R7,#10 ①

            DEL1:MOV R6,#200 ②

            DEL2:MOV R5,#248 ③

            DJNZ R5,$ ④

            DJNZ R6,DEL2 ⑤

            DJNZ R7,DEL1 ⑥

            RET ⑦

            對每條指令進(jìn)行計算得出精確延時時間為:

             1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2

            =[(2*248+3)*200+3]*10+3 ⑧

            =998033μs≈1s

            由⑧整理得:延時時間=[(2*第一層循環(huán)+3)*第二層循環(huán)+3]*第三層循環(huán)+3 ⑨

            此式適用三層循環(huán)以內(nèi)的程序,也驗證了例1中式⑦(第三層循環(huán)相當(dāng)于1)的成立。

            注意,要實現(xiàn)較長時間的延時,一般采用多重循環(huán),有時會在程式序里加入NOP指令,這時公式⑨不再適用,下面舉例分析。

            例3仍以1秒延時為例

            DEL:MOV R7,#10 1指令周期1

            DEL1:MOV R6,#0FFH 1指令周期10

            DEL2:MOV R5,#80H 1指令周期255*10=2550

            KONG:NOP 1指令周期128*255*10=326400

            DJNZ R5,$ 2指令周期2*128*255*10=652800

            DJNZ R6,DEL2 2指令周期2*255*10=5110

            DJNZ R7,DEL1 2指令周期2*10=20

            RET 2

            延時時間=1+10+2550+326400+652800+5110+20+2 =986893μs約為1s

            整理得:延時時間=[(3*第一層循環(huán)+3)*第二層循環(huán)+3]*第三層循環(huán)+3 ⑩

            結(jié)論:針對初學(xué)者的困惑,對匯編程序的延時算法進(jìn)行了分步講解,并就幾種不同寫法分別總結(jié)出相應(yīng)的計算公式,只要仔細(xì)閱讀例1中的詳解,并用例2、例3來加深理解,一定會掌握各種類型程序的算法并加以運用。

          單片機延時子程序

          1)延時為:20ms 晶振12M

          1+(1+2*248+2)*4+1+1+1=20000US=20MS

          用匯編..優(yōu)點就是精確...

          缺點就是算有點復(fù)雜.

          DELAY20MS:

          MOV R7,#4

          D1:

          MOV R6,#248

          DJNZ R6,$

          DJNZ R7,D1

          NOP

          NOP

          RET

          2)一些通過計算51匯編指令得出的軟延時子程序

          ;*****************************************************************

          ;延時10uS

          ;*****************************************************************

          time10us:movr5,#05h;11us

          djnzr5,$

          ret

          ;*****************************************************************

          ;延時50uS

          ;*****************************************************************

          time50us:movr5,#19h;51us

          djnzr5,$

          ret

          ;*****************************************************************

          ;延時100uS

          ;*****************************************************************

          time100us:movr5,#31h;99.6us

          djnzr5,$

          ret

          ;*****************************************************************

          ;延時200uS

          ;*****************************************************************

          time200us:movr5,#64h;201us

          djnzr5,$

          ret

          ;*****************************************************************

          ;延時250uS

          ;*****************************************************************

          time250us:movr5,#7ch;249.6us

          djnzr5,$

          ret


          上一頁 1 2 下一頁

          關(guān)鍵詞: 51單片機延時子程

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();