【藍橋杯單片機09】串行接口的基本原理與應用


【藍橋杯單片機09】串行接口的基本原理與應用

廣東職業技術學院 歐浩源

    串行接口是一個非常重要的外設,它是單片機與外部終端的數據傳輸渠道。不管是簡單的51單片機,還是復雜的ARM處理器,串口通信都是必不可少的,有些芯片甚至有幾個串行接口。就藍橋杯的“單片機設計與開發”賽項來說,串行通信考查的幾率也是相當大的。

1、串口重要概念概述
    <1> 串行通信是指數據一位接一位地順序發送或接收。
    <2> 串行通信有SPI、IIC、UART等多種,最常見最通用的是指UART,無特殊說明,本文指的就是UART。
    <3> 串行通信的制式有:單工、半雙工、全雙工三種。
    <4> 計算機的串行通信接口是RS-232的標准接口,而單片機的UART接口則是TTL電平,兩者的電氣規范不一致,所以要完成兩者之間的數據通信,就需要借助接口芯片在兩者之間進行電平轉換,常用的有MAX232芯片。
    <5> 波特率:每秒鍾傳輸的位數,9600波特率就是指每秒鍾傳輸9600位。
注意:在51單片機中需要使用定時器1來產生波特率,因此,如果使用串口通信,則定時器1就不能做其他用途,在初始化串行接口模塊的時候,除了要配置SCON寄存器之外,還有根據波特率參數設置定時器1的技術初值。

2、51單片機的串口相關寄存器
    對於傳統的51單片機,與串口相關的寄存器有:
    TH1TL1:設置波特率參數。
    TMOD:設置定時器1的工作模式。
    SBUF:串行通信數據的發送和接收緩沖器。
    SCON:串行接口控制寄存器。
    在這里主要是掌握SCON,跟串口有關的各種屬性都在這個寄存器里進行配置:

    如果你在比賽或者應用中使用的是STC15F2K602單片機,你還需要對新增的輔助寄存器AUXR進行設置,否則是無法進行串口數據收發的,對於傳統的89C52單片機,則不需要這個步驟。
    新增的輔助寄存器AUXR的位定義如下:

3、串口通信的編程思路
    在串口通信的程序設計中,主要有串口初始化和數據收發兩個部分。
    在初始化函數中,基本步驟如下:
    <1> 設置定時器1的工作模式,也就是對TMOD寄存器賦值。
    <2> 計算波特率參數,並賦值給TH1和TL1寄存器。
    <3> 打開定時器1。
    如果使用的是STC 12系統單片機,則要設置AUXR寄存器。
    <4> 設置SCON寄存器。
    <5> 使能串口中斷ES。
    <6> 使能總中斷EA。
    數據的發送通常采用查詢方式,而數據的接收則采用中斷方式。
    實際上,各個應用程序中,這些代碼都差不多,可以參考一下的框架:

4、單元實訓題目

5、實現源碼參考

#include "reg52.h" 
//--------對於STC15F2K6052單片機--------
sfr AUXR=0x8e;                //新增輔助寄存器
//--------------------------------------
unsigned char tmpRecv;
void Init_Uart()
{
    TMOD=0x20;        //定時器1工作模式為自動重裝
    TH1=0xfd;         //設置波特率為9600
    TL1=0xfd;         //11.0592M或12M的12分頻
    AUXR=0x00;        //bit7=1:定時器1不分頻,0則12分頻
    TR1=1;            //啟動定時器1
    SCON = 0x50;      //串口參數為模式1和允許接收
    ES=1;             //使能串口中斷
    EA=1;             //使能總中斷
}
/*=============發送單個字節函數================*/
void SendByte(unsigned char dat)
{
    SBUF = dat;            //將數據放進SBUF緩沖器
    while(TI == 0);        //等待發送數據完成
    TI = 0;                //清除發送完成標志
}
/*=============串口中斷服務函數================*/
void Sevice_Uart() interrupt 4
{
    if(RI == 1)                //接收到一個完整的字節
    {
        RI = 0;                //清除接收完成標志
        tmpRecv = SBUF;
        SendByte(tmpRecv + 1);
    }
}

main()
{
    Init_Uart();
    SendByte(0x5a);
    SendByte(0xa5);
    while(1);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM