江协科技51单片机学习- p19 串口通信

 

🚀write in front🚀  
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 

💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚 

前言:

本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。

引用:

51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili

​​​​​​c51语言变量语句意思,C51中循环语句-CSDN博客

串口引用:

正文:

0. 🌿概述

在淘宝上购买了江协科技51单片机开发板套件(普中科技STC51单片机A2型号),就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程,通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。

1. 🚀51单片机串口

🌵串口是一种应用十分广泛的通信接口,串口成本低,容易使用,通信线路简单,可以实现两个是被的互相通信。

🌵单片机的串口可以使单片机与单品阿吉,单片机与电脑,单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。

🌵51单片机内部自带 UART(Universal Aysnchronous Reciver Transmitter,异步收发器),可以实现单片机的串口通信。

⚠️注意DB9串口和单片机的使用的电平信号和TTL是不一样的,DB9串口的电压可以高达15V,如果将DB9串口直接和单片机TTL 串口互相连接,轻则烧坏单片机重则烧坏电脑主板,一定需要注意DB9串口的电压和单片机TTL UART串口的电平电气特性。

串口的硬件电路,串口通信接口有4个通信引脚

VCC电源
TXD接收端
RXD发送端
GND

⚠️当电平标准不一致时,需要加转换芯片。

串口的电平标准

🦖电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有以下三种:

  • TTL电平,+5V表示1,0V表示0
  • RS232电平,-3V~-15V表示1,+3V~+15V表示0
  • RS485电平,两线压法+2V~+6V表示1,-2V~-6V表示0(差分信号)😳

但是,🥺什么是差分信号呢?

9针串口引脚的定义

常见通信方式的比较

名称引脚定义通信方式特点
UARTTXD,RXD全双工,异步点对点通信
I2CSCL,SDA半双工,同步可挂载多个设备
SPISCLK,MOSI,MISO,CS全双工,同步可挂载多个设备
1-WireDQ半双工,异步可挂载多个设备

除此之外常见的通信方式还有 CAN,USB 灯通信方式。

2. 🚀常见的通信术语

全双工:

半双工:

单工:

异步:

同步:

总线:

3. 🚀51单片机里的UART串口

51单片机里的UART串口

  • STC89C52单片机里只有一个UART
  • STC89C52的UART有四种工作模式
    模式0:
    模式1:  (常用)
    模式2:
    模式3:

普中科技C51单片机A2开发板电路原理图中UART的电路接法如下,

 

可以看到CH340的TXD、RXD和单片机CPU的 TXD,RXD是交叉连接的。

4. 🚀串口的参数及时序图

串口的参数及时序图

波特率串口通信速率(发送和接收数据位的间隔时间)
校验位用户数据校验
停止位用于数据帧间隔

奇偶校验

奇校验检查前面数据里1的个数,如果前面数据里1的个数是偶数,就将校验位置1,表示数据中1的个数为奇数个。
偶校验检查前面数据里1的个数,如果前面数据里1的个数是奇数,就将校验位置1,表示数据中1的个数为偶数个。

C51单片机内部串口功能图

  • 😎通过控制 T1 定时器来控制串口UART的波特率。
  • 😎串口的波特率可以通过 2分频+16分频,或者直接16分频。
  • 😎SBUF:串口缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址,写操作时,写入的是发送寄存器,读操作时,读取的是接收寄存器。

 5. 🚀串口相关寄存器和中断

串口相关寄存器和中断,51单片机串口UART串口部分中断进入到单片机内部中断模块,框图如下

😎使用串口还需要使用定时器T1

51单片机和串口相关的寄存器

STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。

串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能,其特使如下:

 SCON寄存器的bit位:

😭 SM0/FE :当PCON寄存器的 SMOD0/PCON.6位为1的时候,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。

当PCON寄存器中SMOD0/PCON.6位为0的时,该位和SM1一起指定串行通信的工作方式,如下表所示:

SM0SM1工作方式功能说明波特率
00方式0同步移位串行方式:移位寄存器波特率是SYSclk/12
01方式18位UART,波特率可变(2^SMOD/32)X(定时器1的溢出率)
10方式29位UART(2^SMOD/64)x SYSclk系统工作时钟频率
11方式39位UART,波特率可变(2^SMOD/32)X(定时器1的溢出率)

