🚀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针串口引脚的定义
常见通信方式的比较
名称 | 引脚定义 | 通信方式 | 特点 |
UART | TXD,RXD | 全双工,异步 | 点对点通信 |
I2C | SCL,SDA | 半双工,同步 | 可挂载多个设备 |
SPI | SCLK,MOSI,MISO,CS | 全双工,同步 | 可挂载多个设备 |
1-Wire | DQ | 半双工,异步 | 可挂载多个设备 |
除此之外常见的通信方式还有 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一起指定串行通信的工作方式,如下表所示:
SM0 SM1 工作方式 功能说明 波特率 0 0 方式0 同步移位串行方式:移位寄存器 波特率是SYSclk/12 0 1 方式1 8位UART,波特率可变 (2^SMOD/32)X(定时器1的溢出率) 1 0 方式2 9位UART (2^SMOD/64)x SYSclk系统工作时钟频率 1 1 方式3 9位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串口数据。