0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手把手教你寫單片機(jī)定時(shí)器中斷程序

NJ90_gh_bee81f8 ? 來源:未知 ? 作者:李建兵 ? 2018-03-12 16:02 ? 次閱讀

我們在學(xué)單片機(jī)時(shí)我們第一個(gè)例程就是燈的閃爍,那是用延時(shí)程序做的,現(xiàn)在回想起來,這樣做不很恰當(dāng),為什么呢?我們的主程序做了燈的閃爍,就不能再干其它的事了,難道單片機(jī)只能這樣工作嗎?當(dāng)然不是,我們能用定時(shí)器來實(shí)現(xiàn)燈的閃爍的功能。

例1:查詢方式

ORG 0000H

AJMP START

ORG 30H

START:

MOV P1,#0FFH ;關(guān)所 燈

MOV TMOD,#00000001B ;定時(shí)/計(jì)數(shù)器0工作于方式1

MOV TH0,#15H

MOV TL0,#0A0H ;即數(shù)5536

SETB TR0 ;定時(shí)/計(jì)數(shù)器0開始運(yùn)行

LOOP:JBC TF0,NEXT ;如果TF0等于1,則清TF0并轉(zhuǎn)NEXT處

AJMP LOOP ;不然跳轉(zhuǎn)到LOOP處運(yùn)行

NEXT:CPL P1.0

MOV TH0,#15H

MOV TL0,#9FH;重置定時(shí)/計(jì)數(shù)器的初值

AJMP LOOP

END AJMP LOOP

END

鍵入程序,看到了什么?燈在閃爍了,這可是用定時(shí)器做的,不再是主程序的循環(huán)了。簡單地分析一下程序,為什么用JBC呢?TF0是定時(shí)/計(jì)數(shù)器0的溢出標(biāo)記位,當(dāng)定時(shí)器產(chǎn)生溢出后,該位由0變1,所以查詢該位
就可知宇時(shí)時(shí)間是否已到。該位為1后,要用軟件將標(biāo)記位清0,以便下一次定時(shí)是間到時(shí)該位由0變1,所以用了JBC指令,該指位在判1轉(zhuǎn)移的同時(shí),還將該位清0。




以上程序是能實(shí)現(xiàn)燈的閃爍了,可是主程序除了讓燈閃爍外,還是不能做其他的事??!不,不對,我們能在LOOP:……和AJMP LOOP指令之間插入一些指令來做其他的事情,只要保證執(zhí)行這些指令的時(shí)間少于定時(shí)時(shí)間就行了。那我們在用軟件延時(shí)程序的時(shí)候不是也能用一些指令來替代DJNZ嗎?是的,但是那就要求你精確計(jì)算所用指令的時(shí)間,然后再減去對應(yīng)的DJNZ循環(huán)次數(shù),很不方便,而現(xiàn)在只要求所用指令的時(shí)間少于定時(shí)時(shí)間就行,顯然要求低了。當(dāng)然,這樣的辦法還是不好,所以我們常用以下的辦法來實(shí)現(xiàn)。

程序2:用中斷實(shí)現(xiàn)

ORG 0000H,

AJMP START

ORG 000BH ;定時(shí)器0的中斷向量地址

AJMP TIME0 ;跳轉(zhuǎn)到真正的定時(shí)器程序處

ORG 30H

START:

MOV P1,#0FFH ;關(guān)所 燈

MOV TMOD,#00000001B ;定時(shí)/計(jì)數(shù)器0工作于方式1

MOV TH0,#15H

MOV TL0,#0A0H ;即數(shù)5536

SETB EA ;開總中斷允許

SETB ET0 ;開定時(shí)/計(jì)數(shù)器0允許

SETB TR0 ;定時(shí)/計(jì)數(shù)器0開始運(yùn)行

LOOP: AJMP LOOP ;真正工作時(shí),這里可寫任意程序

TIME0: ;定時(shí)器0的中斷處理程序

PUSH ACC

PUSH PSW ;將PSW和ACC推入堆棧保護(hù)

CPL P1.0

MOV TH0,#15H

MOV TL0,#0A0H ;重置定時(shí)常數(shù)

POP PSW

POP ACC

RETI

END

