這篇文章主要針對的是單片機編程中的中斷知識,單片機編程其實很簡單(就是C語言編程),難的是各種外圍器件的學習,以及看懂芯片手冊和對芯片進行初試化的操作,因為單片機編程中常常涉及到中斷,要對各種暫存器進行操作,所以我統一羅列出來,方便后面編程時查閱,本篇不介紹單片機編程中的基本知識(包括c語言知識、單片機基礎知識),
文章目錄
- 1、單片機時鐘時序單位(晶振周期/拍節、狀態、機器周期、指令周期):
- 2、單片機最小系統組成5部分:單片機、晶振電路、復位電路、電源電路、下載電路
- 3、單片機引腳解釋:單片機的40個引腳大致可分為4類:電源、時鐘、控制和I/O引腳,
- 一、中斷簡介:
- 1、89C51的中斷系統有5個中斷源 ,2個優先級,可實作二級中斷嵌套,
- 2、中斷暫存器
- (1)定時器控制暫存器TCON:高位才與定時器有關,低位是外部中斷相關的
- (2)串行口控制暫存器SCON
- (3)中斷允許暫存器IE:
- (4)中斷優先級控制暫存器IP:
- (5)電源控制暫存器PCON:
- 二、定時器/計數器篇
- 1、定時器/計數器中斷:用到的暫存器
- (1)暫存器每位詳解:
- 【注】:在編程中定時器/計數器的使用方法:
- 三、外部中斷篇
- 1、外部中斷:用到的控制暫存器TCON(主要是低四位,高四位與定時器有關):
- 注:編程時外部中斷的使用方法
- 四、串口中斷篇
- 1、串口中斷:用到的相關暫存器
- 2、波特率計算方法:
注意:
Stc89c51/52單片機的P0口為開漏輸出,若作為普通I/O口試,需要加上拉電阻,不然輸出不了高電平,(注:P1、P2、P3都是準雙向輸出)

其中上拉電阻的作用:
1、加大普通IO口的驅動能力,
2、起到限流的作用,
3、抵抗電磁干擾,
1、單片機時鐘時序單位(晶振周期/拍節、狀態、機器周期、指令周期):

2、單片機最小系統組成5部分:單片機、晶振電路、復位電路、電源電路、下載電路

3、單片機引腳解釋:單片機的40個引腳大致可分為4類:電源、時鐘、控制和I/O引腳,
⒈ 電源:
⑴ VCC - 芯片電源,接+5V;
⑵ VSS - 接地端;
⒉ 時鐘:XTAL1、XTAL2 - 晶體振蕩電路反相輸入端和輸出端,
⒊ 控制線:控制線共有4根,
⑴ ALE/PROG:地址鎖存允許/片內EPROM編程脈沖
① ALE功能:用來鎖存P0口送出的低8位地址
② PROG功能:片內有EPROM的芯片,在EPROM編程期間,此引腳輸入編程脈沖,
⑵ PSEN:外ROM讀選通信號,
⑶ RST/VPD:復位/備用電源,
① RST(Reset)功能:復位信號輸入端,
② VPD功能:在Vcc掉電情況下,接備用電源,
⑷ EA/Vpp:內外ROM選擇/片內EPROM編程電源,
① EA功能:內外ROM選擇端,
② Vpp功能:片內有EPROM的芯片,在EPROM編程期間,施加編程電源Vpp,
⒋ I/O線
80C51共有4個8位并行I/O埠:P0、P1、P2、P3口,共32個引腳,P3口還具有第二功能,用于特殊信號輸入輸出和控制信號(屬控制總線),
一、中斷簡介:

1、89C51的中斷系統有5個中斷源 ,2個優先級,可實作二級中斷嵌套,

!!注意:程式中涉及到中斷時,這幅圖非常有用,對中斷的初始化基本就要安照這個圖中從左到右進行暫存器的設定,這樣中斷才會作業,

2、中斷暫存器
(1)定時器控制暫存器TCON:高位才與定時器有關,低位是外部中斷相關的

IT0:外部中斷0觸發方式控制位,當IT0=0時,為電平觸發方式(低電平有效),當IT0=1時,為邊沿觸發方式(下降沿有效),
IE0:外部中斷0中斷請求標志位,Cpu檢測到外部中斷引腳存在中斷請求信號時,硬體自動將IE0置1,注意:當IT0選擇為邊沿觸發時,當CPU回應此中斷時由硬體將IE0位清零,若IT0選擇位電平觸發時,則需要在中斷服務程式中由軟體將IE0清零,
IT1:外部中斷1觸發方式控制位,同上
IE1:外部中斷1中斷請求標志位,同上
TR0、TR1是對定時器0/1進行啟動控制的
TF0:定時/計數器T0溢位中斷請求標志位,當啟動T0計數以后,T0從初值開始加1計數,計數器計數到最高位產生溢位時,由硬體自動將TF0置1,并向CPU發中斷請求,當CPU回應此中斷時,由硬體將TF0位清零,
TF1:定時/計數器T1溢位中斷請求標志位,同上
(2)串行口控制暫存器SCON

