<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機學(xué)習之十八:串行通訊程序:?jiǎn)纹瑱C發(fā)送

單片機學(xué)習之十八:串行通訊程序:?jiǎn)纹瑱C發(fā)送

作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò ) 收藏
一、實(shí)驗現象:

本文引用地址:http://dyxdggzs.com/article/201611/315892.htm

每次按下k0按鍵,由單片機向電腦發(fā)送數據62。

二、實(shí)驗目的

掌握單片機串行通訊的概念、特點(diǎn)

掌握串行通訊波特率的計算方法

掌握max232接口芯片的連接方法

掌握方式1串口通訊的簡(jiǎn)單程序編寫(xiě)

三、實(shí)驗任務(wù)分析:

在這個(gè)實(shí)驗里面,我們來(lái)學(xué)習編寫(xiě)一個(gè)單片機和PC機之間的通訊程序。首先我們來(lái)學(xué)習一些和串行通訊有關(guān)的理論知識。

通訊的基本方式分為并行通訊和串行通訊。由于MCS-51系列單片機有一個(gè)異步全雙工(全雙工:指的是數據可以同時(shí)進(jìn)行雙向的傳送)的串行口,所以我們只研究串行通訊的問(wèn)題。這里有個(gè)新概念-異步,下面我們簡(jiǎn)單的給大家解釋一下。

(一)、異步通訊的概念

由于單片機自帶的串行口是異步的,所以我們現在只研究異步通訊問(wèn)題

在異步傳送中,一幀信息是一位一位進(jìn)行傳送的。每一個(gè)要傳送的字符要用“起始位”和“停止位”作為字符開(kāi)始和結束的標志,傳送的時(shí)候每個(gè)字符的的組成格式如下:

1幀信號=起始位+數據位(可以是5、6、7、8位數據)+停止位,具體格式由通訊雙方約定。

(二)、關(guān)于異步通訊需要了解的知識

從異步通訊的特點(diǎn)中我們可以知道,在異步數據傳送中,通訊雙方事先必須約好兩項事宜:

(1)、字符格式:雙方要約定兩者之間以什么樣的格式傳遞信息,比如字符的編碼形式、奇偶校驗形式、以及起始位和停止位的規定。在單片機中我們是靠選擇串口的工作方式來(lái)約定格式的,如何選擇稍后介紹。

(2)、波特率:在異步數據傳送中,通訊雙方傳送數據的速率應該相同。我們用“波特率”作為衡量數據傳送速率的指標,它定義為“每秒傳送的數據位數”。

例如:數據傳送的速率是120字符/秒,每一個(gè)字符假如是10位,則傳送的波特率為:120×10=1200(比特)

一般的,異步傳送速率在50~9600比特之間。

可見(jiàn),在通訊程序中,我們首先應該進(jìn)行初始化工作,約定雙方異步通訊的相關(guān)協(xié)議。

那么怎樣進(jìn)行初始化呢?這就涉及到串行接口的控制問(wèn)題,下面我們來(lái)談?wù)勥@個(gè)問(wèn)題。

(三)、MCS-51的串行通訊接口

MCS-51單片機內部有一個(gè)功能很強的異步全雙工串行口,該串行口有四種工作方式,供不同的場(chǎng)合使用(如何選擇后面介紹)。通訊的波特率可以由我們編寫(xiě)的軟件設置,由片內的定時(shí)器/計數器T1或者T0產(chǎn)生。下面我們就來(lái)詳細的介紹一下。

1、串行口的工作方式

串行口的四種工作方式中,串行通訊只使用方式1、2、3,方式0主要用于擴展I/O口,這種方式我們不做詳細說(shuō)明,大家可參考相關(guān)教材。

方式1:

這是串口通訊中最常用的方式,為10位異步通訊接口,一幀信息(10位)=起始位(0)+8位數據(低位在前)+停止位(1)。

另外,方式1還有一個(gè)特點(diǎn),波特率可變,我們能夠靈活進(jìn)行設置(如何設置我們稍后介紹),因此這種方式在串行通訊中應用的十分廣泛,我們在該試驗中,就選擇這個(gè)工作方式。

方式2和3:

一般用于主-從式多機通訊的情況下,本試驗采用的是方式1,所以我們暫時(shí)也不介紹拉!

2、串行口工作方式的選擇

既然決定采用方式1,那么就要對控制寄存器初始化了。串行口的四種通訊方式,使用哪種由特殊功能寄存器SCON決定(也在特殊功能寄存器區,地址是98H,可位尋址,它的各位在單片機復位的時(shí)候被清零)。SCON各位說(shuō)明如下:圖


