国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來(lái)到深圳市穎特新科技有限公司!
語(yǔ)言
當(dāng)前位置:首頁(yè) >> 技術(shù)中心 >> 單片機(jī)入門(mén) >> UART串口通信的基本應(yīng)用

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

關(guān)鍵字:單片機(jī)通訊 作者:admin 來(lái)源:不詳 發(fā)布時(shí)間:2018-05-08  瀏覽:8

1、通信的三種基本類(lèi)型

我們常用的通信通?梢苑譃閱喂ぁ腚p工、全雙工通信。

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

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

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

2、UART模塊介紹

IO口模擬串口通信,大家了解了串口通信的實(shí)質(zhì),但是我們的單片機(jī)程序卻需要不停的檢測(cè)掃描單片機(jī)IO口收到的數(shù)據(jù),大量占用了CPU資源。這時(shí)候就會(huì)有聰明人想了,其實(shí)我們不是很關(guān)心通信的過(guò)程,我們只需要一個(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)成,先來(lái)了解一下串口控制寄存器SCON。

表1 SCON--串行控制寄存器的位分配(地址:98H)

可位尋址;復(fù)位值:0x00;復(fù)位源:任何復(fù)位

7

6

5

4

3

2

1

0

符號(hào)

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

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

符號(hào)

描述

7

SM0

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

6

SM1

5

SM2

多機(jī)通信控制位(很少用),模式1直接清零。

4

REN

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

3

TB8

模式2和3中將要發(fā)送的第9位數(shù)據(jù)(很少用)

2

RB8

模式2和3中接收第9位數(shù)據(jù)(很少用),模式1用來(lái)接收停止位

1

TI

發(fā)送中斷標(biāo)志位,模式1下,在數(shù)據(jù)位最后一位發(fā)送結(jié)束,開(kāi)始發(fā)送停止位時(shí)由硬件自動(dòng)置1,必須通過(guò)軟件清零。也就是說(shuō),再發(fā)送前我們清零TI,發(fā)送數(shù)據(jù),數(shù)據(jù)發(fā)送到停止位時(shí),TI硬件置1,方便我們CPU查詢(xún)發(fā)送完畢狀態(tài)。

0

RI

接收中斷標(biāo)志位,當(dāng)接收電路接收到停止位的中間位置時(shí),RI由硬件置1。也就是說(shuō),接收數(shù)據(jù)之前我們必須清零RI,接受數(shù)據(jù)到停止位的中間位置時(shí),RI硬件置1,方便我們CPU查詢(xún)到接收狀態(tài)。

前邊學(xué)了那么多寄存器的配置,相信SCON這個(gè)地方,對(duì)于大多數(shù)同學(xué)來(lái)說(shuō)已經(jīng)不是難點(diǎn)了,應(yīng)該能看懂并且可以自己配置了。對(duì)于串口的四種模式,模式1是最常用的,就是我們前邊提到的1位起始位,8位數(shù)據(jù)位和1位結(jié)束位。因?yàn)槲覀兊慕坛滩煌诮炭茣?shū),只要有的功能都一一介紹,我們只介紹實(shí)用的技術(shù),所以其他3種模式,真正遇到需要使用的時(shí)候大家再去查資料就行。

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

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

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

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

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

數(shù)字的含義這里解釋一下,256是8位數(shù)據(jù)的溢出值,也就是TL1的溢出值,11059200就是我們板子上單片機(jī)的晶振,12是說(shuō)1個(gè)機(jī)器周期是12個(gè)時(shí)鐘周期,值得關(guān)注的是這個(gè)16,重點(diǎn)說(shuō)明。我們?cè)贗O口模擬串口通信接收數(shù)據(jù)的時(shí)候,我們采集的是這一位數(shù)據(jù)的中間位置,而實(shí)際上串口模塊比我們模擬的要復(fù)雜和精確一些。他采取的方式是把一位信號(hào)采集16次,其中第7、8、9次取出來(lái),這三次中其中兩次如果是高電平,那么就認(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ā)送和接收電路,我們主要了解一下他們?cè)谖锢砩嫌?個(gè)名字相同的SBUF寄存器,他們的地址也都是99H,但是一個(gè)用來(lái)做發(fā)送緩沖,一個(gè)用來(lái)做接收緩沖。意思就是說(shuō),有2個(gè)房間,兩個(gè)房間的門(mén)牌號(hào)是一樣的,其中一個(gè)只出人不進(jìn)人,另外一個(gè)只進(jìn)人不出人,這樣的話(huà),我們就可以實(shí)現(xiàn)UART的全雙工通信,相互之間不會(huì)產(chǎn)生干擾。但是在邏輯上呢,我們每次只操作SBUF,單片機(jī)會(huì)自動(dòng)根據(jù)對(duì)它執(zhí)行的是“讀”還是“寫(xiě)”操作來(lái)選擇是接收SBUF還是發(fā)送SBUF,后邊通過(guò)程序,我們就會(huì)徹底了解這個(gè)問(wèn)題。

3、UART串口程序

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

1、配置串口為模式1。

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

3、確定波特率大小,計(jì)算定時(shí)器TH1和TL1的初值,如果有需要可以使用PCON進(jìn)行波特率加倍。

4、打開(kāi)定時(shí)器控制寄存器TR1,讓定時(shí)器跑起來(lái)。

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

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

#include  

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ā)送回去;

                           //等號(hào)左邊的SBUF實(shí)際上就是發(fā)送SBUF,因?yàn)閷?duì)它的操作是“寫(xiě)”;

                           //等號(hào)右邊的是接收SBUF,因?yàn)閷?duì)它的操作是“讀”。

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

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

    }

}

 

void ConfigUART(unsigned int baud)  //串口配置函數(shù),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)志位的方法來(lái)編寫(xiě)的,而實(shí)際工程開(kāi)發(fā)中,當(dāng)然就不能這么干了,所以就用到了串口中斷,來(lái)看一下程序。

 

#include 

 

void ConfigUART(unsigned int baud);

 

void main ()

{

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

    

    while(1);

}

 

void ConfigUART(unsigned int baud)  //串口配置函數(shù),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

    ES = 1;   //打開(kāi)串口中斷

    EA = 1;   //打開(kāi)總中斷

}

 

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)卻完全空出來(lái)了,我們就可以隨意添加其它功能代碼進(jìn)去。

編輯:admin  最后修改時(shí)間:2018-05-25

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

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

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

亚洲国产av在线观看一区| 国产欧美日本在线播放| 久久黄片免费播放大全| 久热香蕉精品视频在线播放| 欧美日韩中国性生活视频| 色哟哟精品一区二区三区| 国产精品自拍杆香蕉视频| 亚洲天堂精品在线视频| 日本女人亚洲国产性高潮视频| 人妻中文一区二区三区| 成人精品一区二区三区综合| 国产又粗又猛又爽又黄| 国产视频福利一区二区| 日韩成人午夜福利免费视频| 亚洲熟女熟妇乱色一区| 国产一区一一一区麻豆| 日韩一区二区三区观看| 国产91人妻精品一区二区三区| 国产av精品高清一区二区三区| 暴力三级a特黄在线观看| 中文字幕日韩无套内射| 高潮日韩福利在线观看| 午夜久久久精品国产精品| 日本av一区二区不卡| 91精品欧美综合在ⅹ| 欧美不雅视频午夜福利| 五月天六月激情联盟网| 婷婷亚洲综合五月天麻豆| 女生更色还是男生更色| 日韩性生活视频免费在线观看| 精品人妻一区二区三区免费看| 亚洲av首页免费在线观看| 91欧美激情在线视频| 国产麻豆视频一二三区| 色哟哟哟在线观看视频| 亚洲国产香蕉视频在线观看| 精品人妻少妇二区三区| 一本久道久久综合中文字幕| 色婷婷国产精品视频一区二区保健 | 91精品国产综合久久福利| 日韩欧美国产精品中文字幕|