單片機(jī)STC89C52學(xué)習(xí)——19 串口通信
匯總:00 單片機(jī)STC89C52學(xué)習(xí)
參考教程:普中科技
1 原理
1.1 并行通信與串行通信
并行通信 | 串行通信 |
---|---|
將數(shù)據(jù)字節(jié)的各位用多條數(shù)據(jù)線同時(shí)進(jìn)行傳送 | 將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線上逐個(gè)地傳送(先低后高) |
控制簡單、傳輸速度快汪拥;但由于傳輸線較多达传,長距離傳送時(shí)成本高且接收方的各位同時(shí)接收存在困難(相互干擾等) | 傳輸線少,長距離傳送時(shí)成本低迫筑,且可以利用電話網(wǎng)(電話線)等現(xiàn)成的設(shè)備宪赶;但數(shù)據(jù)的傳送控制比并行通信復(fù)雜 |
1.2 串行通信:異步通信與同步通信
-
異步通信
? ? ? ?異步通信是指通信的發(fā)送與接收設(shè)備使用各自的時(shí)鐘控制數(shù)據(jù)的發(fā)送和接收過程。為使雙方的收發(fā)協(xié)調(diào)脯燃,要求發(fā)送和接收設(shè)備的時(shí)鐘盡可能一致搂妻。
? ? ? ?異步通信是以字符(構(gòu)成的幀)為單位進(jìn)行傳輸,字符與字符之間的間隙(時(shí)間間隔)是任意的辕棚,但每個(gè)字符中的各位是以固定的時(shí)間傳送的欲主。即字符之間不一定有“位間隔”的整數(shù)倍的關(guān)系,但同一字符內(nèi)的各位之間的距離均為“位間隔”的整數(shù)倍逝嚎。
數(shù)據(jù)格式: - 同步通信
? ? ? ?同步通信時(shí)要建立發(fā)送方時(shí)鐘對(duì)接收方時(shí)鐘的直接控制她紫,使雙方達(dá)到完全同步。此時(shí)屿储,傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍贿讹,同時(shí)傳送的字符間不留間隙,即既保持位同步關(guān)系够掠,也保持字符同步關(guān)系民褂。發(fā)送方對(duì)接收方的同步可以通過兩種方法實(shí)現(xiàn)——外同步和自同步:
1.3 串行通信的傳輸方向
-
單工
數(shù)據(jù)傳輸僅能沿一個(gè)方向,不能實(shí)現(xiàn)反向傳輸 -
半雙工
數(shù)據(jù)傳輸可以沿兩個(gè)方向疯潭,但需要分時(shí)進(jìn)行 -
全雙工
數(shù)據(jù)可以同時(shí)進(jìn)行雙向傳輸
1.4 串行通信中常見的錯(cuò)誤校驗(yàn)
-
奇偶校驗(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)不一致,則說明傳輸數(shù)據(jù)過程中出現(xiàn)了差錯(cuò)椿访。 -
代碼和校驗(yàn)
? ? ? ?代碼和校驗(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)行比較加酵,相符則無差錯(cuò),否則即認(rèn)為傳送過程中出現(xiàn)了差錯(cuò)哭当。 -
循環(huán)冗余校驗(yà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)用于同步通信中。
1.5 傳輸速率
-
比特率
? ? ? ?比特率(波特率)是每秒鐘傳輸二進(jìn)制代碼的位數(shù)个盆,單位是:位/秒(bps)。如每秒鐘傳送240個(gè)字符朵栖,而每個(gè)字符格式包含10位(1個(gè)起始位颊亮、1個(gè)停止位、8個(gè)數(shù)據(jù)位)陨溅,這時(shí)的比特率為:10位×240個(gè)/秒 = 2400 bps -
傳輸距離與傳輸速率的關(guān)系
? ? ? ?串行接口或終端直接傳送串行信息位流的最大距離與傳輸速率及傳輸線的電氣特性有關(guān)终惑。當(dāng)傳輸線使用每0.3m(約1英尺)有50PF電容的非平衡屏蔽雙絞線時(shí),傳輸距離隨傳輸速率的增加而減小门扇。當(dāng)比特率超過1000 bps 時(shí)雹有,最大傳輸距離迅速下降,如9600 bps 時(shí)最大距離下降到只有76m(約250英尺)臼寄。
? ? ? ?反比:若要傳得遠(yuǎn)霸奕,波特率必須小吉拳;只需要傳很近质帅,波特率可以大。
1.6 串行通信接口標(biāo)準(zhǔn)
- RS-232C接口
- RS-422A接口
- RS-485接口
1.7 80C51的串行口的控制
有兩個(gè)物理上獨(dú)立的接收留攒、發(fā)送緩沖器SBUF煤惩,它們占用同一地址99H ;接收器是雙緩沖結(jié)構(gòu) 炼邀,避免數(shù)據(jù)接收過程中出現(xiàn)重疊錯(cuò)誤魄揉;發(fā)送緩沖器,因?yàn)榘l(fā)送時(shí)CPU是主動(dòng)的拭宁,不會(huì)產(chǎn)生重疊錯(cuò)誤洛退。
-
控制寄存器SCON(通常0101 0000 = 0x50)
設(shè)定串行口的工作方式票彪、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志
-
SM0和SM1:工作方式選擇位,可選擇四種工作方式(通常選擇方式1)
- SM2:多機(jī)通信控制位不狮,主要用于方式2和方式3降铸。當(dāng)接收機(jī)的SM2=1時(shí)可以利用收到的RB8來控制是否激活RI(RB8=0時(shí)不激活RI,收到的信息丟棄摇零;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF推掸,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)驻仅。當(dāng)SM2=0時(shí)谅畅,不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF噪服,并激活RI(即此時(shí)RB8不具有控制RI激活的功能)毡泻。通過控制SM2,可以實(shí)現(xiàn)多機(jī)通信粘优。在方式0時(shí)仇味,SM2必須是0。在方式1時(shí)雹顺,如果SM2=1丹墨,則只有接收到有效停止位時(shí),RI才置1嬉愧。
- REN:允許串行接收位贩挣。由軟件置REN=1,則啟動(dòng)串行口接收數(shù)據(jù)没酣;若軟件置REN=0王财,則禁止接收
- TB8,在方式2或方式3中裕便,是發(fā)送數(shù)據(jù)的第九位绒净,可以用軟件規(guī)定其作用∩两穑可以用作數(shù)據(jù)的奇偶校驗(yàn)位疯溺,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位哎垦。在方式0和方式1中囱嫩,該位未用。
- RB8漏设,在方式2或方式3中墨闲,是接收到數(shù)據(jù)的第九位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位郑口。在方式1時(shí)鸳碧,若SM2=0盾鳞,則RB8是接收到的停止位。
- TI:發(fā)送中斷標(biāo)志位瞻离。在方式0時(shí)腾仅,當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式套利,串行發(fā)送停止位的開始時(shí)推励,由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請(qǐng)肉迫。在中斷服務(wù)程序中验辞,必須用軟件將其清0,取消此中斷申請(qǐng)喊衫。
- RI:接收中斷標(biāo)志位跌造。在方式0時(shí),當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí)族购,或在其它方式壳贪,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1联四,向CPU發(fā)中斷申請(qǐng)撑碴。也必須在中斷服務(wù)程序中,用軟件將其清0朝墩,取消此中斷申請(qǐng)。
-
PCON
其中只有一位SMOD與串行口工作有關(guān)
- SMOD (PCON.7) :波特率倍增位伟姐。在串行口方式1收苏、方式2、方式3時(shí)愤兵,波特率與SMOD有關(guān)鹿霸,當(dāng)SMOD=1時(shí),波特率提高一倍秆乳。復(fù)位時(shí)懦鼠,SMOD=0。
1.8 80C51串行口的工作方式
-
方式0
方式0時(shí)屹堰,串行口為同步移位寄存器的輸入輸出方式肛冶。主要用于擴(kuò)展并行輸入或輸出口。數(shù)據(jù)由RXD (P3.0) 引腳輸入或輸出扯键,同步移位脈沖由TXD(P3.1)引腳輸出睦袖。發(fā)送和接收均為8位數(shù)據(jù),低位在先荣刑,高位在后馅笙。波特率固定為fosc/12伦乔。
-
輸出:
-
輸入:
-
方式1
方式1是10位數(shù)據(jù)的異步通信口。TXD為數(shù)據(jù)發(fā)送引腳董习,RXD為數(shù)據(jù)接收引腳烈和,傳送一幀數(shù)據(jù)的格式如圖所示。其中1位起始位皿淋,8位數(shù)據(jù)位招刹,1位停止位。
-
輸出:
-
輸入:
用軟件置REN為1時(shí)沥匈,接收器以所選擇波特率的16倍速率采樣RXD引腳電平蔗喂,檢測(cè)到RXD引腳輸入電平發(fā)生負(fù)跳變時(shí),則說明起始位有效,將其移入輸入移位寄存器,并開始接收這一幀信息的其余位训貌。接收過程中古瓤,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時(shí)常空,控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的停止位為1)時(shí)瞪浸,將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)裝入接收SBUF,第9位(停止位)進(jìn)入RB8吏祸,并置RI=1对蒲,向CPU請(qǐng)求中斷。
-
方式2和方式3
方式2或方式3時(shí)為11位數(shù)據(jù)的異步通信口贡翘。TXD為數(shù)據(jù)發(fā)送引腳蹈矮,RXD為數(shù)據(jù)接收引腳 。
-
輸出:
發(fā)送開始時(shí)联喘,先把起始位0輸出到TXD引腳叭喜,然后發(fā)送移位寄存器的輸出位(D0)到TXD引腳捂蕴。每一個(gè)移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出闪幽。
第一次移位時(shí)啥辨,停止位“1”移入輸出移位寄存器的第9位上 ,以后每次移位盯腌,左邊都移入0溉知。當(dāng)停止位移至輸出位時(shí),左邊其余位全為0腕够,檢測(cè)電路檢測(cè)到這一條件時(shí)级乍,使控制電路進(jìn)行最后一次移位,并置TI=1帚湘,向CPU請(qǐng)求中斷玫荣。 -
輸入:
接收時(shí),數(shù)據(jù)從右邊移入輸入移位寄存器大诸,在起始位0移到最左邊時(shí)捅厂,控制電路進(jìn)行最后一次移位。當(dāng)RI=0资柔,且SM2=0(或接收到的第9位數(shù)據(jù)為1)時(shí)恒傻,接收到的數(shù)據(jù)裝入接收緩沖器SBUF和RB8(接收數(shù)據(jù)的第9位),置RI=1建邓,向CPU請(qǐng)求中斷。如果條件不滿足睁枕,則數(shù)據(jù)丟失官边,且不置位RI,繼續(xù)搜索RXD引腳的負(fù)跳變外遇。
1.9 波特率的計(jì)算
? ? ? ?在串行通信中注簿,收發(fā)雙方對(duì)發(fā)送或接收數(shù)據(jù)的速率要有約定。通過軟件可對(duì)單片機(jī)串行口編程為四種工作方式跳仿,其中方式0和方式2的波特率是固定的诡渴,而方式1和方式3的波特率是可變的,由定時(shí)器T1的溢出率來決定菲语。
? ? ? ?串行口的四種工作方式對(duì)應(yīng)三種波特率妄辩。由于輸入的移位時(shí)鐘的來源不同惑灵,所以,各種方式的波特率計(jì)算公式也不相同眼耀。
- 方式0的波特率 = fosc/12
- 方式2的波特率 = (2SMOD/64) · fosc
- 方式1的波特率 = (2SMOD/32) · (T1溢出率)
- 方式3的波特率 = (2SMOD/32) · (T1溢出率)
? ? ? ?當(dāng)T1作為波特率發(fā)生器時(shí)英支,最典型的用法是使T1工作在自動(dòng)再裝入的8位定時(shí)器方式(即方式2,且TCON的TR1=1哮伟,以啟動(dòng)定時(shí)器)干花。這時(shí)溢出率取決于TH1中的計(jì)數(shù)值:T1 溢出率 = fosc /{12×[256 -(TH1)]}
? ? ? ?在單片機(jī)的應(yīng)用中,常用的晶振頻率為:12MHz和11.0592MHz楞黄。所以池凄,選用的波特率也相對(duì)固定。常用的串行口波特率以及各參數(shù)的關(guān)系如表所示鬼廓。
1.10 串口如何使用
- TMOD:確定T1的工作方式
- 賦初值:計(jì)算T1的初值肿仑,裝載TH1、TL1
- TCON:啟動(dòng)T1(TR1位)
- SCON:確定串行口控制
- IE桑阶、IP:中斷方式時(shí)柏副,進(jìn)行中斷設(shè)置
1.11 單片機(jī)與單片機(jī)的通信
-
點(diǎn)對(duì)點(diǎn)
-
多機(jī)通信
單片機(jī)構(gòu)成的多機(jī)系統(tǒng)常采用總線型主從式結(jié)構(gòu)。所謂主從式蚣录,即在數(shù)個(gè)單片機(jī)中割择,有一個(gè)是主機(jī),其余的是從機(jī)萎河,從機(jī)要服從主機(jī)的調(diào)度荔泳、支配。80C51單片機(jī)的串行口方式2和方式3適于這種主從式的通信結(jié)構(gòu)虐杯。當(dāng)然采用不同的通信標(biāo)準(zhǔn)時(shí)玛歌,還需進(jìn)行相應(yīng)的電平轉(zhuǎn)換,有時(shí)還要對(duì)信號(hào)進(jìn)行光電隔離擎椰。在實(shí)際的多機(jī)應(yīng)用系統(tǒng)中支子,常采用RS-485串行標(biāo)準(zhǔn)總線進(jìn)行數(shù)據(jù)傳輸。
2 程序:串口通信——返回收到的數(shù)據(jù)达舒,通過串口調(diào)試助手顯示
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void USARTInit()
{
TMOD = 0x20;// 使用T1:GATE = 0; C/T = 0定時(shí)器; M1 = 1值朋、M0 = 0為8位自動(dòng)重裝
TH1 = 0xF3; TL1 = 0xF3;// 波特率4800
PCON = 0x80;// 倍頻
TR1 = 1;// 啟動(dòng)T0
SCON = 0x50;
EA = 1; ES = 1;// 中斷允許:總、串口
}
void main()
{
USARTInit();
while (1);
}
void intUSART() interrupt 4// 接收到數(shù)據(jù)巩搏,SBUF存滿昨登,RI = 1即發(fā)出中斷請(qǐng)求產(chǎn)生中斷
{
u8 receivedData = SBUF;// 讀緩沖器的數(shù)據(jù)保存到變量
RI = 0;// 要手動(dòng)清零,取消中斷申請(qǐng)
SBUF = receivedData;// 放到緩沖區(qū)就開始發(fā)送了
while(!TI);// 等待直到發(fā)送完成贯底,TI變成1
TI = 0;
}
效果: