|
串行與并行通訊方式
并行:控制簡單,傳輸速度快。線多,長距離成本較高且同時接受困難。
串行:將數(shù)據(jù)字節(jié)分成一位一位的行駛在一條傳輸線上進(jìn)行傳輸。如圖:

同步與異步串行通訊方式
同步串行通訊方式:同步通訊需要建立發(fā)送方對接收方時鐘的直接控制,是雙方達(dá)到完全同步。
異步串行通訊方式:通訊的發(fā)送和接收設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收,為使雙方收發(fā)協(xié)調(diào),要求發(fā)送和接收的時鐘盡可能一致。如圖:

異步通訊方式的特點(diǎn):
異步通訊以字符構(gòu)成的幀為單位進(jìn)行傳輸,字符與字符之間的間隙是任意的,但每個字符中的各位是以固定的時間傳送的。其一幀字符信息由4部分組成:起始位、數(shù)據(jù)位、奇偶檢驗位、停止位。在單片機(jī)中的通訊一般情況下均使用這種幀格式。如圖:

串行通訊的制式
單工:數(shù)據(jù)傳輸僅沿一個方向,不能實(shí)現(xiàn)反向傳輸
半雙工:數(shù)據(jù)可以沿兩個方向傳輸,但是需要分時
全雙工:數(shù)據(jù)可以同時進(jìn)行雙向傳輸
串行通訊三種錯誤校驗:奇偶校驗、代碼和校驗、循環(huán)冗余校驗
RS232電平與TTL電平的轉(zhuǎn)換
PC使用的串口的電平為RS232的九針串口,MCU使用的電平是TTL電平,要使得PC
和MCU進(jìn)行通訊,就需要對其電平極性轉(zhuǎn)換。主要的幾款電平轉(zhuǎn)換芯片:MAX232、MAX202、HIN232,SIPEX320等
串行通訊速度的定義_波特率
串行通訊的速率用波特率表示,其定義為:
每秒鐘傳送二進(jìn)制代碼的位數(shù),即1波特=1位/秒,單位bps(位/秒)
eg:每秒鐘傳送240個字符,而每個字符格式包含10位(1起始、8數(shù)據(jù)、1停止),此時的波特率為:
10位*240個/秒=2400bps
串行通訊波特率的計算
單片機(jī)的串行口可設(shè)定為四種工作方式,其中方式0和方式2波特率固定,方式1和方式3波特率可變,由定時器T1的溢出率來決定。計算公式如下:

其中:fosc為系統(tǒng)晶振頻率,通常為12MHz(或者11.0592MHz),SMOD為PCON寄存器的最高位。T1的溢出率即定時器T1溢出的頻率。
電源管理寄存器_PCON

SMOD;該位與串通信波特率有關(guān)。
SMOD=0;串口方式1、2、3時,波特率正常
SMOD=1;串口方式1、2、3時,波特率加倍
SMOD0,LVDF,P0F,此三位為STC_MCU 所特有的,可查看相關(guān)手冊。
GF1、GF0;兩個通用標(biāo)志位,可隨意使用。
PD;掉電模式設(shè)定位,
PD=0;MCU正常工作
PD=1;MCU進(jìn)入掉電模式
IDL;空閑模式設(shè)定位
IDL=0;MCU正常工作
IDL=1;單片機(jī)進(jìn)入空閑模式
單片機(jī)的兩種模式狀態(tài):
掉電模式:進(jìn)入掉電模式后,晶振停震,CPU,定時器,串行口全部停止工作,只有外部中斷繼續(xù)工作,
可有外部中斷低電平觸發(fā)或下降沿觸發(fā)或硬件復(fù)位模式喚醒。
空閑模式:除CPU不夠工作外,其余仍繼續(xù)工作,在空閑模式下,可由任一個中斷或者硬件復(fù)位喚醒
T1的溢出率
T1的溢出率就是T1定時器溢出的頻率,只要算出T1定時器每一處一次所需的時間T,那么T的倒數(shù)即為他的溢出率。
51串行口結(jié)構(gòu)
51單片機(jī)串行口是一個可編程全雙工的通信接口,具有Uart(通用異步收發(fā)器)的全部功能,能同時進(jìn)行數(shù)據(jù)的發(fā)送與接收,也可作為同步一位寄存器使用。
51_MCU主要由兩個獨(dú)立的串行數(shù)據(jù)緩沖寄存器SBUF
(一個發(fā)送,一個接收)和發(fā)送控制器、接收控制器,輸入移位寄存器及若干控制門電路。如圖:

串行口控制寄存器_SCON

SM0,SM1;工作方式選擇位,串口有四中工作方式,如下:

SM2;多機(jī)通信可控制位,SM2主要用于方式2和方式3,當(dāng)接收機(jī)的SM2=1時,可以利用收的RB8來控制是否激活RI;
RB8=0,不激活RI,收到的信息丟棄
RB8=1,收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走,
當(dāng)SM2=0時,無論收到的RB8是0還是1,均可以收收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,通過控制SM2可實(shí)現(xiàn)多機(jī)通信。
在方式0時,SM2必須是0,
在方式1時,若SM2=1,則只有接收到有效停止位時,RI才置1
REN;允許串行接收位
REN=1;允許串行口接收數(shù)據(jù)
REN=0;禁止串行口接收數(shù)據(jù)
TB8;方式2、3中發(fā)送數(shù)據(jù)的第九位,可定義其作用,奇偶檢驗,地址幀標(biāo)志等,方式0和1中,未使用
RB8;方式2、3中接收數(shù)據(jù)的第九位,可定義其作用,奇偶檢驗,地址幀標(biāo)志等,方式1,若SM2=0,則RB8是接收到的停止位。
TI;發(fā)送中斷標(biāo)志位,方式0中,串行發(fā)送第8位數(shù)據(jù)結(jié)束時,或者其他方式,串行發(fā)送停止位時,由內(nèi)部硬件置1,向CPU發(fā)出中斷申請,在中斷服務(wù)程序中,須用軟件清零,取消此中斷申請。
RI;接收中斷標(biāo)志位,
方式0中,串行接收第8位數(shù)據(jù)結(jié)束時,或者其他方式,串行接收停止位時,由內(nèi)部硬件置1,向CPU發(fā)出中斷申請,在中斷服務(wù)程序中,須用軟件清零,取消此中斷申請
串口方式0,串行口為同步移位寄存器的輸入輸出方式,主要永不擴(kuò)展并行輸入輸出接口,數(shù)據(jù)由RXD(P3.0)引腳輸入或者輸出,同步移位脈沖由TXD(P3.1)引腳輸出,發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定fosc/12
串口方式1;10位數(shù)據(jù)一步通訊口,1起始,8數(shù)據(jù),1停止,TXD(P3.1)為數(shù)據(jù)發(fā)送引腳,RXD(P3.0)為數(shù)據(jù)接收引腳。其傳輸波特率可變,對51而言,波特率有定時器1的溢出率而決定,一般而言,在單片基于單片機(jī),單片機(jī)與計算機(jī),計算機(jī)與計算機(jī)串口通訊時,基本都市選擇方式1,所以此種方式必須掌握。
串口方士2,3;11位數(shù)據(jù)的異步通訊口,XD(P3.1)為數(shù)據(jù)發(fā)送引腳,RXD(P3.0)為數(shù)據(jù)接收引腳。在這兩種方式下,1起始,9數(shù)據(jù),1停止,一幀數(shù)據(jù)11位。方式2的波特率固定為晶晶振頻率的1/64或1/32,方式3的波特率由定時器1的溢出率決定。
方式2和方式2的差別僅在于波特率的選取不同,兩種方式下,接收到的停止位與SBUF,RB8,RI都無關(guān)。
串口方式1的編程實(shí)現(xiàn)
方式1數(shù)據(jù)輸出時序圖如下:

當(dāng)數(shù)據(jù)被寫入SBUF寄存器后,單片機(jī)自動開始從起始位發(fā)送數(shù)據(jù),發(fā)送到停止位的開始時,
由內(nèi)部硬件將TI置1,向CPU申請中斷,接下來可在中斷服務(wù)程序中進(jìn)行相關(guān)處理,也可選擇不進(jìn)入中斷。

用軟件置REN為1時,接收器以所選擇波特率的16倍速率采樣RXD引腳電平,
檢測到RXD引腳輸入電平發(fā)聲負(fù)跳變時,則說明起始位有效。
將其移入輸入移位寄存器并開始接受這一幀信息的其余位。
接收過程中,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器的最左邊,
控制電路進(jìn)行最后一次移位,當(dāng)RI=0且SM2=0(或結(jié)收到的停止位為1)時,
將接受到的9位數(shù)據(jù)前8位數(shù)據(jù)裝入接收SBUF,第九位(停止位)進(jìn)入RB8,并置RI=1,向CPU申請中斷,
在進(jìn)行串口的相關(guān)操作之前,需要對單片機(jī)的一些特殊寄存器和進(jìn)行初始化設(shè)置
主要是設(shè)置產(chǎn)生波特率的定時器1,串行口控制和中斷控制,具體步驟如下:
確定T1的工作方式(編程TMOD寄存器)
計算T1的初值,裝載TH1和TL1
啟動T1(編程TCON中的TR1位)
確定串行口工作方式(編程SCON寄存器)
串行口工作在中斷方式時,要進(jìn)行中斷設(shè)置(編程IE、IP寄存器)
-----------------------------------------------------------------------------------------------------------------------
//串口方式1
TMOD=0X20;
//T1定時器,工作方式2
TH1=0XFD;
//T1定時器裝初值
TL1=0XFD;
//T1定時器裝初值
TR1=1;
//啟動T1定時器
REN=1;
//允許串口接收
SM0=0;
//設(shè)定串口工作方式1
SM1=1;
//設(shè)定串口工作方式1
EA=1;
//開總中斷
ES=1;
//開串口中斷
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//串口中斷服務(wù)程序
void ser() interrupt 4
{
RI=0;
//RI清零;因為收到數(shù)據(jù)或者或者發(fā)送了數(shù)據(jù)會由硬件置1
a=SBUF;
//將SBUF中的數(shù)據(jù)讀走給a
flag=1;
//中斷標(biāo)志位置1
}
-----------------------------------------------------------------------------------------------------------------------
串口方式0
串行口為同步移位寄存器的輸入輸出方式,主要永不擴(kuò)展并行輸入輸出接口,數(shù)據(jù)由RXD(P3.0)引腳輸入或者輸出,同步移位脈沖由TXD(P3.1)引腳輸出,發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定fosc/12。
在該模式下,串行口的SBUF是作為同步移位寄存器使用的。
在串行口發(fā)送時。SBUF相當(dāng)于一個并行進(jìn)入,串行輸出的移位寄存器,
由單片機(jī)的內(nèi)部總線并行接收八位數(shù)據(jù),并從RXD信號線串行輸出,在接收操作時,他有相當(dāng)于一個串行輸入、并行輸出的移位寄存器。該模式下,SM2,RB8,TB8不起作用。
方式0數(shù)據(jù)輸出時序圖如下:

發(fā)送操作在TI=0時進(jìn)行,CPU將數(shù)據(jù)移入SBUF后,RXD線上即可發(fā)出8位數(shù)據(jù),TXD上發(fā)送同步脈沖,
8位數(shù)據(jù)發(fā)送完后,TI由硬件置位,并在中斷允許的情況下向CPU申請中斷,
CPU相應(yīng)中斷后,先用軟件是TI清零,然后再給SBUF送下一個需要發(fā)送的字符,如此重復(fù)上述過程。
方式0數(shù)據(jù)輸入時序圖如下:

接收過程在REN=1和RI=0的條件下啟動,為此串行數(shù)據(jù)由RXD線輸入,TXD線輸出同步脈沖,
接收電路接收到8位數(shù)據(jù)后,RI自動置位并在中斷允許的條件下向CPU發(fā)出中斷請求,
CPU 查詢到RI為1或者相應(yīng)中斷以后便將SBUF中的數(shù)據(jù)送到累加器,RI需要由軟件復(fù)位,
需要注意的是:
串行口工作模式0并不是一個同步通訊串口通訊方式,
它的主要用途是與外面的同步移位寄存器相連已達(dá)到擴(kuò)展單片機(jī)輸入并行口和輸出并行口的目的。
其可以通過芯片(74LS164)把串口數(shù)據(jù)轉(zhuǎn)化成并口數(shù)據(jù),通過芯片(74LS165)把并行輸出的數(shù)據(jù)轉(zhuǎn)換成串口輸出
-----------------------------------------------------------------------------------------------------------------------
使用串口工作模式0間隔發(fā)送數(shù)據(jù)0XAA
void main()
{
SCON=0;
//串行口工作方式0
EA=1;
//開總中斷
ES=1;
//允許串口中斷
TI=0;
//發(fā)送中斷標(biāo)志位
while(1)
{
SBUF=0XAA;
delay();
}
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
void ser0() interrupt 4
{
TI=0;
//清楚發(fā)送中斷標(biāo)志位
}
-----------------------------------------------------------------------------------------------------------------------
串口方式2和方式3
均為11位數(shù)據(jù)的異步通信口,唯一的區(qū)別在于傳輸速率的不同。
TXD數(shù)據(jù)發(fā)送引腳,RXD數(shù)據(jù)接收引腳,1起始,
9數(shù)據(jù)(含1位附加第9位,發(fā)送時為SCON中的TB8,接收時為RB8),1停止,一幀數(shù)據(jù)11位。
方式2的波特率固定為晶晶振頻率的1/64或1/32,方式3的波特率由定時器1的溢出率決定。
串口方式2和方式3一幀數(shù)據(jù)傳送格式,如圖:

串口方式2和方式3輸出時序圖:

發(fā)送開始時,先把起始位0輸出到TXD管腳,然后發(fā)送移位寄存器的的輸出位(D0)到TXD引腳
每一個移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出,
第一次移位時,停止位1移入輸出移位寄存器的第9位,以后每次移位,左邊都輸入0
當(dāng)停止移位至輸出位時,左邊其余位全為零,檢測電路檢測到這一條件時,使控制電路進(jìn)行最后一次移位,并置TI=1;向CPU請求中斷。
串口方式2和方式3輸入時序圖:

接受時,數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時,控制電路進(jìn)行最后一次移位。
當(dāng)RI=0且SM2=0(或接收到第9位數(shù)據(jù)位1)時,接收到的數(shù)據(jù)裝入接收緩沖器SBUF和RB8(接收數(shù)據(jù)的第9位),置RI=1,向CPU申請中斷,如果條件不滿足,則數(shù)據(jù)丟失,且不置位RI,繼續(xù)搜索RXD引腳的負(fù)跳變。
在方式2和方式3中,要用到SCON寄存器中的TB8位和RB8位,TB8為數(shù)據(jù)發(fā)送的第9位,用于方式2和方式3,由軟件更改,RB8為數(shù)據(jù)接收的第9位,用于方式2和方式3,在方式1中,如果SM2=0,則RB8用于存放接收到的停止位,在方式0下不適用該位。
-----------------------------------------------------------------------------------------------------------------------
使用串口工作方式2發(fā)送0XAA
void main()
{
SM0=1;
//SMOSM1為10,串行工作方式2
SM1=0;
//11位異步收發(fā)(9位數(shù)據(jù))
TB8=0;
//數(shù)據(jù)發(fā)送的第9位
EA=1;
//開總中斷
ES=1;
//允許串口中斷
|
|