简介
串口通信就是单片机和pc之间的一种通信方式。
通信方式:并行,串行,同步,异步(最常用的)
传输方向:单工,半双工(不同时间),全双工
基本结构
相关寄存器
SCON串口控制寄存器(主要用方式1)
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
符号 | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
多机通信控制位 | 允许接收位 | 是要发送的第9位数据位 | 接收到的第9位数据位 | 发送中断标志位 | 接收中断标志位 | |||
主要用于方式2,3中 | 1允许接收 | |||||||
0拒绝接收 |
TB8——在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址
RB8——当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到 RB8中。方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。
TI——方式1、2、3中。当发送数据完毕,硬件会将其置1,当 TI 被置1,会向CPU发送中断请求。我们记得要在中断服务程序中把 IT 置回0
RI——当接受完一帧数据时,RI 由硬件置1,当RI 被置1,会向CPU请求中断。同样要在中断服务程序中把 RI 置回0。
SM0 | SM1 | 工作方式 | 功能 | 波特率 |
0 | 0 | 方式0 | 8位同步移位寄存器 | 晶振频率 / 12 |
0 | 1 | 方式1 | 10位UART | 可变 |
1 | 0 | 方式2 | 11位 | 晶振频率/32或晶振频率/64 |
1 | 1 | 方式3 | 11位 | 可变 |
PCON功率控制寄存器
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
PCON | SMOD |
这个寄存器只有一个位SMOD,在方式1,2.,3时,波特率都与SMOD有关,当SMOD=1时,波特率会增加一倍。复位时,SMOD变回0。
SBUF寄存器:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。
当发送使用时,就采用SBUF=XXX; (XXX为需要传送的数据)
当接收使用时,采用XXX=SBUF;
记得因为是串行的所以传输都是一位一位进行的。
波特率计算
代码部分
#include <REGX52.H>
#include "delay.h"
#include "DigitalTube.h"
void init()
{
SCON=0x50;//配置寄存器
PCON=0;//波特率不加倍
TMOD |=0X20;//定时器选择工作模式2
TH1=TL1=0xfd;//波特率9600
EA=1;//中断打开
ES=1;//接受中断
ET1=1;//定时器中断关闭
TR1=1;//定时器开关打开
}
void UART_SendByte() interrupt 4
{
unsigned char date; //定义一个数据
delay();
date = SBUF;//pc发送数据
RI = 0; //接收关闭
print(date/10,1);//控制数码管
print(date%10,2);
SBUF = date;//pc接收数据
while(!TI);//判断发送是否关闭
TI = 0;//发送关闭
}
结论
代码部分我只给了中断配置及串口通信的代码,其余大家自由发挥。本章重点是搞清楚串口通信的寄存器配置,波特率的计算,以及与之前中断、定时器相关知识相结合。——中断——定时器