SM0、SM1:串行口作業方式選擇位:

SM2:多級通信控制位,只有當串口作業與方式2/3時,該位才有意義,注意:若SM2=1,則串行口作業與方式2/3,此時只有當接收的第9位資料等于1,即RB8=1時,才將8位資料送入SUBF中去,并由硬體置RI=1產生中斷請求,否則將接收的8位資料丟棄,然而當SM2=0時,不管接受的第9資料位為0/1,都將前8位資料送入SBUF,并使RI=1產生中斷請求,
REN:允許串行接收位,由軟體置REN=1,則啟動串行口接收資料;若軟體置REN=0,則禁止接收,
TB8:在方式2或方式3中,是發送資料的第9位,可以用用戶軟體設定,可以用作資料的奇偶校驗位,或在多機通信中,作為地址幀/資料幀的標志位,在方式0和方式1中,該位未用到,
RB8:在方式2或方式3中,是接收到資料的第9位,作為奇偶校驗位或地址幀/資料幀的標志位,在方式1時,若SM2=0,則RB8是接收到的停止位,
TI:發送中斷標志位,在方式0時,當串行發送第8位資料進入緩沖區SBUF時,由內部硬體使TI置1,向CPU發中斷申請,在中斷服務程式中,必須用軟體將其清0,取消此中斷申請,
RI:接收中斷標志位,在方式0時,當串行接收完第8位資料時,由內部硬體使RI置1,向CPU發中斷申請,也必須在中斷服務程式中,用軟體將其清0,取消此中斷申請,
(3)中斷允許暫存器IE:

EX0:外部中斷0允許位;//值為0,禁止中斷,值為1,允許中斷,下面幾個都是一樣的,
ET0:定時/計數器T0中斷允許位;
EX1:外部中斷0允許位;
ET1:定時/計數器T1中斷允許位;
ES: 串行口中斷允許位;
EA :CPU中斷允許(總允許)位,
(4)中斷優先級控制暫存器IP:

PS:串行口優先級控制位;1:高優先級,0:低優先級
PT0/PT1:定時器/計數器0/1中斷優先級控制位;1:高優先級,0:低優先級
PX0/PX1:外部中斷管0/1中斷優先級控制位;1:高優先級,0:低優先級
注: 默認中斷優先級

(5)電源控制暫存器PCON:

SMOD:串行口波特率倍增位,在串口方式1、方式2、方式3時,波特率與SMOD有關,當SMOD=1時,波特率提高一倍,系統復位時,SMOD=0,
!!注意:如果以相同的波特率,用波特率加倍的方式比不加倍的方式計算的誤差小,
二、定時器/計數器篇
1、定時器/計數器中斷:用到的暫存器
(1)兩個特殊功能暫存器TH0/TH1(高8位)和TL1/TL0(低8位)
(2)控制暫存器TCON(主要是高四位)

TF1:T1溢位中斷請求標志位,
TR1:T1運行控制位,TR1置1時,T1開始作業;TR1置0時,T1停止
作業,
TF0:T0溢位中斷請求標志位,
TR0:T0運行控制位,
(3)作業方式暫存器TMOD:高四位是定時器T1作業欄位,低四位為T0的作業欄位