SM0、SM1:串行接口的工作方式選擇:

00-方式0;01-方式1;10-方式2;11-方式3。由于在該試驗中我們選擇方式1,所以應該把SM0和SM1置為01。

SM2:允許方式2和方式3進(jìn)行多機通訊的控制位,所以如果我們使用方式2、3進(jìn)行多機通訊時(shí),將該位置1;但是在本實(shí)驗中我們采用方式1,所以SM2置0即可。

再來(lái)看看TI:串行口發(fā)送中斷標志。

當一幀信息發(fā)送完成時(shí),發(fā)送中斷標志TI置1,向CPU申請中斷。所以在有串口中斷程序的時(shí)候,我們初始化的時(shí)候應該把這一位置0,免得還沒(méi)有開(kāi)始發(fā)送就申請中斷啦?。ㄎ覀兿冗@樣簡(jiǎn)單的解釋一下,說(shuō)多了大家可能會(huì )暈哦,如果想了解的更加詳細,自己參考相關(guān)教材吧!^_^)。

RI:串行口接受中斷標志。

當串口接受完一幀信息后,接受中斷標志RI置1,向CPU申請中斷,如果CPU允許中斷,就進(jìn)入串行中斷服務(wù)程序。同樣,在有串口中斷程序的時(shí)候,初始化的時(shí)候也應該把RI清0,免得還沒(méi)有開(kāi)始接受就申請中斷啦!

但是這里需要說(shuō)明一點(diǎn):CPU事先不能分辯是TI還是RI的中斷請求,所以必須在中斷服務(wù)程序中加以判斷,然后在程序中用軟件清零。

REN:允許串行口接受控制位。當REN=1時(shí)為允許串行口接受數據;當REN=0時(shí)為禁止接受狀態(tài)。在這個(gè)實(shí)驗里面,由于我們用單片機發(fā)送數據,所以這一位置0置1均可,我們就把它置0吧。

TB8:在方式1中該位沒(méi)有用,在方式2、3中,是要發(fā)送的第九位數據。所以這一位是1和0均可。

RB8:在方式2、3中,它是接受到的第九位數據位。在方式1中,當SM2=0,RB8是已經(jīng)接受的停止位。

綜上所述,我們這個(gè)實(shí)驗里面,對串口的初始化程序可以是:mov scon,#40h

3、串口波特率的計算

當串口工作于方式1,波特率是可變的,我們可以靈活的進(jìn)行設置,通過(guò)給計數器置入不同的初值,產(chǎn)生不同的波特率。

計數初值N和波特率之間的關(guān)系可以用下面的公式描述:

N=28-(2SMOD×fosc)/(32×12×波特率)

其中的SMOD是特殊功能寄存器PCON的最高位,叫做波特率選擇位,格式如下,其中和串口有關(guān)的只有D7位,其余的我們就不研究了。

它的設置可以通過(guò)如下的程序完成:

mov pcon,#00h ;使smod=0

mov pcon,#80h ;使smod=1

下面通過(guò)例子說(shuō)明N的計算方法,例如:

(1)、系統晶振12MHZ,當SMOD=1,欲產(chǎn)生的波特率為2400,時(shí)間常數N的計算如下:

N=256-(2×12×106)/(32×12×2400)=256-26.04=230=E6H

(2)、系統晶振12MHZ,當SMOD=0,欲產(chǎn)生的波特率為2400,時(shí)間常數N的計算如下:

N=256-(1×12×106)/(32×12×2400)=256-13.02=243=F3H

關(guān)于N的計算我們就簡(jiǎn)單的說(shuō)這么多吧,后面的說(shuō)明里面有一個(gè)常用的波特率設置的表格,在設置波特率的時(shí)候可以進(jìn)行查閱。

從上面我們可以看到,SMOD取0或者1都可以產(chǎn)生2400的波特率,那么到底應該如何選擇呢?其實(shí),SMOD的選擇影響著(zhù)波特率的準確度。關(guān)于這部分內容的詳細討論大家可以參考相關(guān)教材,我們就不多說(shuō)了。

4、數據的發(fā)送過(guò)程

設置好了串口的工作方式和波特率,我們就可以進(jìn)行數據的發(fā)送拉。發(fā)送的過(guò)程如下:CPU執行一條將數據寫(xiě)入發(fā)送緩沖區SBUF的指令即可啟動(dòng)發(fā)送(如mov sbuf,a),串行數據從TXD引腳輸出,發(fā)送完一幀數據后,由硬件把TI置位。

(五)、單片機的串口電平轉換電路

