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