国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

單片機第一季:零基礎10——串口通信和RS485

這篇具有很好參考價值的文章主要介紹了單片機第一季:零基礎10——串口通信和RS485。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1,串口通訊基礎

1.1,同步和異步

1.2,并行和串行?

1.3,單工、半雙工與全雙工通信?

1.4,通信速率?

2,單片機串口通訊

2.1,接口標準?

2.2,通訊協議?

2.3,串口內部結構?

3,串口相關寄存器?

4,波特率計算?

5,串口初始化?

6,開發(fā)板硬件設計?

7,串口發(fā)送和接收程序

8,串口調試總結

9,RS485?



485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

1,串口通訊基礎

什么是通信:
(1)人和人之間的通信:說話、寫信、狼煙、手勢等;
(2)人和計算機之間的通信:按鍵、顯示器、鼠標、觸摸屏等;
(3)計算機和計算機之間的通信;

通信的關鍵:
(1)事先約定;
(2)基本信息單元;
(3)有效信息的編碼、傳輸和解碼?;

通信的專業(yè)性概念:
(1)同步和異步;
(2)單工、半雙工、全雙工;
(3)并行和串行;
(4)電平信號和差分信號?;

1.1,同步和異步

異步通信是指通信的發(fā)送與接收設備使用各自的時鐘控制數據的發(fā)送和接收過程。為使雙方的收發(fā)協調,要求發(fā)送和接收設備的時鐘盡可能一致。
異步通信是以字符(構成的幀)為單位進行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但每個字符中的各位是以固定的時間傳送的,即字符之間不一定有“位間隔”的整數倍的關系,但同一字符內的各位之間的距離均為“ 位間隔”的整數倍。如下圖所示:

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

異步通信的特點:不要求收發(fā)雙方時鐘的嚴格一致,實現容易,設備開銷較小,但每個字符要附加2~3 位用于起止位,各幀之間還有間隔,因此傳輸效率不高。?

同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。此時,傳輸數據的位之間的距離均為“位間隔”的整數倍,同時傳送的字符間不留間隙,即保持位同步關系,也保持字符同步關系。發(fā)送方對接收方的同步可以通過兩種方法實現。如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

1.2,并行和串行?

串行通訊:

串行通信是指使用一條數據線,將數據一位一位地依次傳輸,每一位數據占據一個固定的時間長度。其只需要少數幾條線就可以在系統(tǒng)間交換信息,特別適用于計算機與計算機、計算機與外設之間的遠距離通信。如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

串行通信的特點:傳輸線少,長距離傳送時成本低,且可以利用電話網等現成的設備,但數據的傳送控制比并行通信復雜。?

并行通訊:?

并行通信通常是將數據字節(jié)的各位用多條數據線同時進行傳送,通常是8位、16 位、32 位等數據一起傳輸。如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

并行通信的特點:控制簡單、傳輸速度快;由于傳輸線較多,長距離傳送時成本高且接收方的各位同時接收存在困難,抗干擾能力差。

串口通信基礎:
(1)一種特定的通信協議;
(2)也叫串行通信、串口通信、UART、USART;
(3)異步、串行、全雙工;

1.3,單工、半雙工與全雙工通信?

單工是指數據傳輸僅能沿一個方向,不能實現反向傳輸。如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

半雙工是指數據傳輸可以沿兩個方向,但需要分時進行。如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

全雙工是指數據可以同時進行雙向傳輸。如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

串行通信的主要用途:
(1)早期:計算機之間短距離通信(15米),完備通信機制
(2)現在:CPU之間近距離通信、調試信息輸入輸出,非完備通信?

串行通信的工作方式:
(1)3根線(GND、RxD、TxD)或者9根線;
(2)發(fā)送方有發(fā)送移位寄存器,接收方有接收移位寄存器;
(3)數據在發(fā)送方和接收方的CPU中都以字節(jié)為單位整字節(jié)處理;
(4)數據在通信線上以位為單位逐個bit的傳輸;?

串行通信的主要概念:
(1)起始位、數據位、奇偶校驗位、停止位(幀),一幀數據里各位的定義,例如數據位有幾位;
(2)波特率:一秒鐘傳輸多少個bit位,發(fā)送方和接收方必須波特率設置為一樣,例如9600代表1秒鐘發(fā)送了9600各bit位;
(3)流控:速率協商,現在一般都要禁用掉?;

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

