第五章 中斷系統(tǒng)和定時計數(shù)器_第1頁
第五章 中斷系統(tǒng)和定時計數(shù)器_第2頁
第五章 中斷系統(tǒng)和定時計數(shù)器_第3頁
第五章 中斷系統(tǒng)和定時計數(shù)器_第4頁
第五章 中斷系統(tǒng)和定時計數(shù)器_第5頁
已閱讀5頁,還剩125頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第五章中斷系統(tǒng)和定時/計數(shù)器本章學(xué)習(xí)目標(biāo):理解中斷概念,能正確描繪單片機中斷響應(yīng)過程熟記89C51單片機的5個中斷源及其中斷入口地址能按要求正確設(shè)置特殊功能寄存器IE、IP、TCON、SCON和TMOD熟悉中斷優(yōu)先控制的方法能正確描繪定時/計數(shù)器的4種工作方式,重點掌握方式1、方式2的應(yīng)用學(xué)會定時/計數(shù)初值的計算能讀懂教材中的控制實例,學(xué)會編寫同等難度的中斷、定時/計數(shù)程序5.1中斷系統(tǒng)5.1.1中斷系統(tǒng)的基本概念

某人看書——某人正在處理一件事A電話鈴響——出現(xiàn)另一件須立即解決的事B暫停看書——中止A 書中作記號——記錄斷點,便于接續(xù)電話談話——處理B 繼續(xù)看書——繼續(xù)A的工作 保護(hù)斷點中斷響應(yīng)中斷請求中斷返回1.中斷的概念(1)現(xiàn)實生活中的中斷:

中斷原因:

一個人不可能同時完成兩項任務(wù)。

單片機只有一個CPU,一旦面臨多任務(wù),它也會中斷嗎?先接電話,然后再繼續(xù)看書,這樣效率最高?。?)單片機中的中斷CPU在處理某一事件A時,發(fā)生了另一事件B請求CPU迅速去處理(中斷發(fā)生或中斷請求);CPU暫時中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返回)。中斷請求→中斷響應(yīng)→中斷服務(wù)→中斷返回中斷過程事件B的處理過程事件A事件B什么是中斷?2.中斷技術(shù)的應(yīng)用并行處理

CPU可以與多臺外設(shè)并行工作,并分時與他們進(jìn)行信息交換,提高了CPU的工作效率。實時控制

單片機應(yīng)用系統(tǒng)可能隨機請求CPU提供服務(wù)。有了中斷系統(tǒng),CPU就可以立即響應(yīng)并予以處理。故障處理

單片機系統(tǒng)在工作時可能會出現(xiàn)一些突發(fā)故障,如電源斷電,存儲器出錯,程序執(zhí)行錯誤(如除數(shù)為0)等,一旦出現(xiàn)故障,CPU就可及時轉(zhuǎn)去執(zhí)行故障處理程序,而不必停機。3.中斷系統(tǒng)

為實現(xiàn)中斷功能而配置的硬件和編寫的軟件就是中斷系統(tǒng)。中斷由誰來實施?中斷功能由中斷系統(tǒng)來執(zhí)行。圖5-1中斷系統(tǒng)的結(jié)構(gòu)框圖5.1.2中斷源—中斷的申請方能夠向CPU發(fā)出中斷申請的部件稱為中斷源。89C51單片機有5個中斷源。見下表

那些部件可以向CPU申請中斷呢?中斷源

說明

外部中斷從P3.2引腳引入的外部中斷申請定時器T0中斷定時器T0溢出時引發(fā)中斷申請外部中斷從P3.3引腳引入的外部中斷申請定時器T1中斷定時器T1溢出時引發(fā)中斷申請串行口中斷一次串行發(fā)送或接收完成后,發(fā)出中斷申請“五源中斷,兩級管理”

五個中斷源:入口地址

外部中斷0(/INT0)0003HT0溢出中斷000BH

外部中斷1(/INT1)0013HT1溢出中斷001BH

串口中斷

0023H

“五源中斷”大家應(yīng)當(dāng)明白,為什么前面有一些程序一始我們這樣寫:ORG0000HLJMPSTARTORG0030HSTART:。。外中斷0:0003H定時器0:000BH外中斷1:0013H定時器1:001BH串口:0023H這樣寫的目的,就是為了讓出中斷源所占用的向量地址。當(dāng)然,在程序中沒用中斷時,直接從0000H開始寫程序,在原理上并沒有錯,但在實際工作中最好不這樣做。中斷服務(wù)入口地址它們的自然優(yōu)先級由高到低排列。5.1.3中斷控制——中斷的控制“工具”中斷允許寄存器IE中斷優(yōu)先級寄存器IP定時/計數(shù)器及外部中斷控制寄存器TCON串口控制寄存器SCON

單片機通過對4個特殊功能寄存器實施中斷控制:1.中斷允許寄存器IE功能:

控制單片機是否接受中斷申請,以及接受哪一種中斷申請字節(jié)地址:

A8H

其格式和每位的含義如下,可以位尋址:圖5-2IE的格式由位操作指令或數(shù)據(jù)傳送指令實現(xiàn)。例:同時打開外部中斷0和串行口中斷,可設(shè)置為:法1:MOVIE,#10010001B

法2:SETB

ESSETBEX0SETBEA

〈想一想〉還可以怎樣實現(xiàn)?如何對IE進(jìn)行設(shè)置?

IE的設(shè)置方法:2.中斷優(yōu)先級寄存器IP功能:

對89C51單片機進(jìn)行高級別或低級別中斷的設(shè)置,IP的字節(jié)地址:

B8H

格式和每位的含義如下:

圖5-3IP的格式

舉例例:令串行口為高優(yōu)先級中斷,外部中斷0為低優(yōu)先級中斷。設(shè)置方法:法1:

MOVIE,#10010001B

;開中斷

MOVIP,#00010000B

;設(shè)優(yōu)先級法2:

MOVIE,#10010001B

SETBPS說明:此時串口的優(yōu)先級高于外部中斷0的優(yōu)先級答案:

此時CPU按自然優(yōu)先級順序確定該響應(yīng)哪個中斷請求。如果幾個同級別的中斷源同時申請中斷,CPU如何響應(yīng)?注意:

自然優(yōu)先級由硬件決定,用戶不能更改。排列見表5-2同一級中的5個中斷源的優(yōu)先順序是:

/INT0中斷

T0溢出中斷

/INT1中斷

T1溢出中斷

串口中斷

高低出廠前已由廠家固化順序——事先約定中斷優(yōu)先原則:(概括為四句話)1、低級不打斷高級2、高級不睬低級3、同級不能打斷4、同級、同時中斷,事先約定。

例:設(shè)有如下要求,將T0、外中斷1設(shè)為高優(yōu)先級,其它為低優(yōu)先級,求IP的值。IP的首3位沒用,可任意取值,設(shè)為000,后面根據(jù)要求寫就可以了XXXPSPT1PX1PT0PX000000110因此,最終,IP的值就是06H例:在上例中,如果5個中斷請求同時發(fā)生,求中斷響應(yīng)的次序。響應(yīng)次序為:定時器0->外中斷1->外中斷0->實時器1->串行中斷。3.定時/計數(shù)器及外部中斷控制寄存器TCON功能:

