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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1020|回復: 3
打印 上一主題 下一主題
收起左側

第5章 定時器與數碼管基礎5.1 5.2

[復制鏈接]
跳轉到指定樓層
樓主

隨著學習內容越來越多,個別細節可能會感覺略有吃力。但是不要擔心,這個跟小孩學走路一樣,剛開始走得不太穩,沒關系,多走幾步多練練。看教材的時候要注意專心,一遍看不懂,思考一下,再回頭看第二遍和第三遍,沒準一下就明白了。如果三遍還看不明白,那就把不懂的問題放一放,繼續往下學兩課然后再回頭看一次,也可以與他人討論一下,可能就會茅塞頓開了。
5.1邏輯電路與邏輯運算
在數字電路經常會遇到邏輯電路,而在C語言中則經常用到邏輯運算。二者在原理上是相互關聯的,在這里就先簡單介紹一下。
首先,在“邏輯”這個概念范疇內,存在真和假這兩個邏輯值,而將其對應到數字電路或C語言中,就變成了“非0值”和“0值”這兩個值,即邏輯上的“假”就是數字電路或C語言中的“0”這個值,而邏輯“真”就是其它一切“非0值”。
來具體學習一下幾個主要的邏輯運算符。假定有2個字節變量:AB,二者進行某種邏輯運算后的結果為F
以下邏輯運算符都是按照變量整體值進行運算的,通常就叫做邏輯運算符:
&& 邏輯與。F = A && B,當AB的值都為真(即非0值,下同)時,其運算結果F為真(具體數值為1,下同);當AB值任意一個為假(即0,下同)時,結果F為假(具體數值為0,下同)。
|| 邏輯或。F = A || B,當AB值任意一個為真時,其運算結果F為真;當AB值都為假時,結果F為假。
! 邏輯非,F = !A,當A值為假時,其運算結果F為真;當A值為真時,結果F為假。
以下邏輯運算符都是按照變量內的每一個位來進行運算的,通常就叫做位運算符:
& 按位與,F = A & B,將AB兩個字節中的每一位都進行與運算,再將得到的每一位結果組合為總結果F,例如A = 0b11001100B = 0b11110000,則結果F就等于0b11000000
| 按位或,F = A | B,將AB兩個字節中的每一位都進行或運算,再將得到的每一位結果組合為總結果F,例如A = 0b11001100B = 0b11110000,則結果F就等于0b11111100
~ 按位取反,F = ~A,將A字節內的每一位進行非運算(就是取反),再將得到的每一位結果組合為總結果F,例如A = 0b11001100,則結果F就等于0b00110011;這個運算符流水燈實驗里已經用過了,現在再回頭看一眼,是不是清楚多了。
^ 按位異或,異或的意思是,如果運算雙方的值不同(即相異)則結果為真,雙方值相同則結果為假。在C語言里沒有按變量整體值進行的異或運算,所以僅以按位異或為例,F = A ^ BA = 0b11001100B = 0b11110000,則結果F就等于0b00111100
今后看資料或芯片手冊的時候,會經常遇到一些電路符號,圖5-1所示就是數字電路中的常用符號,知道這些符號有利于理解器件的邏輯結構,尤其重點認識圖5-1中的國外流行圖形符號。在這里先簡單看一下,日后遇到了可以到這里來查閱。
5-1  邏輯電路符號
5.2 定時器的學習
定時器是單片機系統的一個重點,但并不是難點,需要完全理解并且熟練掌握。
5.2.1 定時器的初步認識
1、時鐘周期
時鐘周期:時鐘周期T是時序中最小的時間單位,具體計算的方法是
時鐘周期 =1/時鐘源頻率
Kingst51單片機開發板上用的晶振是11.0592M,那么對于這個單片機系統來說,時鐘周期=1/11059200秒。
2機器周期
單片機完成一個操作的最短時間。機器周期主要針對匯編語言而言,在匯編語言下程序的每一條語句執行所使用的時間都是機器周期的整數倍,語句占用的時間是可以計算出來的,而C語言一條語句的時間是不確定的,受到諸多因素的影響。51單片機系列,在其標準架構下一個機器周期是12個時鐘周期,也就是12/11059200秒。而一些增強型的51單片機,其速度都更快一些,有的1個機器周期等于4個時鐘周期,有的1個機器周期就等于1個時鐘周期,也就是說大體上其速度可以達到標準51架構的3倍或12倍。Kingst51單片機采用的是標準的51單片機,所以后面的章節如果遇到機器周期這個概念,全部是指12個時鐘周期。
時鐘周期和機器周期兩個概念了解即可,下邊就來講講重頭戲,定時器和計數器。定時器和計數器是單片機內部的同一個模塊,通過配置SFR(特殊功能寄存器)可以實現兩種不同的功能。大多數情況下是使用定時器功能,因此主要來講定時器功能,計數器功能可自學。
顧名思義,定時器就是用來進行定時的。定時器內部有一個寄存器,讓它開始計數后,這個寄存器的值每經過一個機器周期就會自動加1,因此,可以把機器周期理解為定時器的計數周期。就像鐘表每經過一秒,數字自動加1一樣,定時器是每過一個機器周期的時間,也就是12/11059200秒,數字自動加1。還有一個特別注意的地方,就是鐘表是加到60后,秒就自動變成0了,這種情況在單片機或計算機里稱之為溢出。那定時器加到多少才會溢出呢?后面會講到定時器有多種工作模式,分別使用不同的位寬(指使用多少個二進制位),假如是16位的定時器,也就是2個字節,最大值就是65535,那么加到65535后,再加1就算溢出,如果有其他位數的話,道理是一樣的,對于51單片機來說,溢出后,這個值會直接變成0。從某一個初始值開始,經過確定的時間后溢出,這個過程就是定時的含義。
5.2.2 定時器的寄存器
標準的51單片機內部有T0T1這兩個定時器,T就是Timer的縮寫,現在很多51系列單片機還會增加額外的定時器,在這里先講定時器01。對于單片機的每一個功能模塊,都是由它的SFR,也就是特殊功能寄存器來控制。與定時器有關的特殊功能寄存器,有以下幾個,不需要去記憶這些寄存器的名字和作用,只要大概知道就行,用的時候隨時可以查手冊,找到每個寄存器的名字和每個寄存器所起到的作用。
5-1的寄存器是存儲定時器的計數值的。TH0/TL0用于T0TH1/TL1用于T1
5-1  定時值存儲寄存器
名稱
描述
SFR地址
復位值
TH0
定時器0高字節
0x8C
0x00
TL0
定時器0低字節
0x8A
0x00
TH1
定時器1高字節
0x8D
0x00
TL1
定時器1低字節
0x8B
0x00
5-2是定時器控制寄存器TCON的位分配,表5-3是則是對每一位的具體含義的描述。
5-2  TCON——定時器控制寄存器的位分配(地址0x88、可位尋址)
7
6
5
4
3
2
1
0
符號
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
復位值
0
0
0
0
0
0
0
0
5-3   TCON——定時器控制寄存器的位描述
符號
描述
7
TF1
定時器1溢出標志。一旦定時器1發生溢出時硬件置1。清零有兩種方式:軟件清零,或者進入定時器中斷時硬件清零。
6
TR1
定時器1運行控制位。軟件置位/清零來進行啟動/停止定時器。
5
TF0
定時器0溢出標志。一旦定時器0發生溢出時硬件置1。清零有兩種方式:軟件清零,或者進入定時器中斷時硬件清零。
4
TR0
定時器0運行控制位。軟件置位/清零來進行啟動/停止定時器。
3
IE1
外部中斷部分,與定時器無關,暫且不看。
2
IT1
1
IE0
0
IT0
注意在表5-3中的描述中,只要寫到硬件置1或者清0的,就是指一旦符合條件,單片機將自動完成的動作,只要寫軟件置1或者清0的,是指必須用程序去完成這個動作,后續遇到此類描述就不再另做說明了。
對于TCON這個SFR,其中有TF1TR1TF0TR04位需要理解清楚,它們分別對應于T1T0以定時器1為例講解,那么定時器0同理。先看TR1,當程序中寫TR1 = 1以后,定時器值就會每經過一個機器周期自動加1,當程序中寫TR1 = 0以后,定時器就會停止加1,其值會保持不變化。TF1,這個是一個標志位,他的作用是通知用戶定時器溢出了。比如定時器設置成16位的模式,那么每經過一個機器周期,TL11一次,當TL1加到255后,再加1TL1變成0TH1會加1一次,如此一直加到TH1TL1都是255(即TH1TL1組成的16位整型數為65535)以后,再加1一次,就會溢出了,TH1TL1同時都變為0,只要一溢出,TF1馬上自動變成1通知用戶定時器溢出了,僅僅是提供給用戶一個信號,讓用戶知道定時器溢出了,它不會對定時器是否繼續運行產生任何影響。
本節開頭就提到了定時器有多種工作模式,工作模式的選擇就由TMOD來控制,TMOD的位分配和描述見表5-45-6所示,TMOD的位功能如表5-5所示。
5-4  TMOD——定時器模式寄存器的位分配(地址0x89、不可位尋址)
7
6
5
4
3
2
1
0
符號
GATE
(T1)
C/T
(T1)
M1
(T1)
M0
(T1)
GATE
(T0)
C/T
(T0)
M1
(T0)
M0
(T0)
復位值
0
0
0
0
0
0
0
0
5-5  TMOD——定時器模式寄存器的位描述
符號
描述
T1/T0
在表5-4中,標T1的表示控制定時器1的位,標T0的表示控制定時器0的位。
GATE
該位被置1時為門控位。僅當INTx腳為高并且TRx控制位被置1時使能定時器x,定時器開始計時,當該位被清0時,只要TRx位被置1,定時器x就使能開始計時,不受到單片機引腳INTx外部信號的干擾,常用來測量外部信號脈沖寬度。這是定時器一個額外功能,本節課暫不介紹。
C/T
定時器或計數器選擇位。該位被清零時用作定時器功能(內部系統時鐘),被置1用作計數器功能。
5-6  TMOD——定時器模式寄存器M1/M0工作模式
M1
M0
工作模式
描述
0
0
0
兼容8048單片機的13位定時器,THn8位和TLn5位組成一個13位定時器。
0
1
1
THnTLn組成一個16位的定時器。
1
0
2
8位自動重裝模式,定時器溢出后THn重裝到TLn中。
1
1
3
禁用定時器1,定時器0變成28位定時器。
請注意,表5-2TCON最后標注了“可位尋址”,而表5-4TMOD標注的是“不可位尋址”。意思就是說:比如TCON有一個位叫TR1用戶可以在程序中直接進行TR1 = 1這樣的操作。但對TMOD里的位比如(T1)M1 = 1這樣的操作就是錯誤的。要操作就必須一次操作這整個字節,也就是必須一次性對TMOD所有位操作,不能直接對其中某一位單獨進行操作,那么能不能只修改其中的一位而不影響其它位的值呢?當然可以,在后續課程中就會學到方法的。
5-6列出的就是定時器的4種工作模式,其中模式0是為了兼容老的8048系列單片機而設計的,現在的51幾乎不會用到這種模式,而模式3根據應用經驗,它的功能用模式2完全可以取代,所以基本上也是不用的,那么重點來學習模式1和模式2
模式1,是THnTLn組成了一個16位的定時器,計數范圍是065535,溢出后,只要不對THnTLn重新賦值,則從0開始計數。模式2,是8位自動重裝載模式,只有TLn做加1計數,計數范圍0255THn的值并不發生變化,而是保持原值,TLn溢出后,TFn就直接置1了,并且THn原先的值直接賦給TLn,然后TLn從新賦值的這個數字開始計數。這個功能可以用來產生串口的通信波特率,后面章節講串口的時候要用到。
5.2.3 定時器的應用
了解了定時器相關的寄存器,下面就來做一個定時器的程序,鞏固一下學到的內容。這節課的程序先使用定時器0,在使用定時器的時候,需要以下幾個步驟:
第一步:設置特殊功能寄存器TMOD,配置好工作模式。
第二步:設置計數寄存器TH0TL0的初值。
第三步:設置TCON,通過TR01來讓定時器開始計數。
第四步:判斷TCON寄存器的TF0位,監測定時器溢出情況。
寫程序之前,要先來學會計算如何用定時器定時時間。Kingst51開發板單片機的晶振是11.0592M,時鐘周期就是1/11059200,機器周期是12/11059200,假如要定時20ms,就是0.02秒,要經過x個機器周期得到0.02秒,來算一下x*12/11059200=0.02,得到x= 1843216位定時器的溢出值是65536(因65535再加1才是溢出),于是就可以這樣操作,先給TH0TL0一個初始值,讓它們經過18432個機器周期后剛好達到65536,也就是溢出,溢出后可以通過檢測TF0的值得知,就剛好是0.02秒。那么初值y = 65536 - 18432 = 47104,轉成16進制就是0xB800,也就是TH0 = 0xB8TL0 = 0x00
細心的讀者會發現,如果初值直接給一個0x0000,一直到65536溢出,定時器定時值最大也就是71ms左右,那么想定時更長時間怎么辦呢?用小學學過的邏輯,倍數關系就可以解決此問題。
下面就用程序來實現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;  //定義一個計數變量,記錄T0溢出次數
    ENLED = 0;    //使能U3,選擇獨立LED
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;
    TMOD = 0x01;   //設置T0為模式1
    TH0  = 0xB8;   //T0賦初值0xB800
    TL0  = 0x00;
    TR0  = 1;      //啟動T0
   
    while (1)
    {
        if (TF0 == 1)         //判斷T0是否溢出
        {
            TF0 = 0;           //T0溢出后,清零中斷標志
            TH0 = 0xB8;       //并重新賦初值
            TL0 = 0x00;
            cnt++;             //計數值自加1
            if (cnt >= 50)   //判斷T0溢出是否達到50
            {
                cnt = 0;      //達到50次后計數值清零
                LED = ~LED;  //LED取反:0-->11-->0
            }
        }
    }
}
程序中都寫了注釋,結合前幾章學的內容,不難理解。本程序實現的結果是開發板上最右邊的小燈點亮一秒,熄滅一秒,也就是以0.5Hz的頻率進行閃爍。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:123917 發表于 2026-3-27 01:01 | 只看該作者
通俗易懂,圖文并茂,樓主辛苦了
回復

使用道具 舉報

板凳
ID:1167894 發表于 2026-3-27 13:19 | 只看該作者
wjfw 發表于 2026-3-27 01:01
通俗易懂,圖文并茂,樓主辛苦了

多謝您的認可,后續會持續更新
回復

使用道具 舉報

地板
ID:1145550 發表于 2026-4-17 15:37 | 只看該作者
謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表