日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術中心 >> 單片機入門 >> 深入理解51單片機串口通信

深入理解51單片機串口通信

關鍵字:51單片機 作者:admin 來源:不詳 發(fā)布時間:2018-05-19  瀏覽:5

串口通信的基本認識

通信分為并行通信和串行通信,并行通信時的數據各個位同時傳送,可以實現字節(jié)為單位通信,但通信線多占用資源,成本高。以前用到的的P1=0x55,一次給P1口的8個管腳分別賦值,同時進行信號輸出,類似于8個車道可以過去8輛車,這樣的形式是并行的,一般稱P0,P1,P2,P3為51單片機的4組并行總線。

串行通信,就是一個車道,一個只能通過一輛車,如果一個0x55這樣一個字節(jié)的數據要傳輸過去的話,假如低位在前,高位在后的話,那發(fā)送方式是:0-1-0-1-0-1-0-1,一位一位的進行傳輸,要發(fā)送8次才能發(fā)送完一個字節(jié)

STC89C52有兩個引腳是專門用來做串口通信的,一個是P3.0(RXD),一個是P3.1(TXD),他們組成的通信接口就是串行接口,簡稱串口。用于兩個單片機進行UART通信。兩單片機通信接口連接方式:RXD——TXD,TXD——RXD。

單片機1的TXD發(fā)送通道接到單片機2的RXD接收通道,單片機的1的RXD接收通道接到單片機2的TXD發(fā)送通道,從而實現相互通信。

當單片機1想給單片機2發(fā)送數據,比如發(fā)送了0xCE,用二進制表示就是11001110,在串口通信過程中,是低位先發(fā),高位后發(fā)的原則,那么就是讓TXD首先拉低電平,持續(xù)一段時間,發(fā)送一位0,然后拉高電平,持續(xù)一段時間,發(fā)送一位1,繼續(xù)拉高,在持續(xù)一段時間,發(fā)送一位1,一直把8位二進制數11001110全部發(fā)送完畢,這里涉及到一個問題,就是持續(xù)的一個時間段時間“到底是多少”。因而便引入通信中非常重要的一個概念波特率,也叫做比特率。

波特率

波特率就是發(fā)送二進制數據位的速率,習慣用baud表示,即我們發(fā)送一位二進制數據持續(xù)的時間=1/baud。在通信之前,單片機1和單片機2首先都要明確約定好他們之間的通信波特率,必須保持一致,收發(fā)雙方才能正常通信。

約定好速度之后,我們還要考慮第二個問題,數據什么時候是起始,什么時候是結束?提前和延遲結束都會接收錯誤。在uart通信的時候,一個字節(jié)是8位,規(guī)定當沒有通信信號發(fā)生時,通信線路保持高電平,當數據發(fā)送前,先發(fā)一位0表示起始位,然后發(fā)送8位數據位,數據位是先低再高,數位位發(fā)送完后才呢個后再發(fā)送一位1表示停止位,這樣我們要發(fā)送的8位數據,實際上我們發(fā)送了10位,多出來兩位其中一個是起始位,一個是停止位。而接受方一直保持的高電平,一旦檢測到一位低電平,準備開始接受數據,接受8位數據后,然后檢測停止位,再準備下一個數據接收。

串口數據發(fā)送示意圖,實際上是一個時域示意圖,就是信號隨著時間變化的對應關系。比如在單片機的發(fā)送引腳上,左邊的是先發(fā)生的,右邊的是后發(fā)生的,數據位的切換時間就是波特率分之一秒,如果能夠理解時域的概念,后邊很多通信的時序圖就很容易理解了。

RS232

在我們電腦上,一般都會有一個9針的串行接口,這個串行接口叫做RS232接口,它和UART通信有關聯,但是由于現在筆記本電腦不帶9針串口,所以和單片機通信越來越趨于使用USB虛擬串口。

九針串口分工頭和母頭

公頭上5下4,上5從左到右為1.2.3.4.5;下4從左到右為6.7.8.9;

母頭上5下4,上5從左到右為5.4.3.2.1;下4從左到右為9.8.7.6;

RS232接口一共有9個引腳,分別定義是:1、載波檢測DCD;2、接收數據RXD;3、發(fā)送數據TXD;4、數據終端準備好DTR;5、信號地線SG;6、數據準備好DSR;7、請求發(fā)送RTS;8、清除發(fā)送CTS;9、振鈴提示RI。我們要讓這個串口和我們單片機進行通信,我們只需要關心其中的2腳RXD、3腳TXD和5腳GND即可。

雖然這三個引腳的名字和我們單片機上的串口名字一樣,但是卻不能直接和單片機對連通信,這是為什么呢?隨著我們了解的內容越來越多,我們得慢慢知道,不是所有的電路都是5V代表高電平而0V代表低電平的。對于RS232標準來說,它是個反邏輯,也叫做負邏輯。為何叫負邏輯?它的TXD和RXD的電壓,-3V~-15V電壓代表是1,+3~+15V電壓代表是0。低電平代表的是1,而高電平代表的是0,所以稱之為負邏輯。因此電腦的9針RS232串口是不能和單片機直接連接的,需要用一個電平轉換芯片MAX232來完成。

這個芯片就可以實現把標準RS232串口電平轉換成我們單片機能夠識別和承受的UART 0V/5V電平。從這里大家似乎慢慢有點明白了,其實RS232串口和UART串口,它們的協議類型是一樣的,只是電平標準不同而已,而MAX232這個芯片起到的就是中間人的作用,它把UART電平轉換成RS232電平,也把RS232電平轉換成UART電平,從而實現標準RS232接口和單片機UART之間的通信連接。

USB轉串口通信

隨著技術的發(fā)展,工業(yè)上還有RS232串口通信的大量使用,但是商業(yè)技術的應用上,已經慢慢的使用USB轉UART技術取代了RS232串口,絕大多數筆記本電腦已經沒有串口這個東西了,那我們要實現單片機和電腦之間的通信該怎么辦呢?

我們只需要在電路上添加一個USB轉串口芯片,就可以成功實現USB通信協議和標準UART串行通信協議的轉換,在我們的開發(fā)板上,我們使用的是CH340T這個芯片。

我們需要用跳線帽把中間和下邊的針短接在一起。右側的CH340T這個電路很簡單,把電源、晶振接好后,6腳和7腳的DP和DM分別接USB口的2個數據引腳上去,3腳和4腳通過跳線接到了我們單片機的TXD和RXD上去。

CH340T的電路里3腳位置加了個4148的二極管,是一個小技巧。因為STC89C52這個單片機下載程序時需要冷啟動,就是先點下載后上電,上電瞬間單片機會先檢測需要不需要下載程序。雖然單片機的VCC是由開關來控制,但是由于CH340T的3腳是輸出引腳,如果沒有此二極管,開關后級單片機在斷電的情況下,CH340T的3腳和單片機的P3.0(即RXD)引腳連在一起,有電流會通過這個引腳流入后級電路并且給后級的電容充電,造成后級有一定幅度的電壓,這個電壓值雖然只有兩三伏左右,但是可能會影響到正常的冷啟動。加了二極管后,一方面不影響通信,另外一個方面還可以消除這種不良影響。這個地方可以暫時作為了解,大家如果自己做這類電路,可以參考一下。

IO口模擬UART串口通信

UART串口波特率,常用的值是300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200等速率。IO口模擬UART串行通信程序是一個簡單的演示程序,我們使用串口調試助手下發(fā)一個數據,數據加1后,再自動返回。

串口調試助手,這里我們直接使用STC-ISP軟件自帶的串口調試助手,先把串口調試助手的使用給大家說一下,如圖11-6所示。第一步要選擇串口助手菜單,第二步選擇十六進制顯示,第三步選擇十六進制發(fā)送,第四步選擇COM口,這個COM口要和自己電腦設備管理器里的那個COM口一致,波特率按我們程序設定好的選擇,我們程序中讓一個數據位持續(xù)時間是1/9600秒,那這個地方選擇波特率就是選9600,校驗位選N,數據位8,停止位1。

串口調試助手的實質就是利用電腦上的UART通信接口,發(fā)送數據給我們的單片機,也可以把我們的單片機發(fā)送的數據接收到這個調試助手界面上。

因為初次接觸通信方面的技術,所以我把后面的IO模擬串口通信程序進行一下解釋,大家可以邊看我的解釋邊看程序,把底層原理先徹底弄懂。

變量定義部分就不用說了,直接看main主函數。首先是對通信的波特率的設定,在這里我們配置的波特率是9600,那么串口調試助手也得是9600。配置波特率的時候,我們用的是定時器T0的模式2。模式2中,不再是TH0代表高8位,TL0代表低8位了,而只有TL0在進行計數,當TL0溢出后,不僅僅會讓TF0變1,而且還會將TH0中的內容重新自動裝到TL0中。這樣有一個好處,就是我們可以把想要的定時器初值提前存在TH0中,當TL0溢出后,TH0自動把初值就重新送入TL0了,全自動的,不需要程序中再給TL0重新賦值了,配置方式很簡單,大家可以自己看下程序并且計算一下初值。