上面的例程中,定時(shí)時(shí)間一到,TF0由0變1,就會引發(fā)中斷,CPU將自動(dòng)轉(zhuǎn)至000B處尋找程序并執(zhí)行,由于留給定時(shí)器中斷的空間只有8個(gè)字節(jié),顯然不足以寫下所有有中斷處理程序,所以在000B處安排一條跳轉(zhuǎn)指令,轉(zhuǎn)到實(shí)際處理中斷的程序處,這樣,中斷程序能寫在任意地方,也能寫任意長度了。進(jìn)入定時(shí)中斷后,首先要保存當(dāng)前的一些狀態(tài),程序中只演示了保存存ACC和PSW,實(shí)際工作中應(yīng)該根據(jù)需要將可能會改變的單元的值都推入堆棧進(jìn)行保護(hù)(本程序中實(shí)際不需保存護(hù)任何值,這里只作個(gè)演示)。

上面的兩個(gè)單片機(jī)程序運(yùn)行后,我們發(fā)現(xiàn)燈的閃爍非常快,根本分辨不出來,只是視覺上感到燈有些晃動(dòng)而已,為什么呢?我們能計(jì)算一下,定時(shí)器中預(yù)置的數(shù)是5536,所以每計(jì)60000個(gè)脈沖就是定時(shí)時(shí)間到,這60000個(gè)脈沖的時(shí)間是多少呢?我們的晶體震蕩器是12M,所以就是60000微秒,即60毫秒,因此速度是非??斓?。如果我想實(shí)現(xiàn)一個(gè)1S的定時(shí),該怎么辦呢?下面給出一個(gè)例程。

ORG 0000H

AJMP START

ORG 000BH ;定時(shí)器0的中斷向量地址

AJMP TIME0 ;跳轉(zhuǎn)到真正的定時(shí)器程序處

ORG 30H

START:

MOV P1,#0FFH ;關(guān)所 燈

MOV 30H,#00H ;軟件計(jì)數(shù)器預(yù)清0

MOV TMOD,#00000001B ;定時(shí)/計(jì)數(shù)器0工作于方式1

MOV TH0,#3CH

MOV TL0,#0B0H ;即數(shù)15536

SETB EA ;開總中斷允許

SETB ET0 ;開定時(shí)/計(jì)數(shù)器0允許

SETB TR0 ;定時(shí)/計(jì)數(shù)器0開始運(yùn)行

LOOP: AJMP LOOP ;真正工作時(shí),這里可寫任意程序

TIME0: ;定時(shí)器0的中斷處理程序

PUSH ACC

PUSH PSW ;將PSW和ACC推入堆棧保護(hù)

INC 30H

MOV A,30H

CJNE A,#20,T_RET ;30H單元中的值到了20了嗎?

T_L1: CPL P1.0 ;到了,取反P10

MOV 30H,#0 ;清軟件計(jì)數(shù)器

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定時(shí)常數(shù)

POP PSW

POP ACC

RETI

END

先自己分析一下,看看是怎么實(shí)現(xiàn)的?這里采用了軟件計(jì)數(shù)器的概念,思路是這樣的,先用定時(shí)/計(jì)數(shù)器0做一個(gè)50毫秒的定時(shí)器,定時(shí)是間到了以后并不是立即取反P10,而是將軟件計(jì)數(shù)器中的值加1,如果軟件計(jì)數(shù)器計(jì)到了20,就取反P10,并清掉軟件計(jì)數(shù)器中的值,不然直接返回,這樣,就變成了20次定時(shí)中斷才取反一次P10,因此定時(shí)時(shí)間就延長了成了20*50即1000毫秒了。

這個(gè)思路在工程中是非常有用的,有的時(shí)候我們需要若干個(gè)定時(shí)器,可51中總共才有2個(gè),怎么辦呢?其實(shí),只要這幾個(gè)定時(shí)的時(shí)間有一定的公約數(shù),我們就能用軟件定時(shí)器加以實(shí)現(xiàn),如我要實(shí)現(xiàn)P10口所接燈按1S每次,而P11口所接燈按2S每次閃爍,怎么實(shí)現(xiàn)呢?對了我們用兩個(gè)計(jì)數(shù)器,一個(gè)在它計(jì)到20時(shí),取反P10,并清零,就如上面所示,另一個(gè)計(jì)到40取反P11,然后清0,不就行了嗎?這部份的程序如下

ORG 0000H

AJMP START

ORG 000BH ;定時(shí)器0的中斷向量地址

AJMP TIME0 ;跳轉(zhuǎn)到真正的定時(shí)器程序處

ORG 30H

START:

MOV P1,#0FFH ;關(guān)所 燈

MOV 30H,#00H ;軟件計(jì)數(shù)器預(yù)清0

MOV TMOD,#00000001B ;定時(shí)/計(jì)數(shù)器0工作于方式1

MOV TH0,#3CH