(1)暫存器每位詳解:
——暫存器中第三位 C/T 是定時或者計數模式選擇位,值等于0時,計數脈沖來自CPU內部,計數脈沖頻率為時鐘信號頻率的12分頻(即一個機器周期),為定時模式;值等于1時,計數脈沖來自與p3.4或p3.5相接的外部頻率,此時為計數模式,
——GATE是啟動方式控制位,值為1,則定時器啟動由TCON暫存器中的TR0/TR1位和芯片的引腳INT0或INT1共同控制(雙保險),而值為0,則只受TCON暫存器中的TR0/TR1位控制,
*
注:定時器初值計算方法:TC=M-(T/TCY),其中M:定時器/計數器的最大次數(與作業方式有關),T:我們需要定時器定時的時間,TCY:計數器計數脈沖的周期(晶振周期的12倍或者一個機器周期,若單片機晶振為12Mhz,則機器周期=((1/12Mhz)12=1us),TC:定時器需要預置的初值,當然從公式中知當TC=0時,即從預置初值0開始計數,定時時間T最大,最大TMAX為TCTCY,
**從而可以得出各種作業方式定時器的最大定時時間為:
作業方式0:Tmax=2^13 * 1us=8.192ms //其中的1us就是計數脈沖周期(機器周期)
作業方式1:Tmax=2^16 * 1us=65.536ms
作業方式2/3:Tmax=2^8 * 1us=0.256ms
所以在編程時,我們選擇定時器時,要看是否在當前所選作業方式的量程內,不要出現這種情況:你要我1ms進入一次定時中斷,而你又選擇的作業方式2/3,這樣超過它的量程,這樣是不行的,
**
【注】:在編程中定時器/計數器的使用方法:
1.對TMOD賦值,以確定T0和T1的作業方式,
2.根據要定時的時間,由公式計算初值,并將其寫入TH0、TL0或TH1、TL1,
3. 中斷方式時,打開定時器中斷(ET0/ET1)及總中斷EA,
4. 使TR0或TR1置位,啟動定時/計數器定時或計數
三、外部中斷篇
1、外部中斷:用到的控制暫存器TCON(主要是低四位,高四位與定時器有關):

1、IT0:外部中斷0觸發方式控制位,當IT0=0時,為電平觸發方式(低電平有效),當IT0=1時,為邊沿觸發方式(下降沿有效),
2、IE0:外部中斷0中斷請求標志位,Cpu檢測到外部中斷引腳存在中斷請求信號時,硬體自動將IE0置1,注意:當IT0選擇為邊沿觸發時,當CPU回應此中斷時由硬體將IE0位清零,若IT0選擇位電平觸發時,則需要在中斷服務程式中由軟體將IE0清零,
3、IT1:外部中斷1觸發方式控制位,同上
4、IE1:外部中斷1中斷請求標志位,同上
注:編程時外部中斷的使用方法
1、設定IT0或IT1確定外部中斷的觸發方式;
2、打開外部中斷(EX0/EX1)及總中斷EA,
四、串口中斷篇
1、串口中斷:用到的相關暫存器
(1)串口控制暫存器SCON,每位具體說明見前面分析,

(2)電源控制暫存器PCON,分析見前面,

注意:
1、 方式0總共8位(8位資料位);方式1總共10位(1位起始位、8位資料位、1位停止位);方式2和方式3總共11位(1位起始位、9位資料位(包括有一位TB8或RB8,需提前置好)、1位停止位),如果有停止位,在串口除錯助手中就要選擇!
2、 串口中雙方通信,就要確定好一個傳送速率(波特率),波特率的計算要涉及到定時器的參與,所以在串口中斷編程中既要設定串口的暫存器,還要設定選擇的定時器的暫存器,
3、 一個小知識:除了往SBUF中發送資料給串口外,還可以使用printf的方式(前提引入#include<stdio.h>的頭檔案)

4、 編程操作流程:
a) 設定串口的作業方式(SCON),
b) 設定計數器作業方式(TMOD),
c) 確定波特率是否加倍(PCON),
d) 根據波特率的計算公式,求出定時器/計數器的計數初值(TH0、TL0或TH1、TL1),
5、 中斷方式時,打開定時器中斷(ET0/ET1)及總中斷EA,
6、 使TR0或TR1置位,啟動定時/計數器定時或計數,
實體

注:上圖中,因為定時器作業在方式2/方式3時,是8位自動重裝,通常對TLX、THX初始化時裝入相同的定時器/計數器初值,以便以相同的初值進行連續計數/定時,
2、波特率計算方法:
串口通信中引入:波特率的計算與串口的作業方式有關,
方式0的波特率 = fosc/12 //(fosc為晶振頻率)
方式2的波特率 =((2*SMOD)/64)· fosc
方式1的波特率 =((2*SMOD)/32)·(T1溢位率)
方式3的波特率 =((2*SMOD)/32)·(T1溢位率)
T1 溢位率 = fosc /{12×(256-X)} //X表示定時器/計數器1的計數初值,
注:當串行口作業作業于方式1或3時,通常以定時器/計數器1作業于方式2,即8位重裝計數初值方式,作為串口作業于方式1或3的波特率發生器,
溢位率為溢位周期的倒數,若計數初值為X(即從X開始計數),那么以作業在方式2的8位自動重裝計數,則可以計數256,從而需要計數的位數為:256-X,這么多位數需要多少個機器周期呢? 1/fosc易知為一個晶振周期(也就是拍節),12/fosc也就是一個機器周期(因為單片機中一個機器周期為12個晶振周期),所以溢位的周期為:(12/fosc)*(256-X),溢位率也就出來了,
通常使用定時器/計數器1作業與方式2作為波特率發生器,串口作業與方式1,是因為該方式具有自動重裝計數初值功能,可避免反復重裝計數初值帶來的定時誤差,使波特率更加穩定,按上述公式可以推得計數初值為:X=2^8-((fosc *2^SOMD)/(32 * 12 * 波特率))
小知識點:
無源和有源蜂鳴器的區別:
無源這里的“源”不是指電源,而是指震蕩源,也就是說,有源蜂鳴器內部帶震蕩源,所以只要一通電就會叫,而無源內部不帶震蕩源,所以如果用直流信號無法令其鳴叫,
正是根據無源蜂鳴器的這一特點,可以通過控制給蜂鳴器引腳輸入高低電平的時間,使蜂鳴器發出“哆啦咪法索拉稀”的聲音,而有源蜂鳴器則不可以控制音頻,
CH340芯片–>用于usb轉串口;DS1302–低功耗實時時鐘芯片,它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償等多種功能,
未完待續!,,,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275066.html
標籤:其他