波特率設置好以后,打開中斷,然后等待接收串口調試助手下發(fā)的數據。接收數據的時候,首先要進行低電平檢測while (PIN_RXD),若沒有低電平則說明沒有數據,一旦檢測到低電平,就進入啟動接收函數StartRXD()。接收函數最開始啟動半個波特率周期,初學可能這里不是很明白。大家回頭看一下我們的圖11-2里邊的串口數據示意圖,如果在數據位電平變化的時候去讀取,因為時序上的誤差以及信號穩(wěn)定性的問題很容易讀錯數據,所以我們希望在信號最穩(wěn)定的時候去讀數據。除了信號變化的那個沿的位置外,其它位置都很穩(wěn)定,那么我們現在就約定在信號中間位置去讀取電平狀態(tài),這樣能夠保證我們讀的一定是正確的。

一旦讀到了起始信號,我們就把當前狀態(tài)設定成接收狀態(tài),并且打開定時器中斷,第一次是半個周期進入中斷后,對起始位進行二次判斷一下,確認一下起始位是低電平,而不是一個干擾信號。以后每經過1/9600秒進入一次中斷,并且把這個引腳的狀態(tài)讀到RxdBuf里邊。等待接收完畢之后,我們再把這個RxdBuf加1,再通過TXD引腳發(fā)送出去,同樣需要先發(fā)一位起始位,然后發(fā)8個數據位,再發(fā)結束位,發(fā)送完畢后,程序運行到while (PIN_RXD),等待第二輪信號接收的開始。

串口通信基本應用

通信的三種基本類型

常見的通信傳輸方式可以分為單工通信、半雙工通信、全雙工通信。

單工通信就是只允許一個方向向另外一個方向傳送信息,而另外一方不能回傳消息。比如:電視遙控器、收音基等

半雙工通信是指數據可以在雙方之間相互傳播,但是同一時刻只能呢個其中一方發(fā)給另一方,比如:對講機

全雙工通信是指發(fā)送數據同時也能接收數據,兩者同步進行,就如同我們的電話一樣,我們說的同時也可以聽到對方的聲音。

uart模塊介紹

IO口模擬串口通信,讓大家了解了串口通信的本質,但是我們的單片機程序卻需要不停的檢測掃描單片機IO口收到的數據,大量占用了單片機的運行時間。這時候就會有聰明人想了,其實我們并不是很關心通信的過程,我們只需要一個通信的結果,最終得到接收到的數據就行了。這樣我們可以在單片機內部做一個硬件模塊,讓它自動接收數據,接收完了,通知我們一下就可以了,我們的51單片機內部就存在這樣一個UART模塊,要正確使用它,當然還得先把對應的特殊功能寄存器配置好。

51單片機的UART串口的結構由串行口控制寄存器SCON、發(fā)送和接收電路三部分構成,先來了解一下串口控制寄存器SCON。

SCON串行控制器的位分配(地址:0x98)

位:符號:復位值: 0:RI:0;1:TI:0;2:RB8:0;3:TB8:0;4:REN:0;5:SM2:0;6:SM1:0;7:SM0:0;

0位RI:接收中斷標志位,當接收電路接收到停止位的中間位置時,RI由硬件置1,必須通過軟件清零

1位TI:發(fā)送中斷標志位,當發(fā)送電路發(fā)送到停止位的中間位置時,TI由硬件置1,必須通過軟件清零。

2位RB8:模式2和3中接收到的第9位數據(很少用),模式1用來接收停止位。

3位TB8:模式2和3中要發(fā)送的第9位數據(很少用)。

4位REN:使能串行接收。由軟件置位使能接收,軟件清零則禁止接收。

5位SM2:多機通信控制位(極少用),模式1直接清零。

6位SM1和7位SM0:

這兩位共同決定了串口通信的模式0~模式3共4種模式。我們最常用的就是模式1,也就是SM0=0,SM1=1,下邊我們重點就講模式1,其它模式從略。

對于串口的四種模式,模式1是最常用的,就是我們前邊提到的1位起始位,8位數據位和1位停止位。下面我們就詳細介紹模式1的工作細節(jié)和使用方法,至于其它3種模式與此也是大同小異,真正遇到需要使用的時候大家再去查閱相關資料就行了。

在我們使用IO口模擬串口通信的時候,串口的波特率是使用定時器T0的中斷體現出來的。在硬件串口模塊中,有一個專門的波特率發(fā)生器用來控制發(fā)送和接收數據的速度。對于STC89C52單片機來講,這個波特率發(fā)生器只能由定時器T1或定時器T2產生,而不能由定時器T0產生,這和我們模擬的通信是完全不同的概念。

