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