以上我們介紹的是單片機串口的定義和設定,在實(shí)際使用的時(shí)候,單片機串口輸出的是TTL電平,傳輸的距離非常有限,不超過(guò)1.5m。而電腦的串口輸出的是RS232電平,兩者的電平并不相同,需要外接接口進(jìn)行電平匹配,這個(gè)電平轉換芯片采用專(zhuān)用芯片max232來(lái)完成。

在學(xué)習板的電路上,是采用3線(xiàn)制連接串口,也就是說(shuō)和電腦的9針串口連接3條線(xiàn)即可,RXD(串行輸入通道)、TXD(串行輸出通道)、GND,對我們來(lái)說(shuō)已經(jīng)夠用了。具體的電路如下圖所示,這是一個(gè)典型電路,可以直接使用:

對這個(gè)電路我們簡(jiǎn)單解釋一下:

T1IN、T2IN: 兩路TTL電平輸入引腳,連接單片機的串行輸出TXD腳。

T1OUT、T2OUT: 兩路RS232電平輸出引腳,連接電腦9針串口的串行輸入RXD。

R1IN、R2IN: 兩路RS232電平輸入,連接電腦9針串口的串行輸出TXD端。

R1OUT、R2OUT:兩路TTL電平輸出,連接電腦9針串口的串行輸入RXD端。

4個(gè)外接電容進(jìn)行電壓匹配和電源去耦。

通過(guò)MAX232的TTL和RS232輸入輸出端口,自動(dòng)調節了單片機串口的TTL電平信號和RS232串行通信信號的電平匹配。

順便說(shuō)一句:本實(shí)驗是單片機和電腦之間的串行通訊,兩者電平不同,所以需要電平轉換芯片,如果是單片機和單片機之間的通訊,兩者都是TTL電平,就不需要進(jìn)行電平轉換,兩個(gè)串口可以直接通過(guò)導線(xiàn)連接。

(六)、串口調試助手

為了能夠在電腦上看到單片機發(fā)送過(guò)來(lái)的數據,我們必須用一個(gè)軟件來(lái)觀(guān)察通訊情況。這里采用“串口調試助手”軟件,這是一個(gè)綠色軟件,無(wú)需安裝,可以直接運行。它的設置方法可見(jiàn)下面的圖解:

四、實(shí)驗程序

org 0000h

clr p1.5

;以下是串口初始化程序

mov scon,#40h ;選擇串口工作于方式1

mov tmod,#20h ;定時(shí)器T1設置為工作方式2,用作波特率發(fā)生器

mov tl1,#0f3h ;按照波特率為2400計算初值

mov th1,#0f3h ;把計數初值送入常數緩沖器

mov pcon,#80h ;smod=1,波特率變成4800

setb tr1 ;啟動(dòng)定時(shí)器T1

;以下判斷是否按鍵k0按下

wait1: jb p1.1,wait1 ;k0沒(méi)有按下,等待

acall del10ms ;延時(shí)10ms去抖動(dòng)

jb p1.1,wait1 ;再次查詢(xún)k0,是抖動(dòng)返回

wait2: jnb p1.1,wait2 ;等待按鍵彈起

mov a,#62h ; 01100010送到a

mov sbuf,a ;發(fā)送信息,傳送的一幀信息為:0+01100010+1

ajmp wait1 ;返回繼續查詢(xún)k0是否按下

del10ms: mov r7,#20 ;延時(shí)10ms子程序

del1: mov r6,#0ffh

del2: djnz r6,del2

djnz r7,del1

ret

end

五、幾點(diǎn)說(shuō)明

1、該例子中,單片機向電腦發(fā)送的是一個(gè)數據,所以我們我們在串口助手上選擇16進(jìn)制顯示,就會(huì )顯示數據62,如果我們不選擇16進(jìn)制顯示,那么發(fā)送的就是ASCII碼,大家可以試一下,這時(shí)顯示的是字符b。

2、下表是串口常用的波特率設置,便于大家使用的時(shí)候查閱:

工作

方式

波特率

Fosc=6M

Fosc=12M

Fosc=11.0592M

方式1

或者

方式3

SMOD

TMOD

TH1

SMOD

TMOD

TH1

SMOD

TMOD

TH1

62500

-

-

-

1

20

FFH

-

-

-

19200

-

-

-

-

-

-

1

20

FDH

9600

-

-

-

-

-

-

0

20

FDH

4800

-

-

-

1

20

F3H

0

20

FAH

2400

1

20

F3H

0

20

F3H

0

20

F4H

1200

1

20

E6H

0

20

E6H

0

20

E8H

600

1

20

CCH

0

20

CCH

0

20

D0H



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>