如果用定時器2,需要配置額外的寄存器,默認是使用定時器1的,我們本章內容主要就使用定時器T1作為波特率發(fā)生器來講解,方式1下的波特率發(fā)生器必須使用定時器T1的模式2,也就是自動重裝載模式,定時器的重載值計算公式為:

TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率

和波特率有關的還有一個寄存器,是一個電源管理寄存器PCON,他的最高位可以把波特率提高一倍,也就是如果寫PCON |= 0x80以后,計算公式就成了:

TH1 = TL1 = 256 - 晶振值/12 /16 /波特率

公式中數字的含義這里解釋一下,256是8位定時器的溢出值,也就是TL1的溢出值,晶振值在我們的開發(fā)板上就是11059200,12是說1個機器周期等于12個時鐘周期,值得關注的是這個16,我們來重點說明。在IO口模擬串口通信接收數據的時候,采集的是這一位數據的中間位置,而實際上串口模塊比我們模擬的要復雜和精確一些。他采取的方式是把一位信號采集16次,其中第7、8、9次取出來,這三次中其中兩次如果是高電平,那么就認定這一位數據是1,如果兩次是低電平,那么就認定這一位是0,這樣一旦受到意外干擾讀錯一次數據,也依然可以保證最終數據的正確性。

串口通信的發(fā)送和接收電路在物理上有2個名字相同的SBUF寄存器,它們的地址也都是0x99,但是一個用來做發(fā)送緩沖,一個用來做接收緩沖。意思就是說,有2個房間,兩個房間的門牌號是一樣的,其中一個只出人不進人,另外一個只進人不出人,這樣的話,我們就可以實現UART的全雙工通信,相互之間不會產生干擾。但是在邏輯上呢,我們每次只操作SBUF,單片機會自動根據對它執(zhí)行的是“讀”還是“寫”操作來選擇是接收SBUF還是發(fā)送SBUF,后邊通過程序,我們就會徹底了解這個問題。

##UART串口程序

一般情況下,我們編寫串口通信程序的基本步驟如下所示:

1、配置串口為模式1。

2、配置定時器T1為模式2,即自動重裝模式。

3、根據波特率計算TH1和TL1的初值,如果有需要可以使用PCON進行波特率加倍。

4、打開定時器控制寄存器TR1,讓定時器跑起來。

這里還要特別注意一下,就是在使用T1做波特率發(fā)生器的時候,千萬不要再使能T1的中斷了。

我們先來看一下由IO口模擬串口通信直接改為使用硬件UART模塊時的程序代碼,看看程序是不是簡單了很多,因為大部分的工作硬件模塊都替我們做了。程序功能和IO口模擬的是完全一樣的。

通信實例與ASCLL碼

先拋開我們使用的漢字不談,那么我們常用的字符就包含了0~9的數字、A~Z/a~z的字母、還有各種標點符號等。那么在單片機系統里面我們怎么來表示它們呢?ASCII碼(American Standard Code for Information Interchange,即美國信息互換標準代碼)可以完成這個使命:我們知道,在單片機中一個字節(jié)的數據可以有0~255共256個值,我們取其中的0~127共128個值賦予了它另外一層涵義

我們用字符格式發(fā)送一個小寫的a,返回一個十六進制的0x61,數碼管上顯示的也是61,ASCII碼表里字符a對應十進制是97,等于十六進制的0x61;我們再用字符格式發(fā)送一個數字1,返回一個十六進制的0x31,數碼管上顯示的也是31,ASCII表里字符1對應的十進制是49,等于十六進制的0x31。這下大家就該清楚了:所謂的十六進制發(fā)送和十六進制接收,都是按字節(jié)數據的真實值進行的;而字符格式發(fā)送和字符格式接收,是按ASCII碼表中字符形式進行的,但它實際上最終傳輸的還是一個字節(jié)數據。這個表格,當然不需要大家去記住,理解它,用的時候過來查就行了。

編輯:admin  最后修改時間:2018-05-19

聯系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

田林县| 建宁县| 浮山县| 崇仁县| 子长县| 利辛县| 宝应县| 花莲市| 惠州市| 儋州市| 响水县| 甘孜| 临武县| 大安市| 平昌县| 德庆县| 凤冈县| 霸州市| 安康市| 翁源县| 墨玉县| 松原市| 涟水县| 绍兴县| 香河县| 阜城县| 桃园市| 新巴尔虎左旗| 靖州| 玉田县| 房产| 宁河县| 类乌齐县| 侯马市| 麻江县| 枣强县| 锦屏县| 金华市| 西宁市| 周宁县| 津南区|