串口調試助手的串口設置里有對應的波特率,數據位長度,停止位長度的選擇,RTS和DTR代表表速率協商的流控選擇,不勾選。?

1.4,通信速率?

衡量通信性能的一個非常重要的參數就是通信速率,通常以比特率(Bitrate)來表示。比特率是每秒鐘傳輸二進制代碼的位數,單位是:位/秒( bps)。如每秒鐘傳送240 個字符,而每個字符格式包含10 位(1 個起始位、1 個停止位、8 個數據位),這時的比特率為:10 位×240 個/秒= 2400 bps?。

在后面會遇到一個“波特率”的概念,它表示每秒鐘傳輸了多少個碼元。而碼元是通信信號調制的概念,通信中常用時間間隔相同的符號來表示一個二進制數字,這樣的信號稱為碼元。如常見的通信傳輸中,用0V 表示數字0,5V 表示數字1,那么一個碼元可以表示兩種狀態(tài)0 和1,所以一個碼元等于一個二進制比特位,此時波特率的大小與比特率一致;如果在通信傳輸中,有0V、2V、4V 以及6V 分別表示二進制數00、01、10、11,那么每個碼元可以表示四種狀態(tài),即兩個二進制比特位,所以碼元數是二進制比特位數的一半,這個時候的波特率為比特率的一半。由于很多常見的通信中一個碼元都是表示兩種狀態(tài),所以我們常常直接以波特率來表示比特率。?

先搞清楚以下問題:
(1)串行通信功能是SoC的一個(內部)外設提供的,與CPU本身無關;
(2)各種不同SoC的串行通信大同小異;
(3)串行通信經常作為主控SoC與其他外部芯片之間的通信接口;

2,單片機串口通訊

2.1,接口標準?

串口通信(Serial Communication),是指外設和計算機間通過數據信號線、地線等按位進行傳輸數據的一種通信方式,屬于串行通信方式。串口是一種接口標準,它規(guī)定了接口的電氣標準,沒有規(guī)定接口插件電纜以及使用的協議。?

串口通信的接口標準有很多,有RS-232C、RS-232、RS-422A、RS-485 等。常用的是RS-232 和RS-485。RS-232 其實是RS-232C 的改進,原理是一樣的。這里我們就以RS-232C 接口進行解。

RS-232C 是EIA(美國電子工業(yè)協會)1969 年修訂RS-232C 標準。RS-232C定義了數據終端設備(DTE)與數據通信設備(DCE)之間的物理接口標準。RS-232C 接口規(guī)定使用25 針連接器,簡稱DB25,連接器的尺寸及每個插針的排列位置都有明確的定義,如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

RS-232C 還有一種9 針的非標準連接器接口,簡稱DB9。串口通信使用的大多都是DB9 接口。DB25 和DB9 接頭有公頭和母頭之分,其中帶針狀的接頭是公頭,而帶孔狀的接頭是母頭。9 針串口線的外觀圖如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

從上圖中可以看到公頭和母頭的管腳定義順序是不一樣,這一點需要特別注意。這些管腳都有什么作用呢? 9 針串口和25 針串口常用管腳的功能說明如下圖所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

在串口通信中,通常我們只使用2、3、5 三個管腳,即TXD、RXD、SGND,其他管腳功能大家看不明白也沒關系。
RS-232C 對邏輯電平也做了規(guī)定,如下:
在TXD 和RXD 數據線上:
1.邏輯1 為-3~-15V 的電壓 ;2.邏輯0 為3~15V 的電壓
在RTS、CTS、DSR、DTR 和DCD 等控制線上:
1.信號有效( ON 狀態(tài)) 為3~15V 的電壓
2.信號無效( OFF 狀態(tài)) 為-3~-15V 的電壓

由此可見,RS-232C 是用正負電壓來表示邏輯狀態(tài),與晶體管-晶體管邏輯集成電路(TTL)以高低電平表示邏輯狀態(tài)的規(guī)定正好相反。而我們51 單片機使用的就是TTL 電平,所以要實現51 單片機與計算機的串口通信,需要進行TTL與RS-232C 電平轉換,通常使用的電平轉換芯片是MAX232。?

