午夜亚洲av中文字字幕乱码,一级日本大片免费观看,欧美牲交a欧美牲交一级aa,亚州熟妇视频无码

UART串口通信的基本應用

發(fā)布時間:2024-07-11
1、通信的三種基本類型 我們常用的通信通??梢苑譃閱喂?、半雙工、全雙工通信。
單工就是指只允許一方向另外一方傳送信息,而另一方不能回傳信息。比如我們的電視遙控器,我們的收音機廣播等,都是單工通信技術(shù)。
半雙工是指數(shù)據(jù)可以在雙方之間相互傳播,但是同一時刻只能其中一方發(fā)給另外一方,比如我們的對講機就是典型的半雙工。
全雙工通信就發(fā)送數(shù)據(jù)的同時也能夠接受數(shù)據(jù),兩者同步進行,就如同我們的電話一樣,我們說話的同時也可以聽到對方的聲音。
2、uart模塊介紹 io口模擬串口通信,大家了解了串口通信的實質(zhì),但是我們的單片機程序卻需要不停的檢測掃描單片機io口收到的數(shù)據(jù),大量占用了cpu資源。這時候就會有聰明人想了,其實我們不是很關(guān)心通信的過程,我們只需要一個通信的結(jié)果,最終得到接收到的數(shù)據(jù)就行了。這樣我們可以在單片機內(nèi)部做一個硬件模塊,讓他自動接收數(shù)據(jù),接收完了,通知我們一下就可以了,我們的51單片機內(nèi)部就存在這樣一個uart模塊,要正確使用它,當然還得先把對應的特殊功能寄存器配置好。
51單片機的uart串行口的結(jié)構(gòu)由串行口控制寄存器scon、發(fā)送和接收電路三部分構(gòu)成,先來了解一下串口控制寄存器scon。
表1scon--串行控制寄存器的位分配(地址:98h)
可位尋址;復位值:0x00;復位源:任何復位

7
6
5
4
3
2
1
0
符號
sm0
sm1
sm2
ren
tb8
rb8
ti
ri
表2scon--串行控制寄存器的位描述

符號
描述
7
sm0
這兩位共同決定了串口通信的模式0到模式3共4種模式。我們最常用的就是模式1,也就是sm0=0,sm1=1,下邊我們重點就講模式1,其他模式從略。
6
sm1
5
sm2
多機通信控制位(很少用),模式1直接清零。
4
ren
使能串行接收。由軟件置位使能接收,軟件清零則禁止接收
3
tb8
模式2和3中將要發(fā)送的第9位數(shù)據(jù)(很少用)
2
rb8
模式2和3中接收第9位數(shù)據(jù)(很少用),模式1用來接收停止位
1
ti
發(fā)送中斷標志位,模式1下,在數(shù)據(jù)位最后一位發(fā)送結(jié)束,開始發(fā)送停止位時由硬件自動置1,必須通過軟件清零。也就是說,再發(fā)送前我們清零ti,發(fā)送數(shù)據(jù),數(shù)據(jù)發(fā)送到停止位時,ti硬件置1,方便我們cpu查詢發(fā)送完畢狀態(tài)。
0
ri
接收中斷標志位,當接收電路接收到停止位的中間位置時,ri由硬件置1。也就是說,接收數(shù)據(jù)之前我們必須清零ri,接受數(shù)據(jù)到停止位的中間位置時,ri硬件置1,方便我們cpu查詢到接收狀態(tài)。
前邊學了那么多寄存器的配置,相信scon這個地方,對于大多數(shù)同學來說已經(jīng)不是難點了,應該能看懂并且可以自己配置了。對于串口的四種模式,模式1是最常用的,就是我們前邊提到的1位起始位,8位數(shù)據(jù)位和1位結(jié)束位。因為我們的教程不同于教科書,只要有的功能都一一介紹,我們只介紹實用的技術(shù),所以其他3種模式,真正遇到需要使用的時候大家再去查資料就行。
在我們使用io口模擬串口通信的時候,我們串口的波特率是使用定時器0的中斷體現(xiàn)出來的。在實際串口模塊中,有一個專門的波特率發(fā)生器用來控制發(fā)送數(shù)據(jù)的速度和讀取接收數(shù)據(jù)的速度。對于stc89c52rc單片機來講,這個波特率發(fā)生器只能由定時器1或定時器2產(chǎn)生,而不能由定時器0產(chǎn)生,這和我們模擬的通信是完全不同的概念。
如果用定時器2,需要配置額外的寄存器,默認是使用定時器1的,我們本章內(nèi)容主要是使用定時器1作為波特率發(fā)生器來講解,方式1下的波特率發(fā)生器必須使用定時器1的模式2,也就是自動重裝載模式,定時器的初值具體的計算公式是:
th1=tl1=256-晶振值/12/2/16/波特率
和波特率有關(guān)的還有一個寄存器,是一個電源管理寄存器pcon,他的最高位可以把波特率提高一倍,也就是如果寫pcon|=0x80以后,計算公式就成了
th1=tl1=256-晶振值/12/16/波特率
數(shù)字的含義這里解釋一下,256是8位數(shù)據(jù)的溢出值,也就是tl1的溢出值,11059200就是我們板子上單片機的晶振,12是說1個機器周期是12個時鐘周期,值得關(guān)注的是這個16,重點說明。我們在io口模擬串口通信接收數(shù)據(jù)的時候,我們采集的是這一位數(shù)據(jù)的中間位置,而實際上串口模塊比我們模擬的要復雜和精確一些。他采取的方式是把一位信號采集16次,其中第7、8、9次取出來,這三次中其中兩次如果是高電平,那么就認定這一位數(shù)據(jù)是1,如果兩次是低電平,那么就認定這一位是0,這樣一旦受到意外干擾讀錯一次數(shù)據(jù),也依然可以保證最終數(shù)據(jù)的正確性。
了解了串口采集模式,在這里要給大家留一個思考題。“晶振值/12/2/16/波特率”這個地方計算的時候,出現(xiàn)不能除盡,或者出現(xiàn)小數(shù)怎么辦,允許出現(xiàn)多大的偏差?把這部分理解了,也就理解了我們的晶振為何使用11.0592m了。
串口通信的發(fā)送和接收電路,我們主要了解一下他們在物理上有2個名字相同的sbuf寄存器,他們的地址也都是99h,但是一個用來做發(fā)送緩沖,一個用來做接收緩沖。意思就是說,有2個房間,兩個房間的門牌號是一樣的,其中一個只出人不進人,另外一個只進人不出人,這樣的話,我們就可以實現(xiàn)uart的全雙工通信,相互之間不會產(chǎn)生干擾。但是在邏輯上呢,我們每次只操作sbuf,單片機會自動根據(jù)對它執(zhí)行的是“讀”還是“寫”操作來選擇是接收sbuf還是發(fā)送sbuf,后邊通過程序,我們就會徹底了解這個問題。
3、uart串口程序 一般情況下,我們編寫串口通信程序的基本步驟如下所示:
1、配置串口為模式1。
2、配置定時器t1為模式2,即自動重裝模式。
3、確定波特率大小,計算定時器th1和tl1的初值,如果有需要可以使用pcon進行波特率加倍。
4、打開定時器控制寄存器tr1,讓定時器跑起來。
這個地方還要特別注意一下,就是在使用t1做波特率發(fā)生器的時候,千萬不要再使能t1的中斷了。
我們先來看一下由io口模擬串口通信直接改為使用硬件uart模塊時程序代碼,看看程序是不是簡單了很多,因為大部分的工作硬件模塊都替我們做了。程序功能和io口模擬的是完全一樣的。
#include
voidconfiguart(unsignedintbaud);
voidmain()
{
configuart(9600);//配置波特率為9600
while(1)
{
while(!ri);//等待接收完成
ri=0;//清零接收中斷標志位
sbuf=sbuf+1;//接收到的數(shù)據(jù)+1后,發(fā)送回去;
//等號左邊的sbuf實際上就是發(fā)送sbuf,因為對它的操作是“寫”;
//等號右邊的是接收sbuf,因為對它的操作是“讀”。
while(!ti);//等待發(fā)送完成
ti=0;//清零發(fā)送中斷標志位
}
}
voidconfiguart(unsignedintbaud)//串口配置函數(shù),baud為波特率
{
scon=0x50;//配置串口為模式1
tmod&=0x0f;//清零t1的控制位
tmod|=0x20;//配置t1為模式2
th1=256-(11059200/12/32)/baud;//計算t1重載值
tl1=th1;//初值等于重載值
et1=0;//禁止t1中斷
tr1=1;//啟動t1
}
當然了,這個程序還是在主循環(huán)里等待接收中斷標志位和發(fā)送中斷標志位的方法來編寫的,而實際工程開發(fā)中,當然就不能這么干了,所以就用到了串口中斷,來看一下程序。
#include
voidconfiguart(unsignedintbaud);
voidmain()
{
configuart(9600);//配置波特率為9600
while(1);
}
voidconfiguart(unsignedintbaud)//串口配置函數(shù),baud為波特率
{
scon=0x50;//配置串口為模式1
tmod&=0x0f;//清零t1的控制位
tmod|=0x20;//配置t1為模式2
th1=256-(11059200/12/32)/baud;//計算t1重載值
tl1=th1;//初值等于重載值
et1=0;//禁止t1中斷
tr1=1;//啟動t1
es=1;//打開串口中斷
ea=1;//打開總中斷
}
voidinterruptuart()interrupt4
{
if(ri)//接收到字節(jié)
{
ri=0;//手動清零接收中斷標志位
sbuf=sbuf+1;//接收數(shù)據(jù)+1發(fā)回去,左邊為發(fā)送sbuf,右邊為接收sbuf。
}
if(ti)//字節(jié)發(fā)送完畢
{
ti=0;//手動清零發(fā)送中斷標志位
}
}
大家可以試驗一下試試,看看是不是和前邊用io口模擬通信實現(xiàn)的效果一致,而主循環(huán)卻完全空出來了,我們就可以隨意添加其它功能代碼進去。
上一個:步進電機的選擇的計算公式及計算方法
下一個:結(jié)婚登記有什么要求

物流管理的內(nèi)容包括哪些
云手機和模擬器一樣嗎(云手機和模擬器哪個防封)
一起來喝生姜茶 | 生姜,原來是養(yǎng)生高手!
喝茶能顯著提升人體抵御病毒的能力
空運摩爾曼斯克機場介紹
教你如何維護超凈工作臺
貝塔射線揚塵監(jiān)測設備監(jiān)測大氣環(huán)境揚塵污染
ZLGF-200KV/2mA直流高壓發(fā)生器技術(shù)參數(shù)
液體式冷熱沖擊試驗箱
廣聯(lián)達導入CAD圖紙缺失后的解決辦法