十天学会单片机Day4串行口通信
?并行與串行基本通信方式
1.并行通信方式
通常是將數(shù)據(jù)字節(jié)的各位用多條數(shù)據(jù)線同時進(jìn)行傳送。
并行通信控制簡單、傳輸速度快;由于傳輸線較多,長距離傳送時成本高且接收方的各位同時接收存在困難。 ?
2.串行通信方式
是將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線上逐個地傳送。
串行通信傳輸線少,長距離傳送時成本低,且可以利用電話網(wǎng)等現(xiàn)成的設(shè)備,但數(shù)據(jù)的傳送控制比并行通信復(fù)雜。
3.異步串行通信方式
異步通信是指通信的發(fā)送與接收設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收過程。為使雙方的收發(fā)協(xié)調(diào),要求發(fā)送和接收設(shè)備的時鐘盡可能一致。
異步通信是以字符(構(gòu)成的幀)為單位進(jìn)行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但每個字符中的各位是以固定的時間傳送的,即字符之間不一定有“位間隔”的整數(shù)倍的關(guān)系,但同一字符內(nèi)的各位之間的距離均為“位間隔”的整數(shù)倍。
異步通信的數(shù)據(jù)格式:
異步通信不要求收發(fā)雙方時鐘的嚴(yán)格一致,實現(xiàn)容易,設(shè)備開銷較小,但每個字符要附加2~3位用于起止位,各幀之間還有間隔,因此傳輸效率不高。
4.同步串行通信方式
同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達(dá)到完全同步。此時,傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時傳送的字符間不留間隙,即保持位同步關(guān)系,也保持字符同步關(guān)系。發(fā)送方對接收方的同步可以通過兩種方法實現(xiàn)。??
同步通信是以特定的位組合“01111110”作為幀的開始和結(jié)束標(biāo)志,所傳輸?shù)囊粠瑪?shù)據(jù)可以是任意位。所以傳輸?shù)男瘦^高,但實現(xiàn)的硬件設(shè)備比異步通信復(fù)雜。
面向字符的同步格式:
面向位的同步格式:
5.串行通信的制式
單工:數(shù)據(jù)傳輸僅能沿一個方向,不能實現(xiàn)反向傳輸。
半雙工:指數(shù)據(jù)傳輸可以沿兩個方向,但需要分時進(jìn)行。
全雙工:指數(shù)據(jù)可以同時進(jìn)行雙向傳輸。
6.串行通信的錯誤校驗
奇偶校驗:在發(fā)送數(shù)據(jù)時,數(shù)據(jù)位尾隨的1位為奇偶校驗位(1或0)。奇校驗時,數(shù)據(jù)中“1”的個數(shù)與校驗位“1”的個數(shù)之和應(yīng)為奇數(shù);偶校驗時,數(shù)據(jù)中“1”的個數(shù)與校驗位“1”的個數(shù)之和應(yīng)為偶數(shù)。接收字符時,對“1”的個數(shù)進(jìn)行校驗,若發(fā)現(xiàn)不一致,則說明傳輸數(shù)據(jù)過程中出現(xiàn)了差錯。
代碼和校驗:發(fā)送方將所發(fā)數(shù)據(jù)塊求和(或各字節(jié)異或),產(chǎn)生一個字節(jié)的校驗字符(校驗和)附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)同時對數(shù)據(jù)塊(除校驗字節(jié)外)求和(或各字節(jié)異或),將所得的結(jié)果與發(fā)送方的“校驗和”進(jìn)行比較,相符則無差錯,否則即認(rèn)為傳送過程中出現(xiàn)了差錯。
循環(huán)冗余校驗:通過某種數(shù)學(xué)運算實現(xiàn)有效信息與校驗位之間的循環(huán)校驗,常用于對磁盤信息的傳輸、存儲區(qū)的完整性校驗等。這種校驗方法糾錯能力強(qiáng),廣泛應(yīng)用于同步通信中。
?
7.串行通信接口
RS-232
RS-232C接口規(guī)定使用25針連接器,連接器的尺寸及每個插針的排列位置都有明確的定義。(陽頭)
MAX232:把TTL電平從0V和5V轉(zhuǎn)換到3V~15V或-3V~-15V之間。
分立元件實現(xiàn)RS-232電平與TTL電平轉(zhuǎn)換電路。
TXD 為低 Q3導(dǎo)通 PCRXD拉高(如PC用中斷接受的話會產(chǎn)生中斷);TXD發(fā)送高電平,Q3截止,PCRXD內(nèi)部高阻,而PCTXD平時是-3~-15V,拉低PCRXD。
PC發(fā)送信號:當(dāng)PCTXD為低電平,Q4截止,RXD拉高為高電平;當(dāng)PCTXD變高時,Q4導(dǎo)通,RXD被Q4拉倒低電平。雙向轉(zhuǎn)換。
?
MAX232芯片實現(xiàn)RS232電平與TTL電平轉(zhuǎn)換
????
?
CH340 USB-COM轉(zhuǎn)換芯片
?
8.波特率與定時器初值的關(guān)系
比特率是每秒鐘傳輸二進(jìn)制代碼的位數(shù),單位是:位/秒(bps)。如每秒鐘傳送240個字符,而每個字符格式包含10位(1個起始位、1個停止位、8個數(shù)據(jù)位),這時的比特率為:10位×240個/秒 = 2400 bps
方式0的波特率 =? fosc/12
方式2的波特率 =(2^SMOD/64)· fosc
方式1的波特率 =(2^SMOD/32)·(T1溢出率)
方式3的波特率 =(2^SMOD/32)·(T1溢出率)
fosc為晶振頻率。SMOD是PCON寄存器最高位。T1溢出率是定時器T1溢出的頻率。
T1溢出率=fosc / {12 * [ 256- (TH1) ] }
方式1,在給定時器計滿溢出時,自動進(jìn)入中斷服務(wù)程序,然后我們需手動再次給定時器裝初值。
方式2,當(dāng)定時器計滿溢出后,單片機(jī)會自動為其裝初值,并且無須進(jìn)入中斷服務(wù)程序進(jìn)行任何處理。定時器溢出速率就會絕對穩(wěn)定。
Eg:已知串行口通信在串口方式1下,波特率為9600bps,系統(tǒng)晶振頻率為11.0592MHZ,求TL1和TH1中裝入的數(shù)值?
取SMOD=0
9600 = (1/32)*11059200/ {12 *[256 - (X)] }
X=253,轉(zhuǎn)換成16進(jìn)制0xFD
?
9.串行口結(jié)構(gòu)
有兩個物理上獨立的接收、發(fā)送緩沖器SBUF,它們占用同一地址99H ;接收器是雙緩沖結(jié)構(gòu) ;發(fā)送緩沖器,因為發(fā)送時CPU是主動的,不會產(chǎn)生重疊錯誤。
10.寄存器
| 位序號 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 位符號 | SMOD | (SMOD0) | (LVDF) | (P0F) | GF1 | GF0 | PD | IDL |
?
?
?
SMOD-該位與串口通信波特率有關(guān)
SMOD=0:串口方式123時,波特率正常
SMOD=1:串口方式123時,波特率加倍。
?
| 位序號 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 位符號 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
?
?
?
?
| SM0 | SM1 | 方式 | 功能說明 |
| 0 | 0 | 0 | 同步移位寄存器方式(通常用于擴(kuò)展I/O口) |
| 0 | 1 | 1 | 10位異步收發(fā)(8位數(shù)據(jù)),波特率可變 |
| 1 | 0 | 2 | 11位異步收發(fā)(9位數(shù)據(jù)),波特率固定 |
| 1 | 1 | 3 | 11位異步收發(fā)(9位數(shù)據(jù)),波特率可變 |
?
?
?
?
?
SM2-多機(jī)通信控制位
主要用于方式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(即此時RB8不具有控制RI激活的功能)。通過控制SM2,可以實現(xiàn)多機(jī)通信。
在方式0時,SM2必須是0。在方式1時,若SM2=1,則只有接收到有效停止位時,RI才置1。
REN-允許串行接收位
由軟件置REN=1,則啟動串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。
TB8-在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位
可以用軟件規(guī)定其作用。可以用作數(shù)據(jù)的奇偶校驗位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。
在方式0和方式1中,該位未用。
RB8-在方式2或方式3中,是接收到數(shù)據(jù)的第九位
作為奇偶校驗位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時,若SM2=0,則RB8是接收到的停止位。
TI-發(fā)送中斷標(biāo)志位
在方式0時,當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時,或在其它方式,串行發(fā)送停止位的開始時,由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請。
RI-接收中斷標(biāo)志位
在方式0時,當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時,或在其它方式,串行接收停止位的中間時,由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請
定時器/計數(shù)器工作方式寄存器TMOD在之前已經(jīng)有過5.
11.步驟
串行口工作之前,應(yīng)對其進(jìn)行初始化,主要是設(shè)置產(chǎn)生波特率的定時器1、串行口控制和中斷控制。具體步驟如下:
①確定T1的工作方式(編程TMOD寄存器) ②計算T1的初值,裝載TH1、TL1 ③啟動T1(編程TCON中的TR1位) ④確定串行口控制(編程SCON寄存器)⑤串行口在中斷方式工作時,要進(jìn)行中斷設(shè)置(編程IE、IP寄存器)
?
1 //串口方式1 I get X 2 #include <reg52.h> 3 unsigned char flag, a, i; 4 unsigned char code table[]="I get "; 5 6 void init() 7 { 8 TMOD = 0x20;//確定T1工作方式 自動重載8位定時器,收TR1控制 9 TH1 = 0xFD;//裝初值 10 TL1 = 0xFD; 11 TR1 = 1;//開啟定時器 12 REN = 1;//允許串行口接受 13 SM0 = 0;//方式1 14 SM1 = 1; 15 EA = 1;//中斷總開關(guān)開 16 ES = 1;//串行口中斷打開 17 } 18 19 void main() 20 { 21 init(); 22 while(1) 23 { 24 if(flag == 1) { //有接收 25 ES = 0; //串行口中斷關(guān)閉 26 for(i = 0; i < 6; i++) { 27 SBUF = table[i]; //SBUF發(fā)送寄存器I get 28 while(!TI); //發(fā)送 29 TI = 0; //發(fā)送中斷標(biāo)志位清0 30 } 31 SBUF = a; //把接收到的緩存在a中的給SBUF發(fā)送 32 while(!TI); //發(fā)送 33 TI = 0; //軟件清0 34 ES = 1; //打開串行口中斷 35 flag = 0; //標(biāo)志清0 36 } 37 } 38 } 39 40 void ser() interrupt 4 41 { //RI=1接收到串行口中斷 42 RI = 0; //軟件清0 43 a = SBUF; //讀取SBUF中數(shù)據(jù)存于a 44 flag = 1; //標(biāo)志置1 代表有接收 45 }?
1 //方式2 2 #include <reg52.h> 3 4 void InitUART(void) 5 { 6 TMOD = 0x20; 7 SCON = 0x50; 8 TH1 = 0xFD; 9 TL1 = TH1; 10 PCON = 0x00; 11 EA = 1; 12 ES = 1; 13 TR1 = 1; 14 } 15 16 void SendOneByte(unsigned char c) 17 { 18 SBUF = c; 19 while(!TI); 20 TI = 0; 21 } 22 23 void main(void) 24 { 25 InitUART(); 26 } 27 28 void UARTInterrupt(void) interrupt 4 29 { 30 if(RI) 31 { 32 RI = 0; 33 //add your code here! 34 } 35 else 36 TI = 0; 37 }?
轉(zhuǎn)載于:https://www.cnblogs.com/kuotian/p/5428915.html
總結(jié)
以上是生活随笔為你收集整理的十天学会单片机Day4串行口通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BP神经网络 MATLAB源程序
- 下一篇: java 进度条 百分比_java怎么让