中斷(Interrupt)是指在計(jì)算機(jī)運(yùn)行過程中,出現(xiàn)某些意外情況需主機(jī)干預(yù)時(shí),機(jī)器能自動(dòng)停止正在運(yùn)行的程序并轉(zhuǎn)入處理新情況的程序,處理完畢后又返回原被暫停的程序繼續(xù)運(yùn)行。
定時(shí)器/計(jì)數(shù)器(Timer/Counter)在實(shí)時(shí)控制系統(tǒng)中,實(shí)現(xiàn)對(duì)于外界事件的定時(shí)延時(shí)及計(jì)數(shù)功能。
串行通信(Serial Communicate)是計(jì)算機(jī)與外界交換信息的一種基本通信方式。
中斷系統(tǒng)中斷過程中,請(qǐng)求產(chǎn)生中斷的事件稱為中斷源,中斷源向CPU提出的請(qǐng)求為中斷請(qǐng)求(Interrupt Requst,IRQ),CPU通過上下文切換保存好當(dāng)前的工作狀態(tài)后,轉(zhuǎn)而去處理中斷請(qǐng)求,也就是產(chǎn)生中斷響應(yīng)。直到處理完中斷請(qǐng)求事件,才返回原來(lái)的工作狀態(tài),繼續(xù)工作。整個(gè)過程如下圖所示:
51單片機(jī)中斷系統(tǒng)的結(jié)構(gòu)圖如下:
中斷源51單片機(jī)中有5個(gè)中斷源,如下表所示:
中斷號(hào) 優(yōu)先級(jí) 中斷源 中斷入口地址0 1(最高級(jí)) 外部中斷0 0003H
1 2 定時(shí)器0 000BH
2 3 外部中斷1 0013H
3 4 定時(shí)器1 001BH
4 5(最低級(jí)) 串口中斷 0023H
每個(gè)中斷源都分配了對(duì)應(yīng)的中斷號(hào)及中斷服務(wù)入口地址,在這個(gè)中斷入口地址里,存放著跳轉(zhuǎn)到相應(yīng)中斷服務(wù)程序的跳轉(zhuǎn)指令。當(dāng)多個(gè)中斷源同時(shí)向CPU提出中斷請(qǐng)求時(shí),CPU將根據(jù)中斷源的優(yōu)先級(jí)來(lái)依次響應(yīng)中斷。
相關(guān)寄存器SFR中與中斷有關(guān)的寄存器有:
IEIE(Interrupt Enable),中斷允許寄存器,可位尋址,其各位定義如下:
位地址 AFH AEH ADH ACH ABH AAH A9H A8H定義 EA - (ET2) ES ET1 EX1 ET0 EX0
* EA(Enable All):CPU中斷總控制位,EA=1,CPU對(duì)所有中斷開放,EA=0,CPU禁止一切中斷響應(yīng)。
* ES(Enable Serial):串口中斷允許控制位,ES=1,允許串行口接受、發(fā)送中斷。
* ET0/ET1(Enable Timer):定時(shí)/計(jì)數(shù)器0/1中斷允許控制位,ET0/ET1=1,允許T0/T1中斷。52系列單片機(jī)里還有ET2。
* EX0/EX1(Enable Exterior):外部中斷INT0/INT1中斷允許控制位,EX0/EX1=1,允許外部中斷INT0/INT1中斷。
IP(Interrupt Priority),中斷優(yōu)先級(jí)寄存器,可位尋址,其各位定義如下。未設(shè)置時(shí)或復(fù)位后,IP各位均為”“則按照系統(tǒng)默認(rèn)的優(yōu)先級(jí)
位地址 BFH BEH BDH BCH BBH BAH B9H B8H定義 - - (PT2) PS PT1 PX1 PT0 PX0
* PS(Priority Serial):串行口優(yōu)先級(jí)設(shè)定位,PS=1,串行口為高優(yōu)先級(jí)。
* PT0/PT1(Priority Timer):定時(shí)/計(jì)數(shù)器0/1優(yōu)先級(jí)設(shè)定位,PT0/PT1=1,定時(shí)/計(jì)數(shù)器0/1為高優(yōu)先級(jí)。
* PX0/PX1(Priority Exterior):外部中斷INT0/INT1優(yōu)先級(jí)設(shè)定位,PX0/PX1=1,外部中斷INT0/INT1為高優(yōu)先級(jí)。
TCON(Timer Control),定時(shí)/計(jì)數(shù)器控制寄存器,可位尋址,其各位定義如下:
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H定義 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
* TF0/TF1(Timer Flag):定時(shí)/計(jì)數(shù)器0/1溢出標(biāo)志位,當(dāng)定時(shí)/計(jì)數(shù)器計(jì)滿溢出時(shí),由硬件自動(dòng)置“1”,并申請(qǐng)中斷;在進(jìn)入中斷服務(wù)程序后,又由硬件自動(dòng)置“0”。
* TR0/TR1(Timer Run):定時(shí)/計(jì)數(shù)器0/1啟停控制位,TR0/TR1=1,啟動(dòng)定時(shí)/計(jì)數(shù)器。
* IE0/IE1(Interrupt Exterior):外部中斷INT0/INT1中斷請(qǐng)求標(biāo)志位,外部中斷源有請(qǐng)求時(shí),對(duì)應(yīng)的標(biāo)志位IE0/IE1由硬件置“1”,當(dāng)CPU響應(yīng)該中斷后,又由硬件自動(dòng)置“0”。
* IT0/IT1(Interrupt Touch):外部中斷INT0/INT1的觸發(fā)方式選擇位,IT0/IT1=0,對(duì)應(yīng)外部中斷設(shè)置為低電平觸發(fā)方式,IT0/IT1=1,對(duì)應(yīng)外部中斷設(shè)置為邊沿觸發(fā)方式。
51單片機(jī)在CPU的每個(gè)機(jī)器周期的S5 P2期間,將自動(dòng)查詢TCON中各個(gè)中斷申請(qǐng)標(biāo)志,若查詢到某個(gè)中斷標(biāo)志位被置位,將啟動(dòng)中斷機(jī)制。
中斷源發(fā)出中斷請(qǐng)求后。要使CPU能夠響應(yīng)中斷,IE中的中斷總允許位EA及對(duì)應(yīng)的中斷允許位(ES/ET/EX)都需要置為“1”。
處理外部中斷時(shí),若外部中斷設(shè)為低電平觸發(fā)方式,則CPU在每個(gè)查詢中斷申請(qǐng)標(biāo)志時(shí)也將對(duì)INTi引腳進(jìn)行采樣,測(cè)得INTi=0,則認(rèn)為有中斷申請(qǐng),隨即將IEi標(biāo)志位置位,否則測(cè)得INTi=1,則認(rèn)為無(wú)中斷請(qǐng)求,而清除IEi標(biāo)志位。所以施加在INTi引腳上的低電平持續(xù)時(shí)間應(yīng)該大于一個(gè)機(jī)器周期,且小于中斷服務(wù)程序得執(zhí)行時(shí)間。
若外部中斷設(shè)為邊沿觸發(fā)方式,則CPU在每個(gè)查詢中斷申請(qǐng)標(biāo)志時(shí)將對(duì)INTi引腳進(jìn)行采樣,若在連續(xù)兩個(gè)機(jī)器周期采樣到先高后低的電平變化,則認(rèn)為有中斷申請(qǐng),隨即將IEi標(biāo)志位置位,否則測(cè)得INTi=1,則認(rèn)為無(wú)中斷請(qǐng)求,而清除IEi標(biāo)志位。所以,為了保證CPU在兩個(gè)機(jī)器周期內(nèi)能夠檢測(cè)到由高到低跳變得電平,輸入的高低電平持續(xù)時(shí)間至少要保持12個(gè)振蕩周期(即一個(gè)機(jī)器周期)時(shí)間。
在中斷處理過程中,如果正在執(zhí)行同級(jí)或高優(yōu)先級(jí)的中斷服務(wù)程序,或是正在執(zhí)行的指令還沒完成,則中斷響應(yīng)會(huì)受到阻斷。51單片機(jī)的中斷響應(yīng)時(shí)間最短為3個(gè)機(jī)器周期,其他情況的中斷響應(yīng)時(shí)間一般是3~8個(gè)周期。
在CPU響應(yīng)中斷后,應(yīng)該撤除該中斷請(qǐng)求,否則會(huì)再次產(chǎn)生中斷,進(jìn)入死循環(huán)。
中斷程序的編寫由中斷的處理過程可知,在編寫中斷管理與控制程序時(shí)應(yīng)該考慮一下幾個(gè)方面:
* CPU開中斷和關(guān)中斷
* 某個(gè)中斷源中斷請(qǐng)求的允許或屏蔽
* 各中斷源優(yōu)先級(jí)別的設(shè)定
* 外部中斷請(qǐng)求的觸發(fā)方式
中斷程序基本編寫格式如下:
匯編:
;中斷入口設(shè)置 ORG 0000H ;起始地址 LJMP MAIN ;跳轉(zhuǎn)到主程序 ORG 0003H ;中斷入口地址1 LJMP INT1 ;跳轉(zhuǎn)到外部中斷INT0服務(wù)程序 ORG 000BH ;中斷入口地址2 LJMP INT2 ;跳轉(zhuǎn)到定時(shí)器0中斷服務(wù)程序,沒有則不寫或?qū)懗伞癛ETI”,下同 ORG 0013H ;中斷入口地址3 LJMP INT3 ;跳轉(zhuǎn)到外部中斷INT1服務(wù)程序 ORG 001BH ;中斷入口地址4 LJMP INT4 ;跳轉(zhuǎn)到定時(shí)器1中斷服務(wù)程序 ORG 0023H ;中斷入口地址5 LJMP INT5 ;跳轉(zhuǎn)到串口中斷服務(wù)程序 ;主程序 ORG 0030H ;起始地址 MAIN: SETB IT0 ;IT0=1,邊沿觸發(fā) SETB EA ;EA=1,開啟總中斷 SETB EX0 ;EX0=1,允許外部中斷INT0 …… LOOP: NOP LJMP LOOP ;死循環(huán) ;中斷服務(wù)程序 ORG 0100H ;起始地址 INT1: PUSH ACC ;保存原來(lái)狀態(tài),下同 PUSH PSW ; …… INT2: …… …… POP PSW ;恢復(fù)原始狀態(tài),下同 POP ACC ; RETI ;中斷返回 END ;結(jié)束C語(yǔ)言:
#include "reg51.h" // 主程序 void main() { IT0 = 1;//注釋同匯編 EX0 = 1; EA = 1; while (1) { …… } } // 中斷處理程序 void int0() interrupt 0 { // 外部中斷INT0服務(wù)程序 …… } 定時(shí)/計(jì)數(shù)器51單片機(jī)內(nèi)部有兩個(gè)16位可編程的定時(shí)/計(jì)數(shù)器0和1,分別用T0及T1表示。它們的工作方式、定時(shí)時(shí)間、量程、啟動(dòng)方式、等均可通過程序來(lái)設(shè)置和改變。
計(jì)數(shù)功能用于統(tǒng)計(jì)從T0(P3.4)、T1(P3.5)引腳輸入的脈沖負(fù)跳變數(shù)量,每輸入一個(gè)脈沖負(fù)跳變,計(jì)數(shù)器就加1。負(fù)跳變指的是一個(gè)機(jī)器周期采樣為高電平,后一個(gè)機(jī)器周期采樣為低電平。
定時(shí)功能是單片機(jī)通過對(duì)內(nèi)部機(jī)器脈沖信號(hào)計(jì)數(shù)實(shí)現(xiàn)的,計(jì)數(shù)值乘以機(jī)器周期即是相應(yīng)的時(shí)間。如單片機(jī)采用12MHz晶振,機(jī)器內(nèi)部脈沖頻率為1MHz,機(jī)器周期為1us,計(jì)數(shù)1000次,即1ms時(shí)間。
當(dāng)計(jì)數(shù)值溢出后,定時(shí)計(jì)數(shù)器給出中斷請(qǐng)求,進(jìn)而使CPU去處理中斷事件。
51單片機(jī)定時(shí)/計(jì)數(shù)器結(jié)構(gòu)如下:
相關(guān)寄存器除前面介紹過的中斷相關(guān)寄存器外,SFR中與定時(shí)/計(jì)數(shù)器有關(guān)的寄存器有:
TMODTMOD(Timer Mode),定時(shí)/計(jì)數(shù)器模式控制寄存器,不可位尋址,其各位定義如下。其中TMOD的高半字節(jié)D4~D7用來(lái)控制定時(shí)/計(jì)數(shù)器1,低半字節(jié)D0~D3用來(lái)控制定時(shí)/計(jì)數(shù)器0。
位號(hào) D7H D6H D5H D4H D3H D2H D1H D0H定義 GATE C\T M1 M0 GATE C\T M1 M0
* GATE:門控制位,用來(lái)控制定時(shí)/計(jì)數(shù)器的啟動(dòng)方式。GATE=1,由外部中斷引腳INT0/INT1來(lái)啟動(dòng)定時(shí)器T0/T1, 當(dāng)INT0/INT1引腳為高電平且TR0/TR1置位,啟動(dòng)定時(shí)器T0/T1;GATE=0,僅由TR0/TR1置位而啟動(dòng)定時(shí)器T0/T1。
* C\T:功能選擇位,C\T=0,為定時(shí)模式,計(jì)數(shù)脈沖由內(nèi)部提供,計(jì)數(shù)周期等于機(jī)器周期;C\T=1,為計(jì)數(shù)模式,計(jì)數(shù)脈沖由外部引腳T0或T1引入。
* M0/M1:工作方式控制位,用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,如下表:
0 0 方式0 13位計(jì)數(shù)器
1 0 方式1 16位計(jì)數(shù)器
0 1 方式2 8位重裝計(jì)數(shù)器
1 1 方式3 定時(shí)器0分為兩個(gè)獨(dú)立8位計(jì)數(shù)器
T0、T1
T0、T1(Timer),兩個(gè)定時(shí)/計(jì)時(shí)器的初始賦值寄存器,不可位尋址,用于存放定時(shí)/計(jì)數(shù)的初始值。它們是兩個(gè)16位寄存器,均可分為兩個(gè)獨(dú)立的8位寄存器,高8位記為TH,即TH0、TH1,低8位記為TL,即TL0、TL1。使用定時(shí)/計(jì)數(shù)器時(shí),當(dāng)外部或系統(tǒng)時(shí)鐘振蕩器輸入一個(gè)脈沖時(shí),對(duì)應(yīng)寄存器的值便自動(dòng)加1。
編程時(shí)需要注意,16位計(jì)數(shù)初始值要分兩次寫入對(duì)應(yīng)初始值寄存器。
定時(shí)/計(jì)數(shù)過程51單片機(jī)定時(shí)/計(jì)數(shù)器的工作模式、工作方式、計(jì)數(shù)初始值及啟停操作均需要在使用前進(jìn)行初始化。
首先是通過TMOD中的GATE位來(lái)設(shè)置定時(shí)/計(jì)數(shù)器T0/T1的啟動(dòng)操作方式,工作在定時(shí)還是計(jì)數(shù)模式則是通過C/T位來(lái)設(shè)置。其次就是選擇它們的工作方式。
工作方式0、1、3為非自動(dòng)重裝方式,在初始化程序和對(duì)應(yīng)中斷服務(wù)程序中均需要對(duì)初始數(shù)據(jù)寄存器THi、TLi裝載。方式0是一個(gè)13位定時(shí)/計(jì)數(shù)器,只用了16位寄存器的高8位THi和TLi的低5位0~4位,TLi高3位未用,裝入數(shù)據(jù)時(shí)需要注意。方式1為16位寄存器。
方式3只適用于定時(shí)/計(jì)數(shù)器T0,一般在定時(shí)/計(jì)時(shí)器T1作串行口波特率發(fā)生器時(shí),才會(huì)選擇這個(gè)工作模式。此時(shí)T0拆分為兩個(gè)獨(dú)立8位計(jì)數(shù)寄存器TH0和TL0,其中TL0下為8位定時(shí)/計(jì)數(shù)器,操作方式同方式0、1;TH0只做簡(jiǎn)單的內(nèi)部定時(shí)功能,它借用定時(shí)/計(jì)時(shí)器1的控制位TR1和溢出標(biāo)志位TF1,占用T1的中斷資源,啟動(dòng)和停止也僅受TR1控制,此時(shí)T1僅可用在不需要中斷的場(chǎng)合。
方式2為8位重裝寄方式,僅由TLi作為工作寄存器,THi的值一直保持不變。TLi溢出時(shí),THi的值作為裝載值由CPU自動(dòng)裝入TLi,自動(dòng)完成計(jì)數(shù)值初始化。所以此種方式下需要初始化時(shí)在THi和TLi中放入相同的計(jì)數(shù)值。
T0/T1寄存器中的初值X與定時(shí)/計(jì)數(shù)器的工作方式、工作模式有關(guān)。
在工作方式0下,為13位寄存器,也就是說(shuō)最大的計(jì)數(shù)值M=213=8192,超過這個(gè)數(shù)字就會(huì)溢出,觸發(fā)中斷。工作方式為1下,為16位寄存器,M=216=65536。工作方式為2下,為8位寄存器,M=28=256。工作方式為3下,定時(shí)/計(jì)數(shù)器0分為高8位和低8位兩個(gè)獨(dú)立8位計(jì)數(shù)器,THi、TLi的M均為28=256。
不管是進(jìn)行定時(shí)還是計(jì)數(shù)模式,其具體實(shí)現(xiàn)都是歸結(jié)于計(jì)數(shù)。
計(jì)數(shù)模式下,是對(duì)外部脈沖數(shù)計(jì)數(shù),初值X = M - 計(jì)數(shù)值。定時(shí)模式下,是對(duì)機(jī)器周期進(jìn)行計(jì)數(shù),初值X = M - 計(jì)數(shù)值 = M - 定時(shí)時(shí)間Tc機(jī)器周期Tp = M - 定時(shí)時(shí)間Tc×晶振頻率12。
最后,中斷中的相關(guān)寄存器也需要進(jìn)行設(shè)置,設(shè)置TRi=1,來(lái)啟動(dòng)定時(shí)/計(jì)數(shù)器。
定時(shí)/計(jì)數(shù)程序編寫通過上面對(duì)定時(shí)/計(jì)數(shù)過程的分析,可知編寫想關(guān)功能程序時(shí),要先進(jìn)行初始化,再根據(jù)公式計(jì)算出定時(shí)初值并裝載。
定時(shí)/計(jì)數(shù)程序基本編寫格式如下:
匯編:
;中斷入口設(shè)置 ORG 0000H ;起始地址 LJMP MAIN ;跳轉(zhuǎn)到主程序 ORG 000BH ;中斷入口地址2 LJMP INT2 ;跳轉(zhuǎn)到定時(shí)器0中斷服務(wù)程序 ORG 001BH ;中斷入口地址4 LJMP INT4 ;跳轉(zhuǎn)到定時(shí)器1中斷服務(wù)程序 ;主程序 ORG 0030H ;起始地址 MAIN: MOV TMOD, #xxH ;設(shè)置工作模式,方式 MOV TH0, #xxH ;計(jì)數(shù)初值,高八位 MOV TL0, #xxH ;低八位 SETB EA ;EA=1 ,開啟總中斷 SETB ET0 ;ET0=1,允許定時(shí)/計(jì)數(shù)器中斷 SETB TR0 ;TR0=1,啟動(dòng)定時(shí)/計(jì)數(shù)器 …… LOOP: NOP LJMP LOOP ;死循環(huán) ;中斷服務(wù)程序 ORG 0100H ;起始地址 INT2: PUSH ACC ;保存原來(lái)狀態(tài),下同 PUSH PSW ; MOV TH0, #xxH ;重新賦計(jì)數(shù)初值(非重裝方式下) MOV TL0, #xxH …… INT4: …… …… POP PSW ;恢復(fù)原始狀態(tài),下同 POP ACC ; RETI ;中斷返回 END ;結(jié)束C語(yǔ)言:
#include "reg51.h" // 主程序 void main() { TMOD = 0xxx; //注釋同匯編 TH0 = 0xxx; TL0 = 0xxx; EA = 1; ET0 = 1; TR0 = 1; while (1) { …… } } // 中斷處理程序 void int2() interrupt 1{ // 定時(shí)器0中斷服務(wù)程序 TH0 = 0xxx; TL0 = 0xxx; …… } 串口通信 通信相關(guān)概念計(jì)算機(jī)通信方式可以分為并行(Parallel)與串行(Serial)通信兩大類,它將計(jì)算機(jī)技術(shù)和通信技術(shù)的相結(jié)合,完成計(jì)算機(jī)與外部設(shè)備或計(jì)算機(jī)與計(jì)算機(jī)之間的信息交換:
并行通信:數(shù)據(jù)的各個(gè)二進(jìn)制位在不同的數(shù)據(jù)線上同時(shí)傳輸。這樣傳輸速度快,效率高,但所需的數(shù)據(jù)線多,成本高,抗干擾能力較差,適用于近距離傳輸。
串行通信:將數(shù)據(jù)拆分成多個(gè)二進(jìn)制位,逐一的在同一條數(shù)據(jù)線上輸出。雖然這樣傳輸速度較慢,效率較低,但所需的數(shù)據(jù)線少、硬件電路簡(jiǎn)單、抗干擾能力強(qiáng),且適用于遠(yuǎn)距離數(shù)據(jù)傳輸。
串行通信又分為同步(Synchronous)通信和異步(Asynchronous)通信兩種方式:
同步通信:串行連續(xù)地傳輸數(shù)據(jù),待發(fā)送的若干個(gè)字符數(shù)據(jù)構(gòu)成一個(gè)數(shù)據(jù)塊,在該數(shù)據(jù)塊前部添加1~2個(gè)同步字符,在數(shù)據(jù)塊的末尾添加校驗(yàn)信息,以此種方式構(gòu)成數(shù)據(jù)幀,以數(shù)據(jù)幀為單位進(jìn)行串行通信。
異步通信:每個(gè)字符數(shù)據(jù)被封裝成幀,之后以幀的形式發(fā)送。每一幀由四部分構(gòu)成,分別是起始位、數(shù)據(jù)位、校驗(yàn)位和停止位。起始位是數(shù)據(jù)開始傳送的標(biāo)志,用邏輯0表示;數(shù)據(jù)位緊跟起始位,通常是5~8位二進(jìn)制位;校驗(yàn)位用于校驗(yàn)數(shù)據(jù)位是否發(fā)送正確,可以選擇奇校驗(yàn)、偶校驗(yàn)或者不使用校驗(yàn)位。幀和幀之間可以連續(xù),或者加入任意的空閑位,空閑位用邏輯1表示。
串行數(shù)據(jù)的傳輸制式可分為單工(Simplex)、半雙工(Half Duplex)、全雙工(Full Duplex)。
單工:數(shù)據(jù)傳輸僅能沿一個(gè)方向,不能實(shí)現(xiàn)反向傳輸。
半雙工:數(shù)據(jù)傳輸可以沿兩個(gè)方向,但需要分時(shí)進(jìn)行。
全雙工:數(shù)據(jù)可以同時(shí)進(jìn)行雙向傳輸。
串行通信的錯(cuò)誤校驗(yàn)方式有奇偶校驗(yàn)(Parity Check)、代碼和校驗(yàn)、循環(huán)冗余校驗(yàn)(Cyclical Redundancy Check,CRC)三種:
奇偶校驗(yàn):在發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)位尾隨的1位為奇偶校驗(yàn)位(1或0)。奇校驗(yàn)時(shí),數(shù)據(jù)中“1”的個(gè)數(shù)與校驗(yàn)位“1”的個(gè)數(shù)之和應(yīng)為奇數(shù);偶校驗(yàn)時(shí),數(shù)據(jù)中“1”的個(gè)數(shù)與校驗(yàn)位“1”的個(gè)數(shù)之和應(yīng)為偶數(shù)。接收字符時(shí),對(duì)“1”的個(gè)數(shù)進(jìn)行校驗(yàn),若發(fā)現(xiàn)不一致,則說(shuō)明傳輸數(shù)據(jù)過程中出現(xiàn)了差錯(cuò)。
代碼和校驗(yàn):發(fā)送方將所發(fā)數(shù)據(jù)塊求和(或各字節(jié)異或),產(chǎn)生一個(gè)字節(jié)的校驗(yàn)字符(校驗(yàn)和)附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)同時(shí)對(duì)數(shù)據(jù)塊(除校驗(yàn)字節(jié)外)求和(或各字節(jié)異或),將所得的結(jié)果與發(fā)送方的“校驗(yàn)和”進(jìn)行比較,相符則無(wú)差錯(cuò),否則即認(rèn)為傳送過程中出現(xiàn)了差錯(cuò)。
循環(huán)冗余校驗(yàn):通過某種數(shù)學(xué)運(yùn)算實(shí)現(xiàn)有效信息與校驗(yàn)位之間的循環(huán)校驗(yàn),常用于對(duì)磁盤信息的傳輸、存儲(chǔ)區(qū)的完整性校驗(yàn)等。這種校驗(yàn)方法糾錯(cuò)能力強(qiáng),廣泛應(yīng)用于同步通信中。
波特率(Baud Rate)是串口通信時(shí)每秒鐘傳輸二進(jìn)制代碼的位數(shù),單位是位/秒(bps)。
51單片機(jī)的串行接口是一個(gè)全雙工通信接口,即能夠同時(shí)進(jìn)行數(shù)據(jù)發(fā)送和接收。它可作通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter,UART)用,也可以作同步移位寄存器。其結(jié)構(gòu)如下:
相關(guān)寄存器除前面介紹過的中斷及定時(shí)/計(jì)數(shù)器相關(guān)寄存器外,SFR中與串口通信相關(guān)的寄存器有:
SCONSCON(Serial Control),串行口控制寄存器,可位尋址,其各位定義如下:
位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H定義 SM0 SM1 SM2 REN TB8 RB8 TI RI
* SM0和SM1(Serial Mode):串行口工作方式控制位,用于設(shè)置串行口工作方式,如下表:
SM0 SM1 工作方式 功能 波特率0 0 方式0 8位同步移位寄存器 晶振頻率/12
0 1 方式1 10位UART 可變
1 0 方式2 11位UART 晶振頻率/64 或 /32
1 1 方式3 11位UART 可變
* SM2:多機(jī)通訊控制位,主要在以上工作方式為2或3下使用,工作方式0或1下都應(yīng)該設(shè)為“0”狀態(tài)。
* REN(Receive Enable):串行允許接收位,REN=1,允許接受數(shù)據(jù)。
* TB8(Transfer Bit 8):工作方式為2或3下存放發(fā)送數(shù)據(jù)的第9位,由軟件置”0”或”1”。
* RB8(Receive Bit 8):工作方式為2或3下存放接受數(shù)據(jù)的第9位。方式0下不使用;方式1下,當(dāng)SM2=0時(shí),用于存放接收到的停止位。
* TI(Transfer Interrupt):發(fā)送中斷標(biāo)志位,用于指示一幀數(shù)據(jù)是否發(fā)送完成。使用前必須軟件復(fù)位為“0”,發(fā)送完一幀數(shù)據(jù)后硬件將自動(dòng)置”1”。
* RI(Receive Interrupt):接受中斷標(biāo)志位,用于指示一幀數(shù)據(jù)是否接受完成。接受完一幀數(shù)據(jù)后硬件將自動(dòng)置”1”,之后必須軟件復(fù)位為“0”。
SBUF(Serial Data Buffer),串行數(shù)據(jù)緩沖器,不可位尋址。串行口兩個(gè)SBUF,分別為發(fā)送寄存器和接收寄存器,它們?cè)谖锢斫Y(jié)構(gòu)上是完全獨(dú)立的,在SFR中的字節(jié)地址都是99H。這個(gè)重疊的地址靠讀/寫指令區(qū)分:串行發(fā)送時(shí),CPU向SBUF寫入數(shù)據(jù),此時(shí)99H表示發(fā)送SBUF;串行接收時(shí),CPU從SBUF讀出數(shù)據(jù),此時(shí)99H表示接收SBUF。
PCONPCON(Power Control),電源控制寄存器,不可位尋址,其中只有一位與串口設(shè)置有關(guān),其余都用于電源控制。其各位定義如下:
位號(hào) D7H D6H D5H D4H D3H D2H D1H D0H定義 SMOD - - - GF1 GF0 PD IDL
* SMOD(Serial Mode):波特率選擇位。工作方式1、2、3下串行通信波特率與2SMOD成正比。也就是SMOD=1,通信波特率可提高一倍。
* GF0/GF1(General Flag):通用標(biāo)志位,用戶可自由使用
* PD(Power Down):掉電控制位。PD=0,單片機(jī)正常工作;PD=1,進(jìn)入掉電模式,外部晶振停振,CPU、定時(shí)器、串行口全部停止工作,只有外部中斷工作。在該模式下,只有硬件復(fù)位和上電能夠喚醒單片機(jī)。
* IDL(Idle):空閑控制位。IDL=0,單片機(jī)正常工作;IDL=1,單片機(jī)進(jìn)入空閑模式,除CPU不工作外,其余仍繼續(xù)工作,在空閑模式下可由任一個(gè)中斷或硬件復(fù)位喚醒。
一般情況下,當(dāng)CPU允許接收(REN=1)且接收中斷標(biāo)志RI復(fù)位時(shí),就啟動(dòng)一次接收過程。外界數(shù)據(jù)通過引腳RXD(P3.0)串行輸入,數(shù)據(jù)最低位首先輸入一個(gè)大小為9位移位寄存器,當(dāng)一幀數(shù)據(jù)接收完畢后再并行送入接收SBUF中,同時(shí)RI也置“1”。當(dāng)用軟件讀取完數(shù)據(jù)并復(fù)位RI后,才進(jìn)行下一次操作。
當(dāng)發(fā)送中斷標(biāo)志TI復(fù)位后,CPU便開始執(zhí)行一條寫SBUF指令,啟動(dòng)一次發(fā)送過程,發(fā)送控制器同時(shí)啟動(dòng),并開始發(fā)送數(shù)據(jù)。發(fā)送的數(shù)據(jù)通過引腳TXD(P3.1)輸出,首先輸出最低位。當(dāng)一幀數(shù)據(jù)發(fā)送完畢即發(fā)送SBUF為空時(shí),CPU自動(dòng)將TI值“1”。使用軟件將TI復(fù)位,才執(zhí)行下一個(gè)發(fā)送過程。
51單片機(jī)串行口有4種工作方式,通過SCON寄存器中的SM0、SM1口選擇。
方式0下,串行口為同步移位寄存器的輸入輸出方式,主要用于和外部同步移位寄存器外接,以達(dá)到擴(kuò)展一個(gè)并行輸入或輸出口的目的。這種方式下,數(shù)據(jù)從RXD端串行輸入或輸出,同步移位信號(hào)從TXD輸出,波特率固定為晶振頻率的1/12。TXD引腳每輸出一位同步移位脈沖,數(shù)據(jù)就由RXD引腳輸入或輸出一個(gè)二進(jìn)制位,發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后,沒有起始位和停止位。此時(shí),SM2、RB8、TB8均設(shè)為“0”,不起作用。方式0工作時(shí)序圖如下:
方式1下,串行口為10位異步通信方式,即1個(gè)起始位、8個(gè)有效數(shù)據(jù)位和1個(gè)停止位,波特率由定時(shí)/計(jì)數(shù)器T1溢出率及PCON中的SMOD位共同決定。進(jìn)行發(fā)送操作時(shí),發(fā)送電路會(huì)自動(dòng)在8位發(fā)送數(shù)據(jù)前后分別加上一位起始位和一位停止位。接收操作時(shí),接收器以所選擇波特率的16倍速率采樣RXD引腳電平,檢測(cè)負(fù)跳變時(shí),則說(shuō)明起始位有效,將其移入輸入移位寄存器,并開始接收這一幀信息的其余位。接收過程中,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時(shí),控制電路進(jìn)行最后一次移位,隨后將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)裝入接收SBUF,第9位(停止位)進(jìn)入RB8,并置RI=1,向CPU申請(qǐng)中斷。如果上述條件不滿足,數(shù)據(jù)則會(huì)被舍棄。此時(shí),SM2也要設(shè)為“0”。方式1工作時(shí)序圖如下:
方式2及方式3下,串行口都為11為異步收發(fā)方式,即1個(gè)起始位、8個(gè)有效數(shù)據(jù)位、1個(gè)附加數(shù)據(jù)位和1個(gè)停止位,其兩者的差異在于通信波特率的不同:方式2的波特率取決于晶振頻率和PCON中的SMOD位,固定為晶振頻率的1/64或1/32;方式3的波特率由定時(shí)器T1的溢出率和SMOD位共同決定,故其波特率是可調(diào)的。比方式1多出來(lái)的一個(gè)附加位發(fā)送時(shí)為SCON中的TB8,接收時(shí)為RB8,由用戶安排,可作奇偶校驗(yàn)位,也可作其他控制位。這兩種方式很適合主從式的通信結(jié)構(gòu),在多機(jī)通訊時(shí),主機(jī)的SM2位設(shè)為“0”,而從機(jī)的SM2位設(shè)為“1”,以便之間相互識(shí)別。
方式0下:
波特率=晶振頻率fosc12
方式2下:
波特率=2SMOD64?fosc
方式1下及方式3下,波特率都由定時(shí)/計(jì)數(shù)器T1溢出率及PCON中的SMOD位共同決定。T1的溢出率又取決于計(jì)數(shù)速率和計(jì)數(shù)值。定時(shí)模式下,計(jì)數(shù)速率為晶振頻率的1/12;計(jì)數(shù)模式下,計(jì)數(shù)速率取決于外部輸入時(shí)鐘頻率,但不可超過晶振頻率的1/24。作波特率發(fā)生器時(shí),T1通常設(shè)置為定時(shí)模式,工作在工作方式2下,作8位重裝寄存器,此時(shí)波特率計(jì)算公式為:
T1溢出周期=定時(shí)時(shí)間=12f_osc?(256?計(jì)數(shù)初值X)
T1溢出率=1T1溢出周期
波特率=2SMOD32?T1溢出率=2SMOD?f_osc384?(256?X)
則T1的計(jì)數(shù)初值,也就是裝載值為:
計(jì)數(shù)初值X=256?2SMOD?f_osc384?波特率
串行通信程序編寫由串行通信的基本過程可知,在使用串行口之前需要對(duì)串行口進(jìn)行初始化,確定使用的工作方式并進(jìn)行相關(guān)配置。
串行通信程序基本編寫格式如下:
匯編:
;中斷入口設(shè)置 ORG 0000H ;起始地址 LJMP MAIN ;跳轉(zhuǎn)到主程序 ORG 0023H ;中斷入口地址5 LJMP INT5 ;跳轉(zhuǎn)到串口中斷服務(wù)程序 ;主程序 ORG 0030H ;起始地址 MAIN: MOV TMOD, #20H ;設(shè)置定時(shí)/計(jì)數(shù)器T1工作模式為定時(shí),工作方式2 MOV TH1, #F4H ;計(jì)數(shù)初值,高八位,波特率2400 MOV TL1, #F4H ;低八位 MOV SCON, #90H ;設(shè)置串行口工作方式2,單機(jī),允許接收 MOV PCON, #00H ;波特率不加倍 SETB EA ;EA=1 ,開啟總中斷 SETB ES ;ES=1,開啟串口中斷 SETB TR1 ;TR1=1,啟動(dòng)定時(shí)/計(jì)數(shù)器 …… SEND: MOV A, #xxH ;待發(fā)送數(shù)據(jù)放入A,即刻生成了偶校驗(yàn)位放在P中 MOV C, P ;將偶校驗(yàn)位放入位寄存器C CPL C ;奇校驗(yàn)則把P取反 MOV TB8, C ;將校驗(yàn)位放入TB8中 MOV SUBF, A ;發(fā)送數(shù)據(jù) JBC TI, xxx ;發(fā)送完一幀數(shù)據(jù)后清除TI并進(jìn)行下一步 LOOP: NOP LJMP LOOP ;死循環(huán) ;中斷服務(wù)程序 ORG 0100H ;起始地址 INT5: MOV A, SBUF ;取出接收到的數(shù)據(jù) JB RB8, ERR ;進(jìn)行校驗(yàn),不同則跳轉(zhuǎn)到錯(cuò)誤處理 CLR RI ;復(fù)位,準(zhǔn)備下次接收 …… RETI ;中斷返回 ERR: …… …… END ;結(jié)束C語(yǔ)言:
#include "reg51.h" // 主程序 void main() { TMOD = 0x20H; //注釋同匯編 TH0 = 0xF4; TL0 = 0xF4; SCON = 0x90; PCON = 0x00; EA = 1; ES = 1; TR1 = 1; while (1) { send(data); } } //發(fā)送數(shù)據(jù) void send(unsigned char data) { ACC = data; TB8 = P; SBUF = data; while(!TI == 0){ …… TI = 0; } } // 中斷處理程序,接收數(shù)據(jù) void int5() interrupt 5{ // 定時(shí)器0中斷服務(wù)程序 ACC = SBUF; RI = 0; if (RB8 == p){ …… }else{ …… } }更新歷史:
* 2017.11.27 完成初稿
原文鏈接
評(píng)論
查看更多