UART通信特点
异步、全双工、串行。
只使用一对线就可以实现数据的通信,节约成本。
数据一位一位发送,数据传输较慢。
只能一对一通信。
如何实现通信的?
UART:
- 发送数据的TX
- 接受数据的RX
- 参考GND
UART是异步通信,通信双方使用各自的时钟系统,发送和接收数据需要统一双方发送和接收的频率,即统一波特率。
下面以9600的波特率为例子:
发送数据
一直处于高电平代表停止,从高电平转换为低电平代表开始,开始后要延迟52us,之后可以发送数据,9600的波特率就是104us发送一条数据,发送端每104us发送一条数据,接受端每104us接收一条数据。
51单片机的UART
以stc89c52为例子:
SCON用来控制通信的方式和其他功能。
SM0/FE和SM1可以构成4种工作方式:
SM0 = 0;SM1 = 0; 同步移位寄存器
SM0 = 0;SM1 = 1; 8位UART,波特率可变
SM0 = 1;SM1 = 0; 9位UART,波特率固定 (不使用效验位,波特率和晶振频率相关)
SM0 = 1;SM1 = 1; 9位UART,波特率可变(不使用效验位)
REN: 为1可以接收数据,为0不能接受数据。
TI: 如果是第一种方式,发生完第8位数据后会置1。其他方式是在停止位开始发送的时候置1。TI需要在软件中置0。
//发送数据
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
RI:与TI相对应,用于接受数据,数据接受完毕后置1。
//接受处理数据
void UART_Routine() interrupt 4
{
if(RI==1) //如果接收标志位为1,接收到了数据
{
P2=~SBUF; //读取数据,取反后输出到LED
UART_SendByte(SBUF); //将受到的数据发回串口
RI=0; //接收标志位清0
}
UART初始化。
void UART_Init()
{
SCON=0x50;
PCON |= 0x80;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}