51单片机学习记录(12)“串口通信“

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值