定時(shí)器與數(shù)碼管基礎(chǔ)
邏輯電路與邏輯運(yùn)算
非0為真
邏輯與
&&
F = A && B
A和B都為真時(shí),F(xiàn)才為真
A和B只要有一個(gè)為假時(shí),F(xiàn)就為假
一假必假
邏輯或
||
F = A || B
A和B只要有一個(gè)為真時(shí),F(xiàn)就為真
A和B均為假時(shí),F(xiàn)才為假
一真必真
邏輯非
!
F = !A
A為真時(shí),F(xiàn)為假;
A為假時(shí),F(xiàn)為真;
真假相反
按位與
&
F = A& B
將A和B兩個(gè)字節(jié)的每一位都進(jìn)行與運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F
例如A = 0b11001100、B = 0b11110000,則 F = 0b11000000
按位或
|
F = A | B
將A和B兩個(gè)字節(jié)的每一位都進(jìn)行與運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F
例如A = 0b11001100、B = 0b11110000,則 F = 0b11111100
按位取反
~
F = ~A
將A字節(jié)內(nèi)的每一位進(jìn)行非運(yùn)算(就是取反),再將得到的每一位結(jié)果組合為總結(jié)果F
例如A = 0b11001100,則 F = 0b00110011
按位異或
^
異或的意思:如果運(yùn)算雙方的值不同(即相異)則結(jié)果為真,雙方值相同,則結(jié)果為假
F = A ^ B
例如A = 0b11001100、B = 0b11110000,則 F = 0b00111100

定時(shí)器的學(xué)習(xí)
定時(shí)器是單片機(jī)系統(tǒng)的一個(gè)重點(diǎn)
定時(shí)器的初步認(rèn)識(shí)
時(shí)鐘周期
時(shí)鐘周期T是時(shí)序中最小的時(shí)間單位,具體計(jì)算方法是:
時(shí)鐘周期 = 1 / 時(shí)鐘源頻率
KST-51 單片機(jī)開發(fā)板上用的晶振是11.0592MHz,那么對(duì)于這個(gè)單片機(jī)系統(tǒng)來說,時(shí)鐘周期 = 1 / 11059200秒
機(jī)器周期
單片機(jī)完成一個(gè)操作的最短時(shí)間。
機(jī)器周期主要針對(duì)匯編語言而言,在匯編語言下程序的每一條語句執(zhí)行所用的時(shí)間都是機(jī)器周期的整數(shù)倍,而且語句占用的時(shí)間是可以計(jì)算出來的,而C語言一條語句的時(shí)間是不確定的,受諸多因素的影響。
51單片機(jī)系列,在其標(biāo)準(zhǔn)架構(gòu)下一個(gè)機(jī)器周期是12個(gè)時(shí)鐘周期,也就是12/11059200秒。
現(xiàn)在有不少增強(qiáng)型的51單片機(jī),其速度都比較快,有的1個(gè)機(jī)器周期等于4個(gè)時(shí)鐘周期,有的1個(gè)機(jī)器周期等于1個(gè)時(shí)間周期,也就是說大體上其速度可以達(dá)到標(biāo)準(zhǔn)51架構(gòu)的3倍或者12倍。
定時(shí)器和計(jì)數(shù)器是單片機(jī)內(nèi)部的同一模塊,通過配置SFR(特殊功能寄存器)可以實(shí)現(xiàn)兩種不同的功能。
定時(shí)器就是用來定時(shí)的。定時(shí)器內(nèi)部有一個(gè)寄存器,讓它開始計(jì)數(shù)后,這個(gè)寄存器每經(jīng)過一個(gè)機(jī)器周期就會(huì)自動(dòng)加1,因此,可以把機(jī)器周期理解為定時(shí)器的計(jì)數(shù)周期。
就像鐘表,每經(jīng)過一秒,數(shù)字自動(dòng)加1,而這個(gè)定時(shí)器就是每經(jīng)過一個(gè)機(jī)器周期的時(shí)間,也就是12/11059200秒,數(shù)字自動(dòng)加1。
還有一個(gè)特別注意的地方,就是鐘表是加到60后,秒就自動(dòng)變成0了,這種情況在單片機(jī)或計(jì)算機(jī)中稱為溢出。
從某一個(gè)初值開始,經(jīng)過確定的時(shí)間后溢出,這個(gè)過程就是定時(shí)的含義。
定時(shí)器的寄存器
標(biāo)準(zhǔn)的51單片機(jī)內(nèi)部有T0和T1這兩個(gè)定時(shí)器,T就是Timer的縮寫,現(xiàn)在很多51系列單片機(jī)還會(huì)增加額外的定時(shí)器。
對(duì)于單片機(jī)的某一個(gè)功能模塊,都是由于它的SFR,也就是特殊功能寄存器來控制。

上表中的四個(gè)寄存器都是用于存儲(chǔ)定時(shí)器的計(jì)數(shù)值的
TH0/TL0用于T0,TH1/TL1用于T1

上表是定時(shí)器控制寄存器TCON的位分配,下表則是對(duì)每一位的具體含義的描述

硬件置1或者清0的,就是指一旦符合條件,單片機(jī)將自動(dòng)完成動(dòng)作
軟件置1或者清0的,就是指必須用程序去完成這個(gè)動(dòng)作
對(duì)于TCON這個(gè)SFR,其中有TF1、TR1對(duì)應(yīng)于T1;TF0、TR0對(duì)應(yīng)于T0
以T1為例:
先看TR1,當(dāng)程序中寫TR1 = 1以后,定時(shí)器值就會(huì)每經(jīng)過一個(gè)機(jī)器周期自動(dòng)加1,當(dāng)程序中寫 TR1 = 0以后,定時(shí)器就會(huì)停止加1,其值會(huì)保持不變化。
TF1是一個(gè)標(biāo)志位,它的作用是告訴我們定時(shí)器溢出了。
例如,將定時(shí)器設(shè)置成16位的模式,那么每經(jīng)過一個(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í)都變成0,只要一溢出,TF1馬上自動(dòng)變成1,告訴我們定時(shí)器溢出了,僅僅是給我們一個(gè)信號(hào),讓我們知道定時(shí)器溢出了,并不會(huì)對(duì)定時(shí)器是否繼續(xù)運(yùn)行產(chǎn)生任何影響
定時(shí)器有多種工作模式,工作模式的選擇就由TMOD控制

上表為TMOD的位分配
TCON標(biāo)注了“可位尋址",TMOD標(biāo)注了”不可位尋址“
TCON有一個(gè)位叫TR1,可以在程序中,直接進(jìn)行TR1 = 1的操作,也就是可以對(duì)某一位進(jìn)行操作。
TMOD里的位,比如(T1)M1 = 1這樣子的操作是錯(cuò)誤的,要操作就必須一次性操作這一整個(gè)字節(jié),也就是必須一次性對(duì)TMOD所有的位操作。
下表則是對(duì)TMOD的每一位的具體含義的描述

TMOD的位功能如下表

上表中列出的就是定時(shí)器的4種工作模式
其中模式0是為了兼容老的8048系列單片機(jī)而設(shè)計(jì)的,選擇的51幾乎不會(huì)用到這種模式
而模式3的功能用模式2完全可以取代,所以也基本上是不用的
模式1,是THn和TLn組成了一個(gè)16位定時(shí)器,計(jì)數(shù)范圍是0~65535,溢出后,只要部隊(duì)THn和TLn重新賦值,則從0開始計(jì)數(shù)。
模式2,是8位自動(dòng)重裝載模式,只有TLn做加1計(jì)數(shù),計(jì)數(shù)范圍是0~255,THn的值不會(huì)變化,而會(huì)保持原來的值;TLn溢出后,TFn就直接置1了,并且THn原先的值直接賦給TLn,然后TLn從新賦值的這個(gè)數(shù)字開始計(jì)數(shù)。
模式2的功能可以用來產(chǎn)生串口的通信波特率

OSC表示時(shí)鐘頻率,因?yàn)?個(gè)機(jī)器周期等于12個(gè)時(shí)鐘周期,所以d是12
下邊GATE右邊是一個(gè)非門,再右邊是一個(gè)或門,再右邊是一個(gè)與門
該電路是下邊部分控制上邊部分
TRn和下邊的或門電路的結(jié)果要進(jìn)行與運(yùn)算,如果TRn是0的話,與運(yùn)算完了看到是0,所以要讓定時(shí)器工作,TRn就必須置1
這里的與門結(jié)果要想得到1,那么前面的或門出來的結(jié)果就必須是1才行:
- 在GATE位是1的情況下,經(jīng)過一個(gè)非門變?yōu)?,此時(shí),若想或門結(jié)果為1,則INTn腳必須是1,定時(shí)器才會(huì)工作,INTn腳是0的情況下,定時(shí)器不工作
- 在GATE位是0的情況下,經(jīng)過一個(gè)非門變成1,此時(shí),不論INTn引腳是什么電平,經(jīng)過或門后都肯定是1,定時(shí)器就會(huì)工作
從圖上看有兩種方式:
- 第一種是開關(guān)打在上邊,即C/T = 0的時(shí)候,一個(gè)機(jī)器周期TL就會(huì)加1一次,此時(shí)是定時(shí)器模式
- 第二種是開關(guān)打在下邊,即C/T = 1的時(shí)候,Tn腳來一個(gè)脈沖TL就會(huì)加1一次,此時(shí)是計(jì)數(shù)器模式
定時(shí)器的應(yīng)用
在使用定時(shí)器的時(shí)候,需要有以下步驟:
- 設(shè)置特殊功能寄存器TMOD,配置好工作模式
- 設(shè)置計(jì)數(shù)寄存器THn和TLn的初值
- 設(shè)置TCON,通過TRn置1來讓定時(shí)器開始計(jì)數(shù)
- 判斷TCON寄存器的TFn位,監(jiān)測(cè)定時(shí)器溢出的情況
晶振是11.0592MHz,時(shí)鐘周期:1/11059200,機(jī)器周期:12/11059200

