基本介紹
- 串口是一種應用十分廣泛的通訊接口,串口成本低、容易使用、通信線路簡單,可實現兩個設備的互相通信。
- 單片機的串口可以使單片機與單片機、單片機與電腦、單片機與各式各樣的模塊互相通信,極大的擴展了單片機的應用范圍,增強了單片機系統的硬件實力。
- 51單片機內部自帶UART(Universal Asynchronous Receiver Transmitter,通用異步收發器),可實現單片機的串口通信。
基本接線
- 簡單雙向串口通信有兩根通信線(發送端TXD和接收端RXD)
- TXD與RXD要交叉連接
- 當只需單向的數據傳輸時,可以直接一根通信線
- 當電平標准不一致時,需要加電平轉換芯片
電平標准
電平標准是數據1和數據0的表達方式,是傳輸線纜中人為規定的電壓與數據的對應關系,串口常用的電平標准有如下三種:
- TTL電平:+5V表示1,0V表示0
- RS232電平:-3-15V表示1,+3+15V表示0
- RS485電平:兩線壓差+2+6V表示1,-2-6V表示0(差分信號)
常見通信接口比較
名稱 | 引腳定義 | 通信方式 | 特點 |
---|---|---|---|
UART | TXD、RXD | 全雙工、異步 | 點對點通信 |
I²C | SCL、SDA | 半雙工、同步 | 可掛載多個設備 |
SPI | SCLK、MOSI、MISO、CS | 全雙工、同步 | 可掛載多個設備 |
1-Wire | DQ | 半雙工、異步 | 可掛載多個設備 |
51單片機的UART
- STC89C52有1個UART
- STC89C52的UART有四種工作模式:
模式0:同步移位寄存器
模式1:8位UART,波特率可變(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可變
串口模式圖
SBUF:串口數據緩存寄存器,物理上是兩個獨立的寄存器,但占用相同的地址。寫操作時,寫入的是發送寄存器,讀操作時,讀出的是接收寄存器
串口和中斷系統
串口相關寄存器
SCON配置
SCON:串行控制寄存器,可位尋址,用於選擇串行通信的工作方式和某些控制功能。
- SM0,SM1按下列組合確定串行口的工作方式:
我們一般選擇方式1,所以SM0=0,SM1=1.
- REN:1則啟動串行接收器RXD,開始接收信息,0為禁止接收,我們先設置為1。
- TI:發送中斷請求標志位,發送數據時,由內部硬件自動置1,響應中斷后由軟件復位為0。
- RI:接收中斷請求標志位,接收數據時,由內部硬件自動置1,響應中斷后由軟件復位為0。
這里配置SCON的八位分別為:01010000,十六進制0x50
PCON配置
PCON:電源控制寄存器,不可位尋址
這里配置PCON的八位分別為:10000000,十六進制0x50
中斷寄存器配置
程序配置
波特率可通過軟件進行生成
程序操作
串口向電腦發送數據
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char num;
void main(){
UartInit();
while(1){
UART_SendBype(num++);
Delay(1000);
}
}
#include <REGX52.H>
void UartInit(void) //4800bps@12.000MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x40; //8位數據,可變波特率
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1為8位自動重裝方式
TL1 = 0xF3; //設定定時初值
TH1 = 0xF3; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啟動定時器1
}
void UART_SendBype(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
電腦通過串口控制單片機
需要接受定時器SCON的REN為1,和發送不通,接收要配置串口中斷,串口中斷號為4
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char num;
void main(){
UartInit();
while(1){
}
}
void UART_Routine() interrupt 4
{
//判斷是接收中斷
if(RI==1)
{
P1=~SBUF;//點亮LED
UART_SendBype(SBUF);
RI=0;//清除接收中斷標志
}
}
數據顯示
HEX模式/十六進制模式/二進制模式:以原始數據的形式顯示
文本模式/字符模式:以原始數據編碼后的形式顯示,可發送ASCII編碼表字符