51單片機入門:串口通信

串行通信的初步認識

通信方式分類

1、按照數據傳送方式:

并行通信:通信時數據的各個位同時傳送,可以實現字節為單位的通信。

但是通信線多,占用資源多,成本高。

串行通信:一次只能發送一位,要發送8次才能發送一個字節。(從低位開始發送)

2、按照數據同步方式:

同步通信:發送端在發送串行數據的同時,提供一個時鐘信號,并按照一定的約定(例如:在時鐘信號的上升沿的時候,將數據發送出去)發送數據,接收端根據發送端提供的時鐘信號來接收數據。如:I2C、SPI等有時鐘信號的協議,都屬于這種通信方式。

異步通信:接收方并不知道數據什么時候會到達,收發雙方可以有各自自己的時鐘。發送方發送的時間間隔可以不均,接收方是在數據的起始位和停止位的幫助下實現信息同步的。

3、按照數據傳輸方向:

單工通信:只允許一方向另外一方傳送信息(即單方面傳送),比如電視遙控機等。

半雙工通信:數據可以在雙方之間相互傳播,同一時間只能其中一方發給另外一方,比如對講機。

全雙工通信:發送數據的同時也能夠接收數據,兩者可以同時進行,比如視頻通話。

UART串口通信

UART(通用異步收發器)是一種通用串行數據總線,用于異步通信。該總線雙向通信,可以實現全雙工傳輸和接收。通過發送和接收數據來使單片機與單片機、單片機與電腦、單片機與各式各樣的模塊互相通信。

對于51單片機,以STC89C52RC為例,有兩個引腳專門用來通信:一個是RXD,一個是TXD,其基本模型如下:

f5235e5a0e694ba69129b2fe81efa695.jpg

其中,GND必須連接在一起,因為GND是電平基準。

如果單片機1要給單片機2發送11110 0100這個數據,先發送一個0,持續一段時間,再發送一個0,再持續一段時間......以此類推,逐次把所有的位都發送出去。

1、持續時間是多長時間?

引入波特率,也叫比特率:發送二進制數據的速率,習慣上用baud表示。發送一位二進制數據的持續時間為:1/baud。

如果單片機1和單片機2要通信,必須要保持波特率的一致。

2、數據什么時候開始、結束?

UART串口通信里規定:當沒有通信信號發生的時候,通信線路保持高電平。在發送數據之前,先發送一個0表示起始位(這個0的持續時間也是1/baud)。之后再發送8位的數據位,最后再發送一位1表示停止位

61b83f8d2ec3421081036a2fcfd361b5.jpg


RS232通信接口

串口通信可以實現單片機與單片機通信,也可實現單片機與電腦通信。對于電腦,其CPU就相當于一個單片機。

通常,臺式電腦上有RS232接口(九針九孔,也叫公頭母頭),但筆記本電腦一般沒有,通常用USB虛擬的串口。

RS232接口及其各個針孔功能:

05b349b0c4e94292b9e7a492527353cf.jpg

RS232電平標準:

高電平1:-3V~-15V;低電平0:+3V~+15V,為負邏輯。

其不能直接與單片機相連(會燒壞單片機),通常情況下用MAX232轉換芯片來實現我們單片機電壓與電腦電壓之間的轉換。

缺點:傳輸距離有限,最大傳輸距離標準值為50英尺,實際上也只能用在15米左右。且接口使用一根信號線和一根信號返回線而構成共地的傳輸形式,這種共地傳輸容易產生共模干擾,所以抗噪聲干擾性弱。


電平轉換芯片

MAX232轉換芯片

f6df51a3e9864aa08e249ee6dbe52d07.jpg

MAX232芯片是美信(MAXIM)公司專為RS-232標準串口設計的單電源電平轉換芯片,使用+5v單電源供電。

TTL/CMOS數據從11引腳(T1IN)、10引腳(T2IN)輸入轉換成RS-232數據從14(T1OUT)、7腳(T2OUT)送到電腦DB9插頭;DB9插頭的RS-232數據從13引腳(R1IN)、8引腳(R2IN)輸入轉換成TTL/CMOS數據后從12引腳(R1OUT)、9引腳(R2OUT)輸出。

USB轉串口通信

我們在工業上常使用RS232串口通信,但在商業上大部分為USB轉UART技術。

USB轉串口設備是一種將計算機的USB接口轉換為通用串口(如RS232、RS485等)的轉換器這種設備使得沒有串口的老式設備(如編程器、機械控制系統等)能夠通過USB接口與現代計算機連接。


串行口通信相關寄存器

SCON:串行控制寄存器

地址D7D6D5D4D3D2D1D0
98HSM0/FESM1SM2RENTB8RB8TIRI

SCON用于選擇串行通信的工作方式,和某些控制功能,其格式如上,可位尋址通常只考慮SM0、SM1、REN、TI和RI

SM0/FE:當PCON寄存器中的SMOD0為1,該位用于幀錯誤檢測;當PCON寄存器中的SMOD0為0時,該位與SM1一起指定串行通信的工作方式,具體如下:

REN:允許/禁止穿行接收控制位。由軟件置位REN,REN=1為允許串行接收狀態,可啟動串行接收器RXD,開始接收信息;軟件復位REN,即REN=0,則禁止接收;

TI:發送中斷請求標志位。在模式1中,停止位開始發送時由內部硬件置1,表示向主機請求中斷;中斷響應后需要軟件復位,即TI=0。初始化為0。

RI:接收中斷請求標志位。在模式1中,接收到停止位時由內部硬件置1;中斷響應后由軟件復位0,初始化為0。

PCON:電源控制寄存器

地址D7D6D5D4D3D2D1D0
87HSMODSMOD0/POFGF1GF0PDIDL

不可位尋址

SMOD:波特率選擇位,就是決定波特率是否加倍。用軟件置位SMOD,當SMOD=1時,使波特率加倍;當SMOD=0時,各工作方式的波特率不加倍。復位時默認SMOD=0。

SMOD0:幀錯誤檢測有效控制位,當SMOD0=1時,SCON寄存器中的SM0/FE位用于FE功能(幀錯誤檢測);當SMOD0=0時,SCON寄存器中的SM0/FE位用于SM0功能,與SM1一起指定串行口工作方式。

SBUF:串行口數據緩沖寄存器

SBUF寄存器有2個,一個是發送寄存器,另一個是接收寄存器(名字都一樣),但在邏輯上SBUF只有一個(地址都為99H),物理結構上,這是倆個完全獨立的寄存器。如果CPU寫SBUF,數據就會被送入發送寄存器準備發送;如果CPU讀SBUF,則讀入的數據一定來自接收寄存器。

簡單來講:a=SBUF,代表單片機從計算機接收到了數據(接收到的數據自動存在接收寄存器SBUF中)并且從接收寄存器SBUF讀取數據并賦給a。SBUF=a,代表單片機要給計算機發送a數據,只需將a賦給發送寄存器SBUF就行,發送寄存器SBUF會自動給計算機發送SBUF中的數據。


波特率的設置

為選擇波特率,關鍵在于定時器/計數器1的溢出率。

溢出率:單位時間內(1秒)定時器/計數器溢出的次數。

通常用的是定時器T1的模式2。模式2中,不再是 TH1 代表高 8 位,TL1 代表低 8 位了,而只有 TL1 在進行計數,當 TL1 溢出后,不僅僅會讓 TF1 變 1,而且還會將 TH1 中的內容重新自動裝到 TL1 中。這樣有一個好處,就是我們可以把想要的定時器初值提前存在 TH1 中,當 TL1 溢出后,TH1 自動把初值就重新送入 TL1 了,全自動的,不需要程序中再給 TL1 重新賦值了。


代碼設計

UART串口通信初始化

void UART_Init(){SCON=0x40;  //0100 0000PCON=0;/**通過定時器T1來設置波特率*/TMOD&=0x0F;  //0000 1111,清零定時器T1TMOD|=0x20;  //0010 1111,設置T1定時模式TL1 = 0xFA;		//設定定時初值TH1 = 0xFA;		//設定定時器重裝值ET1 = 0;		//禁止定時器1中斷TR1 = 1;		//啟動定時器1
}

其中,要禁止定時器1中斷。如果允許中斷,當中斷服務程序執行時,可能會引入額外的延遲或抖動,這會干擾波特率發生器的正常工作,導致數據傳輸錯誤或不穩定。

