【藍橋杯單片機09】串行接口的基本原理與應用編程
廣東職業技術學院 歐浩源框架
串行接口是一個很是重要的外設,它是單片機與外部終端的數據傳輸渠道。無論是簡單的51單片機,仍是複雜的ARM處理器,串口通訊都是必不可少的,有些芯片甚至有幾個串行接口。就藍橋杯的「單片機設計與開發」賽項來講,串行通訊考查的概率也是至關大的。函數
一、串口重要概念概述
<1> 串行通訊是指數據一位接一位地順序發送或接收。
<2> 串行通訊有SPI、IIC、UART等多種,最多見最通用的是指UART,無特殊說明,本文指的就是UART。
<3> 串行通訊的制式有:單工、半雙工、全雙工三種。
<4> 計算機的串行通訊接口是RS-232的標準接口,而單片機的UART接口則是TTL電平,二者的電氣規範不一致,因此要完成二者之間的數據通訊,就須要藉助接口芯片在二者之間進行電平轉換,經常使用的有MAX232芯片。
<5> 波特率:每秒鐘傳輸的位數,9600波特率就是指每秒鐘傳輸9600位。
注意:在51單片機中須要使用定時器1來產生波特率,所以,若是使用串口通訊,則定時器1就不能作其餘用途,在初始化串行接口模塊的時候,除了要配置SCON寄存器以外,還有根據波特率參數設置定時器1的技術初值。spa
二、51單片機的串口相關寄存器
對於傳統的51單片機,與串口相關的寄存器有:
TH1和TL1:設置波特率參數。
TMOD:設置定時器1的工做模式。
SBUF:串行通訊數據的發送和接收緩衝器。
SCON:串行接口控制寄存器。
在這裏主要是掌握SCON,跟串口有關的各類屬性都在這個寄存器裏進行配置:設計
若是你在比賽或者應用中使用的是STC15F2K602單片機,你還須要對新增的輔助寄存器AUXR進行設置,不然是沒法進行串口數據收發的,對於傳統的89C52單片機,則不須要這個步驟。
新增的輔助寄存器AUXR的位定義以下:code
三、串口通訊的編程思路
在串口通訊的程序設計中,主要有串口初始化和數據收發兩個部分。
在初始化函數中,基本步驟以下:
<1> 設置定時器1的工做模式,也就是對TMOD寄存器賦值。
<2> 計算波特率參數,並賦值給TH1和TL1寄存器。
<3> 打開定時器1。
若是使用的是STC 12系統單片機,則要設置AUXR寄存器。
<4> 設置SCON寄存器。
<5> 使能串口中斷ES。
<6> 使能總中斷EA。
數據的發送一般採用查詢方式,而數據的接收則採用中斷方式。
實際上,各個應用程序中,這些代碼都差很少,能夠參考一下的框架:blog
四、單元實訓題目接口
五、實現源碼參考開發
#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); }