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