0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UART串口通信的基本應(yīng)用

GReq_mcu168 ? 來源:玩轉(zhuǎn)單片機(jī) ? 2020-08-05 10:44 ? 次閱讀

通信的三種基本類型

常用的通信從傳輸方向上可以分為單工通信、半雙工通信、全雙工通信三類。

單工通信就是指只允許一方向另外一方傳送信息,而另一方不能回傳信息。比如電視遙控器、收音機(jī)廣播等,都是單工通信技術(shù)。

半雙工通信是指數(shù)據(jù)可以在雙方之間相互傳播,但是同一時(shí)刻只能其中一方發(fā)給另外一方,比如我們的對(duì)講機(jī)就是典型的半雙工。

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

UART 模塊介紹

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

51 單片機(jī)的 UART 串口的結(jié)構(gòu)由串行口控制寄存器 SCON、發(fā)送和接收電路三部分構(gòu)成,先來了解一下串口控制寄存器 SCON。如表 11-1 表 11-2 所示。

表 11-1 SCON——串行控制寄存器的位分配

表 11-2 SCON——串行控制寄存器的位描述

前邊學(xué)了那么多寄存器的配置,相信 SCON 這個(gè)地方,對(duì)于大多數(shù)同學(xué)來說已經(jīng)不是難點(diǎn)了,應(yīng)該能看懂并且可以自己配置了。對(duì)于串口的四種模式,模式 1 是最常用的,就是我們前邊提到的 1 位起始位,8 位數(shù)據(jù)位和 1 位停止位。下面我們就詳細(xì)介紹模式 1 的工作細(xì)節(jié)和使用方法,至于其它 3 種模式與此也是大同小異,真正遇到需要使用的時(shí)候大家再去查閱相關(guān)資料就行了。

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

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

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

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

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

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

了解了串口采集模式,在這里要給大家留一個(gè)思考題?!熬д裰?12/2/16/波特率”這個(gè)地方計(jì)算的時(shí)候,出現(xiàn)不能除盡,或者出現(xiàn)小數(shù)怎么辦,允許出現(xiàn)多大的偏差?把這部分理解了,也就理解了我們的晶振為何使用 11.0592M 了。

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

UART 串口程序

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

配置串口為模式 1。

配置定時(shí)器 T1 為模式 2,即自動(dòng)重裝模式。

根據(jù)波特率計(jì)算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 進(jìn)行波特率加倍。

打開定時(shí)器控制寄存器 TR1,讓定時(shí)器跑起來。

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

我們先來看一下由 IO 口模擬串口通信直接改為使用硬件 UART 模塊時(shí)的程序代碼,看看程序是不是簡(jiǎn)單了很多,因?yàn)榇蟛糠值墓ぷ饔布K都替我們做了。程序功能和 IO 口模擬的是完全一樣的。

#include 《reg52.h》

void ConfigUART(unsigned int baud);

void main(){

ConfigUART(9600); //配置波特率為 9600

while (1){

while (!RI); //等待接收完成

RI = 0; //清零接收中斷標(biāo)志位

SBUF = SBUF + 1; //接收到的數(shù)據(jù)+1 后,發(fā)送回去

while (!TI); //等待發(fā)送完成

TI = 0; //清零發(fā)送中斷標(biāo)志位

}

}

/* 串口配置函數(shù),baud-通信波特率 */

void ConfigUART(unsigned int baud){

SCON = 0x50; //配置串口為模式 1

TMOD &= 0x0F; //清零 T1 的控制位

TMOD |= 0x20; //配置 T1 為模式 2

TH1 = 256 - (11059200/12/32)/baud; //計(jì)算 T1 重載值

TL1 = TH1; //初值等于重載值

ET1 = 0; //禁止 T1 中斷

TR1 = 1; //啟動(dòng) T1

}

當(dāng)然了,這個(gè)程序還是用在主循環(huán)里等待接收中斷標(biāo)志位和發(fā)送中斷標(biāo)志位的方法來編寫的,而實(shí)際工程開發(fā)中,當(dāng)然就不能這么干了,我們也只是為了用直觀的對(duì)比來告訴同學(xué)們硬件模塊可以大大簡(jiǎn)化程序代碼,那么實(shí)際使用串口的時(shí)候就用到串口中斷了,來看一下用中斷實(shí)現(xiàn)的程序。請(qǐng)注意一點(diǎn),因?yàn)榻邮蘸桶l(fā)送觸發(fā)的是同一個(gè)串口中斷,所以在串口中斷函數(shù)中就必須先判斷是哪種中斷,然后再作出相應(yīng)的處理。

#include 《reg52.h》

void ConfigUART(unsigned int baud);

void main(){

EA = 1; //使能總中斷

ConfigUART(9600); //配置波特率為 9600

while (1);

}

/* 串口配置函數(shù),baud-通信波特率 */

void ConfigUART(unsigned int baud){

SCON = 0x50; //配置串口為模式 1

TMOD &= 0x0F; //清零 T1 的控制位

TMOD |= 0x20; //配置 T1 為模式 2

TH1 = 256 - (11059200/12/32)/baud; //計(jì)算 T1 重載值

TL1 = TH1; //初值等于重載值

ET1 = 0; //禁止 T1 中斷

ES = 1; //使能串口中斷

TR1 = 1; //啟動(dòng) T1

}

/* UART 中斷服務(wù)函數(shù) */

void InterruptUART() interrupt 4{

if (RI){ //接收到字節(jié)

RI = 0; //手動(dòng)清零接收中斷標(biāo)志位

SBUF = SBUF + 1; //接收的數(shù)據(jù)+1 后發(fā)回,左邊是發(fā)送 SBUF,右邊是接收 SBUF

}

if (TI){ //字節(jié)發(fā)送完畢

TI = 0; //手動(dòng)清零發(fā)送中斷標(biāo)志位

}

}

大家可以試驗(yàn)一下,看看是不是和前邊用 IO 口模擬通信實(shí)現(xiàn)的效果一致,而主循環(huán)卻 完全空出來了,我們就可以隨意添加其它功能代碼進(jìn)去。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120785
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1242

    瀏覽量

    101535
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1627

    瀏覽量

    55602

原文標(biāo)題:UART串口通信的基本應(yīng)用

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常見串口通信協(xié)議 如何設(shè)置串口參數(shù)

    串口通信是一種常見的通信方式,廣泛應(yīng)用于計(jì)算機(jī)、嵌入式系統(tǒng)和各種電子設(shè)備之間。串口通信協(xié)議主要是指在串行
    的頭像 發(fā)表于 12-27 09:51 ?481次閱讀

    【AG32開發(fā)板體驗(yàn)連載】AG32VF407 UART串口通信測(cè)試

    【AG32開發(fā)板體驗(yàn)連載】--智能蒸烤箱 AG32VF407 UART串口通信測(cè)試 由AG32VF407 MCU手冊(cè)可知, AG32VF407 MCU自帶的UART
    發(fā)表于 11-23 23:23

    串口通信協(xié)議解析 串口通信應(yīng)用實(shí)例

    串口通信協(xié)議解析 串口通信協(xié)議是指規(guī)定了數(shù)據(jù)包的內(nèi)容,內(nèi)容包含了起始位、主體數(shù)據(jù)、校驗(yàn)位及停止位,雙方需要約定一致的數(shù)據(jù)包格式才能正常收發(fā)數(shù)據(jù)的有關(guān)規(guī)范。以下是
    的頭像 發(fā)表于 11-21 17:03 ?611次閱讀

    串口屏如何與主控制器進(jìn)行通信

    一、串口通信基礎(chǔ) 串口通信是一種通過串行數(shù)據(jù)傳輸?shù)姆绞竭M(jìn)行通信的方法。在串口
    的頭像 發(fā)表于 11-20 09:32 ?244次閱讀
    <b class='flag-5'>串口</b>屏如何與主控制器進(jìn)行<b class='flag-5'>通信</b>?

    為什么通信要使用虛擬串口串口助手?

    串口助手和虛擬串口是什么?串口助手和虛擬串口串口通信中很常見。
    的頭像 發(fā)表于 11-15 01:04 ?1402次閱讀
    為什么<b class='flag-5'>通信</b>要使用虛擬<b class='flag-5'>串口</b>和<b class='flag-5'>串口</b>助手?

    通信技術(shù):UART串口通信開源代碼實(shí)操!

    今天我們分享的是關(guān)于UART串口通信示例,歡迎大家探討
    的頭像 發(fā)表于 11-05 11:56 ?3119次閱讀
    <b class='flag-5'>通信</b>技術(shù):<b class='flag-5'>UART</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>開源代碼實(shí)操!

    UART串口通信示例:開啟通信寶藏之門的定位模組LuatOS入門

    今天我們要講解的是UART串口通信示例,關(guān)于Air201資產(chǎn)定位模組LuatOS入門,我會(huì)從搭建環(huán)境、代碼燒錄、示例效果等來細(xì)說:
    的頭像 發(fā)表于 11-03 19:55 ?989次閱讀
    <b class='flag-5'>UART</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>示例:開啟<b class='flag-5'>通信</b>寶藏之門的定位模組LuatOS入門

    超級(jí)干貨!Air780E的串口通信分享

    ? 猛然發(fā)現(xiàn),Air780E的串口通信還沒分享,難怪已經(jīng)有小伙伴提出了要求! 那我們來講解低功耗4G模組 Air780E 的串口通信的基本用法,小伙伴們,學(xué)起來吧! 一、硬件準(zhǔn)備 ?
    的頭像 發(fā)表于 10-15 10:47 ?475次閱讀
    超級(jí)干貨!Air780E的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>分享

    uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

    UART(Universal Asynchronous Receiver/Transmitter)是一種廣泛使用的異步串行通信技術(shù),它允許兩臺(tái)設(shè)備之間進(jìn)行雙向數(shù)據(jù)傳輸。在UART通信
    的頭像 發(fā)表于 10-06 16:12 ?3310次閱讀
    <b class='flag-5'>uart</b>波特率和傳輸頻率的關(guān)系 <b class='flag-5'>UART</b><b class='flag-5'>串口</b>的常用波特率為多少

    了解藍(lán)牙模塊串口通訊基礎(chǔ)知識(shí)

    在物聯(lián)網(wǎng)時(shí)代,設(shè)備之間的無線通信變得越來越重要,藍(lán)牙串口UART(UniversalAsynchronousReceiver/Transmitter)是一種利用藍(lán)牙技術(shù)進(jìn)行無線通信的串
    的頭像 發(fā)表于 09-02 16:16 ?1834次閱讀
    了解藍(lán)牙模塊<b class='flag-5'>串口</b>通訊基礎(chǔ)知識(shí)

    STM32F411RE NUCLEO UART串口通信無法接收的原因?

    STM32F411RE NUCLEO UART串口通信無法接收
    發(fā)表于 04-03 08:02

    UART串口通信實(shí)驗(yàn)及工作原理

    UART通信過程需要設(shè)置波特率、數(shù)據(jù)長(zhǎng)度、開始/停止位等參數(shù)。波特率決定了發(fā)送數(shù)據(jù)的速度,而數(shù)據(jù)長(zhǎng)度和開始/停止位則用于確保數(shù)據(jù)的正確傳輸和接收。
    的頭像 發(fā)表于 03-21 17:10 ?4059次閱讀
    <b class='flag-5'>UART</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>實(shí)驗(yàn)及工作原理

    UART串口通信協(xié)議是什么?

    UART (Universal Asynchronous Receiver/Transmitter) 是一種通信接口協(xié)議,用于實(shí)現(xiàn)串口通信。它是一種簡(jiǎn)單的、可靠的、廣泛應(yīng)用的
    的頭像 發(fā)表于 03-19 17:26 ?1471次閱讀

    AWTK 開源串口屏開發(fā)(12) - 記事本應(yīng)

    記事本是一個(gè)常用的應(yīng)用程序,在AWTK串口屏中,內(nèi)置文件模型和文件選擇對(duì)話框,無需編寫一行傳統(tǒng)的代碼,即可實(shí)現(xiàn)一個(gè)簡(jiǎn)單的記事本應(yīng)用程序。記事本是一個(gè)很常用的應(yīng)用,用來編輯和查看文本文件非常方便。在
    的頭像 發(fā)表于 03-09 08:23 ?373次閱讀
    AWTK 開源<b class='flag-5'>串口</b>屏開發(fā)(12) - 記事<b class='flag-5'>本應(yīng)</b>用

    藍(lán)牙串口通訊總線——I2C/SPI/UART

    嵌入式工程師在做串口通信調(diào)試工作的時(shí)候,會(huì)經(jīng)常用到I2C、SPI、UART這3條總線,I2C、SPI、UART這三種通信總線在嵌入式領(lǐng)域很常
    的頭像 發(fā)表于 01-22 09:41 ?1735次閱讀
    藍(lán)牙<b class='flag-5'>串口</b>通訊總線——I2C/SPI/<b class='flag-5'>UART</b>