在串口通信中通常PC 機的DB9 為公頭,單片機上使用的串口DB9 為母頭,通過一根直通串口線進行相連。在9 針串口線實物圖即為直通型串口線,串口線(COM)母頭連接計算機DB9 的公頭,串口線公頭連接單片機上使用的DB9 母頭,這樣就是將2、3、5 管腳直接相連。如果你要實現兩臺計算機串口通信,那么就需要一根交叉串口線,將2 對3、3 對2、5 對5 連接,交叉串口線一般兩頭都是母頭。?

串口通信中還需要注意的是,串口數據收發(fā)線要交叉連接,計算機的TXD要對應單片機的RXD,計算機的RXD 要對應單片機的TXD,并且共GND,如下圖:?

有的朋友就會問了,在計算機與單片機進行串口通信時,使用的不是直通線嗎,這時候怎么讓TXD 與RXD 交叉連接?前面我們說了單片機處理的是TTL電平,需要使用RS232 電平轉換芯片,將RS232 電平轉換芯片串行數據輸出管腳交叉連接在DB9 母頭上即可,本章后面硬件設計部分會介紹。?

2.2,通訊協議?

RS232 的通信協議比較簡單,通常遵循96-N-8-1 格式。
“96”表示的是通信波特率為9600。串口通信中通常使用的是異步串口通信,即沒有時鐘線,所以兩個設備要通信,必須要保持一致的波特率,當然,波特率常用值還有4800、115200 等。

“N”表示的是無校驗位,由于串口通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、0 校驗(space)、1 校驗(mark)以及無校驗(noparity)。具體的介紹,大家可以百度串口通信了解。?

“8”表示的是數據位數為8 位,其數據格式在前面介紹異步通信中已講過。當然數據位數還可以為5、6、7 位長度。?

“1”表示的是1 位停止位,串口通訊的一個數據包從起始信號開始,直到停止信號結束。數據包的起始信號由一個邏輯0 的數據位表示,而數據包的停止信號可由0.5、1、1.5 或2 個邏輯1 的數據位表示,只要雙方約定一致即可。?

2.3,串口內部結構?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

上圖中右邊的TXD 和RXD 為單片機IO 口,TXD 對應的是P3.1 管腳,RXD 對應的是P3.0 管腳。其內部工作方式在后面小節(jié)會介紹。?

3,串口相關寄存器?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

實際串口例程中用的寄存器包括SCON/SBUF/PCON/IE的部分bit位,SCON中使用SM0和SM1選擇工作方式,REN代表是否允許串口接收,實際例程是要接收上位機的數據所以要允許唇口接收,TI代表串口發(fā)送中斷標志位,表示一幀數據是否發(fā)送完成,RI代表接收數據的中斷標志位,TI/RI由硬件置位,由軟件復位;

SBUF代表發(fā)送接收數據的寄存器;

PCON是使用到SMOD和SMOD0,SMOD代表波特率是否加倍,SMOD0的設置會影響到SCON的SM0/FE;

IE使用到EA/ES/ET1;?

串口控制寄存器SCON:

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

SM0 和SM1 為工作方式選擇位:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

注意:溢出率使用的是定時器1的溢出率。

方式2和方式3中的9位UART的意思是發(fā)送的一幀數據中有9位數據位,一般使用方式1,數據位是8位。?

SM2:多機通信控制位,主要用于方式2 和方式3。當SM2=1 時可以利用收到的RB8 來控制是否激活RI(RB8=0 時不激活RI,收到的信息丟棄;RB8=1 時收到的數據進入SBUF,并激活RI,進而在中斷服務中將數據從SBUF 讀走)。當SM2=0 時,不論收到的RB8 為0 和1,均可以使收到的數據進入SBUF,并激活RI(即此時RB8 不具有控制RI 激活的功能)。通過控制SM2,可以實現多機通信。?

REN:允許串行接收位。由軟件置REN=1,則啟動串行口接收數據;若軟件置REN=0,則禁止接收。?

TB8:在方式2 或方式3 中,是發(fā)送數據的第9 位,可以用軟件規(guī)定其作用??梢杂米鲾祿钠媾夹r炍?,或在多機通信中,作為地址幀/數據幀的標志位。在方式0 和方式1 中,該位未用到。?

RB8:在方式2 或方式3 中,是接收到數據的第9 位,作為奇偶校驗位或地址幀/數據幀的標志位。在方式1 時,若SM2=0,則RB8 是接收到的停止位。

TI:發(fā)送中斷標志位。在方式0 時,當串行發(fā)送第8 位數據結束時,或在其它方式,串行發(fā)送停止位的開始時,由內部硬件使TI 置1,向CPU 發(fā)中斷申請。在中斷服務程序中,必須用軟件將其清0,取消此中斷申請。 代表是否將數據發(fā)送完成。

RI:接收中斷標志位。在方式0 時,當串行接收第8 位數據結束時,或在其它方式,串行接收停止位的中間時,由內部硬件使RI 置1,向CPU 發(fā)中斷申請。也必須在中斷服務程序中,用軟件將其清0,取消此中斷申請。?

使用中斷方式來發(fā)送/接收數據非常合適,提升CPU使用率,會使用到TI/RI標志位(TI/RI標志位代表硬件是否將數據發(fā)送/接收完成,發(fā)送/接收完成硬件將TI/RI標志位置1,需要使用軟件復位為0)。會使用串行口允許中斷ES。

電源控制寄存器PCON:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

SMOD:波特率倍增位。在串口方式1、方式2、方式3 時,波特率與SMOD 有關,當SMOD=1 時,波特率提高一倍。復位時,SMOD=0。?

波特率加倍主要目的是如果要達到一個很高的波特率,當前計算不能滿足,就需要用到波特率加倍。

中斷允許寄存器:

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

會用到串行口中斷允許位ES(用于發(fā)送/接收數據),以及定時器中斷(用于波特率計算)。

4,波特率計算?

以方式1為例,計算波特率:

方式1 的波特率=(2SMOD/32)·(T1 溢出率) ,其中T1 溢出率= fosc /{12×[256 -(TH1)]}。

可以使用小工具51波特率計算自動生成波特率 :

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

選擇定時器工作方式,輸入開發(fā)板上使用的晶振頻率大小,選擇所要使用的波特率,SMOD 為是否倍頻,這個在前面介紹寄存器時說過,下面的誤差大小可以反映出通信時是否出現亂碼。在使用串口通信時,定時器1 工作方式為2,串口工作方式為1,以開發(fā)板晶振是11.0592Mh 為例,假如晶振頻率是12M,那么在生成的波特率就會有誤差而導致通信出錯。為什么替換可以從誤差值反映出來。在本章實驗中波特率選擇9600,使用SMOD,即值為1,點擊確定后即會自動生成定時/計數器THx 的值。如下所示:

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

從上圖可知,使用11.0592M 晶振時,誤差為0。我們對比下當外部晶振使用12Mh 時,波特率誤差多大,如下所示:?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

從上圖可知,當使用12M 晶振時,波特率誤差有6.98%,是比較大的,會導致在通信過程中出現亂碼等錯誤信息。這是我們不希望看到的,所以再次說明下,在做串口通信實驗時,一定要確認外部晶振是否是11.0592M。?

5,串口初始化?

①確定T1 的工作方式(TMOD 寄存器);
②確定串口工作方式(SCON 寄存器);
③計算T1 的初值(設定波特率),裝載TH1、TL1;
④啟動T1(TCON 中的TR1 位);
⑤如果使用中斷,需開啟串口中斷控制位(IE 寄存器)。?

例如:設置串口為工作方式1、波特率為9600、波特率加倍、使用中斷。其配置程序如下:?

#include <reg51.h>

void uart_ini()
{
   TMOD = 0x20;   //定時器1,工作方式2
   TH1 = 0xFA;	 //設置波特率9600
   TL1 = 0xFA;

   SCON = 0x50;	 //工作方式1,允許串行接收
   PCON = 0x80;	 //波特率加倍

   EA = 1;	  //總中斷
   ES = 1;	  //串口中斷
   TR1 = 1;	 //定時器1工作,但不會使用定時器1的中斷

}

思考:為什么要將定時器1的TR1置1??

6,開發(fā)板硬件設計?

開發(fā)板上板載一個USB 轉TTL 模塊和一個RS232 模塊,這兩個模塊都可進行串口通信。其硬件電路如下所示:

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

從上圖中可以看出,通過CH340 芯片把51 單片機的串口與PC 機的USB 口進行連接,不僅可以實現程序的燒入,還可實現串口通信功能。根據前面介紹,串口通信需將數據收發(fā)管腳交叉連接,所以可以看到在CH340 芯片的2 和3 腳已做處理。電路中其他部分是自動下載電路部分,目的是控制單片機的電源,無需冷啟動。使用USB 轉串口芯片,免去了一根串口線,使用普通USB 數據線(支持安卓手機數據線)就可以進行串口通信。?

