標(biāo)題: 第5章 定時(shí)器與數(shù)碼管基礎(chǔ)5.1 5.2 [打印本頁(yè)]
作者: 卓然塵世間 時(shí)間: 2026-3-26 10:28
標(biāo)題: 第5章 定時(shí)器與數(shù)碼管基礎(chǔ)5.1 5.2
隨著學(xué)習(xí)內(nèi)容越來(lái)越多,個(gè)別細(xì)節(jié)可能會(huì)感覺(jué)略有吃力。但是不要擔(dān)心,這個(gè)跟小孩學(xué)走路一樣,剛開(kāi)始走得不太穩(wěn),沒(méi)關(guān)系,多走幾步多練練。看教材的時(shí)候要注意專(zhuān)心,一遍看不懂,思考一下,再回頭看第二遍和第三遍,沒(méi)準(zhǔn)一下就明白了。如果三遍還看不明白,那就把不懂的問(wèn)題放一放,繼續(xù)往下學(xué)兩課然后再回頭看一次,也可以與他人討論一下,可能就會(huì)茅塞頓開(kāi)了。
5.1邏輯電路與邏輯運(yùn)算在數(shù)字電路經(jīng)常會(huì)遇到邏輯電路,而在C語(yǔ)言中則經(jīng)常用到邏輯運(yùn)算。二者在原理上是相互關(guān)聯(lián)的,在這里就先簡(jiǎn)單介紹一下。
首先,在“邏輯”這個(gè)概念范疇內(nèi),存在真和假這兩個(gè)邏輯值,而將其對(duì)應(yīng)到數(shù)字電路或C語(yǔ)言中,就變成了“非0值”和“0值”這兩個(gè)值,即邏輯上的“假”就是數(shù)字電路或C語(yǔ)言中的“0”這個(gè)值,而邏輯“真”就是其它一切“非0值”。
來(lái)具體學(xué)習(xí)一下幾個(gè)主要的邏輯運(yùn)算符。假定有2個(gè)字節(jié)變量:A和B,二者進(jìn)行某種邏輯運(yùn)算后的結(jié)果為F。
以下邏輯運(yùn)算符都是按照變量整體值進(jìn)行運(yùn)算的,通常就叫做邏輯運(yùn)算符:
&& 邏輯與。F = A && B,當(dāng)A、B的值都為真(即非0值,下同)時(shí),其運(yùn)算結(jié)果F為真(具體數(shù)值為1,下同);當(dāng)A、B值任意一個(gè)為假(即0,下同)時(shí),結(jié)果F為假(具體數(shù)值為0,下同)。
|| 邏輯或。F = A || B,當(dāng)A、B值任意一個(gè)為真時(shí),其運(yùn)算結(jié)果F為真;當(dāng)A、B值都為假時(shí),結(jié)果F為假。
! 邏輯非,F = !A,當(dāng)A值為假時(shí),其運(yùn)算結(jié)果F為真;當(dāng)A值為真時(shí),結(jié)果F為假。
以下邏輯運(yùn)算符都是按照變量?jī)?nèi)的每一個(gè)位來(lái)進(jìn)行運(yùn)算的,通常就叫做位運(yùn)算符:
& 按位與,F = A & B,將A、B兩個(gè)字節(jié)中的每一位都進(jìn)行與運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0b11001100,B = 0b11110000,則結(jié)果F就等于0b11000000。
| 按位或,F = A | B,將A、B兩個(gè)字節(jié)中的每一位都進(jìn)行或運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0b11001100,B = 0b11110000,則結(jié)果F就等于0b11111100。
~ 按位取反,F = ~A,將A字節(jié)內(nèi)的每一位進(jìn)行非運(yùn)算(就是取反),再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0b11001100,則結(jié)果F就等于0b00110011;這個(gè)運(yùn)算符流水燈實(shí)驗(yàn)里已經(jīng)用過(guò)了,現(xiàn)在再回頭看一眼,是不是清楚多了。
^ 按位異或,異或的意思是,如果運(yùn)算雙方的值不同(即相異)則結(jié)果為真,雙方值相同則結(jié)果為假。在C語(yǔ)言里沒(méi)有按變量整體值進(jìn)行的異或運(yùn)算,所以?xún)H以按位異或?yàn)槔?/font>F = A ^ B,A = 0b11001100,B = 0b11110000,則結(jié)果F就等于0b00111100。
今后看資料或芯片手冊(cè)的時(shí)候,會(huì)經(jīng)常遇到一些電路符號(hào),圖5-1所示就是數(shù)字電路中的常用符號(hào),知道這些符號(hào)有利于理解器件的邏輯結(jié)構(gòu),尤其重點(diǎn)認(rèn)識(shí)圖5-1中的國(guó)外流行圖形符號(hào)。在這里先簡(jiǎn)單看一下,日后遇到了可以到這里來(lái)查閱。
5-1.png (55.11 KB, 下載次數(shù): 0)
下載附件
2026-3-26 10:26 上傳
圖5-1 邏輯電路符號(hào)
5.2 定時(shí)器的學(xué)習(xí)定時(shí)器是單片機(jī)系統(tǒng)的一個(gè)重點(diǎn),但并不是難點(diǎn),需要完全理解并且熟練掌握。
5.2.1 定時(shí)器的初步認(rèn)識(shí)1、時(shí)鐘周期
時(shí)鐘周期:時(shí)鐘周期T是時(shí)序中最小的時(shí)間單位,具體計(jì)算的方法是
時(shí)鐘周期 =1/時(shí)鐘源頻率
Kingst51單片機(jī)開(kāi)發(fā)板上用的晶振是11.0592M,那么對(duì)于這個(gè)單片機(jī)系統(tǒng)來(lái)說(shuō),時(shí)鐘周期=1/11059200秒。
2、機(jī)器周期
單片機(jī)完成一個(gè)操作的最短時(shí)間。機(jī)器周期主要針對(duì)匯編語(yǔ)言而言,在匯編語(yǔ)言下程序的每一條語(yǔ)句執(zhí)行所使用的時(shí)間都是機(jī)器周期的整數(shù)倍,語(yǔ)句占用的時(shí)間是可以計(jì)算出來(lái)的,而C語(yǔ)言一條語(yǔ)句的時(shí)間是不確定的,受到諸多因素的影響。51單片機(jī)系列,在其標(biāo)準(zhǔn)架構(gòu)下一個(gè)機(jī)器周期是12個(gè)時(shí)鐘周期,也就是12/11059200秒。而一些增強(qiáng)型的51單片機(jī),其速度都更快一些,有的1個(gè)機(jī)器周期等于4個(gè)時(shí)鐘周期,有的1個(gè)機(jī)器周期就等于1個(gè)時(shí)鐘周期,也就是說(shuō)大體上其速度可以達(dá)到標(biāo)準(zhǔn)51架構(gòu)的3倍或12倍。Kingst51單片機(jī)采用的是標(biāo)準(zhǔn)的51單片機(jī),所以后面的章節(jié)如果遇到機(jī)器周期這個(gè)概念,全部是指12個(gè)時(shí)鐘周期。
時(shí)鐘周期和機(jī)器周期兩個(gè)概念了解即可,下邊就來(lái)講講重頭戲,定時(shí)器和計(jì)數(shù)器。定時(shí)器和計(jì)數(shù)器是單片機(jī)內(nèi)部的同一個(gè)模塊,通過(guò)配置SFR(特殊功能寄存器)可以實(shí)現(xiàn)兩種不同的功能。大多數(shù)情況下是使用定時(shí)器功能,因此主要來(lái)講定時(shí)器功能,計(jì)數(shù)器功能可自學(xué)。
顧名思義,定時(shí)器就是用來(lái)進(jìn)行定時(shí)的。定時(shí)器內(nèi)部有一個(gè)寄存器,讓它開(kāi)始計(jì)數(shù)后,這個(gè)寄存器的值每經(jīng)過(guò)一個(gè)機(jī)器周期就會(huì)自動(dòng)加1,因此,可以把機(jī)器周期理解為定時(shí)器的計(jì)數(shù)周期。就像鐘表每經(jīng)過(guò)一秒,數(shù)字自動(dòng)加1一樣,定時(shí)器是每過(guò)一個(gè)機(jī)器周期的時(shí)間,也就是12/11059200秒,數(shù)字自動(dòng)加1。還有一個(gè)特別注意的地方,就是鐘表是加到60后,秒就自動(dòng)變成0了,這種情況在單片機(jī)或計(jì)算機(jī)里稱(chēng)之為溢出。那定時(shí)器加到多少才會(huì)溢出呢?后面會(huì)講到定時(shí)器有多種工作模式,分別使用不同的位寬(指使用多少個(gè)二進(jìn)制位),假如是16位的定時(shí)器,也就是2個(gè)字節(jié),最大值就是65535,那么加到65535后,再加1就算溢出,如果有其他位數(shù)的話(huà),道理是一樣的,對(duì)于51單片機(jī)來(lái)說(shuō),溢出后,這個(gè)值會(huì)直接變成0。從某一個(gè)初始值開(kāi)始,經(jīng)過(guò)確定的時(shí)間后溢出,這個(gè)過(guò)程就是定時(shí)的含義。
5.2.2 定時(shí)器的寄存器標(biāo)準(zhǔn)的51單片機(jī)內(nèi)部有T0和T1這兩個(gè)定時(shí)器,T就是Timer的縮寫(xiě),現(xiàn)在很多51系列單片機(jī)還會(huì)增加額外的定時(shí)器,在這里先講定時(shí)器0和1。對(duì)于單片機(jī)的每一個(gè)功能模塊,都是由它的SFR,也就是特殊功能寄存器來(lái)控制。與定時(shí)器有關(guān)的特殊功能寄存器,有以下幾個(gè),不需要去記憶這些寄存器的名字和作用,只要大概知道就行,用的時(shí)候隨時(shí)可以查手冊(cè),找到每個(gè)寄存器的名字和每個(gè)寄存器所起到的作用。
表5-1的寄存器是存儲(chǔ)定時(shí)器的計(jì)數(shù)值的。TH0/TL0用于T0,TH1/TL1用于T1。
表5-1 定時(shí)值存儲(chǔ)寄存器
表5-2是定時(shí)器控制寄存器TCON的位分配,表5-3是則是對(duì)每一位的具體含義的描述。
表5-2 TCON——定時(shí)器控制寄存器的位分配(地址0x88、可位尋址)
表5-3 TCON——定時(shí)器控制寄存器的位描述
位 | 符號(hào) | 描述 |
| | 定時(shí)器1溢出標(biāo)志。一旦定時(shí)器1發(fā)生溢出時(shí)硬件置1。清零有兩種方式:軟件清零,或者進(jìn)入定時(shí)器中斷時(shí)硬件清零。 |
| | 定時(shí)器1運(yùn)行控制位。軟件置位/清零來(lái)進(jìn)行啟動(dòng)/停止定時(shí)器。 |
| | 定時(shí)器0溢出標(biāo)志。一旦定時(shí)器0發(fā)生溢出時(shí)硬件置1。清零有兩種方式:軟件清零,或者進(jìn)入定時(shí)器中斷時(shí)硬件清零。 |
| | 定時(shí)器0運(yùn)行控制位。軟件置位/清零來(lái)進(jìn)行啟動(dòng)/停止定時(shí)器。 |
| | 外部中斷部分,與定時(shí)器無(wú)關(guān),暫且不看。 |
| |
| |
| |
請(qǐng)注意在表5-3中的描述中,只要寫(xiě)到硬件置1或者清0的,就是指一旦符合條件,單片機(jī)將自動(dòng)完成的動(dòng)作,只要寫(xiě)軟件置1或者清0的,是指必須用程序去完成這個(gè)動(dòng)作,后續(xù)遇到此類(lèi)描述就不再另做說(shuō)明了。
對(duì)于TCON這個(gè)SFR,其中有TF1、TR1、TF0、TR0這4位需要理解清楚,它們分別對(duì)應(yīng)于T1和T0。以定時(shí)器1為例講解,那么定時(shí)器0同理。先看TR1,當(dāng)程序中寫(xiě)TR1 = 1以后,定時(shí)器值就會(huì)每經(jīng)過(guò)一個(gè)機(jī)器周期自動(dòng)加1,當(dāng)程序中寫(xiě)TR1 = 0以后,定時(shí)器就會(huì)停止加1,其值會(huì)保持不變化。TF1,這個(gè)是一個(gè)標(biāo)志位,他的作用是通知用戶(hù)定時(shí)器溢出了。比如定時(shí)器設(shè)置成16位的模式,那么每經(jīng)過(guò)一個(gè)機(jī)器周期,TL1加1一次,當(dāng)TL1加到255后,再加1,TL1變成0,TH1會(huì)加1一次,如此一直加到TH1和TL1都是255(即TH1和TL1組成的16位整型數(shù)為65535)以后,再加1一次,就會(huì)溢出了,TH1和TL1同時(shí)都變?yōu)?/font>0,只要一溢出,TF1馬上自動(dòng)變成1,通知用戶(hù)定時(shí)器溢出了,僅僅是提供給用戶(hù)一個(gè)信號(hào),讓用戶(hù)知道定時(shí)器溢出了,它不會(huì)對(duì)定時(shí)器是否繼續(xù)運(yùn)行產(chǎn)生任何影響。
本節(jié)開(kāi)頭就提到了定時(shí)器有多種工作模式,工作模式的選擇就由TMOD來(lái)控制,TMOD的位分配和描述見(jiàn)表5-4到5-6所示,TMOD的位功能如表5-5所示。
表5-4 TMOD——定時(shí)器模式寄存器的位分配(地址0x89、不可位尋址)
表5-5 TMOD——定時(shí)器模式寄存器的位描述
| |
| 在表5-4中,標(biāo)T1的表示控制定時(shí)器1的位,標(biāo)T0的表示控制定時(shí)器0的位。 |
| 該位被置1時(shí)為門(mén)控位。僅當(dāng)‘INTx’腳為高并且‘TRx’控制位被置1時(shí)使能定時(shí)器‘x’,定時(shí)器開(kāi)始計(jì)時(shí),當(dāng)該位被清0時(shí),只要‘TRx’位被置1,定時(shí)器x就使能開(kāi)始計(jì)時(shí),不受到單片機(jī)引腳‘INTx’外部信號(hào)的干擾,常用來(lái)測(cè)量外部信號(hào)脈沖寬度。這是定時(shí)器一個(gè)額外功能,本節(jié)課暫不介紹。 |
| 定時(shí)器或計(jì)數(shù)器選擇位。該位被清零時(shí)用作定時(shí)器功能(內(nèi)部系統(tǒng)時(shí)鐘),被置1用作計(jì)數(shù)器功能。 |
表5-6 TMOD——定時(shí)器模式寄存器M1/M0工作模式
| | | |
| | | 兼容8048單片機(jī)的13位定時(shí)器,THn的8位和TLn的5位組成一個(gè)13位定時(shí)器。 |
| | | THn和TLn組成一個(gè)16位的定時(shí)器。 |
| | | 8位自動(dòng)重裝模式,定時(shí)器溢出后THn重裝到TLn中。 |
| | | 禁用定時(shí)器1,定時(shí)器0變成2個(gè)8位定時(shí)器。 |
請(qǐng)注意,表5-2的TCON最后標(biāo)注了“可位尋址”,而表5-4的TMOD標(biāo)注的是“不可位尋址”。意思就是說(shuō):比如TCON有一個(gè)位叫TR1,用戶(hù)可以在程序中直接進(jìn)行TR1 = 1這樣的操作。但對(duì)TMOD里的位比如(T1)M1 = 1這樣的操作就是錯(cuò)誤的。要操作就必須一次操作這整個(gè)字節(jié),也就是必須一次性對(duì)TMOD所有位操作,不能直接對(duì)其中某一位單獨(dú)進(jìn)行操作,那么能不能只修改其中的一位而不影響其它位的值呢?當(dāng)然可以,在后續(xù)課程中就會(huì)學(xué)到方法的。
表5-6列出的就是定時(shí)器的4種工作模式,其中模式0是為了兼容老的8048系列單片機(jī)而設(shè)計(jì)的,現(xiàn)在的51幾乎不會(huì)用到這種模式,而模式3根據(jù)應(yīng)用經(jīng)驗(yàn),它的功能用模式2完全可以取代,所以基本上也是不用的,那么重點(diǎn)來(lái)學(xué)習(xí)模式1和模式2。
模式1,是THn和TLn組成了一個(gè)16位的定時(shí)器,計(jì)數(shù)范圍是0~65535,溢出后,只要不對(duì)THn和TLn重新賦值,則從0開(kāi)始計(jì)數(shù)。模式2,是8位自動(dòng)重裝載模式,只有TLn做加1計(jì)數(shù),計(jì)數(shù)范圍0~255,THn的值并不發(fā)生變化,而是保持原值,TLn溢出后,TFn就直接置1了,并且THn原先的值直接賦給TLn,然后TLn從新賦值的這個(gè)數(shù)字開(kāi)始計(jì)數(shù)。這個(gè)功能可以用來(lái)產(chǎn)生串口的通信波特率,后面章節(jié)講串口的時(shí)候要用到。
5.2.3 定時(shí)器的應(yīng)用了解了定時(shí)器相關(guān)的寄存器,下面就來(lái)做一個(gè)定時(shí)器的程序,鞏固一下學(xué)到的內(nèi)容。這節(jié)課的程序先使用定時(shí)器0,在使用定時(shí)器的時(shí)候,需要以下幾個(gè)步驟:
第一步:設(shè)置特殊功能寄存器TMOD,配置好工作模式。
第二步:設(shè)置計(jì)數(shù)寄存器TH0和TL0的初值。
第三步:設(shè)置TCON,通過(guò)TR0置1來(lái)讓定時(shí)器開(kāi)始計(jì)數(shù)。
第四步:判斷TCON寄存器的TF0位,監(jiān)測(cè)定時(shí)器溢出情況。
寫(xiě)程序之前,要先來(lái)學(xué)會(huì)計(jì)算如何用定時(shí)器定時(shí)時(shí)間。Kingst51開(kāi)發(fā)板單片機(jī)的晶振是11.0592M,時(shí)鐘周期就是1/11059200,機(jī)器周期是12/11059200,假如要定時(shí)20ms,就是0.02秒,要經(jīng)過(guò)x個(gè)機(jī)器周期得到0.02秒,來(lái)算一下x*12/11059200=0.02,得到x= 18432。16位定時(shí)器的溢出值是65536(因65535再加1才是溢出),于是就可以這樣操作,先給TH0和TL0一個(gè)初始值,讓它們經(jīng)過(guò)18432個(gè)機(jī)器周期后剛好達(dá)到65536,也就是溢出,溢出后可以通過(guò)檢測(cè)TF0的值得知,就剛好是0.02秒。那么初值y = 65536 - 18432 = 47104,轉(zhuǎn)成16進(jìn)制就是0xB800,也就是TH0 = 0xB8,TL0 = 0x00。
細(xì)心的讀者會(huì)發(fā)現(xiàn),如果初值直接給一個(gè)0x0000,一直到65536溢出,定時(shí)器定時(shí)值最大也就是71ms左右,那么想定時(shí)更長(zhǎng)時(shí)間怎么辦呢?用小學(xué)學(xué)過(guò)的邏輯,倍數(shù)關(guān)系就可以解決此問(wèn)題。
下面就用程序來(lái)實(shí)現(xiàn)LED閃爍功能。
#include <reg52.h>
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned char cnt = 0; //定義一個(gè)計(jì)數(shù)變量,記錄T0溢出次數(shù)
ENLED = 0; //使能U3,選擇獨(dú)立LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0x01; //設(shè)置T0為模式1
TH0 = 0xB8; //為T0賦初值0xB800
TL0 = 0x00;
TR0 = 1; //啟動(dòng)T0
while (1)
{
if (TF0 == 1) //判斷T0是否溢出
{
TF0 = 0; //T0溢出后,清零中斷標(biāo)志
TH0 = 0xB8; //并重新賦初值
TL0 = 0x00;
cnt++; //計(jì)數(shù)值自加1
if (cnt >= 50) //判斷T0溢出是否達(dá)到50次
{
cnt = 0; //達(dá)到50次后計(jì)數(shù)值清零
LED = ~LED; //LED取反:0-->1、1-->0
}
}
}
}
程序中都寫(xiě)了注釋?zhuān)Y(jié)合前幾章學(xué)的內(nèi)容,不難理解。本程序?qū)崿F(xiàn)的結(jié)果是開(kāi)發(fā)板上最右邊的小燈點(diǎn)亮一秒,熄滅一秒,也就是以0.5Hz的頻率進(jìn)行閃爍。
作者: wjfw 時(shí)間: 2026-3-27 01:01
通俗易懂,圖文并茂,樓主辛苦了
作者: 卓然塵世間 時(shí)間: 2026-3-27 13:19
多謝您的認(rèn)可,后續(xù)會(huì)持續(xù)更新
作者: CFDQ 時(shí)間: 2026-4-17 15:37
謝謝分享
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |