<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201611/321877.htm

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

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

在交通燈的控制程序中,需要控制紅燈亮的時(shí)間持續30秒,就可以通過(guò)延時(shí)程序來(lái)完成。延時(shí)程序是如何

實(shí)現的呢?下面讓我們先來(lái)了解一些相關(guān)的概念。

一、機器周期和指令周期

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

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

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

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

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

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

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

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

現在的單片機有很多種型號,但在每個(gè)型號的單片機器件手冊中都會(huì )詳細說(shuō)明執行各種指令所需的機

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

需要精確延時(shí)時(shí)間的延時(shí)程序。

二、延時(shí)指令

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

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

的效果。

1.數據傳送指令 MOV

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

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

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

2.空操作指令 NOP

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

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

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

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

不為0 則轉移到地址標號為KK 的地方;如果為0 則執行下一條指令。這條指令需要2 個(gè)機器周期。

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

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

了解了以上的內容,現在讓我們來(lái)看看

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

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

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

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

的小模塊。這樣在主程序中就可以方便地反復調用編寫(xiě)好的延時(shí)子程序。

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

程序就跳回本指令執行。例如:

DJNZ R7,$ ;R7 內容減1 不為0,則再次執行本指令;為0 則往下執行,當R7 的值改為10

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

51單片機匯編延時(shí)程序算法詳解

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

指令周期、機器周期與時(shí)鐘周期

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

  時(shí)鐘周期:也稱(chēng)為振蕩周期,一個(gè)時(shí)鐘周期 =晶振的倒數。

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

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

  程序分析

  例1 50ms 延時(shí)子程序:

  DEL:MOV R7,#200 ①

  DEL1:MOV R6,#125 ②

  DEL2:DJNZ R6,DEL2 ③

  DJNZ R7,DEL1 ④

  RET ⑤

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

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

  =50603μs

  ≈50ms

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

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

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

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

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

  例2 1秒延時(shí)子程序:

  DEL:MOV R7,#10 ①

  DEL1:MOV R6,#200 ②

  DEL2:MOV R5,#248 ③

  DJNZ R5,$ ④

  DJNZ R6,DEL2 ⑤

  DJNZ R7,DEL1 ⑥

  RET ⑦

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

   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

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

  此式適用三層循環(huán)以?xún)鹊某绦?,也驗證了例1中式⑦(第三層循環(huán)相當于1)的成立。

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

  例3仍以1秒延時(shí)為例

  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

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

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

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

單片機延時(shí)子程序

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

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

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

缺點(diǎn)就是算有點(diǎn)復雜.

DELAY20MS:

MOV R7,#4

D1:

MOV R6,#248

DJNZ R6,$

DJNZ R7,D1

NOP

NOP

RET

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

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

;延時(shí)10uS

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

time10us:movr5,#05h;11us

djnzr5,$

ret

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

;延時(shí)50uS

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

time50us:movr5,#19h;51us

djnzr5,$

ret

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

;延時(shí)100uS

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

time100us:movr5,#31h;99.6us

djnzr5,$

ret

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

;延時(shí)200uS

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

time200us:movr5,#64h;201us

djnzr5,$

ret

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

;延時(shí)250uS

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

time250us:movr5,#7ch;249.6us

djnzr5,$

ret


上一頁(yè) 1 2 下一頁(yè)

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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>