MOV TL0,#0B0H ;即數(shù)15536

SETB EA ;開總中斷允許

SETB ET0 ;開定時(shí)/計(jì)數(shù)器0允許

SETB TR0 ;定時(shí)/計(jì)數(shù)器0開始運(yùn)行

LOOP: AJMP LOOP ;真正工作時(shí),這里可寫任意程序

TIME0: ;定時(shí)器0的中斷處理程序

PUSH ACC

PUSH PSW ;將PSW和ACC推入堆棧保護(hù)

INC 30H

INC 31H ;兩個(gè)計(jì)數(shù)器都加1

MOV A,30H

CJNE A,#20,T_NEXT ;30H單元中的值到了20了嗎?

T_L1: CPL P1.0 ;到了,取反P10

MOV 30H,#0 ;清軟件計(jì)數(shù)器

T_NEXT:

MOV A,31H

CJNE A,#40,T_RET ;31h單元中的值到40了嗎?

T_L2:

CPL P1.1

MOV 31H,#0 ;到了,取反P11,清計(jì)數(shù)器,返回

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定時(shí)常數(shù)

POP PSW

POP ACC

RETI

END

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6041

    文章

    44615

    瀏覽量

    637325
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    900

    瀏覽量

    41624
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3254

    瀏覽量

    115139

原文標(biāo)題:手把手教你使用單片機(jī)定時(shí)器、中斷試驗(yàn)

文章出處:【微信號:gh_bee81f890fc1,微信公眾號:面包板社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    手把手教你做星閃無人機(jī)》即將開播,鎖定15日晚七點(diǎn)!

    ”再次聯(lián)合推出《手把手教你做星閃無人機(jī)—KaihongOS星閃無人機(jī)開發(fā)實(shí)戰(zhàn)》系列課程,該課程與《手把手教你做PC—KaihongOS筆記本電腦開發(fā)實(shí)戰(zhàn)》同步并行,
    的頭像 發(fā)表于 01-13 19:42 ?78次閱讀
    《<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做星閃無人機(jī)》即將開播,鎖定15日晚七點(diǎn)!

    手把手教你做PC》課程即將啟動(dòng)!深開鴻引領(lǐng)探索KaihongOS筆記本電腦開發(fā)實(shí)戰(zhàn)

    ”攜手“電子發(fā)燒友”聯(lián)合推出了《KaihongOS手把手系列直播課程》,該系列課程以實(shí)際產(chǎn)品為案例,詳細(xì)講解每個(gè)產(chǎn)品的開發(fā)全流程。此次首發(fā)內(nèi)容是《手把手教你做PC-
    的頭像 發(fā)表于 01-06 20:46 ?116次閱讀
    《<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做PC》課程即將啟動(dòng)!深開鴻引領(lǐng)探索KaihongOS筆記本電腦開發(fā)實(shí)戰(zhàn)

    Air780E模組LuatOS開發(fā)實(shí)戰(zhàn) —— 手把手教你搞定數(shù)據(jù)打包解包

    本文要說的是低功耗4G模組Air780E的LuatOS開發(fā)實(shí)戰(zhàn),我將手把手教你搞定數(shù)據(jù)打包解包。
    的頭像 發(fā)表于 12-03 11:17 ?241次閱讀
    Air780E模組LuatOS開發(fā)實(shí)戰(zhàn) —— <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>搞定數(shù)據(jù)打包解包

    單片機(jī)有哪些中斷類型

    單片機(jī)中斷是指在單片機(jī)執(zhí)行程序的過程中,當(dāng)外部設(shè)備或內(nèi)部條件發(fā)生某個(gè)特定事件時(shí),能夠暫停當(dāng)前正在執(zhí)行的程序,轉(zhuǎn)而去執(zhí)行一個(gè)特定的服務(wù)
    的頭像 發(fā)表于 10-17 18:12 ?873次閱讀

    單片機(jī)中斷機(jī)制

    單片機(jī)中斷機(jī)制是一種重要的處理方式,它允許單片機(jī)在執(zhí)行主程序的過程中,能夠暫停當(dāng)前任務(wù),轉(zhuǎn)而處理外部或內(nèi)部緊急事件。這種機(jī)制極大地提高了系統(tǒng)的響應(yīng)速度和處理能力,使得
    的頭像 發(fā)表于 10-17 18:03 ?904次閱讀

    單片機(jī)中斷有哪些?各類型中斷有什么作用?

    )時(shí)觸發(fā)。常用于周期性任務(wù)的執(zhí)行。 比較中斷:當(dāng)定時(shí)器計(jì)數(shù)值與預(yù)設(shè)的比較值匹配時(shí)觸發(fā)。常用于PWM信號的生成和精確計(jì)時(shí)。 3. 通信中斷 通信中斷用于處理
    發(fā)表于 09-24 16:22

    簡述單片機(jī)定時(shí)器的工作原理

    單片機(jī)定時(shí)器的工作原理是一個(gè)復(fù)雜而精細(xì)的過程,它涉及到單片機(jī)內(nèi)部的多個(gè)組件和機(jī)制。
    的頭像 發(fā)表于 08-19 18:20 ?1658次閱讀

    手把手教你通過宏集物聯(lián)網(wǎng)工控屏&amp;網(wǎng)關(guān)進(jìn)行協(xié)議轉(zhuǎn)換,將底層PLC/傳感的數(shù)據(jù)轉(zhuǎn)換為TCP協(xié)議并傳輸?shù)接脩?/a>

    手把手教你通過宏集物聯(lián)網(wǎng)工控屏&網(wǎng)關(guān)進(jìn)行協(xié)議轉(zhuǎn)換,將底層PLC/傳感的數(shù)據(jù)轉(zhuǎn)換為TCP協(xié)議并傳輸?shù)接脩艚K端
    的頭像 發(fā)表于 08-15 13:29 ?595次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>通過宏集物聯(lián)網(wǎng)工控屏&amp;網(wǎng)關(guān)進(jìn)行協(xié)議轉(zhuǎn)換,將底層PLC/傳感<b class='flag-5'>器</b>的數(shù)據(jù)轉(zhuǎn)換為TCP協(xié)議并傳輸?shù)接脩? />    </a>