從上圖中可以看到CH340 的2、3 腳串口并非直接連接到單片機串口,而是連接在J39 和J44 端子上,這樣就把CH340 的串口與單片機串口獨立出來,為什么不直接連接而要使用這個J39 和J44 端子呢?這是方便用戶可以使用開發(fā)板上的USB 轉TTL 模塊(也就是CH340 轉串口模塊)做一些串口類模塊的調試,比如:WIFI、藍牙、GPS、GPRS 等,直接利用PC 上位機來調試模塊。同時也方便用戶使用板載USB 轉TTL 模塊給其它類型單片機下載程序。?

如果使用黃色跳線帽將J39 和J44 端子的2、3 短接,那么CH340 串口與單片機串口是連接一起的,此時即可實現程序的下載或串口通信。?

7,串口發(fā)送和接收程序

/**********************************************************************************
****
實驗名稱:串口通信實驗
接線說明:
實驗現象:下載程序后,當串口助手發(fā)送數據給單片機,單片機原封不動轉發(fā)給串口助手顯示
注意事項:使用黃色跳線帽將CH340 旁的J39 端子的UTX 和P30 短接,URX 和P31 短接,出廠默
認已短接好
***********************************************************************************

****/
#include "reg52.h"
typedef unsigned int u16;//對系統(tǒng)默認數據類型進行重定義
typedef unsigned char u8;
/*******************************************************************************
* 函數名: uart_init
* 函數功能: 串口通信中斷配置函數,通過設置TH 和TL 即可確定定時時間
* 輸入: baud:波特率對應的TH、TL 裝載值
* 輸出: 無
*******************************************************************************/
void uart_init(u8 baud)
{
	TMOD|=0X20; //設置計數器工作方式2
	SCON=0X50; //設置為工作方式1
	PCON=0X80; //波特率加倍
	TH1=baud; //計數器初始值設置
	TL1=baud;
	ES=1; //打開接收中斷
	EA=1; //打開總中斷
	TR1=1; //打開計數器
}
/*******************************************************************************
* 函數名: main
* 函數功能: 主函數
* 輸入: 無
* 輸出: 無
*******************************************************************************/
void main()
{
	uart_init(0XFA);//波特率為9600
	while(1)
	{
	}
}
void uart() interrupt 4 //串口通信中斷函數
{
	u8 rec_data;
	RI = 0; //清除接收中斷標志位
	rec_data=SBUF; //存儲接收到的數據
	SBUF=rec_data; //將接收到的數據放入到發(fā)送寄存器
	while(!TI); //等待發(fā)送數據完成
	TI=0; //清除發(fā)送完成標志位
}

注意:要將晶振更換為11.0592MHz的,如果使用12MHz的收到的是亂碼。

思考:當通過串口調試助手將一個字符串發(fā)給單片機后,?串口調試助手也會收到這個字符串,在串口調試助手中收到這個字符串時是很快速的就會顯示的,如果在程序中將每次發(fā)送數據時延遲一段時間,串口調試助手會有怎樣的顯示?

實驗代碼比較簡單,首先定義了串口通信中斷配置函數uart_init,該函數有一個入口參數baud,該值可改變通信波特率。該函數的實現即是按照前面介紹的串口配置步驟。

最后進入while 循環(huán),在循環(huán)體內不執(zhí)行任何功能程序。如果發(fā)生接收中斷,即會進入串口中斷執(zhí)行,在中斷程序內將接收中斷標志位RI置0,讀取接收寄存器內的數據,并將讀取的數據發(fā)給發(fā)送寄存器,直到發(fā)送完畢,硬件將發(fā)送完成中斷標志位TI置1后,通過軟件再將TI置0,執(zhí)行完后回到主函數內繼續(xù)運行,如此循環(huán)。?

485通訊晶振選用多少hz,單片機,單片機,嵌入式硬件

上面的程序中,是通過串口調試助手給單片機發(fā)送數據后觸發(fā)了中斷執(zhí)行函數,中斷執(zhí)行函數內從SBUF讀取接收到的數據,然后在通過SBUF從單片機發(fā)送出去給串口調試助手,也就是發(fā)送的數據借用這個串口中斷執(zhí)行函數來發(fā)送的。

思考:如何通過中斷實現發(fā)送數據?

思考程序:1,發(fā)送一個字符串;2,串口助手發(fā)送數據給單片機,單片機原封不動再發(fā)給串口助手。?