字節(jié)地址:

88H可設(shè)置外部中斷申請的形式:低電平觸發(fā)還是下降沿觸發(fā)控制定時/計數(shù)器的計時開始或停止是各中斷源(串口中斷除外)是否申請中斷的標(biāo)志位格式如下,各位含義見表5-3TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0形式符號位地址功能說明中斷控制IT088H外部中斷0的觸發(fā)控制位IT0=0:低電平觸發(fā)

IT0=1:下降沿觸發(fā)IT0的狀態(tài)由用戶通過初始化程序定義IE089H外部中斷0請求標(biāo)志位。CPU采樣到外部中斷0的中斷請求時,IE0=1CPU響應(yīng)該中斷時,IE0=0IE0的狀態(tài)由單片機自動設(shè)置

IT18AH外部中斷1的觸發(fā)控制位IT1=0:低電平觸發(fā)IT1=1:下降沿觸發(fā)IT1的狀態(tài)由用戶通過初始化程序定義IE18BH外部中斷1的中斷請求標(biāo)志位CPU采樣到外部中斷1的中斷請求時,IE1=1CPU響應(yīng)該中斷時,IE1=0IE1的狀態(tài)由單片機自動設(shè)置

表5-3TCON的功能說明形式

符號

位地址

功能

說明

定時/計數(shù)控制

TR08CHTR0=1:啟動定時/計數(shù)器T0TR0=0:停止定時/計數(shù)器T0

TR0的狀態(tài)由用戶通過初始化程序定義TF08DH定時/計數(shù)器T0溢出中斷請求位T0定時或計數(shù)完成時TF0=1,同時申請中斷CPU響應(yīng)該中斷時,TF0=0TF0的狀態(tài)由單片機自動設(shè)置

TR18EHTR1=1:啟動定時/計數(shù)器T1TR1=0:停止定時/計數(shù)器T1

TR1的狀態(tài)由用戶通過初始化程序定義TF18FH定時/計數(shù)器T1溢出中斷請求位T1定時或計數(shù)完成時TF1=1,同時申請中斷CPU響應(yīng)該中斷時,TF1=0TF1的狀態(tài)由單片機自動設(shè)置

續(xù)表5-3

例1編程設(shè)定TCON為低電平觸發(fā)的高優(yōu)先級中斷源。分析:

這是典型的中斷初始化問題,方法一般如下:1)對TCON的相關(guān)位賦值2)設(shè)定所用中斷源的優(yōu)先級——賦值IP3)開中斷——置位IE解:

法1:CLRIT1SETBPX1SETBEX1SETBEA例1

法2:CLRIT1MOVIP,#04HMOVIE,#84H4.串口控制寄存器SCON功能:

只有D1和D0位用于中斷,作為串口中斷請求標(biāo)志,即串口中斷請求寄存器字節(jié)地址:

98H

格式如下:RI為接收中斷請求標(biāo)志位。當(dāng)串口接收完一幀串行數(shù)據(jù)時,RI自動置1;CPU響應(yīng)中斷后,用軟件對RI清0。TI為串行口發(fā)送中斷請求標(biāo)志。當(dāng)串口發(fā)送完一幀串行數(shù)據(jù)時,TI自動置1,請求中斷。CPU響應(yīng)中斷后,由軟件對TI清零。其他幾位的含義及用法見第5章。日常生活中的中斷與單片機中斷的比較:某同學(xué) 單片機過程說明正在看書 執(zhí)行主程序有人找出去 中斷信號

中斷請求暫??磿?/p>

暫停執(zhí)行主程序

中斷響應(yīng)書中作記號當(dāng)前PC入棧

保護(hù)斷點出去做事 執(zhí)行中斷程序

中斷服務(wù)回來繼續(xù)看

返回主程序

中斷返回5.1.4中斷響應(yīng)無同級或高級中斷正在服務(wù)有中斷請求信號相應(yīng)的中斷源已打開,即EA=1,中斷源對應(yīng)中斷允許位也為1。當(dāng)前的指令周期已經(jīng)結(jié)束如果當(dāng)前指令為RETI或訪問IE和IP的指令,至少還要再執(zhí)行完一條指令。1.中斷響應(yīng)條件中斷響應(yīng)和中斷返回1、中斷響應(yīng)的條件:我們?nèi)丝梢皂憫?yīng)外界的事件,是因為我們有多種“傳感器“――眼、耳可以接受不同的信息,計算機是如何做到這點的呢?MCS51工作時,在每個機器周期中都會去查詢一下各個中斷標(biāo)記,看他們是否是“1“,如果是1,就說明有中斷請求了,所以所謂中斷,其實也是查詢,不過是每個周期都查一下而已。這要換成人來說,就相當(dāng)于你在看書的時候,每一秒鐘都會抬起頭來看一看,查問一下,是不是有人按門鈴,是否有電話。。。。在下列三種情況之一時,CPU將封鎖對中斷的響應(yīng):ACPU正在處理一個同級或更高級別的中斷請求。B

現(xiàn)行的機器周期不是當(dāng)前正執(zhí)行指令的最后一個周期。我們知道,單片機有單周期、雙周期、三周期指令,當(dāng)前執(zhí)行指令是單字節(jié)沒有關(guān)系,如果是雙字節(jié)或四字節(jié)的,就要等整條指令都執(zhí)行完了,才能響應(yīng)中斷(因為中斷查詢是在每個機器周期都可能查到的)。

C

當(dāng)前正執(zhí)行的指令是返回批令(RETI)或訪問IP、IE寄存器的指令,則CPU至少再執(zhí)行一條指令才應(yīng)中斷。這些都是與中斷有關(guān)的,如果正訪問IP、IE則可能會開、關(guān)中斷或改變中斷的優(yōu)先級,而中斷返回指令則說明本次中斷還沒有處理完,所以都要等本指令處理結(jié)束,再執(zhí)行一條指令才可以響應(yīng)中斷。MCS-51的中斷響應(yīng)過程:2、中斷響應(yīng)過程這些工作都是由硬件來完成的,不必我們?nèi)タ紤]。這里還有個問題,大家是否注意到,每個中斷向量地址只間隔了8個單元,如0003-000B,在如此少的空間中如何完成中斷程序呢?很簡單,你在中斷處安排一個LJMP指令,不就可以把中斷程序跳轉(zhuǎn)到任何地方了嗎?一個完整的主程序看起來應(yīng)該是這樣的:ORG0000HLJMPSTARTORG0003HLJMPINT0;轉(zhuǎn)外中斷0ORG000BHRETI;沒有用定時器0中斷,在此放一條RETI,萬一“不小心“產(chǎn)生了中斷,也不會有太大的后果。CPU響應(yīng)中斷時,首先把當(dāng)前指令的下一條指令(就是中斷返回后將要執(zhí)行的指令)的地址送入堆棧,然后根據(jù)中斷標(biāo)記,將相應(yīng)的中斷入口地址送入PC,PC是程序指針,CPU取指令就根據(jù)PC中的值,PC中是什么值,就會到什么地方去取指令,所以程序就會轉(zhuǎn)到中斷入口處繼續(xù)執(zhí)行。2.中斷響應(yīng)過程圖5-4中斷響應(yīng)過程將當(dāng)前寄存器內(nèi)容壓入堆棧,如PUSHACC在中斷服務(wù)程序中實現(xiàn),解決單片機中斷后要干什么的問題。把保存在堆棧中的寄存器內(nèi)容取出,送回原來的位置,如POPACC☆5.1.5中斷嵌套答案:CPU要進(jìn)行分析判斷,決定是否響應(yīng):當(dāng)CPU正在執(zhí)行中斷服務(wù)程序時,又有新的中斷源發(fā)出中斷申請,響應(yīng)嗎?情況1:

同級或低級中斷源申請中斷,CPU不予理睬情況2:高級別中斷源申請中斷,若無中斷屏蔽CPU就要響應(yīng)。待執(zhí)行完高級別中斷服務(wù)程序后再轉(zhuǎn)回低級中斷服務(wù)程序繼續(xù)執(zhí)行,這就是中斷嵌套。圖5-5二級中斷嵌套的執(zhí)行過程軟件構(gòu)成:主程序+中斷服務(wù)程序程序編制的關(guān)鍵點:

要對題目要求進(jìn)行精確分析,明確哪些環(huán)節(jié)應(yīng)該安排在主程序中,哪些環(huán)節(jié)應(yīng)該安排在中斷服務(wù)程序中,再分別編制主程序和中斷服務(wù)程序。5.2中斷的應(yīng)用4.2.1中斷應(yīng)用指導(dǎo)

1.中斷系統(tǒng)的程序編制

1.中斷系統(tǒng)的程序編制

(1)編制主程序

第一部分:主程序初始化

功能:第二部分:須由主程序完成的其它功能。此部分必須編寫用于設(shè)置堆棧位置;定義觸發(fā)方式(低電平觸發(fā)或脈沖下降沿觸發(fā))對IE和IP賦值等;(2)選擇中斷服務(wù)程序的入口地址。(3)編制中斷服務(wù)程序。

1.中斷系統(tǒng)的程序編制即明確中斷服務(wù)程序的起始位置注意1:一般要保護(hù)斷點,即保護(hù)進(jìn)入中斷時累加器A、進(jìn)/借位標(biāo)志CY和SFR的狀態(tài),并在退出中斷之前將其恢復(fù);注意2:必須在中斷服務(wù)程序中設(shè)定是否允許再次中斷(即中斷嵌套),由用戶對EX0(或EX1)位置位或清0決定。

說明:一般在中斷服務(wù)程序中涉及到關(guān)鍵數(shù)據(jù)的設(shè)置時應(yīng)關(guān)中斷,即禁止嵌套。2.中斷應(yīng)用舉例——三相交流電的故障檢測電路

例2

圖5-6是三相交流電的故障檢測電路。當(dāng)A相缺電時,發(fā)光二極管LEDA亮;當(dāng)B相缺電時,發(fā)光二極管LEDB亮;當(dāng)C相缺電時,發(fā)光二極管LEDC亮。硬件特點:

①外部中斷由3個交流繼電器的觸點和一個或非門擴展而成;

②3個220V的交流繼電器的線圈ZA、ZB、ZC分別接在A、B、C各相和交流地之間。圖5-6三相交流電的故障檢測電路(1)檢測原理①三相電正常情況下3個線圈同時得電3個常開觸點全都閉合0001不申請外部中斷②故障情況下(假設(shè)A相掉電)(1)檢測原理線圈ZA失電常開觸點ZA斷開0申請外部中斷,在外部中斷服務(wù)程序中讀取P1.0引腳狀態(tài)0011產(chǎn)生A相掉電狀態(tài)信號送入P1.01在中斷服務(wù)程序中對該引腳輸出1A相故障指示燈亮線圈ZB、ZC有電常開觸點ZB、ZC閉合B、C相故障指示燈不亮(2)軟件設(shè)計

ORG0000H LJMPMAIN ;跳至主程序

ORG0013H ;的中斷入口地址

LJMPTEST ;轉(zhuǎn)至中斷服務(wù)程序

ORG0100H MAIN:MOVP1,#15H;P1.0、P1.2、P1.4作輸入;P1.1、P1.3、P1.5輸出0 SETBEX1 ;開中斷

CLRIT1;為低電平觸發(fā)

SETBEA ;CPU開中斷

SJMP$ ;等待中斷TEST: JNBP1.0,LB ;A相正常,轉(zhuǎn)測B相

SETBP1.1 ;A相掉電,點亮LEDALB: JNBP1.2,LC ;B相正常,轉(zhuǎn)測C相

SETBP1.3 ;B相掉電,點亮LEDBLC: JNBP1.4,LL ;C相正常,返回

SETBP1.5 ;C相掉電,點亮LEDCLL:RETIEND5.2.2課題與實訓(xùn)

中斷控制流水燈一.實訓(xùn)目的學(xué)習(xí)外部中斷的基本用法掌握中斷處理程序的編程方法二.課題要求在程序正常運行時P1口的8個LED燈作單燈左移8次而后單燈右移7次,如此循環(huán);中斷時(即按鍵按下)則P1口的8個LED閃爍3次(即全亮全滅3次)。三.背景知識

1.中斷程序的設(shè)計主要涉及開中斷、設(shè)定優(yōu)先級,外中斷還

涉及觸發(fā)方式的設(shè)定。

2.在軟件設(shè)計中,首先要對主程序和中斷服務(wù)程序所完成的

任務(wù)進(jìn)行劃分。根據(jù)該課題提出的要求,在主程序中應(yīng)該

完成的任務(wù)是8個LED循環(huán)左移右移;在中斷服務(wù)程序中

應(yīng)該完成的功能是8個LED閃爍3次。四.硬件電路硬件結(jié)構(gòu)如圖,12引腳的按鍵點動表示有中斷請求發(fā)出。

圖5-7實訓(xùn)7電路五.參考程序

ORG0000H LJMPSTART ORG0003H LJMPINT0 ORG0100H START:MOVSP,#60HMOVIE,#81H;開INT0中斷

SETBIT0;INT0下降沿觸發(fā)

L1:MOV

A,#0FFH;設(shè)初值

MOV

R0,#8;設(shè)定左移八次

CLR

C;將CY清0L2:RLC

A;帶進(jìn)位位循環(huán)左移一位

MOV

P1,A;送P1口,P1.0燈亮

ACALL

DELAY;延時0.2秒

DJNZR0,

L2;判斷是否左移8次

MOV

R0,#7;移動7次L3:RRC

A;帶進(jìn)位位循環(huán)右移

MOV

P1,A;送P1口

ACALL

DELAYDJNZ

R0,L3;是否右移7次?

AJMP

L1;重新開始DELAY:MOV

R5,#4;延時0.2秒

D1:MOV

R6,#200D2:MOV

