【藍橋杯單片機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單片機,與串口相關的寄存器有:
TH1和TL1:設置波特率參數。
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);
}
