找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10230|回復(fù): 1
收起左側(cè)

基于89C51單片機串口通信程序的設(shè)計

[復(fù)制鏈接]
ID:104835 發(fā)表于 2016-2-4 04:07 | 顯示全部樓層 |閱讀模式

        MCS-51系列單片機上有一個通用異步接收/發(fā)送器UART,通過引腳RXD[P3.O]和TXD[P3.1]可與外音B電路進行全雙工的串行異步通信,發(fā)送數(shù)據(jù)時由TXD端送出,接收時數(shù)據(jù)由RXD端輸入。本文將具體介紹單片機串口的特點和編程方法,并且在最后給出一個實用的單片機與計算機通過串口通信的程序。
   
    串行接口的基本特點



   
   
        MCS-51單片機的串行端口有4種基本工作方式,通過編程設(shè)置,可以使其工作在任一方式,以滿足不同場合的需要。其中方式0主要用于外接移位寄存器,以擴展單片機的I/O電路;工作方式1多用于雙機之間或與外設(shè)電路的通信;方式2、3除有方式1的功能外,還可以作多機通信,以構(gòu)成分布式多微機系統(tǒng)。

       串行端口有兩個控制寄存器SCON、PCON,用于設(shè)置工作方式、發(fā)送或接收的狀態(tài)、特征位、數(shù)據(jù)傳送波特率[每秒傳送的位數(shù)]以及作為中斷標志等。

   
       串行端口有一個數(shù)據(jù)寄存器SBUF[在特殊功能寄存器中的字節(jié)地址為99H],該寄存器為發(fā)送和接收所共用。發(fā)送時,只寫不讀;接收時,只讀不寫。在一定條件下,向SBuF寫入數(shù)據(jù)就啟動了發(fā)送過程;讀SBuF就啟動了接收過程。

       串行端口的波特率可以用程序來控制。在不同工作方式中,由時鐘振蕩頻率的分頻值或由定時器T1的定時溢出時間確定,使用十分方便靈活。
   
    串口控制寄存器
   
    1. 特殊功能寄存器SCON

    它用于定義串行口的工作方式及實施接收和發(fā)送控制。字節(jié)地址為98H,其各位定義如下表:



    SM0、SM1:串行口工作方式選擇位,其定義如下:


   
SM2:多機通訊控制位,僅用于方式2和方式3。當發(fā)送數(shù)據(jù)時SM2必須有軟件設(shè)置為1;接收數(shù)據(jù)時,如果SM2=1只有接收到的第9位數(shù)據(jù)為1時,RI才置位;如果SM2=0只要接收第9位數(shù)據(jù),RI就置位。

    REN:接收允許控制位。由軟件置位(REN=1)才允許接收,又由軟件清O(REN=0)來禁止接收。

   
TB8:是要發(fā)送數(shù)據(jù)的第9位。在方式2或方式3中,要發(fā)送的第9位數(shù)據(jù),根據(jù)需要由軟件置1或清0。例如?杉s定作為奇偶校驗位,或在多機通訊中作為區(qū)別地址幀或數(shù)據(jù)幀的標志位。

   
RB8:接收到的數(shù)據(jù)的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=O,RB8為接收到的停止位。在方式2或方式3中,RB8為接收到的第9位數(shù)據(jù)。

   
TI:發(fā)送中斷標志。發(fā)送數(shù)據(jù)前必須軟件清0,發(fā)送過程中TI一直為0,當發(fā)送完一幀數(shù)據(jù)后,由硬件自動置1。如果要再發(fā)送,必須用軟件再清0。在編寫串行通信程序的時候,可以使用軟件查詢TI的方法獲得數(shù)據(jù)是否已發(fā)送完畢。

   
RI:接收中斷標志位。接收數(shù)據(jù)前必須軟件清0,接收過程中RI一直為0,當接收完一幀數(shù)據(jù)后,由硬件自動置1。如果要再接收,必須用軟件再清0。在編寫串行通信程序的時候,可以使用軟件查詢RI的方法獲得數(shù)據(jù)是否已接收完畢。

    2. 特殊功能寄存器PCON

    PCON的字節(jié)地址為87H,它的第7位SMOD是與串口的波特率設(shè)置有關(guān)的選擇位。


    SMOD:波特率加倍位。在計算串行方式1、2、3的波特率時SMOD=0波特率不加倍;SMOD=1波特率加倍。
   
    MCS-51單片機的串行的工作方式
   
    MCS-51單片機的全雙工串行口可編程為4種工作方式,現(xiàn)分述如下:

    1方式O

    方式0為移位寄存器輸入/輸出方式?赏饨右莆患拇嫫饕詳U展I/O口,也可以外接同步輸入/輸出設(shè)備。波特率固定為fosc/12,其中fosc為時鐘頻率。

    8位串行數(shù)據(jù)是從RXD輸入或輸出,TXD用來輸出同步脈沖。

   
