<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è) > 嵌入式系統 > 學(xué)習方法與實(shí)踐 > 匯編延時(shí)程序算法詳解

匯編延時(shí)程序算法詳解

——
作者:姜會(huì )敏 時(shí)間:2008-01-15 來(lái)源:嵌入式技術(shù)網(wǎng) 收藏

 

        計算機反復執行一段以達到的目的稱(chēng)為軟件,應用中經(jīng)常需要短時(shí)間。

        有時(shí)要求很高的精度,網(wǎng)上或書(shū)中雖然有現成的公式可以套用,但在部分講解中發(fā)現有錯誤之處,而且延時(shí)的具體講得并不清楚,相當一部分人對此仍很模糊,授人魚(yú),不如授之以漁,本文將以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)型程序的算法并加以運用。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(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>