R7,#123NOPDJNZ

R7,$

DJNZ

R6,D2DJNZ

R5,D1RETINT0:PUSHPSW;保護(hù)PSW,ACC值

PUSHACCMOVA,#00H;使8個LED全亮

MOVR2,#6;閃爍3次(全亮全滅各3次)

L4:MOVP1,A;A值送出

LCALLDELAY;延時0.2秒

CPLA;A值取反

DJNZR2,L4;閃爍3次?

POPACC;恢復(fù)保護(hù)的A值

POPPSW;恢復(fù)保護(hù)的PSW值

RETI;返回主程序

END

六.總結(jié)與提高

1.總結(jié):中斷服務(wù)程序與子程序?qū)Ρ裙餐c:格式相近,執(zhí)行過程大體相同子程序執(zhí)行時刻是確定的,CPU只要執(zhí)行LCALL、ACALL等調(diào)用指令就會轉(zhuǎn)去執(zhí)行子程序中斷服務(wù)程序中斷申請往往是隨機發(fā)生的。中斷服務(wù)程序的發(fā)生可能是在開中斷后的任意時刻,也可能不發(fā)生,2.提高

編寫一個由兩個中斷(外部中斷0、外部中斷1)控制的流水燈程序。要求:主程序不變,中斷0可使P1.0~P1.3的LED閃爍5次,中斷1可使P1.4~P1.7的LED閃爍5次,設(shè)定中斷1的優(yōu)先級比中斷0高。中斷系統(tǒng)應(yīng)用舉例要求每次按動按鍵,使外接發(fā)光二極管LED改變一次亮滅狀態(tài)。解:INT0輸入按鍵信號,P1.0輸出改變LED狀態(tài)。1.跳變觸發(fā):每次跳變引起一次中斷請求。

ORG 0000H;復(fù)位入口 AJMPMAIN ORG 0003H ;中斷入口 AJMP PINT0 ORG 0100H ;主程序MAIN:MOVP1,#0FFH;

SETB EA ;開總允許開關(guān)

SETB EX0 ;開INT0中斷

SETB IT0 ;負(fù)跳變觸發(fā)中斷H: SJMP H ;執(zhí)行其它任務(wù)PINT0:CPLP1.0 ;改變LED RETI ;返回主程序單片機INT0P1.01+5V處理外部中斷

ORG 0000H;復(fù)位入口 AJMPMAIN ORG 0003H ;中斷入口 AJMP PINT0

MAIN:

MOVP1,#0FFH; SETB EA ;開總允許開關(guān)

SETB EX0 ;開INT0中斷

CLR IT0 ;低電平觸發(fā)中斷H: SJMP H ;執(zhí)行其它任務(wù)PINT0:CPLP1.0 ;改變LEDWAIT:JNB P3.2,WAIT;等按鍵釋放

RETI ;返回主程序1.軟件等待按鍵釋放。2.硬件清除中斷信號。2.電平觸發(fā):避免一次按鍵引起多次中斷響應(yīng)。單片機INT0P1.01+5V5.6實踐訓(xùn)練

任務(wù):工業(yè)順序控制

1.實現(xiàn)任務(wù)工業(yè)順序控制,由P1.0~1.6控制注塑機的7道工序,現(xiàn)模擬控制7只發(fā)光二極管的點亮,低電平有效,設(shè)定每道工序時間轉(zhuǎn)換為延時,P3.4為開工啟動開關(guān),高電平啟動。P3.3為外部故障輸入模擬開關(guān),低電平報警,P1.7為報警聲音輸出,設(shè)定6道工序只有1位輸出,第七道工序3位有輸出。

2.任務(wù)目標(biāo)

(1)掌握中斷的初始化步驟。

(2)了解中斷的處理過程。

(3)了解中斷服務(wù)子程序與普通子程序的異同。

3.知識點分析

(1)中斷的入口地址。

(2)中斷源的產(chǎn)生、中斷的控制、優(yōu)先級的處理、中斷的響應(yīng)和返回。

4.實施過程

(1)硬件設(shè)計

P3.4接K1,P3.3接K2(外中斷1),P1.0~P1.6分別接發(fā)光二極管D1~D7,P1.7接LM386正向輸入端,通過LM386功率放大后5腳輸入接揚聲器,由它發(fā)出報警聲音。硬件設(shè)計如圖5-12所示。圖5-12工業(yè)順序控制2) 軟件設(shè)計

ORG 0000H LJMP PO10 ORG 0013H ;外部中斷1的入口地址

LJMP PO16 ORG 0080HPO10:MOV P1,#7FH ORL P3,#00HPO11:JNBP3.4,PO11 ;開工嗎?

MOV IE,#84HMOV IP,#04H MOV PSW,#00H ;初始化

MOV SP,#53HPO12:MOV P1,#7EH ;第一道工序

ACALL PO1B MOV P1,#7DH ;第二道工序

ACALL PO1B MOV P1,#7BH ;第三道工序

ACALL PO1B MOV P1,#77H ;第四道工序

ACALL PO1B MOV P1,#6FH ;第五道工序

ACALL PO1B MOV P1,#5FH ;第六道工序

ACALL PO1B MOV P1,#0FH ;第七道工序

ACALL PO1B SJMP PO12PO16:MOV B,R2 ;保護(hù)現(xiàn)場PO17:MOV P1,#7FH ;關(guān)輸出

MOV 20H,#0A0H ;振蕩次數(shù) PO18: SETB P1.7 ;振蕩

ACALL PO1A ;延時

CLR P1.7 ;停振

ACALL PO1A ;延時

DJNZ 20H,PO18 ;不為0轉(zhuǎn)

CLR P1.7 ACALL PO1A ;停振

JNB P3.3,PO17 ;故障消除嗎?

MOV R2,B ;恢復(fù)現(xiàn)場

RETIPO19: MOV R2,#10H

ACALL DELY ;延時1 RETPO1A: MOV R2,#06H ACALL DELY ;延時2 RETPO1B: MOV R2,#30H ACALL DELY ;延時3 RETDELY: PUSH 02HDEL2: PUSH 02HDEL3: PUSH 02H ;延時DEL4: DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END5.3定時/計數(shù)器

1.日常生活中定時、計數(shù)的例子:如鬧鐘、畫“正”統(tǒng)計選票、家用水表對水量的計數(shù)。

2.單片機應(yīng)用系統(tǒng)中定時計數(shù)的需求:如用單片機控制的打鈴器、空調(diào)的定時開關(guān)、啤酒自動生產(chǎn)線上對酒瓶的計數(shù)裝置等。

3.89C51單片機片內(nèi)的定時/計數(shù)器:

兩個16位可編程的定時/計數(shù)器:T0和T1,都能定時和對外部事件進(jìn)行計數(shù)。此外,T1還可以作為串行接口的波特率發(fā)生器。5.3.1定時/計數(shù)器的結(jié)構(gòu)1.定時和計數(shù)的原理(1)計數(shù)