還有一種類似串口調試助手的軟件SecureCRT也可實現收發(fā)數據。

串口實際調試中,直接發(fā)送一個字符串時,發(fā)現往字符串發(fā)送函數中不能直接傳入一個字符串,需要將指向字符串的指針傳入,也就是以下形式:

unsigned char *str = "abcdef";


void uart_send_string(unsigned char *str)
{
	while (*str != '\0')
	{
		uart_send_byte(*str);		// 發(fā)送1個字符
		str++;						// 指針指向下一個字符
	}
}

uart_send_string(str);

以下代碼為PC發(fā)送數據給單片機,然后通過串口調試助手回讀數據:

#include "reg51.h"
typedef unsigned int u16;//對系統(tǒng)默認數據類型進行重定義
typedef unsigned char u8;



void uart_send_byte(unsigned char c);
void delay(void);
void uart_send_string(unsigned char *str);

void uart_init(u8 baud)
{
TMOD|=0X20; //設置計數器工作方式2
SCON=0X50; //設置為工作方式1
PCON=0X80; //波特率加倍
TH1=baud; //計數器初始值設置
TL1=baud;
ES=1; //打開接收中斷
EA=1; //打開總中斷
TR1=1; //打開計數器
}

void main()
{
	unsigned char *str = "劉海龍";
	uart_init(0XFA);//波特率為9600

//	while(1)
//	{
//	   //send_byte('A');
//	   //uart_send_byte('B');
//	   uart_send_string(str);
//	   uart_send_byte('\n');
//	   delay();
//	}



while(1);


}

void uart_send_byte(unsigned char c)
{
   // 第1步,發(fā)送一個字節(jié)
   SBUF = c;

   // 第2步,先確認串口發(fā)送部分沒有在忙
   while (!TI);

   // 第3步,軟件復位TI標志位
   TI = 0;
}

void uart_send_string(unsigned char *str)
{
	while (*str != '\0')
	{
		uart_send_byte(*str);		// 發(fā)送1個字符
		str++;						// 指針指向下一個字符
	}
}


void delay(void)
{
	unsigned char i, j;

	for (i=0; i<200; i++)
		for (j=0; j<200; j++);
}

void uart_rec() interrupt  4
{
   unsigned char tmp;

   if(RI)
   {
   		tmp = SBUF;
		RI = 0;
   }
  uart_send_byte(tmp);
}

注意:中斷函數中需要通過軟件將RI置0,另外在中斷函數內使用字節(jié)發(fā)送函數uart_send_byte()?發(fā)送數據,不使用那個字符串發(fā)送函數。

8,串口調試總結

串口編程主要以下幾步:

第一步:找到相關寄存器;

第二部:模式選擇,波特率設定以及對應定時器設定,打開串口中斷;

第三步:單片機發(fā)出數據可以使用問詢方式輸出,也可使用中斷方式輸出,單片機接收數據只能通過中斷方式接收;

第四步:如果需要使用中斷,需要設定串口對應的中斷函數,在中斷函數中接收數據以及發(fā)送數據。

9,RS485?

待完善。?文章來源地址http://www.zghlxwxcb.cn/news/detail-764786.html

