亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(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é)變量:AB,二者進(jìn)行某種邏輯運(yùn)算后的結(jié)果為F
以下邏輯運(yùn)算符都是按照變量整體值進(jìn)行運(yùn)算的,通常就叫做邏輯運(yùn)算符:
&& 邏輯與。F = A && B,當(dāng)AB的值都為真(即非0值,下同)時(shí),其運(yùn)算結(jié)果F為真(具體數(shù)值為1,下同);當(dāng)AB值任意一個(gè)為假(即0,下同)時(shí),結(jié)果F為假(具體數(shù)值為0,下同)。
|| 邏輯或。F = A || B,當(dāng)AB值任意一個(gè)為真時(shí),其運(yùn)算結(jié)果F為真;當(dāng)AB值都為假時(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,將AB兩個(gè)字節(jié)中的每一位都進(jìn)行與運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0b11001100B = 0b11110000,則結(jié)果F就等于0b11000000
| 按位或,F = A | B,將AB兩個(gè)字節(jié)中的每一位都進(jìn)行或運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0b11001100B = 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 ^ BA = 0b11001100B = 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  邏輯電路符號(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)部有T0T1這兩個(gè)定時(shí)器,T就是Timer的縮寫(xiě),現(xiàn)在很多51系列單片機(jī)還會(huì)增加額外的定時(shí)器,在這里先講定時(shí)器01。對(duì)于單片機(jī)的每一個(gè)功能模塊,都是由它的SFR,也就是特殊功能寄存器來(lái)控制。與定時(shí)器有關(guān)的特殊功能寄存器,有以下幾個(gè),不需要去記憶這些寄存器的名字和作用,只要大概知道就行,用的時(shí)候隨時(shí)可以查手冊(cè),找到每個(gè)寄存器的名字和每個(gè)寄存器所起到的作用。
5-1的寄存器是存儲(chǔ)定時(shí)器的計(jì)數(shù)值的。TH0/TL0用于T0TH1/TL1用于T1
5-1  定時(shí)值存儲(chǔ)寄存器
名稱(chēng)
描述
SFR地址
復(fù)位值
TH0
定時(shí)器0高字節(jié)
0x8C
0x00
TL0
定時(shí)器0低字節(jié)
0x8A
0x00
TH1
定時(shí)器1高字節(jié)
0x8D
0x00
TL1
定時(shí)器1低字節(jié)
0x8B
0x00
5-2是定時(shí)器控制寄存器TCON的位分配,表5-3是則是對(duì)每一位的具體含義的描述。
5-2  TCON——定時(shí)器控制寄存器的位分配(地址0x88、可位尋址)
7
6
5
4
3
2
1
0
符號(hào)
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
復(fù)位值
0
0
0
0
0
0
0
0
5-3   TCON——定時(shí)器控制寄存器的位描述
符號(hào)
描述
7
TF1
定時(shí)器1溢出標(biāo)志。一旦定時(shí)器1發(fā)生溢出時(shí)硬件置1。清零有兩種方式:軟件清零,或者進(jìn)入定時(shí)器中斷時(shí)硬件清零。
6
TR1
定時(shí)器1運(yùn)行控制位。軟件置位/清零來(lái)進(jìn)行啟動(dòng)/停止定時(shí)器。
5
TF0
定時(shí)器0溢出標(biāo)志。一旦定時(shí)器0發(fā)生溢出時(shí)硬件置1。清零有兩種方式:軟件清零,或者進(jìn)入定時(shí)器中斷時(shí)硬件清零。
4
TR0
定時(shí)器0運(yùn)行控制位。軟件置位/清零來(lái)進(jìn)行啟動(dòng)/停止定時(shí)器。
3
IE1
外部中斷部分,與定時(shí)器無(wú)關(guān),暫且不看。
2
IT1
1
IE0
0
IT0
請(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,其中有TF1TR1TF0TR04位需要理解清楚,它們分別對(duì)應(yīng)于T1T0以定時(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ī)器周期,TL11一次,當(dāng)TL1加到255后,再加1TL1變成0TH1會(huì)加1一次,如此一直加到TH1TL1都是255(即TH1TL1組成的16位整型數(shù)為65535)以后,再加1一次,就會(huì)溢出了,TH1TL1同時(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-45-6所示,TMOD的位功能如表5-5所示。
5-4  TMOD——定時(shí)器模式寄存器的位分配(地址0x89、不可位尋址)
7
6
5
4
3
2
1
0
符號(hào)
GATE
(T1)
C/T
(T1)
M1
(T1)
M0
(T1)
GATE
(T0)
C/T
(T0)
M1
(T0)
M0
(T0)
復(fù)位值
0
0
0
0
0
0
0
0
5-5  TMOD——定時(shí)器模式寄存器的位描述
符號(hào)
描述
T1/T0
在表5-4中,標(biāo)T1的表示控制定時(shí)器1的位,標(biāo)T0的表示控制定時(shí)器0的位。
GATE
該位被置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é)課暫不介紹。
C/T
定時(shí)器或計(jì)數(shù)器選擇位。該位被清零時(shí)用作定時(shí)器功能(內(nèi)部系統(tǒng)時(shí)鐘),被置1用作計(jì)數(shù)器功能。
5-6  TMOD——定時(shí)器模式寄存器M1/M0工作模式
M1
M0
工作模式
描述
0
0
0
兼容8048單片機(jī)的13位定時(shí)器,THn8位和TLn5位組成一個(gè)13位定時(shí)器。
0
1
1
THnTLn組成一個(gè)16位的定時(shí)器。
1
0
2
8位自動(dòng)重裝模式,定時(shí)器溢出后THn重裝到TLn中。
1
1
3
禁用定時(shí)器1,定時(shí)器0變成2個(gè)8位定時(shí)器。
請(qǐng)注意,表5-2TCON最后標(biāo)注了“可位尋址”,而表5-4TMOD標(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,是THnTLn組成了一個(gè)16位的定時(shí)器,計(jì)數(shù)范圍是065535,溢出后,只要不對(duì)THnTLn重新賦值,則從0開(kāi)始計(jì)數(shù)。模式2,是8位自動(dòng)重裝載模式,只有TLn做加1計(jì)數(shù),計(jì)數(shù)范圍0255THn的值并不發(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ù)寄存器TH0TL0的初值。
第三步:設(shè)置TCON,通過(guò)TR01來(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= 1843216位定時(shí)器的溢出值是65536(因65535再加1才是溢出),于是就可以這樣操作,先給TH0TL0一個(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 = 0xB8TL0 = 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-->11-->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
wjfw 發(fā)表于 2026-3-27 01:01
通俗易懂,圖文并茂,樓主辛苦了

多謝您的認(rèn)可,后續(xù)會(huì)持續(xù)更新
作者: CFDQ    時(shí)間: 2026-4-17 15:37
謝謝分享




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1