您的位置:網站首頁 > 電器維修資料網 > 正文 >
51單片機的延時子程序
來源: 日期:2013-12-18 14:02:40 人氣:標簽:
延時程序在單片機編程中使用非常廣泛,但一些讀者在學習中不知道延時程序怎么編程,不知道機器周期和指令周期的區別,不知道延時程序指令的用法,下面就此問題從延時程序的基本概念、機器周期和指令周期的區別和聯系、相關指令的用法等用圖解法的形式詳盡的解答。
我們知道程序設計是單片機開發 重要的工作,而程序在執行過程中常常需要完成延時的功能。例如在交通燈的控制程序中,需要控制紅燈亮的時間持續30秒,就可以通過延時程序來完成。延時程序是如何實現的呢?下面讓我們先來了解一些相關的概念。
一、機器周期和指令周期
1.機器周期是指單片機完成一個基本操作所花費的時間,一般使用微秒來計量單片機的運行速度,51單片機的一個機器周期包括12個時鐘振蕩周期,也就是說如果51單片機采用l2mhz晶振,那么執行一個機器周期就只需要1μs;如果采用的是6mhz的晶振,那么執行一個機器周期就需要2μs。
2.指令周期是指單片機執行一條指令所需要的時間,一般利用單片機的機器周期來計量指令周期。在51單片機里有單周期指令(執行這條指令只需一個機器周期),雙周期指令(執行這條指令只需要兩個機器周期),四周期指令(執行這條指令四個機器周期)。除了乘、除兩條指令是四周期指令,其余均為單周期或雙周期指令。也就是說,如果51單片機采用的是12mhz晶振,那么它執行一條指令一般只需1~2微秒的時間;如果采用的是6mh品振,執行一條指令一般就需2~4微秒的時間。
現在的單片機有很多種型號,但在每個型號的單片機器件手冊中都會詳細說明執行各種指令所需的機器周期,了解以上概念后,那么可以依據單片機器件手冊中的指令執行周期和單片機所用晶振頻率來完成需要精確延時時間的延時程序。
二、延時指令
在單片機編程里面并沒有真正的延時指令,從上面的概念中我們知道單片機每執行一條指令都需要一定的時間,所以要達到延時的效果,只須讓單片機不斷地執行沒有具體實際意義的指令,從而達到了延時的效果。
1.數據傳送指令 mov
數據傳送指令功能是將數據從一個地方復制、拷貝到另一個地方。如:movr7,#80h;將數據80h送到寄存器r7,這時寄存器r7里面存放著80h,就單這條指令而言并沒有任何實際意義,而執行該指令則需要一個機器周期。
2.空操作指令 nop
空操作指令功能只是讓單片機執行沒有意義的操作,消耗一個機器周期。
3.循環轉移指令 dinz
循環轉移指令功能是將第一個數進行減1并判斷是否為0,不為0則轉移到指定地點;為0則往下執行。
如:dinzr7,kk;將寄存器r7的內容減1并判斷寄存器r7里的內容減完1后是否為0,如果不為0則轉移到地址標號為kk的地方;如果為0則執行下一條指令。這條指令需要2個機器周期。
利用以上三條指令的組合就可以比較精確地編寫出所需要的延時程序。
三、1秒延時子程序、流程圖及時間計算(以單片機晶振為l2mhz為例,1個機器周期需要1μs)
了解了以上的內容,現在讓我們來看看
程序總共所需時間:1+10+2560+330240+660480+5120+20+2=998433μs≈1s在這里運行這段程序共需998433μs,還差1567μs才達到is的,所以想要達到完美的1s延時,需要在返回指令ret前再添加一些指令讓它把1567μs的延時完成。有興趣的話可以自己試著添加完成。
后補充一點,編寫程序時一般將延時程序編寫成獨立的子程序,而所謂子程序也就是一個實現某個功能的小模塊。這樣在主程序中就可以方便地反復調用編寫好的延時子程序。
提示:循環轉移指令(dinz)除了可以給定地址標號讓其跳轉外,還可以將地址標號改成$,這樣程序就跳回本指令執行。例如:
djnzr7,$;r7內容減1不為0,則再次執行本指令;為0則往下執行,當r7的值改為10時,則執行完該條程序所需的時間為2*10=20μs。
【看看這篇文章在百度的收錄情況】