51单片机-串口通信
目錄
1.什么是通信
1.1.通信的概念
1.2.傳送方式
1.3.同步方式
1.4.傳送方向
1.5.校驗(yàn)方式
2.單片機(jī)串口介紹
2.1.硬件電路
2.2.電平標(biāo)準(zhǔn)
2.3.常見(jiàn)接口
2.4.內(nèi)部結(jié)構(gòu)
2.5.相關(guān)寄存器
2.6.工作模式(模式1)
2.7.如何配置串口中斷
3.實(shí)際應(yīng)用
3.1.單片機(jī)向電腦發(fā)送數(shù)據(jù)
3.2.電腦向單片機(jī)發(fā)送數(shù)據(jù)
1.什么是通信
1.1.通信的概念
????????簡(jiǎn)單來(lái)說(shuō),通信就是傳遞信息;我把信息發(fā)給你,你把信息發(fā)給我,這就是通信;但是我如何把信息準(zhǔn)確傳遞給你,方式有很多。
????????在硬件領(lǐng)域,通信的方式也有很多種,從簡(jiǎn)單的串口通信,到I2C,SPI,CAN,MIPI等,不同的通信總線,對(duì)應(yīng)的協(xié)議也不同;但通信的本質(zhì)有相同之處;
- 按照數(shù)據(jù)傳送方式可分為串行通信和并行通信;
- 按照通信的數(shù)據(jù)同步方式,可分為異步通信和同步通信;
- 按照數(shù)據(jù)的傳輸方向又可分為單工、半雙工和全雙工通信
1.2.傳送方式
????????計(jì)算機(jī)與外界的信息交換稱(chēng)為通信,通信傳送的基本方式可分為并行通信和串行通信兩種;
并行通信:將數(shù)據(jù)字節(jié)的各位用多條數(shù)據(jù)線同時(shí)進(jìn)行傳送,如系統(tǒng)總線;
- 優(yōu)點(diǎn):控制簡(jiǎn)單,傳輸速度快;
- 缺點(diǎn):由于傳輸線較多,長(zhǎng)距離傳送時(shí)成本高;抗干擾能力差,固接受方的各位同時(shí)接收存在困難;
串行通信:將數(shù)據(jù)字節(jié)分成一位一位的形式,在一條傳輸線上逐位傳送
- 優(yōu)點(diǎn):傳輸線少,長(zhǎng)距離傳送時(shí),成本低;抗干擾能力強(qiáng),適合長(zhǎng)距離傳送;
- 缺點(diǎn):控制復(fù)雜,傳輸速度慢;
1.3.同步方式
同步通信:同步通信是一種連續(xù)傳送數(shù)據(jù)的通信方式,一次通信傳送多個(gè)字符數(shù)據(jù),稱(chēng)為一幀信息。
- 特點(diǎn):數(shù)據(jù)傳輸速率較高;其缺點(diǎn)是通信雙方必須建立準(zhǔn)確的位定時(shí)信號(hào),也就是發(fā)送時(shí)鐘和接收時(shí)鐘保持嚴(yán)格同步;
- 同步字符:傳送數(shù)據(jù)前,傳送同步字符進(jìn)行聯(lián)絡(luò);
- 信息幀:包含同步字符,數(shù)據(jù)場(chǎng),校驗(yàn)字符;
- 數(shù)據(jù)場(chǎng):多個(gè)數(shù)據(jù)字節(jié)之間沒(méi)有間隙,連續(xù)發(fā)送;
異步通信:在異步通信中,數(shù)據(jù)通常是以字符或字節(jié)為單位組成數(shù)據(jù)幀進(jìn)行傳送的。收、發(fā)端各有一套彼此獨(dú)立,互不同步的通信機(jī)構(gòu),由于收發(fā)數(shù)據(jù)的幀格式相同,因此可以相互識(shí)別接收到的數(shù)據(jù)信息
- 特點(diǎn):不要求收發(fā)雙方時(shí)鐘的嚴(yán)格一致,實(shí)現(xiàn)容易,設(shè)備開(kāi)銷(xiāo)較小,但每個(gè)字符要附加2~3位用于起止位,各幀之間還有間隔,因此傳輸效率不高。
- 起始位:起始位必須是持續(xù)一個(gè)比特時(shí)間的邏輯0電平,標(biāo)志傳輸一個(gè)字符的開(kāi)始,接收方可用起始位使自己的接收時(shí)鐘與發(fā)送方的數(shù)據(jù)同步;
- 數(shù)據(jù)位:數(shù)據(jù)位緊跟在起始位之后,是通信中的真正有效信息;數(shù)據(jù)位的位數(shù)可以由通信雙方共同約定;傳輸數(shù)據(jù)時(shí)先傳送字符的低位,后傳送字符的高位;
- 校驗(yàn)位:奇偶校驗(yàn)位僅占一位,用于進(jìn)行奇校驗(yàn)或偶校驗(yàn),奇偶檢驗(yàn)位不是必須有的。如果是奇校驗(yàn),需要保證傳輸?shù)臄?shù)據(jù)總共有奇數(shù)個(gè)邏輯高位;如果是偶校驗(yàn),需要保證傳輸?shù)臄?shù)據(jù)總共有偶數(shù)個(gè)邏輯高位。
- 停止位:停止位可以是是1位、1.5位或2位,可以由軟件設(shè)定;它一定是邏輯1電平,標(biāo)志著傳輸一個(gè)字符的結(jié)束;
- 空閑位:空閑位是指從一個(gè)字符的停止位結(jié)束到下一個(gè)字符的起始位開(kāi)始,表示線路處于空閑狀態(tài),必須由高電平來(lái)填充;
1.4.傳送方向
????????串行通信的傳送方式有三種,分別是單工、半雙工和全雙工。
單工:?數(shù)據(jù)傳輸只支持?jǐn)?shù)據(jù)在一個(gè)方向上傳輸;
半雙工:?允許數(shù)據(jù)在兩個(gè)方向上傳輸,但某一時(shí)刻只允許數(shù)據(jù)在一個(gè)方向上傳輸,實(shí)際上是一種切換方向的單工通信,不需要獨(dú)立的接收端和發(fā)送端,兩者可合并為一個(gè)端口;
全雙工:?允許數(shù)據(jù)同時(shí)在兩個(gè)方向上傳輸,因此全雙工通信是兩個(gè)單工方式的結(jié)合,需要獨(dú)立的接收端和發(fā)送端。
1.5.校驗(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)不一致,則說(shuō)明傳輸數(shù)據(jù)過(guò)程中出現(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)行比較,相符則無(wú)差錯(cuò),否則即認(rèn)為傳送過(guò)程中出現(xiàn)了差錯(cuò)。
- 循環(huán)冗余校驗(yàn):這種校驗(yàn)是通過(guò)某種數(shù)學(xué)運(yùn)算實(shí)現(xiàn)有效信息與校驗(yàn)位之間的循環(huán)校驗(yàn),常用于對(duì)磁盤(pán)信息的傳輸、存儲(chǔ)區(qū)的完整性校驗(yàn)等。這種校驗(yàn)方法糾錯(cuò)能力強(qiáng),廣泛應(yīng)用于同步通信中。
2.單片機(jī)串口介紹
????????串口通信(Serial Communication),是指外設(shè)和計(jì)算機(jī)間通過(guò)數(shù)據(jù)信號(hào)線地線等按位進(jìn)行傳輸數(shù)據(jù)的一種通信方式,屬于串行通信方式。串口是一種接口標(biāo)準(zhǔn),它規(guī)定了接口的電氣標(biāo)準(zhǔn),沒(méi)有規(guī)定接口插件電纜以及使用的協(xié)議。
????????51單片機(jī)內(nèi)部自帶UART(Universal Asynchronous Receiver Transmitter,通用異步收發(fā)器),可實(shí)現(xiàn)單片機(jī)的串口通信。
2.1.硬件電路
????????簡(jiǎn)單雙向串口通信有兩根通信線(發(fā)送端TXD和接收端RXD),交叉連接,并且共GND,如圖:
2.2.電平標(biāo)準(zhǔn)
????????電平標(biāo)準(zhǔn)是數(shù)據(jù)1和數(shù)據(jù)0的表達(dá)方式,是傳輸線纜中人為規(guī)定的電壓與數(shù)據(jù)的對(duì)應(yīng)關(guān)系,串口常用的電平標(biāo)準(zhǔn)有如下三種:
- TTL電平:+5V表示1,0V表示0
- RS232電平:-3~-15V表示1,+3~+15V表示0
- RS485電平:兩線壓差+2~+6V表示1,-2~-6V表示0(差分信號(hào))
2.3.常見(jiàn)接口
?此外,還有CAN、USB等;
2.4.內(nèi)部結(jié)構(gòu)
????????有兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF,它們占用同一地址99H ;接收器是雙緩沖結(jié)構(gòu) ;發(fā)送緩沖器,因?yàn)榘l(fā)送時(shí)CPU是主動(dòng)的,不會(huì)產(chǎn)生重疊錯(cuò)誤
2.5.相關(guān)寄存器
?1.串口控制寄存器SCON
- SM0/SM1:工作方式選擇位;
- SM2:多機(jī)通訊控制位;方式2/3中使用,控制接收數(shù)據(jù);SM2=1,只有當(dāng)RB8=1才能激活R1,接收數(shù)據(jù);
- REN:允許串行接收位;REN=1,啟動(dòng)串行口接收數(shù)據(jù);REN=0,禁止接收;
- TB8:在方式2或方式3中,是發(fā)送數(shù)據(jù)的第9位,可以用軟件規(guī)定其作用;可以用作數(shù)據(jù)基偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位;
- RB8:在方式2或方式3中,是發(fā)送數(shù)據(jù)的第9位,可以用軟件規(guī)定其作用;可以用作數(shù)據(jù)基偶校驗(yàn)位;在方式1時(shí),若SM2=0,則RB8是接收到的停止位;
- TI:發(fā)送中斷標(biāo)志位;在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其他方式,串行發(fā)送停止位的開(kāi)始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)送中斷申請(qǐng);在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請(qǐng)
- RI:接收專(zhuān)斷標(biāo)志位;在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其他方式,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)送中斷申請(qǐng);在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請(qǐng);
2.電源控制寄存器PCON
只有一位SMOD和串口工作相關(guān),其他位是電源控制相關(guān);那為什么和串口相關(guān)的控制位,會(huì)放到PCON去呢,原因是串口控制位超過(guò)了8位,剛好電源的控制位用不到8位,所以...
- SMOD:波特率倍增位;在串口方式1/2/3時(shí),波特率與SMOD有關(guān),當(dāng)SMOD=1,波特率加倍;復(fù)位時(shí),SMOD=0;
2.6.工作模式(模式1)
模式1:模式1是10位數(shù)據(jù)的異步通信口,其中1位起始位,8位數(shù)據(jù)位,1位停止位,TXD和RXD分別為數(shù)據(jù)的發(fā)送和接收引腳;其傳輸波特率是可變的,對(duì)于51單片機(jī),波特率由定時(shí)器1的溢出率決定;通常我們?cè)谧鰡纹瑱C(jī)與單片機(jī)串口通信,單片機(jī)與計(jì)算機(jī)串口通信,計(jì)算機(jī)與計(jì)算機(jī)串口通信時(shí),基本都選擇模式1,其傳輸一幀的數(shù)據(jù)格式如下:
????????模式1傳輸一幀的數(shù)據(jù)共10位,1位起始位(0),8位數(shù)據(jù)位,最低位在前,最高位在后,1位停止位(1),幀與幀之間可以有空閑,也可以無(wú)空閑,模式1數(shù)據(jù)輸出和輸入時(shí)序圖如下:
波特率:模式1的波特率是可變的,波特率=2^SMOD/32*溢出率;
- 當(dāng)單片機(jī)工作在12T模式時(shí),定時(shí)器1的溢出率=SYSclk/12/(256-TH1)
- 當(dāng)單片機(jī)工作在6T模式時(shí),定時(shí)器1的溢出率=SYSclk/6/(256-TH1)
溢出率:單位時(shí)間(秒)內(nèi)定時(shí)器/計(jì)數(shù)器1回0溢出的次數(shù),即定時(shí)器/計(jì)數(shù)器1的溢出率=定時(shí)器/計(jì)數(shù)器1的溢出次數(shù)/秒
2.7.如何配置串口中斷
????????在具體操作串行口之前,需要對(duì)單片機(jī)的一些與串口有關(guān)的特殊功能寄存器進(jìn)行初始化設(shè)置,主要是設(shè)置產(chǎn)生波特率的定時(shí)器1,串行口控制,和中斷控制,具體步驟如下:
- 配置TMOD寄存器:確定定時(shí)器的工作模式(T2);
- 配置TCON寄存器:定時(shí)器的控制開(kāi)關(guān);
- 計(jì)數(shù)器初值配置:裝載TH1,TL1;
- 配置SCON寄存器:確定串行口工作模式;
- 中斷配置:串行口在中斷方式時(shí),要進(jìn)行中斷設(shè)置(配置IE,I);
3.實(shí)際應(yīng)用
3.1.單片機(jī)向電腦發(fā)送數(shù)據(jù)
功能需求:串口向電腦發(fā)送遞增的16進(jìn)制數(shù)據(jù)(單片機(jī)每隔一段時(shí)間通過(guò)串口向電腦發(fā)送數(shù)據(jù))
程序設(shè)計(jì):首先,將串口有關(guān)的特殊功能寄存器進(jìn)行初始化設(shè)置(初始化);其次,定義串口需要發(fā)送的字節(jié)(子函數(shù));最后,通過(guò)主函數(shù)實(shí)現(xiàn)想要的效果
#include <REGX51.H> #include "Delay.h"unsigned char Sec;//全局變量//*串口初始化函數(shù) /******************************************** 因定時(shí)器1在工作模式2時(shí),為8位自動(dòng)重裝方式,我們進(jìn)中斷后無(wú)事可做, 因此,無(wú)需打開(kāi)定時(shí)器1的中斷,更無(wú)需寫(xiě)定時(shí)器1的中斷服務(wù)程序 **********************************************/ void UART_Init() {TMOD&=0x0F;TMOD|=0x20;TR1=1;TH1=0xF3;TL1=0xF3;ET1=0;SCON=0x40;PCON|=0x80; }//*子函數(shù) void UART_SendByte(unsigned char Byte) {SBUF=Byte; //把Byte的值賦給緩存SBUFwhile(TI==0); //確認(rèn)發(fā)送控制器TI標(biāo)志位的狀態(tài),只有當(dāng)TI不等于0時(shí),才會(huì)跳出循環(huán)TI=0; //清除發(fā)送完成標(biāo)志位 }//*主函數(shù) void main() {UART_Init();while(1){UART_SendByte(Sec);Sec++;Delay(1000);//延時(shí)1s} }3.2.電腦向單片機(jī)發(fā)送數(shù)據(jù)
功能需求:電腦向單片機(jī)發(fā)送數(shù)據(jù),同時(shí)控制LED燈亮滅
程序設(shè)計(jì):首先,將串口有關(guān)的特殊功能寄存器進(jìn)行初始化設(shè)置(初始化);其次,定義串口需要發(fā)送的數(shù)據(jù)(子函數(shù));最后,通過(guò)主函數(shù)和中斷服務(wù)程序,實(shí)現(xiàn)想要功能
#include <REGX51.H>//*串口初始化函數(shù) void UART_Init() {TMOD&=0x0F;TMOD|=0x20;TR1=1;TH1=0xF3;TL1=0xF3;ET1=0;SCON=0x50;PCON|=0x80;ES=1;EA=1; }//*子函數(shù) void UART_SendByte(unsigned char Byte) {SBUF=Byte; //把Byte的值賦給緩存SBUFwhile(TI==0); //確認(rèn)發(fā)送控制器TI標(biāo)志位的狀態(tài),只有當(dāng)TI不等于0時(shí),才會(huì)跳出循環(huán)TI=0; //清除發(fā)送完成標(biāo)志位 }//*主函數(shù) void main() {UART_Init();while(1){} }//*中斷函數(shù) void UART_Routine() interrupt 4 {if(RI==1) //接收中斷{P2=~SBUF;//將P2口賦值為~SBUF,控制LED亮滅UART_SendByte(SBUF);//單片機(jī)接收電腦發(fā)送的數(shù)據(jù)RI=0; //清除接收完成標(biāo)志位} }總結(jié)
以上是生活随笔為你收集整理的51单片机-串口通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《重说中国近代史》—张鸣—(4)古老命题
- 下一篇: 汉堡王什么汉堡好吃_KFC、汉堡王、麦当