此處SCON=0x40,說明REN=0,不允許接收數據;若需要單片機接收數據,將REN置1,即:SCON=0x50。

串口發送一個字節

void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);//檢測是否完成發送TI=0;
}

串口中斷函數模版

void UART_Routine() interrupt 4
{if(RI==1){執行程序RI=0;  }
}

注意,中斷函數要進行條件判斷,因為串口接收和發送字節都能產生中斷請求(即:當TI為1或RI為1時都能產生中斷請求),通過條件判斷來區分接收和發送。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10569.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python把png轉成jpg

在Python中,你可以使用PIL(Python Imaging Library,也稱為Pillow)庫來讀取PNG圖片并將其轉換為JPG格式。下面是一個簡單的示例代碼: from PIL import Image# 打開PNG圖片 png_image Image.open(input.png)# 保存為JP…

微軟exchange郵箱發送

使用java發送exchange類型的郵件&#xff0c;foxmail中配置如下圖&#xff1a; 需要的maven依賴如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

PCIE協議-2-事務層規范-Message Request Rules

2.2.8 消息請求規則 本文檔定義了以下幾組消息&#xff1a; INTx 中斷信號電源管理錯誤信號鎖定事務支持插槽電源限制支持廠商定義消息延遲容忍度報告&#xff08;LTR&#xff09;消息優化緩沖區沖洗/填充&#xff08;OBFF&#xff09;消息設備就緒狀態&#xff08;DRS&#…

【系統架構師】-案例篇(八)數據流圖

數據流&#xff1a;數據流是系統中數據的流動&#xff0c;它可以是輸入、輸出或存儲在系統中的數據。 數據處理過程&#xff1a;數據處理過程是對數據進行處理的單元&#xff0c;可以是一個物理設備或軟件模塊。 數據存儲&#xff1a;數據存儲是系統中存儲數據的單元&#xff0…

焦作定制在線教育系統上線,小學英語教案怎么寫?教案要怎么下筆?

說到小學英語這也是當前&#xff0c;學生們的重點&#xff0c;那作為配套的輔導機構&#xff0c;要怎么寫教案?這也是需要關注的地方&#xff0c;因為教案關系著教學&#xff0c;有了它學生們上課才會更有效率&#xff0c;所以&#xff0c;會寫教案也是上課的第一步。 教案要怎…

小紅書·電商運營課:小紅書開店流程,小紅書電商如何運營(18節視頻課)

課程目錄 第1節課:學習流程以及后續實操流程注意事項 第2節課:小紅書店鋪類型解析以及開店細節 第3節課:小紅書電商運營兩種玩法之多品店鋪解析 第4節課:小紅書電商運營兩種玩法之單品店鋪解析 第5節課:選品課(多品類類目推薦) 第6節課:選品課(多品類類目推薦) 第7節課:…

百度GL地圖實現某一段路的路況(new BMapGL.DrivingRouteLine)

功能描述&#xff1a; 1.百度地圖實現點擊地圖出現起點&#xff0c;再次點擊出現終點&#xff08;起點終點能拖動&#xff09;繪制完終點后獲取該路的路況并且起點和終點可以拖動實現實時更新&#xff08;新繪制的路段的&#xff09;路況 2.地點搜索 效果如下&#xff1a; 關鍵…

Springboot+Vue項目-基于Java+MySQL的制造裝備物聯及生產管理ERP系統(附源碼+演示視頻+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;Java畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計 &…

Web自動化-日志收集

目標 1. 理解日志的相關概念 2. 掌握日志的基本用法 3. 掌握日志的高級用法 一、日志相關概念 目標 1. 了解日志的概念 2. 理解日志的作用 3. 掌握常見的日志級別 1. 日志 概念&#xff1a;日志就是用于記錄系統運行時的信息&#xff0c;對一個事件的記錄&#xff1b…

ffmpeg解析rtsp流獲取視頻的寬高

要使用FFmpeg來解析RTSP流并獲取視頻的寬度和高度,你可以使用avformat_find_stream_info函數來獲取流的信息,然后從AVStream結構體中讀取視頻的寬度和高度。以下是一個簡單的示例代碼: #include <libavformat/avformat.h> int main(int argc, char *argv[]) {AVForm…

ppt轉pdf的java實現

一、實現方式 java采用jacob包的功能&#xff0c;把ppt演示文稿轉換為pdf。 支持文件格式&#xff1a;pptx,ppt 二、事先準備 1、依賴于office&#xff0c;需安裝office辦公軟件 2、需要下載一個jacob-1.20-x64.dll的文件&#xff0c;放到java的bin目錄下。 文件可以網上搜…

電影網站|基于SSM+vue的電影網站系統(源碼+數據庫+文檔)

電影網站 目錄 基于SSMvue的電影網站系統 一、前言 二、系統設計 三、系統功能設計 1 系統功能模塊 2 管理員功能模塊 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取&#xff1a; 博主介紹&#xff1a;??大廠碼農|畢設布道…

Linux sliplogin命令教程:如何使用sliplogin命令建立SLIP服務器(附實例詳解和注意事項)

Linux sliplogin命令介紹 sliplogin&#xff08;Serial Line Internet Protocol Login&#xff09;命令用于將SLIP接口加入標準輸入&#xff0c;把一般終端機的連線變成SLIP連線。通常可用來建立SLIP服務器&#xff0c;讓遠端電腦以SLIP連線到服務器。 Linux sliplogin命令適…

貪心算法-----檸檬水找零

今日題目&#xff1a;leetcode860 題目鏈接&#xff1a;點擊跳轉題目 分析&#xff1a; 顧客只會給三種面值&#xff1a;5、10、20&#xff0c;先分類討論 當收到5美元時&#xff1a;不用找零&#xff0c;面值5張數1當收到10美元時&#xff1a;找零5美元&#xff0c;面值5張數…

未授權訪問:JBoss未授權訪問漏洞

目錄 1、漏洞原理? 2、環境搭建 3、未授權訪問 4、利用jboss.deployment getshell 防御手段 今天繼續學習各種未授權訪問的知識和相關的實操實驗&#xff0c;一共有好多篇&#xff0c;內容主要是參考先知社區的一位大佬的關于未授權訪問的好文章&#xff0c;還有其他大佬…

【Ubuntu 安裝erlang】

apt-get 安裝 apt-get install erlang或 源碼安裝 git clone https://github.com/erlang/otp.git cd otp git checkout maint-25 # current latest stable version ./configure make make install安裝完后&#xff0c;驗證是否成功 # 命令行輸入 erl

7.用戶、角色、菜單表SQL

用戶與角色是 多對多的關系&#xff1b; 角色與菜單權限 多對多的關系&#xff1b; 菜單權限表 create table acl_permission (id char(19) not null DEFAULT COMMENT 編號,pid CHAR(19) not null DEFAULT COMMENT 所屬上級,name VARCHAR(20) not NULL DEFAULT COMMENT …

C語言經典例題-7

1.計算三角形的周長和面積 題目描述&#xff1a; 根據給出的三角形3條邊a, b, c&#xff08;0 < a, b, c < 100,000&#xff09;&#xff0c;計算三角形的周長和面積。 輸入描述: 一行&#xff0c;三角形3條邊&#xff08;能構成三角形&#xff09;&#xff0c;中間用…

【ARM 嵌入式 C 入門及漸進 12.3 -- 將數值的第 s 位到 e 位清零】

請閱讀【嵌入式開發學習必備專欄】 文章目錄 將數值的第 s 位到 e 位清零 將數值的第 s 位到 e 位清零 為了定義一個VAL_CLR_BITS(val, s, n)宏&#xff0c;該宏將變量val的第s位到第n位清零&#xff08;假設n > s&#xff09;&#xff0c;其余位的值保持不變&#xff0c;我…

系統集成項目管理工程師第4章思維導圖發布

2024年開年&#xff0c;軟考系統集成項目管理工程師官方教程&#xff0c;迎來了闊別7年的大改版&#xff0c;改版之后的軟考中項考試&#xff0c;離同宗兄弟高項考試漸行漸遠。 中項第3版教程&#xff0c;僅僅從教程來看&#xff0c;其難度已經不亞于高級的信息系統項目管理師&…