当单片机工作在12T模式时,定时器1的溢出率=SYSclk/12(256-TH1)

当单片机工作在6T模式时,定时器1的溢出率=SYSclk/6(256-TH1)

👾SM2:  初学时暂时不关心这里,和单片机的UART工作方式2,方式3有关。

👾REN:允许/禁止接受控制位。由软件置位REN,当REN=1为允许接收状态,可移动串行接收器RxD,开口式接收信息。软件复位REN,即REN=0,则禁止接受。

👾TB8:初学时暂时不关心这里,和单片机的UART工作方式2,方式3有关。

👾RB8:初学时暂时不关心这里,和单片机的UART工作方式2,方式3有关。

👾TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即T1=1,向主机请求中断,相应中断后必须用软件复位,即TI=0。在其他工作方式中,则在停止为开始发送时有内部硬件置位,必须用软件复位。

👾RI:接收中断请求标志位。在方式0中,当串行接收到第8位结束位时器由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须软件复位,即RI=0。在其它方式中,必须由软件复位,即RI=0。

串口SCON位的中断标志位TI和RI的设置和清除。

 😭串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。

😭由于TI和RI以“逻辑或”关系想主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判断,然后分别处理。

😭因此,两个中断请求标志位均不能有硬件自动复位,必须通过软件清零否则将出现一次请求多次响应的错误

🧃 电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1,方式2,方式3的波特率是否加倍。

🧃电源控制寄存器PCON格式如下

 🧃SMOD:波特率选择位。当软件置位SMOD,即SMOD=1,则串行通信方式1,2,3的波特率加倍;SMOD=0,则使个中国方式的波特率加倍。复位SMOD=0。

🧃SMOD0:帧错误检测有效控制位。当SMOD0=1,则SCON寄存器中的SM0/FE(帧错误检测)位用于FW功能;当SMOD=0,则SCON寄存器中的SM0/FE用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD=0。

串行缓冲寄存器 SBUF

 🧃STC89C52系列单片机的串行口缓冲器(SBUF)的地址是 99H,实际是两个缓冲器,写SBUF操作完成待发送数据的加载,读SBUF操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,一个是只写寄存器,一个是只读寄存器。

🧃串行通道内设有数据寄存器。在所有的串行同行方式中,在写入SBUF信号的控制下,把数据装入相同的9位移位寄存器,前面8个为数据字节,最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或者TB8的值装入移位寄存器的第9位,并进行发送。

🧃由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完成将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应该在该帧接收结束前冲SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

6. 单片机串口波特率计算和定时器T1

  • 51单片机UART工作模式1使用定时器/计数器T1 的 8为自动装载模式。
  • 波特率的计算公式
    定时器T1的需要计数(0xFF - 0xFD)= 2 个脉冲溢出。
    晶振频率为 11.0592MHz
    所以每隔  (1 / 11059200) * 2  一次 (单位为秒)
    溢出率为 1/((1 / 11059200) * 2 ) = 1/(1/11059200)*1/2 = 11059200/2 
    又在单片机内部UART工作图里有16位的分频所以最终的 UART = 11059200/2/16 = 

使用 STC_ISP 计算 UART 串口的波特率:

7. 单片机UART发送接收源码编写

#include <REGX52.H>
#include <INTRINS.H>
#include "delay.h"


void Uart_Init(void)		//4800bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	//AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	//AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	
	//启用UART的中断
	ES = 1;
	EA = 1;
	PS = 0;
}

void UART_Send(unsigned char byte)
{
	SBUF = byte;
	while(TI == 0);
	TI = 0;
}

void main()
{
	Uart_Init();
	
	P2 = 0;
	Delay(500);
	P2 = 0xFF;
	Delay(500);
	P2 = 0;
	Delay(500);
	P2 = 0xFF;
	Delay(500);
	P2 = 0;
	Delay(500);
	P2 = 0xFF;
	Delay(500);
	
	while(1)
	{
	
	}
}


void UART_Routine() interrupt 4
{
	if(RI == 1)
	{
		
		P2 = ~SBUF;
		UART_Send(SBUF);
		
		RI = 0;
	}
}

8. 测试结果

测试结果,可以在电脑上的串口助手里看到单片机发送和接收到了UART串口数据。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值