輸出:串行數(shù)據(jù)從RXD引腳輸出,TXD引腳輸出移位脈沖。CPU將數(shù)據(jù)寫入發(fā)送寄存器SBUF時,立即啟動發(fā)送,將8位數(shù)據(jù)以fos/12的固定波特率從RXD輸出,低位在前,高位在后。發(fā)送完一幀數(shù)據(jù)后,發(fā)送中斷標志TI由硬件置位。

   
輸入:RXD為串行數(shù)據(jù)輸入端,TXD仍為同步脈沖移位輸出端。當(R1)=0且(REN)=1時,開始接收。當接收到第8位數(shù)據(jù)時,將數(shù)據(jù)移入接收寄存器,并由硬件置位RI。


   
左面兩圖分別是方式0擴展輸出和輸入的接線圖,74LS164/74LS165是移位寄存器,將單片機輸出的串行數(shù)據(jù)變?yōu)?位并行數(shù)據(jù),將外部輸入的8位并行數(shù)據(jù)變成串行數(shù)據(jù)。

    2方式1

    方式1為波特率可變的10位異步通訊接口方式。發(fā)送或接收一幀信息,包括1個起始位0,8個數(shù)據(jù)位和1個停止位1。其中的起始位和停止位在發(fā)送時自動插入的。

    輸出:當CPU執(zhí)行一條指令將數(shù)據(jù)寫入發(fā)送緩沖SBUF且TI=0時,就啟動發(fā)送。串行數(shù)據(jù)從TXD引腳輸出,發(fā)送完一幀數(shù)據(jù)后,就由硬件置位TI。

   
輸入:在(REN)=1時,串行口采樣RXD引腳,當采樣到1至O的跳變時,確認是串行發(fā)送來的一幀數(shù)據(jù)的開始位0,從而開始接收一幀數(shù)據(jù)。只有當8位數(shù)據(jù)接收完,并檢測到高電平停止位后,只有滿足①(R1)=0;②(SM2)=0或接收到的第9位數(shù)據(jù)為1時,停止位才進入RB8,8位數(shù)據(jù)才能進入接收寄存器,并由硬件置位中斷標志RI;否則信息丟失。所以在方式1接收時,應(yīng)先用軟件清零RI和SM2標志。

    3. 方式2

    方式2為固定波特率的11位uART方式。它比方式1增加了一位可程控為1或0的第9位數(shù)據(jù)。

   
輸出:發(fā)送的串行數(shù)據(jù)由TXD端輸出一幀信息為11位,附加的第9位來自SCON寄存器的TB8位,用軟件置位或復(fù)位。它可作為多機通訊中地址/數(shù)據(jù)信息的標志位,也可以作為數(shù)據(jù)的奇偶校驗位。當CPu執(zhí)行一條數(shù)據(jù)寫入SuBF的指令且TI=0時,就啟動發(fā)送器發(fā)送。發(fā)送一幀信息后,置位中斷標志TI。

   
輸入:在(REN)=1時,串行口采樣RXD引腳,當采樣到1至O的跳變時,確認是串行發(fā)送來的一幀數(shù)據(jù)的開始位0,從而開始接收一幀數(shù)據(jù)。在接收到附加的第9位數(shù)據(jù)后,當滿足①(RI):0;②(SM2)=0或接收到的第9位數(shù)據(jù)為1時,第9位數(shù)據(jù)才進入RB8,8位數(shù)據(jù)才能進入接收寄存器,并由硬件置位中斷標志Ri;否則信息丟失。且不置位RI。

    4. 工作方式3

    方式3為波特率可變的11位UART方式。除波特率外,其余與方式2相同。
   
    波特率的選擇
   
   
如前所述,在串行通訊中,收發(fā)雙方的數(shù)據(jù)傳送率(波特率)要有一定的約定。在MCS-51串行口的四種工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可變的,由定時器T1的溢出率控制。

    1.方式O

    方式0的波特率固定為主振頻率  的1/12。

    2.方式2

   
方式2的波特率由PCON中的選擇位SMOD來決定,可表示為:波特率=2sMoD×fosc/64也就是當SMOD=1時,波特率為1/32×fosc,當SMOD=0時,波特率為1/64×fosc。

    3.方式1和方式3

    定時器T1作為波特率發(fā)生器,其公式如下:

    波特率=2SMOD/32×定時器T1溢出率

    T1溢出率=T1計數(shù)率/產(chǎn)生溢出所需的周期數(shù)

   
式中T1計數(shù)率取決于它工作在定時器狀態(tài)還是計數(shù)器狀態(tài)。當工作于定時器狀態(tài)時,T1計數(shù)率為fOSC門2:當工作于計數(shù)器狀態(tài)時,T1計數(shù)率為外部輸入頻率,此頻率應(yīng)小于fOSC/24。產(chǎn)生溢出所需周期與定時器T1的工作方式、T1的預(yù)置值(×]有關(guān)。

    定時器T1工作于方式O:溢出所需周期數(shù)=8192-×

    定時器T1工作于方式1:溢出所需周期數(shù)=65536-X

    定時器T1工作于方式2:溢出所需周期數(shù)=256-X

    因為方式2為自動重裝入初值的8位定時器/計數(shù)器模式,所以用它來做波特率發(fā)生器最恰當。這種方式下,T1的溢出率[次/秒]計算式可以表示為:

    T1溢出率=fsoc/12[256-X]

    于是波特率(位/秒)表達式為:


    當時鐘頻率選用11.0592MHz時,取易獲得標準的波特率,所以很多單片機系統(tǒng)選用這個看起來“怪”的晶振就是這個道理。
左表列出了定時器T1工作于方式2常用波特率及初值。













回復(fù)

使用道具 舉報

ID:241196 發(fā)表于 2017-10-20 10:33 | 顯示全部樓層
代碼呢?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表