數(shù)碼管的學(xué)習(xí)
LED小燈是一種簡(jiǎn)單的LED,只能通過亮和滅來表達(dá)簡(jiǎn)單的信息。LED數(shù)碼管比LED小燈更能表達(dá)復(fù)雜信息。
數(shù)碼管的基本介紹

數(shù)碼管共有a,b,c,d,e,f,g,dp這么8段,實(shí)際上,這8段每一段都是一個(gè)LED小燈,所以一個(gè)數(shù)碼管就是由8個(gè)LED小燈組成的。
數(shù)碼管上邊有兩個(gè)com,這就是數(shù)碼管的公共端,之所以有2個(gè),一方面是起到對(duì)稱的效果,剛好是10個(gè)引腳,另外一個(gè)方面,公共端通過的電流較大,并聯(lián)電路電流之和等于總電流,用2個(gè)com可以把公共電流平均到2個(gè)引腳上,降低單條線路承受的電流。

數(shù)碼管分為共陽和共陰兩種,共陰數(shù)碼管就是8只LED小燈的陰極是連接在一起的,陰極是公共端,由陽極來控制單個(gè)小燈的亮滅。同理,共陽數(shù)碼管就是陽極連接在一起。

開發(fā)板上所用的數(shù)碼管是共陽極數(shù)碼管,一共有6個(gè)
要想數(shù)碼管亮,首先需要三極管導(dǎo)通,[[小燈部分總分析#Q16-1|同Q16導(dǎo)通]],三極管導(dǎo)通之后,[[小燈部分總分析#DBX-0|還需要DBX為低電平]],此時(shí),數(shù)碼管才可以亮
開發(fā)板上有6個(gè)數(shù)碼管,習(xí)慣上稱之為6位,那么控制位就是74HC138了。而數(shù)碼管內(nèi)部的8個(gè)LED小燈稱之為數(shù)碼管的段,那么數(shù)碼管的段選擇(即該段的亮滅)是通過P0口控制,經(jīng)過74HC245驅(qū)動(dòng)。
數(shù)碼管的真值表

[[數(shù)碼管代碼部分#^LedDisplay-1|數(shù)碼管顯示1]]
數(shù)碼管的靜態(tài)顯示
74HC138在同一時(shí)刻只能讓一個(gè)輸出口為低電平,也就是說一個(gè)時(shí)刻內(nèi),只能使能一個(gè)數(shù)碼管,并根據(jù)給出的P0的值來改變這個(gè)數(shù)碼管顯示的字符,可以將此理解為數(shù)碼管的靜態(tài)顯示。
數(shù)碼管靜態(tài)顯示是對(duì)應(yīng)動(dòng)態(tài)顯示而言的,靜態(tài)顯示對(duì)于一兩個(gè)數(shù)碼管還行,對(duì)于多個(gè)數(shù)碼管,靜態(tài)顯示實(shí)現(xiàn)的意義就沒有了。
像用unsigned char或者unsigned int這兩個(gè)關(guān)鍵字,這樣定義的變量都是放在單片機(jī)的RAM中,在程序中可以隨意去改變這些變量的值。
但是還有一種數(shù)據(jù),在程序中要使用,卻不會(huì)改變它的值,定義這種數(shù)據(jù)時(shí),可以加上一個(gè)code關(guān)鍵字修飾一下,這個(gè)數(shù)據(jù)就會(huì)存儲(chǔ)到程序空間 Flash 中,這樣可以大大節(jié)省單片機(jī)的RAM使用量,畢竟單片機(jī)RAM空間比較小,而程序空間則大得多。
[[數(shù)碼管代碼部分#^LedDisplayCountdown|單個(gè)數(shù)碼管倒計(jì)時(shí)]]
本文來自博客園,作者:EricsT,轉(zhuǎn)載請(qǐng)注明原文鏈接:http://www.rzrgm.cn/EricsT/p/19001659

浙公網(wǎng)安備 33010602011771號(hào)