定時/計數(shù)器的實質(zhì)是加1計數(shù)器(16位),其原理類似于古代用來計時的水鐘:假設(shè)計滿一小時需要100,000,000滴,這稱為水鐘的計數(shù)容量16位定時/計數(shù)器的計數(shù)容量是65536單片機是對脈沖個數(shù)計數(shù),計數(shù)器每接收到一個脈沖,計數(shù)值加1,當(dāng)接收滿65535個脈沖后,再來一個脈沖,計數(shù)值清0表明這一輪計數(shù)結(jié)束,同時將標(biāo)志位TF0或TF1置1。

(2)定時

單片機內(nèi)部的計數(shù)器用作定時器時,是對標(biāo)準(zhǔn)的時鐘進(jìn)行了計數(shù),每來一個時鐘脈沖,計數(shù)器加1,只要保證計數(shù)脈沖的間隔相等,則計數(shù)值就代表了時間的流逝。計數(shù)器如何能作為定時器使用呢?單片機中的定時器和計數(shù)器其實是一個器件:計數(shù)器:是對外部發(fā)生的事件進(jìn)行計數(shù),定時器:是對單片機內(nèi)部的標(biāo)準(zhǔn)時鐘脈沖進(jìn)行計數(shù)。單片機內(nèi)部的標(biāo)準(zhǔn)時鐘脈沖是如何獲得的呢?

見圖5-9,它是由單片機的晶振經(jīng)過12分頻后得到。由于晶振的頻率很準(zhǔn),所以這個時鐘脈沖的時間間隔也很準(zhǔn)。不難算出,當(dāng)單片機采用12MHz的晶振時,它提供給計數(shù)器的脈沖頻率是12MHz/12=1MHz,脈沖周期就是1微秒。圖5-9定時/計數(shù)器T0的結(jié)構(gòu)示意圖

單片機內(nèi)部的16位定時/計數(shù)器由高8位和低8位兩個寄存器組成:

T0由TH0和TL0組成,

T1由TH1和TL1組成,定時/計數(shù)器的計數(shù)值就存放在這里面。定時/計數(shù)器T1的結(jié)構(gòu)與T0相同。圖9-9定時/計數(shù)器T0的結(jié)構(gòu)示意圖

2.定時/計數(shù)器的結(jié)構(gòu)再以水鐘為例,當(dāng)水不斷落下,下面容器中的水不斷變多,最終總有一滴水使得容器完全充滿。這時如果再有一滴水落下,就會發(fā)生“溢出”。與此類似,16位定時/計數(shù)器計滿65536個脈沖時,也會發(fā)生溢出。

定時/計數(shù)器溢出后標(biāo)志位TF0(或TF1)由0變1,由此能夠引發(fā)定時中斷(在中斷定時方式下),這就像定時的時間一到,鬧鐘就會響一樣。如果采用12MHz的晶振,對應(yīng)的脈沖周期是1微秒,計滿65536個脈沖所對應(yīng)的時間就是65.536ms。

3.定時/計數(shù)值的設(shè)置現(xiàn)實生活中,如何滿足計數(shù)值少于65536的需要?如牛奶包裝線上24盒裝箱一次。再回到水鐘的例子上去:剛才假設(shè)下面容器滴入100,000,000滴水才會滿,現(xiàn)在我們在開始滴水之前先放入一勺水,這樣問題就解決了。

計數(shù)器的道理是一樣的,只要用預(yù)置數(shù)的方法先在計數(shù)容器內(nèi)存入一個初值

(通常稱為時間常數(shù)),如我們要計100,那就存入65436,只要再來100個脈沖,就剛好會溢出,引發(fā)中斷。計數(shù)器初值的設(shè)置在主頻為12MHz的情況下,每個時鐘脈沖是1微秒,則計滿65536個脈沖需65.536毫秒,如要定時10毫秒則存入初值55536,(10毫秒是10000微秒,需計數(shù)10000個脈沖)??梢姡?/p>

定時器的定時時間長短與系統(tǒng)時鐘和定時器初值有關(guān)。

說明

1.當(dāng)定時/計數(shù)器用作計數(shù)器時,通過引腳P3.4(P3.5)對外部輸入脈沖計數(shù)。

2.定時/計數(shù)器T0(T1)啟動運行后,會按設(shè)定的工作方式獨立進(jìn)行計數(shù),不再占用CPU時間。當(dāng)計數(shù)器T0(T1)計滿溢出時,TF0(TF1)置1,向CPU發(fā)出中斷請求信號。定時器初值的設(shè)置5-10定時/計數(shù)器的控制關(guān)系

5.3.2定時/計數(shù)器的控制

在單片機中有兩個特殊功能寄存器與定時/計數(shù)有關(guān),它們就是TMOD和TCON,定時/計數(shù)器T0、T1就由它們來控制:

TMOD用于設(shè)置工作方式;

TCON用于控制其啟動、停止和中斷申請。

1.定時器工作方式寄存器TMOD

TMOD用于設(shè)置T0和T1的工作方式,字節(jié)地址為89H,不能按位尋址。其格式和各位的含義如下:

2.定時/計數(shù)器控制寄存器TCON

TCON的低4位用于控制外部中斷,高4位用于控制定時/計數(shù)器的啟動和中斷申請。

TF0(或TF1)

當(dāng)計數(shù)溢出時,TF0(或TF1)會自動由0變1,告訴我們計數(shù)已滿,我們可以通過查詢TF0(或TF1)位的狀態(tài)來判斷計時時間是否已到;

如果采用定時中斷方式,則TF0(或TF1)由0變1時,能自動引發(fā)中斷。

TR0(或TR1)

由圖4-11可知,只有當(dāng)TR0(或TR1)為1時,開關(guān)1才能閉合,計數(shù)脈沖才能進(jìn)入計數(shù)器,故TR0(或TR1)稱為運行控制位,可用指令“SETBTR0(或TR1)”來置位以啟動定時/計數(shù)器運行;或用指令“CLRTR0(或TR1)”來關(guān)閉定時/計數(shù)器的工作,一切全靠編程人員控制。圖5-11定時/計數(shù)器T0方式0的邏輯結(jié)構(gòu)示意圖

5.3.3定時/計數(shù)器的工作方式

80C51單片機定時/計數(shù)器T0有4種工作方式(方式0、1、2、3),T1有3種工作方式(方式0、1、2)。

1.方式0

當(dāng)TMOD的M1M0=00時,定時/計數(shù)器工作于方式0。方式0為13位定時/計數(shù)器,由TL0的低5位和TH0(8位)共同完成計數(shù)功能(TL0的高3位可忽略)。

當(dāng)TL0的低5位溢出時,向TH0產(chǎn)生進(jìn)位;TH0溢出時,將定時器中斷請求標(biāo)志位TF0置1,可申請中斷,也可對TF0進(jìn)行查詢。

圖5-11定時/計數(shù)器T0方式0的邏輯結(jié)構(gòu)示意圖2.方式1

當(dāng)M1M0=01時,定時/計數(shù)器工作于方式1。方式1的計數(shù)位數(shù)是16位,由TL0作為低8位,TH0作為高8位共同構(gòu)成。其余操作同方式0。圖5-12定時/計數(shù)器T0方式1的邏輯結(jié)構(gòu)示意圖3.方式2

當(dāng)M1M0=10時,定時/計數(shù)器工作于方式2。這是自動重裝初值的8位計數(shù)方式,它省去了方式0和方式1在多次重復(fù)計數(shù)狀態(tài)下必須重新設(shè)定計數(shù)初值的麻煩,但是卻付出了減小定時時間的代價。圖5-13定時/計數(shù)器T0方式2的邏輯結(jié)構(gòu)示意圖特別適合于制作比較精確的脈沖信號發(fā)生器。4.方式3

方式3只適用于定時/計數(shù)器T0。當(dāng)T1被設(shè)定為方式3狀態(tài)時,將停止計數(shù)。

當(dāng)M1M0=11時,T0工作于方式3。此時TL0和TH0作為兩個相互獨立的8位定時/計數(shù)器使用。TL0既可定時又可計數(shù),它使用T0的各控制位、引腳和中斷源,即C/、GATE、TR0、TF0、T0(P3.4引腳)、(P3.2引腳);TH0此時只能用作內(nèi)部定時功能,它借用了定時/計數(shù)器T1的控制位TR1和T1的中斷標(biāo)志位TF1,其啟動和停止只受TR1控制。圖5-14定時/計數(shù)器T0方式3的邏輯結(jié)構(gòu)示意圖

定時器T1無工作方式3,當(dāng)定時器T0工作在方式3時,定時器T1可設(shè)置為方式0、方式1和方式2。

5.4.1應(yīng)用指導(dǎo)

1.定時/計數(shù)器的定時/計數(shù)范圍

定時/計數(shù)器工作于不同方式下的位數(shù)不同,它所具有的計數(shù)范圍也不一樣:

工作方式0:13位定時/計數(shù)方式,因此,最多可以計到213,也就是8192次。工作方式1:16位定時/計數(shù)方式,因此,最多可

以計到216,也就是65536次。工作方式2和工作方式3:都是8位定時/計數(shù)方

式,因此,最多可以計到28,也就是256次。<想一想>如果我們需要超過計數(shù)器計數(shù)范圍的定時或計數(shù)功能,應(yīng)該怎樣做?5.4定時/計數(shù)器應(yīng)用與訓(xùn)練

2.時間常數(shù)初值的計算定時/計數(shù)器只要預(yù)設(shè)一個時間常數(shù)初值,就可以完成不超過其計數(shù)范圍的任意大小的計數(shù)。算法如下:定時時間常數(shù)初值X:方式0X=8192-t(fosc/12)

方式1X=65536-t(fosc/12)

方式2、方式3X=256-t(fosc/12)

其中t是需要定時的時間,單位是微秒;fosc是晶振計數(shù)時間常數(shù)X:方式0X=8192-S

方式1X=65536-S

方式2、方式3X=256-S

說明:式中S是需要計數(shù)的次數(shù)

假設(shè)流水線上一個包裝是12盒,要求每到12盒就產(chǎn)生一個動作,用單片機的工作方式0來控制,應(yīng)當(dāng)預(yù)置的計數(shù)初值是多少呢?對了,就是8192-12=8180。3.定時/計數(shù)器的初始化對80C51單片機的定時/計數(shù)器編程的初始化方法:①對TMOD賦值,以確定T0和T1的工作方式;②計算時間常數(shù)初值,并將其寫入TH0、TL0或TH1、

TL1;③采用中斷定時方式時,需對IE賦值開中斷;④置位TR0或TR1,啟動定時/計數(shù)器。

5.4.2基本訓(xùn)練—初始化訓(xùn)練例3:某牛奶生產(chǎn)線上一個包裝是12盒,要求每生產(chǎn)12盒就執(zhí)行裝箱操作,用89C51單片機來控制,請編寫初始化程序。

1.思路與計算:要確定定時器(T0或T1),選擇其工作方式。我們以T0的工作方式2為例,計算時間常數(shù)并賦值給TH0、TL0。

X=256-S=256-12=244=0F4H

2.初始化程序:

MOVTMOD,#06H;T0作計數(shù)器,工作于方式2MOVTH0,#0F4H;裝入時間常數(shù)初值

MOVTL0,#0F4H;自動重裝時間常數(shù)

MOVIE,#00H;用查詢方式確定計滿12盒?(或MOVIE,#82H);使用T0中斷,計滿12盒后,;自動申請中斷

SETBTR0;啟動T0波特率發(fā)生器

3.總結(jié):對計數(shù)過程是否結(jié)束有查詢和中斷兩種方法,要合理選擇,并在程序設(shè)計中正確體現(xiàn)。

5.4.3應(yīng)用實例

1.

定時/計數(shù)器用于外部脈沖寬度的測量(1)測量原理可以利用定時/計數(shù)器方式寄存器TMOD中的門控位GATE與引腳配合使用,控制定時/計數(shù)器的啟動與停止:當(dāng)GATE=1時,要求TR1=l,且為高電平,才能啟動定時器T1計數(shù)工作;如果出現(xiàn)低電平,則T1停止計數(shù);當(dāng)GATE=0時,只要TR1=1就可以啟動定時器,而與的輸入狀態(tài)無關(guān)。

可以利用定時/計數(shù)器方式寄存器TMOD中的門控位GATE與引腳配合使用,控制定時/計數(shù)器的啟動與停止:

當(dāng)GATE=1時,要求TR1=l,且為高電平,才能啟動定時器T1計數(shù)工作;如果出現(xiàn)低電平,則T1停止計數(shù);

當(dāng)GATE=0時,只要TR1=1就可以啟動定時器,而與的輸入狀態(tài)無關(guān)。

利用上述特點,將被測脈沖信號從(P3.3)引入,在T1的程序初始化中令GATE=1,同時“SETBTR1”,這樣脈沖信號的上升沿就能啟動T1計數(shù),脈沖信號下降沿能使T1停止計數(shù)。利用定時器T1的計數(shù)值m乘以機器周期就可以得到被測脈沖信號的寬度TW。(2)硬件電路硬件電路簡圖如圖4-15。

(3)程序設(shè)計

利用89C51的內(nèi)部RAM30H、31H單元保存被測脈沖寬度對應(yīng)的計數(shù)值。參考程序如下:

ORG0000HAJMPMAINORG0100HMAIN:MOVSP,#60H;設(shè)堆棧指針

MOVTMOD,#90H;設(shè)置控制字,T1工作于方式

;1,GATE=1MOVTH1,#00H;設(shè)定計數(shù)初值為00H

MOVTL1,#00HL1:JBP3.3,L1;等待輸入變?yōu)榈碗娖?/p>

SETBTR1;預(yù)置TR1=1,準(zhǔn)備啟動T1L2:JNBP3.3,L2;等待上升沿,以便開始計數(shù)L3:JBP3.3,L3;是高電平則計數(shù)繼續(xù)

CLRTR1;低電平則停止計數(shù)

MOVA,TL1 ;讀低位計數(shù)值

MOV30H,A ;低位計數(shù)值存于30HMOVA,TH1 ;讀高位計數(shù)值

MOV31H,A ;高位計數(shù)值存于31HEND(4)總結(jié)與思考定時/計數(shù)器還可用于測量脈沖信號的頻率、周期等。本實例是利用定時/計數(shù)器的門控位(GATE)測量脈沖寬度。但要注意,在晶振12MHz的情況下,被測脈沖寬度范圍最大為65535×1μs=65.536ms。

<想一想>,如果要測量脈沖信號的周期,該如何去做?

2.計數(shù)器用于繞線機的控制繞線機常用于對電機或變壓器的繞組進(jìn)行繞制,圖4-16是繞線機的控制電路。當(dāng)按下工作按鈕以后,機器啟動,繞線機在直流電機和減速齒輪的帶動下開始工作。當(dāng)繞線架上的線圈繞到規(guī)定的圈數(shù)時,繞線機會自動停止繞線。如果再次按下工作按鈕,繞線機會重復(fù)以上過程。圖5-16繞線機的控制電路控制說明:1.軟件控制P1.0=0時,繞線機開始繞線;P1.0=1時,繞線機不繞線。

2.繞線機每繞一圈,繞線機脈沖產(chǎn)生電路就產(chǎn)生一個脈沖信號。

(1)工作原理

由于單片機復(fù)位后P1口的輸出狀態(tài)全部為1,所以系統(tǒng)上電后,P1.0輸出高電平“1”繞線機不工作。

當(dāng)按下工作按鈕以后,P1.1輸入低電平“0”,當(dāng)程序檢測到P1.1=0時,在程序指令的控制下從P1.0輸出低電平“0”。繞線機開始繞線。繞線機每繞一圈,定時/計數(shù)器T1的輸入引腳上就會產(chǎn)生一個負(fù)跳變的輸入脈沖。因此,只要用定時/計數(shù)器T1的計數(shù)功能控制好輸入脈沖的個數(shù),就等于控制了繞線機的繞線圈數(shù)。

當(dāng)繞線機纏繞到指定的圈數(shù)時,定時/計數(shù)器T1引發(fā)計數(shù)中斷,在程序指令的控制下,P1.0將輸出的高電平“1”,使電機停轉(zhuǎn),制動器恢復(fù)制動,于是系統(tǒng)回到最初的停機狀態(tài)。

我們假設(shè)繞線架的規(guī)定匝數(shù)是5000圈,為控制這個圈數(shù),可以設(shè)定定時/計數(shù)器T1用作計數(shù)器且工作在方式1,于是確定其計數(shù)初值為:

初值=65536-5000=60536=0EC78H所以(TH1)=0ECH,(TL1)=78H(2)控制程序參考程序如下:

ORG0000HAJMPMAINORG001BHAJMPCOUNTORG0100H

MAIN:MOVTMOD,#50H;設(shè)置T1為計數(shù)器,工作于方式1MOVTH1,#0ECH;設(shè)定計數(shù)初值

MOVTL1,#78HMOVSP,#60H;設(shè)堆棧指針

SETBET1;開T1中斷

SETBEA ;CPU開中斷

CLRF0 ;用戶標(biāo)志F0清0WAIT:MOVC,P1.1 ;等待啟動

JCWAIT ;P1.1=1,等待

CLRP1.0 ;啟動設(shè)備

SETBTR0 ;T1開始計數(shù)LOOP:JNBF0,$ ;等待計數(shù)5000中斷

SETBP1.0 ;繞線機停止工作

CLRTR0 ;T1停止計數(shù)

CLRF0 ;清0SJMPWAIT ;等待重新啟動

ORG0200H ;T1中斷服務(wù)程序起始地址COUNT:MOVTH1,#0ECH ;重新設(shè)定計數(shù)初值

MOVTL1,#78HSETBF0 ;用戶標(biāo)志置1RETI ;中斷返回

END5.4.4課題與實訓(xùn)

簡易方波發(fā)生器一.實訓(xùn)目的掌握定時器初值的計算方法學(xué)習(xí)定時器的使用及定時中斷程序的設(shè)計方法掌握方波信號發(fā)生器的設(shè)計方法二.課題要求

1.基本要求:利用定時/計數(shù)器T1,工作于方式0,采用查詢方式,在P1.0引腳輸出頻率為500Hz的方波,并用示波器進(jìn)行觀察(晶振采用12MHz)。

2.較高要求:

利用定時/計數(shù)器T1,工作于方式0,采用中斷方式,在P1.0引腳輸出頻率為500Hz的方波,并用示波器進(jìn)行觀察(晶振采用12MHz)。三.背景知識

1.方波產(chǎn)生原理使P1.0引腳的輸出狀態(tài)定時翻轉(zhuǎn),則該端口能輸出一定頻率的方波。

2.方式0的時間常數(shù)初值

定時/計數(shù)器工作于方式0狀態(tài)下,定時/計數(shù)的長度是13位。應(yīng)用前面給出的時間常數(shù)初值的計算公式

X=8192-t(fosc/12)

我們可以很方便地計算出時間常數(shù)初值,但在將其裝入定時/計數(shù)器的TH、TL寄存器時,必須要注意:將計算結(jié)果的高8位裝入TH1(或TH0)、低5位裝入TL1(或TL0),這一環(huán)節(jié)是非常容易出錯的。

以該實訓(xùn)T1方式0產(chǎn)生500Hz的方波(周期是2ms)為例,需要進(jìn)行1ms的定時,時間常數(shù)初值

X=8192-1×10-3×(12×106/12)=8192-1000=7192=1C18H=0001110000011000B

以13位二進(jìn)制數(shù)表示,是1110000011000B,則(TL1)=00011000B=18H,(TH1)=00011100B=1CH

定義TMOD=00000000B四.硬件電路該實訓(xùn)硬件電路十分簡單,見圖5-17。圖5-17簡易方波發(fā)生器的硬件電路五.參考程序(1)P1.0輸出500Hz方波——查詢方式

ORG0000H LJMPMAIN ;跳至主程序

ORG0100H MAIN:MOVTMOD,#00H ;置T1工作于方式0 MOVTH1,#1CH ;裝入時間常數(shù)初值

MOVTL1,#18H SETBTR1 ;啟動T1LOOP:JNBTF1,LOOP ;查詢等待

CLRTF1;清TF1 CPLP1.0 ;P1.0取反

MOVTH1,#01CH ;重新裝入時間常數(shù)初值

MOVTL1,#18HAJMPLOOP;繼續(xù)生成波形

END

(2)P1.0輸出500Hz方波——中斷方式

ORG0000H LJMPMAIN ;跳至主程序

ORG001BH ;T1的中斷入口地址

LJMPFANGBO ;轉(zhuǎn)至中斷服務(wù)程序

ORG0100H MAIN:MOVTMOD,#00H ;置T1工作于方式0 MOVTH1,#0E0H ;裝入時間常數(shù)初值

MOVTL1,#18H SETBET1 ;允許T1中斷

SETBEA ;CPU開中斷

SETBTR1 ;啟動T1

