51单片机学习记录(12) “串口通信”
相关知识
SCON寄存器:用于设定串行口的工作方式,接受/发送控制以及设置状态标志,因为先前的文章里已有写到下面是链接,这里就不再赘述
https://blog.csdn.net/weixin_45931009/article/details/107886429#t6
波特率
波特率:波特率表示每秒钟传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,1波特即指每秒传输1个符号。
在串行口通信中,双方的发送与接受的速率需要约定的,而实现这个就是通过控制波特率
四种工作方式对应的波特率计算
方式0的波特率 = fosc/12
方式2的波特率 =(2^SMOD/64)· fosc
方式1的波特率 =(2^SMOD/32)·(T1溢出率)
方式3的波特率 =(2^SMOD/32)·(T1溢出率)
当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。
计算方式: T1 溢出率 = fosc /{12×[256 -(TH1)]}
因为通常使用方式1将T1溢出率的计算公式代入方式1的波特率计算公式即可得到TH1的值
常用波特率与定时器1的关系
80c51串行口结构
其中SBUF是指串行口中的两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,但地址是重叠的。它们都是字节寻址的寄存器,字节地址均为99H。
这个重叠的地址靠读/写指令区分:串行发送数据时,CPU向SBUF写入数据,此时99H表示串行口的发送缓冲寄存器;串行接收数据时,CPU从SBUF读出数据,此时99H表示串行口的接收缓冲寄存器。
串行口初始化
1. 确定T1的工作方式(TMOD寄存器)
2.计算T1的初值,装载TH1,TL1
3.启动T1(TCON 中的TR1位)
4.确定串行口控制(SCON寄存器),串行口在中断方式工作时,要进行中断设置(IE,IP寄存器)
程序示例
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
void UARTinit();
void main()
{
UARTinit();
while(1);
}
void UARTinit()
{
TMOD = 0x20; //确定T1的工作方式,选择方式2,8位自动重装定时/计数器
/*计算初值,装载TH!,TL1*/
TH1 = 0xF3;
TL1 = 0xF3;
PCON = 0x80; //让波特率培增
TR1 = 1; //启动定时/计数器1
SCON = 0x50; //控制串行口,使用方式1 10位异步收发器(8位数据)
ES =1; //打开串行口中断
EA =1; //打开总中断
}
void UARTstart() interrupt 4
{
u8 receivedata; //定义一个接受变量
receivedata = SBUF; //先将SBUF的初值赋给receivedata
RI = 0; //接受完毕,手动将RI(接受中断标志位)清零,取消接受中断申请
SBUF = receivedata; //将新传来的数据发送给SBUF
/*
判断发送是否完毕,TI(发送中断标志位),若仍在发送
则TI=0 一直在while循环中,若发送完毕TI=1,跳出循环,取消发送中断申请
手动让TI=0,准备下次的发送
*/
while(!TI)
TI = 0;
}