1.什么是串口?
串口是通讯接口,实现两个设备的互相通信。
单片机自带UART,其中引脚有TXD发送端,RXD接收端。且电平标准为TTL(+5V为1,0V为0)。
2.常见电平标准:
(1)TTL电平:+5V表示1,0V表示0。
(2)RS232电平:-3~-15V表示1,+3·+15V表示0。
(3)RS485电平:两线压差+2~+6V表示1,-2~-6V表示0。
3.常见通信接口比较:
全双工:通信双方可在同一时刻互传数据。
半双工:不能同时
单工:只能一方传另一方
异步:双方各自约定通信速率
同步:通信双方靠一根时钟线来约定通信速率
4.51单片机的UART:
有四种工作模式,只讲常用的模式一:
(1)UART的结构:
定时器:
缓存寄存器:
控制器:
中断系统:RX/TX
(2)寄存器:
注意:SMOD和SMOD0两个位被放在了PCON中(而非SCON),推测当年因为正好有空。
TI为发送标志位,发送后硬件置1,需软件手动归零。
5.实战:
(1)配置环境:
SM0 SM1设置为 01 可将工作方式设置为模式1。其余均为0即可。
可用STC-ISP生成代码,配置如下:
cpp
void UATR_Init()
{
SCON = 0x40;
PCON = 0x80;
TMOD &= 0x0F;
TMOD |= 0x20;//可使前4位保持不变,只改变定时器0对应的后4位
TR1 = 1;
//控制计时时长
TH1 = 0xF3;
TL1 = 0xF3;
//禁止中断系统
ET1 = 0;
}
(2)串口向电脑发送数据:
cpp
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;//串口缓冲
while (TI == 0);
TI = 0;
}
cpp
void main()
{
UATR_Init();
while (1)
{
UART_SendByte(Sec);
Sec++;
Delay(1000);
}
}
(3)串口接收电脑信息:
因为不知道电脑何时发送数据,故将数据接收放在中断里,待接收到数据,触发中断后再操作。
cpp
void main()
{
UATR_Init();
while (1)
{
}
}
//串口中断模板
void UART_Routine() interrupt 4
{
if (RI == 1)
{
//接收到信息后要执行的操作
P2 = ~SBUF;
UART_SendByte(SBUF);
RI = 0;
}
}