今天,我们来说一说串口通信。
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单、可以实现两个设备的互相通信。
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。
简单双向串口通信有两根通信线,一个是发送端(TXD),一个是接收端(RXD)。TXD与RXD要交叉连接。但当只需要单向传输时,可以只接一根通信线。(如果电平标准不同,需要加电平转换芯片!)
一般有如下三种电平标准
我们单片机一般常用TTL电平 。
一般常见的通信接口有如下几种
全双工:通信双方可以在同一时刻互相传输数据。
半双工:通信双方可以互相传输数据,但只能共用一根线。
异步:通信双方各自约定通信速率。
同步:通信双方靠一根时钟线来约定通信速率。
一般的UART有四种模式,但我们常用模式1。
这是串口通信的模式图。可以看到这有两个SBUF(两个独立的寄存器,一个是发送寄存器,一个是接收寄存器)。
这是中断系统 ,当他发送或接收时,就会触发中断,即当R1或T1为1。
这是串行口相关的寄存器。
其相关代码为
UART
#include <REGX52.H>
/**
* @brief 串口初始化
* @param 无
* @retval 无
*/
void UART_Init()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;
EA=1;
}
/**
* @brief 串口发送一个字节数据
* @param Byte 要发送一个字节数据
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
/* 串口中断函数模板
void UART_Routine() interrupt 4
{
if(RI==1)
{
P2=~SBUF;
UART_SendByte(SBUF);
RI=0;
}
}
*/
main
#include <REGX52.H>
#include "DELAY.H"
#include "UART.H"
unsigned char Sec;
void main()
{
UART_Init();
while(1)
{
}
}
void UART_Routine() interrupt 4
{
if(RI==1)
{
P2=~SBUF;
UART_SendByte(SBUF);
RI=0;
}
}
这就是关于串口通信的相关知识了。