SJMP$ ;等待中斷FANGBO:CPLP1.0 ;P1.0取反

MOVTH1,#0E0H ;重新裝入時間常數(shù)初值

MOVTL1,#18H RETI ;中斷返回

END六.總結(jié)與提高

1.總結(jié)

本實訓(xùn)利用定時器T1的定時功能,以兩種形式輸出頻率為500Hz方波。在實際應(yīng)用中,方波的頻率可能要根據(jù)現(xiàn)場測量參數(shù)、給定參數(shù)或按照某種函數(shù)關(guān)系而變化。因此輸出波形的頻率在編程時還是未知的。2.提高定時/計數(shù)器的計時范圍有限,當(dāng)晶振采用12MHz時,方式1的計時時間最長,也只有65.536ms。當(dāng)需要定時的時間超出了定時/計數(shù)器的計數(shù)范圍,如需定時2秒,這時可以采用以下兩種方法來處理:⑴定時器+軟件計數(shù)的方法

思路是:利用定時/計數(shù)器T1,工作于方式1,實現(xiàn)50ms/次的定時,只要定時40次即可實現(xiàn)2s定時。可以算出定時/計數(shù)器T1工作于方式1時,時間常數(shù)初值為

X=65536-t(fosc/12)=65536-50×10-3×(12×106/12)=15536=3CB0H

于是(TH1)=3CH,(TL1)=0B0H。

定義TMOD=00010000B,此處只給出延時2s的查詢方式子程序。DELAY:MOVR3,#40;設(shè)置定時器溢出次數(shù)

SETBTR1 ;啟動T1開始計時

D1:MOVTH1,#3CH;裝入時間常數(shù)初值

MOVTL1,#0B0H D2:JBCTF1,D3;TF1為1否?是則跳至D3,并清TF1,

AJMPD2;否,則跳至D2D3:DJNZR3,D1;R3=0?不是,跳到D1CLRTR1;是,則停止計數(shù)

RET⑵采用兩個定時器串聯(lián)的方法思路是:

將兩個定時器中的一個(如T0)設(shè)置為定時方式,另一個(T1)設(shè)置成計數(shù)方式;將定時器T0計滿產(chǎn)生的輸出,通過一根I/O口線(如P1.0)連接到計數(shù)器T1的計數(shù)脈沖輸入端P3.5,從而實現(xiàn)更長時間的定時。5.5中斷與定時/計數(shù)器綜合應(yīng)用舉例

5.5.1概述定時/計數(shù)功能與中斷一樣,都是單片機的常用功能。兩者常常同時使用。如實訓(xùn)7就是簡單的中斷、定時綜合應(yīng)用實例。在這類程序的編制過程中,要注意這樣幾個問題:

選擇合適的中斷和定時/計數(shù)方式。如外部中斷是采用電平觸發(fā)還是脈沖下降沿觸發(fā);定時/計數(shù)是用自動重裝方式還是每次定時結(jié)束后用軟件重裝。確定定時結(jié)束的判別方法,用中斷還是查詢。如采用中斷,與其它中斷的優(yōu)先級如何確定,是否會影響系統(tǒng)功能。正確初始化。合理分配控制功能。

☆5.5.2課題與實訓(xùn)

音樂門鈴一.實訓(xùn)目的

1.掌握中斷與定時/計數(shù)綜合程序的設(shè)計方法

2.學(xué)習(xí)音樂門鈴的設(shè)計過程二.課題要求在單片機P1.0引腳外接揚聲器,唱出《祝你生日快樂》歌。三.背景知識

1.音頻脈沖的產(chǎn)生聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單片機某個口線的“高”電平或“低”電平,則在該口線上就能產(chǎn)生一定頻率的方波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時程序控制“高”“低”電平的持續(xù)時間,就能改變輸出頻率,從而改變音調(diào)。例如,要產(chǎn)生中音1。從表4-5可知,中音1的頻率為523Hz,周期T=1/523=1912μs,其半周期為1912/2=956μs,因此只要在P1.0引腳產(chǎn)生半周期為956μs的方波,即可聽到持續(xù)的1音。C調(diào)各音符頻率與計數(shù)初值的對應(yīng)表如下:注:不發(fā)音的簡譜碼用“0”表示

2.音樂節(jié)拍的生成要唱出一首歌,只產(chǎn)生出音頻脈沖還不夠,還要考慮節(jié)拍。

定義:每個音符占用一個字節(jié),字節(jié)的高4位代表音符的高低,低4位表示該音符的節(jié)拍,如果一拍為0.4秒,則1/4拍是0.1秒,只要設(shè)定延遲時間就可獲得節(jié)拍的時間。我們也可以設(shè)1/4拍為1個DELAY,則1拍應(yīng)該是4個DELAY,只要求得1/4拍的DELAY時間,其余的節(jié)拍就是它的倍數(shù)。見表

表5-6節(jié)拍與節(jié)拍碼對照表

3.建立音樂的步驟:

先把譜的音符找出,然后由上表建立時間常數(shù)初值T的順序表,標(biāo)號為TABLE1。建立音符和節(jié)拍表,標(biāo)號為TABLE,將構(gòu)成發(fā)音符的計數(shù)值放在其中。

TABLE表的結(jié)構(gòu)為:簡譜碼(代表音符)為高4位,節(jié)拍碼(表示節(jié)拍數(shù))為低4位,在唱歌程序中對每一個有節(jié)拍的音符能通過設(shè)計共同生成音符節(jié)拍碼,本程序的音符節(jié)拍碼表見表4-5。(1)1/4拍的延遲時間=187毫秒DELAY:MOVR5,#02D1:MOVR4,#187D2:MOVR3,#248DJNZR3,$DJNZR4,D2DJNZR5,D1DJNZR6,DELAYRET

(2)歌譜生日快樂歌

C3/4︱5.565︱7-︱5.565︱-︱ 祝你生日快樂祝你生日快樂︱5.5︱76︱︱-︱ 我們高聲歌唱祝你生日快樂四.硬件電路圖5-18音樂的應(yīng)用電路

五.參考程序

ORG0000H LJMPMAIN ;跳至主程序

ORG001BH ;T1的中斷入口地址

LJMPTIM1 ;轉(zhuǎn)至中斷服務(wù)程序

ORG0100H MAIN:MOVTMOD,#10H ;置T1工作于方式1 SETBET1 ;開T1中斷

SETBEA ;CPU開中斷

MAIN1:MOV60H,#00H;取簡譜碼指針

NEXT:MOVA,60H;簡譜碼指針裝入AMOVDPTR,#TABLE;指向簡譜碼TABLE表地址

MOVCA,@A+DPTR;簡譜碼存入AMOVR1,A;簡譜碼暫存R1JZSTOP;是否取到結(jié)束碼00?

ANLA,#0FH;沒有,則取低4位的節(jié)拍碼

MOVR6,A;取到的節(jié)拍碼存入R6MOVA,R1;將取到的簡譜碼再裝入ASWAPA;高低4位交換

ANLA,#0FH;取低4位的音符碼

JNZSING;取到的音符碼是否為0?

CLRTR1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論