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