</div>                            <div   id=

    手把手教你排序算法怎么

    今天以直接插入排序算法,給大家分享一下排序算法的實(shí)現(xiàn)思路,主要包含以下部分內(nèi)容:插入排序介紹插入排序算法實(shí)現(xiàn)手把手教你排序算法怎么寫在添加新的記錄時(shí),使用順序查找的方式找到其要插入的位置,然后將
    的頭像 發(fā)表于 06-04 08:03 ?744次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>排序算法怎么<b class='flag-5'>寫</b>

    stm8s003開啟定時(shí)器中斷時(shí)出現(xiàn)非常操作復(fù)位的原因?

    stm8s003k3單片機(jī),使用的是TIM4 8位定時(shí)器,當(dāng)開啟定時(shí)器中斷功能時(shí),用仿真仿真,可以進(jìn)入
    發(fā)表于 05-15 07:08

    開啟定時(shí)器中斷定時(shí)后,單片機(jī)無法啟動(dòng)或者復(fù)位是怎么回事?

    開啟定時(shí)器中斷定時(shí)后,在主程序中我在某處中斷使能位置零(TIMx_IER=0X00)正常來說應(yīng)該返回到主程序中,但是出現(xiàn)
    發(fā)表于 05-08 07:59

    HAL庫開啟定時(shí)器中斷時(shí)會卡死程序的原因?

    當(dāng)開啟定時(shí)器中斷時(shí)候,開啟定時(shí)器時(shí)會卡死程序,調(diào)試,全速運(yùn)行卡死在-HAL_TIM_Base_Start_IT函數(shù),單步調(diào)試發(fā)現(xiàn)卡死在程序應(yīng)
    發(fā)表于 04-16 07:12

    8031單片機(jī)定時(shí)器和計(jì)數(shù)是怎么工作的

    8031單片機(jī)定時(shí)器和計(jì)數(shù)是通過內(nèi)部的時(shí)鐘源來工作的。具體來說,定時(shí)器/計(jì)數(shù)T0和T1的輸入端都接到了機(jī)器周期信號上,因此它們的計(jì)數(shù)初
    發(fā)表于 02-02 17:13 ?1331次閱讀

    單片機(jī)中斷功能及其應(yīng)用

    單片機(jī)中斷功能及其應(yīng)用? 單片機(jī)中斷是指在程序執(zhí)行過程中,根據(jù)特定的條件或事件自動(dòng)暫時(shí)中斷當(dāng)前
    的頭像 發(fā)表于 01-30 14:45 ?5735次閱讀

    單片機(jī)外部中斷定時(shí)器中斷的區(qū)別和用法

    單片機(jī)外部中斷定時(shí)器中斷在觸發(fā)來源、應(yīng)用場景以及功能特點(diǎn)上存在明顯差異** **。
    的頭像 發(fā)表于 01-28 17:35 ?3252次閱讀