到了這里,關于單片機第一季:零基礎10——串口通信和RS485的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 單片機第一季:零基礎13——AD和DA轉換

    單片機第一季:零基礎13——AD和DA轉換

    51 單片機系統(tǒng)內部運算時用的全部是數字量,即0 和1,因此對單片機系統(tǒng)而言,無法直接操作模擬量,必須將模擬量轉換成數字量。所謂數字量,就是用一系列0 和1 組成的二進制代碼表示某個信號大小的量。用數字量表示同一個模擬量時,數字位數可以多也可以少,位數越多

    2024年02月13日
    瀏覽(23)
  • 單片機第一季:零基礎6——定時器和計時器

    單片機第一季:零基礎6——定時器和計時器

    目錄 1,單片機定時器原理 2,51單片機定時器/計數器結構 3,定時器配置? 4,示例代碼-通過定時器控制LED燈間隔1s閃爍? 51 單片機有兩組定時器/計數器,因為既可以定時,又可以計數,故稱之為定時器/計數器。 定時器/計數器和單片機的CPU 是相互獨立的。定時器/計數器工作

    2024年02月15日
    瀏覽(20)
  • 單片機第一季:零基礎9——直流電機和步進電機

    單片機第一季:零基礎9——直流電機和步進電機

    目錄 1,直流電機 2,步進電機? 直流電機是指能將直流電能轉換成機械能(直流電動機)或將機械能轉換成直流電能(直流發(fā)電機)的旋轉電機。它是能實現直流電能和機械能互相轉換的電機。當它作電動機運行時是直流電動機,將電能轉換為機械能;作發(fā)電機運行時是直流

    2024年02月16日
    瀏覽(29)
  • 單片機第一季:零基礎12——I2C和EEPROM

    單片機第一季:零基礎12——I2C和EEPROM

    目錄 1,EEPROM 2,I2C? 2.1,I2C物理層? 2.2,I2C協議層? 3,AT24C02介紹? 4,代碼? 為什么需要EEPROM? 單片機內部的ROM只能在程序下載時進行擦除和改寫,但是程序運行本身是不能改寫的。單片機內部的RAM中的數據程序運行時可以改,但是掉電就丟失了。有時候我們有一些數據要

    2024年02月14日
    瀏覽(29)
  • 藍橋杯模塊學習10——串口通信(深夜學習——單片機)

    藍橋杯模塊學習10——串口通信(深夜學習——單片機)

    51單片機——串口通信詳解(STC89C51為例)_佛科院深夜學習的博客-CSDN博客 (1)波特率與SMOD無關 (2)波特率等于溢出率除4 (1)T2R:控制定時器2是否允許使用,置“1”為允許 (2)T2_C/T:控制定時器2用作定時器還是計數器,置“0”為定時器(默認) (3)T2X12:控制定時器

    2023年04月08日
    瀏覽(30)
  • 學習筆記|串口通信的基礎知識|同步/異步|RS232|常見的串口軟件的參數|STC32G單片機視頻開發(fā)教程(沖哥)|第二十集:串口通信基礎

    學習筆記|串口通信的基礎知識|同步/異步|RS232|常見的串口軟件的參數|STC32G單片機視頻開發(fā)教程(沖哥)|第二十集:串口通信基礎

    百度百科:串口通信的概念 什么是通信? 例如U盤和電腦,我們電腦需要往U盤存東西,而U盤上只有四個觸點,除去一個電源一個地,只剩下兩個引腳了。此時我們坑定不能像點亮LED那樣單純的給他兩個引腳上輸出個高低電平就能寫數據了對吧??偛恢劣谳敵鲆粋€高電平就能

    2024年02月07日
    瀏覽(100)
  • 51單片機串口通信

    51單片機串口通信

    串口通信(serial communication)是指外設和計算機間通過數據信號線、地線等按位進行傳輸數據的一種通信方式,屬于串行通信方式。 接口標準:常用RS-232和RS-485 RS-232C有一種9針的非標準連接器口,簡稱DB9。串口通信使用的大多都是DB9接口。在串口通信中,通常我們只使用2、

    2024年02月05日
    瀏覽(26)
  • 51單片機-串口通信

    51單片機-串口通信

    目錄 1.什么是通信 1.1.通信的概念 1.2.傳送方式 1.3.同步方式 1.4.傳送方向 1.5.校驗方式 2.單片機串口介紹 2.1.硬件電路 2.2.電平標準 2.3.常見接口 2.4.內部結構 2.5.相關寄存器 2.6.工作模式(模式1) 2.7.如何配置串口中斷 3.實際應用 3.1.單片機向電腦發(fā)送數據 3.2.電腦向單片機發(fā)送

    2024年02月01日
    瀏覽(24)
  • 單片機的串口通信

    單片機的串口通信

    ? ? ? ? 今天,完整地總結一下普中科技的單片機的串口通信的硬件與編程,記錄一下以后如果需要也比較方便撿起來。 ? ? ? ? 單片機的串口部分的電路圖。開發(fā)板上集成了 1 個串口通信電路,是 USB 轉串口模塊,它既可下載程序也可實現串口通信功能。 ????????對這

    2024年02月11日
    瀏覽(19)
  • 單片機串口通信程序

    本文總結了兩種比較簡單的關于串口發(fā)送接收的程序,以下是步驟: 定義數據: 首先要串口初始化:(以9600波特率為例) 串口中斷:? 在定時器0掃描里加入,或者主函數while(1)里加入: (其中++URX_tt=(1000/波特率),數要接近,否則會有小小干擾。) 接下來關于串口通信

    2024年02月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包