圖1
這張圖第一眼看過(guò)去,可能會(huì)讓人覺(jué)得頭皮發(fā)麻,但稍微想一下,其實(shí)并不復(fù)雜。
這里以定時(shí)器中斷T0為例。先看
圖2
定時(shí)器(也就是計(jì)數(shù)器)T0到達(dá)PT0H之前,先要經(jīng)過(guò)TF0,開(kāi)關(guān)ET0和開(kāi)關(guān)EA。事實(shí)上,TF0也是一個(gè)開(kāi)關(guān),那么,為了讓定時(shí)器T0的中斷順利到達(dá)PT0H,這三個(gè)開(kāi)關(guān)就必須都閉合。
為什么說(shuō)TF0也是一個(gè)開(kāi)關(guān)呢?注意到TF0所在的那一列,一共有8位,這8位剛好可以用一個(gè)寄存器來(lái)保存和控制,這個(gè)寄存器就叫做定時(shí)器控制寄存器:
圖3圖3和TF0所在的那一列不是完全相同,我們暫且不管。這個(gè)TF0其實(shí)是定時(shí)器0的溢出中斷標(biāo)志位 ,當(dāng)T0從初值開(kāi)始加1計(jì)數(shù)到產(chǎn)生溢出時(shí),由硬件使TF0置1,也就是說(shuō),TF0等于1的時(shí)候(相當(dāng)于這個(gè)開(kāi)關(guān)接通),表示T0(一個(gè)8位寄存器)這個(gè)定時(shí)器(計(jì)數(shù)器)已經(jīng)由8個(gè)0通過(guò)加1計(jì)數(shù)變成了8個(gè)1,再加1將產(chǎn)生溢出。這個(gè)時(shí)候就會(huì)引起CPU硬件復(fù)位,讓T0重新變成8個(gè)0。那么,TF0等于1的作用其實(shí)相當(dāng)于把T0這個(gè)寄存器重新置0,當(dāng)然,重新置0之后這個(gè)開(kāi)關(guān)又重新斷開(kāi)。
再看ET0所在的那一列。這一列同樣由一個(gè)寄存器來(lái)控制,叫做中斷允許控制寄存器IE:
圖4
那么,將ET0這個(gè)開(kāi)關(guān)閉合,就只要將寄存器IE中的那一位置1就可以了。ET0置1以后,就相當(dāng)于定時(shí)器T0所引起的操作已經(jīng)被CPU允許了。
再看圖1中EA所在的那一列。這一列的所有開(kāi)關(guān)要么全斷開(kāi),要么全閉合。全斷開(kāi)的時(shí)候,CPU不響應(yīng)任何中斷;全閉合的時(shí)候,CPU響應(yīng)全部中斷。所以,EA叫做中斷允許控制位。至此,圖1中左邊的三個(gè)開(kāi)關(guān)已經(jīng)解釋清楚了,那么右邊的呢?
右邊的更簡(jiǎn)單了。我們注意到,圖1中一共有六個(gè)不同的中斷源:定時(shí)器T0,T1和T2,外中斷0和外中斷1,還有一個(gè)串口中斷。這六個(gè)不同的中斷源要是同時(shí)產(chǎn)生中斷請(qǐng)求怎么辦呢?這個(gè)時(shí)候就有一個(gè)優(yōu)先級(jí)的問(wèn)題,那么
圖5
優(yōu)先級(jí)就由PT0H和PT0這兩位來(lái)設(shè)置:
圖6
也就是說(shuō),六個(gè)不同的中斷源中的任何一個(gè),都可以通過(guò)這兩位設(shè)置成0到3中的任何一個(gè)優(yōu)先級(jí)。再看圖1中任何一個(gè)優(yōu)先級(jí)的左邊
圖7
是不是都有6根連線?
通過(guò)上述解釋?zhuān)瑘D1就可以這樣簡(jiǎn)單理解:
一個(gè)中斷源如果想得到CPU的響應(yīng),就必須先閉合左邊的三個(gè)開(kāi)關(guān),再按照被設(shè)定的優(yōu)先級(jí)順序進(jìn)行響應(yīng)。
是不是很簡(jiǎn)單?
當(dāng)定時(shí)器T0中斷經(jīng)過(guò)左邊三個(gè)開(kāi)關(guān)以及優(yōu)先級(jí)設(shè)定后,到達(dá)圖7的位置以后,這個(gè)時(shí)候就要把定時(shí)器T0的中斷服務(wù)程序的入口地址放到CPU的PC寄存器里邊以便執(zhí)行這個(gè)中斷程序。
最后以一個(gè)簡(jiǎn)單的定時(shí)器程序來(lái)說(shuō)明:
MOV TMOD,A ; 將工作方式控制字寫(xiě)入TMOD
MOV TL0, #9CH ; 送初值
MOV TH0, #9CH ; 送重裝初值,這個(gè)程序的前三句是設(shè)定定時(shí)器T0的初值,可以不管
SETB ET0 ; 圖1中的ET0開(kāi)關(guān)閉合,允許定時(shí)器T0中斷
SETB EA ; 圖1中EA開(kāi)關(guān)閉合,CPU允許全部中斷
SETB TR0 ; 啟動(dòng)定時(shí)器T0,這一句和圖1中的TF0開(kāi)關(guān)閉合不同,可以這樣理解:TF0開(kāi)關(guān) 閉合是讓計(jì)數(shù)器T0重新變成0,這個(gè)過(guò)程是自動(dòng)進(jìn)行的;而計(jì)數(shù)器T0重新變成0 以后,要重新開(kāi)始計(jì)數(shù),TR0置1就是啟動(dòng)這個(gè)過(guò)程。
HERE: SJMP HERE ; 循環(huán)等待,當(dāng)計(jì)數(shù)器T0沒(méi)有變成全1的時(shí)候重復(fù)執(zhí)行這個(gè)指令,就是 空轉(zhuǎn)
; 定時(shí)器T0的中斷服務(wù)程序
CTC0: 當(dāng)計(jì)數(shù)器T0變成全1的時(shí)候 ,將 CTC0這個(gè)中斷程序的入口地址送人PC寄存 器
CPL P1.7
這個(gè)程序的作用是在P1.7引腳輸出周期為200 μs的方波,所以中斷程序只有一句,就是對(duì)P1.7引腳的電壓不斷進(jìn)行取反操作。
上面程序的編寫(xiě)思路是這樣的:主程序中設(shè)置好中斷發(fā)生的所有條件,即把該閉合的開(kāi)關(guān)閉合,然后啟動(dòng)定時(shí)器,等待定時(shí)器計(jì)數(shù),當(dāng)定時(shí)器計(jì)數(shù)未滿時(shí),主程序空轉(zhuǎn);當(dāng)計(jì)數(shù)器滿了以后,相當(dāng)于圖1中最左邊的那個(gè)開(kāi)關(guān)TF0閉合,從而將中斷程序的入口地址CTC0送入PC讓CPU執(zhí)行,并同時(shí)將計(jì)數(shù)器清0。
當(dāng)中斷程序執(zhí)行完成以后(執(zhí)行了一遍CPL P1.7指令),CPU又回到主程序的空轉(zhuǎn)指令
HERE: SJMP HERE ;繼續(xù)等待,這個(gè)時(shí)候因?yàn)橛?jì)數(shù)器已經(jīng)重新清0并已經(jīng)開(kāi)始重新計(jì)數(shù)(定時(shí)器只要啟動(dòng)一次),并且TFo這個(gè)開(kāi)關(guān)已經(jīng)重新斷開(kāi),所以主程序就在那里等待計(jì)數(shù)器下一次計(jì)滿溢出,如此周而復(fù)始。
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6039文章
44573瀏覽量
636294 -
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120614 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3251瀏覽量
114991
原文標(biāo)題:?jiǎn)纹瑱C(jī)工作原理,一張圖幾個(gè)步驟理解很清晰
文章出處:【微信號(hào):電子技術(shù)控,微信公眾號(hào):電子技術(shù)控】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論