看了很多幾本單片機的書,對51定時器的認識又有了一些新的變化。開局一張圖(一個簡單的單片機程序),其實文章也是來解釋這個代碼的寫法。
在此,后面也會對STC官方的庫,做詳細的解讀和使用
我們使用串口,設置它的寄存器
?
一共4種模式,八位的可變
2位,4個狀態
B6位為0的時候,B7用于幀錯誤檢測,當檢測到一個無效的停止位的時候,UART設置它,軟件清0.
這個方式0,是使用一個專用的SBUF發送的
TI標志位
發送完以后,自動的變1,相對于有了一個中斷。然后中斷系統處理,處理完以后就要把狀態變回去。
RI也是,一發一收
接收的一個函數
這里是注意的編程要點
這里要開啟UART的中斷,先開啟大中斷,接著開啟串口的中斷
REN是收發功能的開關
1,2,3都是異步通信,0是移位寄存器
接下來配置定時器
只有兩個寄存器,靈活使用要
TCON是這樣的
TR1,相對于是使能位
關于定時器不得不說,而且最近看了幾本相對古老的書,真的很清晰,現在的書比喻一堆也不知道想說什么。
對51來說,其實是只有4種方式:
1、51單片機計數器的脈沖輸入腳。主要的脈沖輸入腳有Px,y, 也指對應T0的P3.4和對應T1的P3.5,主要用來檢測片外來的脈沖。而引腳18和19則對應著晶振的輸入脈沖,脈沖的頻率和周期為:
F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us
2、定時器有兩種工作模式,分別為計數模式和定時模式。對Px,y的輸入脈沖進行計數為計數模式。定時模式,則是對MCU的主時鐘經過12分頻后計數。因為主時鐘是相對穩定的,所以可以通過計數值推算出計數所經過的時間。所謂的定時器就是恒定的數數。
3、51計數器的計數值存放于特殊功能寄存器中。T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)
其實就是容器,存放脈沖數的
這是我們單片機的4種定時器模式
4、TLx與THx之間的搭配關系
以下的進制,就是向前進位的意思。
1)、TLx與THx之間32進制。即當TLx計到32個脈沖時,TLx歸0同時THx進1。這也稱為方式0。
注意x,是兩個定時器的意思。
這個圖可能更清晰
2)、TLx與THx之間256進制。即當TLx計到256個脈沖時,TLx歸0同時THx進1。這也稱為方式1。
在方式1時,最多計65536個脈沖產生溢出。在主頻為11.0592M時,每計一個脈沖為1.085us,所以溢出一次的時間為1.085usx65536=71.1ms。
2的16次方
3)、THx用于存放TLx溢出后,TLx下次計數的起點。這也稱為方式2。
4)、THx與TLx分別獨立對自己的輸入脈沖計數。這也稱為方式3。
最后再看一下這個定時器的容器
H,L都是高低位的說明。
定時器初始化
1)、確定定時器的計數模式。
2)、確定TLx與THx之間的搭配關系。
3)、確定計數起點值。即TLx與THx的初值。
4)、是否開始計數。TRx
看不懂沒有關系,繼續磨豆腐,再看別的解釋。
16位的寄存器最大的數值是這樣的
13位是這么大
0,13位模式
1,16位模式
2,8位自動重裝模式
3,兩個八位模式
有個問題是,定時器總是和中斷關聯,其實就是,你再應用的時候,不學任何一個都不行。
中斷就好像是權力巨大的IF程序,來了以后主程序就得搭理,媽的。就好像,來了快遞你必須要去取1一樣。
在51里面,這么屌的事件,有這么幾個。更裝逼的名字叫中斷源。分類有三種,外部引腳來的中斷,也就是測量使用,比如你想測量一個波形的占空比,一個波肯定是有邊沿的,你記錄這兩個事件,接著你計算中間的時間,相對于計數,這就測量出來了。
其次就是定時器的中斷,和UART的中斷。
一個這樣的來源,就有一個這樣的標志,這也好理解啊,你總得說明它發生了不是嗎?
這個世界是高速并行的,對于單片機的世界也是,經常多個中斷一起來,關于順序的問題,引入的解決方案是優先級。
害,有個無奈的事情,就是有的東西天生就自帶光環,比如復位事件?;旧暇褪腔钔练肆?,媽的,我來了,誰也別活。。。
一個中斷究竟要怎么樣的觸發,對于現實世界來講,就是消息。打電話,喊叫,或者看見??傊前l生了什么。
單片機也是這樣,發生了什么。
我想聊聊定時器中斷,時刻記得兩個使命,定時和計數。其實你該想想時間是什么作用。其實是標度的概念。它說明了兩個點,起點和終點,在定義它是均勻的時候,那么你可以無聊的數一下有多少。
總結一下,定時器,不如說是時間,它就是一把尺子。中斷就是定位使用的標尺,說:我想從這里開始計數,到下個位置停止。
當然了,處于對技術上面的妥協,定時器中斷也來做別的工作。對于定時,有長有短。對于特別長的時間呢。就好像下面這樣:
右邊是一個計時的間隔
這樣看
不同于我們世界的計時法,我們可以看表,秒針一動,一個時間間隔,單片機沒有這種東西,它有的是是振蕩器。12M,這東西0都數不清,所以不能之間使用,這里就做除法。
我們把這個間隔記錄下來,滿了以后就傳一個數值出去,接著把這個清空,繼續裝東西,好咧,這就是定時器所有的奧秘了。
接下來看看中斷的結構
對于定時器的中斷寄存器就是這樣
這里面沒有編程模型,但是我非要加點這個東西進去。查詢模型,查詢標準位,然后balabala。
4個中斷控制寄存器分別是,定時器,UART,中斷允許,中斷優先級。功能是中斷標志,中斷允許,優先級設定。
IE0 ,外部中斷0標志當它位1的時候,向CPU發送中斷,CPU響應以后硬件請0.
這個就是什么樣的信號來激發
單片機響應中斷以后,不會自動的關閉中斷。轉向ISR以后,把中斷關閉。為了響應下一次中斷。
外中斷1,脈沖觸發這樣設置
這里還需要說一下,中斷優先級。兩級,高或者低。低級可以被高級的打斷,同級不響應。
這個表的作用就是同時來了中斷,響應的順序
這樣寫ISR
畢竟在主線搬磚,現在突然去支線干活,所以需要保護現場
先把手頭的工作做完,PC是執行下一次主線命令的指針,也放入stack。接著搞個圍欄,擋同級的中斷。ISR雖然小,但也還是一個函數,所以它的PC值裝載在主線中,開始運行。
ISR完成的標志是,返回RETI這個指令,相當于,老子完事了~至于這個中斷來的時候去哪里執行ISR,也就是入口在哪里,這個是固定的。
這個時候,引起中斷的位置會自動清0,主程序的第一條指令是跳轉指令,越過這個中斷的向量區。
最后擦屁股得指令就用RETI,這個指令可以把中斷優先級狀態還原,否則中斷就認為中斷還在運行。還有建議就是PUSH和POP得成對使用。
后面得這個激發次數比較重要
外部中斷0 ,下降沿觸發
看看匯編得版本
這個是中斷得向量表,一個長跳轉帶你去main還是exit0
mian很簡單,初始化sp,然后就是一些設置
最后是服務程序,CPL操作IO ,RRTI來說明中斷完成
這段有點拗口
這里需要補充一些東西:
1T、4T、6T和12T是指一個機器周期需要的時鐘周期數。比如現在普遍的51單片機STC89S52是12T的,其1個機器周期等于12個時鐘周期。
也就是說,機器周期大,時鐘周期小。
時鐘頻率:是指為單片機提供時鐘信號的振蕩源的周期(也叫時鐘周期),當采用12MHz晶振時,一個振蕩周期是1/12M秒(1/12000000s)。
時鐘周期也稱為振蕩周期,定義為時鐘脈沖的倒數(可以這樣來理解,時鐘周期就是單片機外接晶振的倒數,例如12M的晶振,它的時間周期就是1/12 us),是計算機中最基本的、最小的時間單位。
機器周期:對于標準51架構而言,1個機器周期為12個時鐘振蕩周期,即1微秒。具體計算為:時鐘周期 X cycles。如果單片機是12T的話,那么機器周期就是時鐘周期×12。
指令周期:執行一條指令的時間,是機器周期的倍數。不同的CPU,執行不同的指令,所需要的指令周期不同。?
機器周期是單片機執行的最小倍數。
不同的單片機指令執行速度不同。1T單片機的計時器是兼容傳統12T單片機的。也就是說只是執行一般的指令會快12倍。
新的單片機已經能做到不分頻了,并且盡量單指令周期,就是指令周期=機器周期=時鐘周期。
就是什么1T單片機,比傳統的快12倍。
在8051單片機中把一個時鐘周期定義為一個節拍(用P表示),二個節拍定義為一個狀態周期(用S表示)。
在計算機中,為了便于管理,常把一條指令的執行過程劃分為若干個階段,每一階段完成一項工作。例如,取指令、存儲器讀、存儲器寫等,這每一項工作稱為一個基本操作。
完成一個基本操作所需要的時間稱為機器周期。
一般情況下,一個機器周期由若干個S周期(狀態周期)組成。8051系列單片機的一個機器周期同6個S周期(狀態周期)組成。前面已說過一個時鐘周期定義為一個節拍(用P表示),二個節拍定義為一個狀態周期(用S表示),8051單片機的機器周期由6個狀態周期組成,也就是說:
一個機器周期=6個狀態周期=12個時鐘周期
指令周期
指令周期是執行一條指令所需要的時間,一般由若干個機器周期組成。指令不同,所需的機器周期數也不同。對于一些簡單的的單字節指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執行,不再需要其它的機器周期。對于一些比較復雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器周期。
時鐘周期、機器周期、指令周期之間的關系圖如下。
時序圖
時鐘周期(振蕩器的倒數)最小,寫做一個P,接著把這個X2,當作狀態周期。
6個狀態作為一個機器周期。
通常含一個機器周期的指令稱為單周期指令,包含兩個機器周期的指令稱為雙周期指令。
MCS-51中,按它們的長度可分為單字節指令、雙字節指令和三字節指令。執行這些指令需要的時間是不同的,也就是它們所需的機器周期是不同的,有下面幾種形式:
·單字節指令單機器周期·
單字節指令雙機器周期·
雙字節指令單機器周期·
雙字節指令雙機器周期·
三字節指令雙機器周期·
單字節指令四機器周期(如單字節的乘除法指令)
這里截取數據手冊看看。注意看,都是使用的機器周期,好好牢記,6個狀態一個機器周期。
指令時序圖
為了好說明指令在什么時候執行,這里就寫:
S1P2
S2P1
S?。?-6),P(1,2),就這樣
S是6分頻的時鐘周期
現在再看這個
S5P2,是不是可以看懂了。在第五個狀態周期的第二個時鐘周期進行對外采樣。
遇到特別短的脈沖的時候要考慮這個,如果太短就捕獲不到了。
再總結一下:
MCS-51的時序單位有四個,它們分別是節拍、狀態、機器周期和指令周期。
·節拍與狀態:我們把振蕩脈沖的周期定義為節拍(為方便描述,用P表示),振蕩脈沖經過二分頻后即得到整個單片機工作系統的時鐘信號,把時鐘信號的周期定義為狀態(用S表示),這樣一個狀態就有兩個節拍,前半周期相應的節拍我們定義為1(P1),后半周期對應的節拍定義為2(P2)。?
·機器周期:MCS-51有固定的機器周期,規定一個機器周期有6個狀態,分別表示為S1-S6,而一個狀態包含兩個節拍,那么一個機器周期就有12個節拍,我們可以記著S1P1、S1P2……S6P1、S6P2,一個機器周期共包含12個振蕩脈沖,即機器周期就是振蕩脈沖的12分頻,顯然,如果使用6MHz的時鐘頻率,一個機器周期就是2us,而如使用12MHz的時鐘頻率,一個機器周期就是1us?!ぶ噶钪芷冢簣绦幸粭l指令所需要的時間稱為指令周期,MCS-51的指令有單字節、雙字節和三字節的,所以它們的指令周期不盡相同,也就是說它們所需的機器周期不相同,可能包括一到四個不等的機器周期。
呼,文章雖然很長,但是對于定時器的內容,我還是沒有寫出來好難受。。。
審核編輯:劉清
評論
查看更多