当前位置: 首页 > news >正文

串口模块详细讲解

目录

1.串口介绍

2。STC-ISP串口功能介绍

3.接口及引脚定义

4.串口知识点

4.1 硬件电路

4.2 电平标准

4.3 相关术语

4.4 常见通信接口比较

4.5 51单片机的UART

4.6 串口参数及时序图

4.7 串口模式图

4.8 串口和中断系统

4.9 串口相关寄存器

5.串口向电脑发送信息代码

第一步:

第二步:

第三步:

第四步:

第五步:

第六步:

第七步:

最终代码:

代码模块:

UART.c

UART.h

main.c

6.电脑通过串口控制LED代码

第一步:

第二步:

第三步:

第四步:

第五步:

第六步:

最终代码:

代码模块:

UART.c

UART.h

main.c

补充:波特率计算


1.串口介绍

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

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

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

2。STC-ISP串口功能介绍

向单片机发送数据(下面框),返回(上框)

3.接口及引脚定义

DB9串口传输数据(注意使用的电压是否一致)使用RS232或RS485电平

4.串口知识点

4.1 硬件电路

简单双向串口通信有两根通信线(发送端TXD和接收端RXD) TXD与RXD要交叉连接

当只需单向的数据传输时,可以直接一根通信线

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

4.2 电平标准

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

TTL电平:+5V表示1,0V表示0

RS232电平:-3~-15V表示1,+3~+15V表示0

RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

4.3 相关术语

全双工:通信双方可以在同一时刻互相传输数据

半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

单工:通信只能有一方发送到另一方,不能反向传输

异步:通信双方各自约定通信速率

同步:通信双方靠一根时钟线来约定通信速率

总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

4.4 常见通信接口比较

4.5 51单片机的UART

STC89C52有1个UART STC89C52的UART有四种工作模式:     

模式0:同步移位寄存器     

模式1:8位UART,波特率可变(常用)   

 模式2:9位UART,波特率固定     

模式3:9位UART,波特率可变

4.6 串口参数及时序图

波特率:串口通信的速率(发送和接收各数据位的间隔时间)

检验位:用于数据验证

停止位:用于数据帧间隔

4.7 串口模式图

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

4.8 串口和中断系统

4.9 串口相关寄存器

5.串口向电脑发送信息代码

第一步:

将延迟函数复制过来并导入工程里面

第二步:

配置串口控制寄存器,配置模式1最常用,REN允许接收给1,不允许接收给0(也可以给1外面不给发就行)

第三步:

发送完置1(硬件只负责),但必须软件复位置0

第四步:

将寄存器配置:

SCON=0x40(串行寄存器配置上面图红色字体部分);PCON=0(波特率)

下图为定时器配置:

这里定时器1,没有定时器0,所有要把高位修改(不影响高低位配置用“”& |“”这两个方式)

第五步:

自动重装:

第六步:

STC-ISP的串口功能,数据调节到我们这款单片机的适应的数据

第七步:

生成代码复制过来修改一下配置

发送数据端

调用单项发送完成

模块化串口设置(完整代码)

串口初始化和单片机向电脑发送一个字节递增数据数据

调用

最终代码:

代码模块:

Delay.c和Delay.h可以在小编往期的博客里面找到

UART.c

#include <REGX52.H>/***@brief	串口初识化,4800bps@12.000MHz*@param	无*@retval	无*/
void UART_Init()
{SCON = 0x40;PCON |= 0x80;	TMOD &= 0x0F;			//设置定时器模式TMOD |= 0x20;			//设置定时器模式TL1 = 0xF3;			//设置定时初始值TH1 = 0xF3;			//设置定时重载值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时
}/***@brief	串口发送一个字节数据*@param	Byte 要发送的一个字节数据*@retval	无*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}

UART.h

#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"unsigned char Sec;void main()
{UART_Init();while(1){UART_SendByte(Sec);Sec++;Delay(1000);}
}

6.电脑通过串口控制LED代码

第一步:

复制一份一修改(收:要中断系统,配置寄存器REN置1接收使能)

所有寄存器设置如下配置:

第二步:

配置中断

中断配置代码如下:

第三步:

中断寄存器修改后总如下,其他不用修改

第四步:

中断号4:

第五步:

中断验证:

接收中断标志RI

第六步:

函数不能在主函数又在中断函数里面,调用,向单片机发送数据代码:第二功能实现:

最终代码:

代码模块:

UART.c

#include <REGX52.H>/***@brief	串口初识化,4800bps@12.000MHz*@param	无*@retval	无*/
void UART_Init()
{SCON = 0x50;PCON |= 0x80;	TMOD &= 0x0F;			//设置定时器模式TMOD |= 0x20;			//设置定时器模式TL1 = 0xF3;			//设置定时初始值TH1 = 0xF3;			//设置定时重载值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时EA = 1;ES = 1;
}/***@brief	串口发送一个字节数据*@param	Byte 要发送的一个字节数据*@retval	无*/
void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0);TI = 0;
}/*串口中断函数模板,要用的时候移到主函数里面
void UART_Routine() interrupt 4
{if(RI == 1){RI = 0;}
}
*/

UART.h

#ifndef __UART_H__
#define __UART_H__void UART_Init();
void UART_SendByte(unsigned char Byte);#endif

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"void main()
{UART_Init();while(1){}
}void UART_Routine() interrupt 4 //中断子函数
{if(RI == 1){P2 = ~SBUF;UART_SendByte(SBUF);RI = 0;}
}

补充:波特率计算

我们串口初识化位0xF3(十六进制数字)=243(十进制数字),寄存器每个256会溢出一次,也就是每隔13us会溢出一次,寄存器的溢出率位1/13约等于0.07692MHZ。根据串口模式图计算 波特率:0.07692/16约等于0.00480769MHZ=4807.69HZ

相关文章:

  • Python-简单网络编程 I
  • 论文精读:YOLO-UniOW: Efficient Universal Open-World Object Detection
  • MES管理系统构建智能制造时代下的全面质量管理体系
  • Spring事务失效的全面剖析
  • windows c++ (9) 程序内注册服务并修改登录账户
  • web 自动化之 yaml 数据/日志/截图
  • 关于github使用总结
  • GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现
  • 集合-进阶
  • 生产排产系统正从传统计划工具向智能化、协同化方向演进
  • 安科瑞能量管理系统在徐州某电池厂新能源储能柜的应用
  • TDengine 做为 Spark 数据源
  • spark-local模式
  • Linux513 rsync本地传输 跨设备传输 一
  • openFeign远程调用
  • 中国版Cursor:基于CodeBuddy与EdgeOne Pages的在线键盘测试工具开发方案
  • 【C++】多线程和多进程
  • 【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
  • VR和眼动控制集群机器人的方法
  • Flannel Host-gw模式的优缺点
  • 中巴续签双边本币互换协议,进一步深化金融战略合作
  • 美国明尼苏达州发生山火,过火面积超80平方公里
  • 尊严的代价:新加坡福利体系下的价值困境
  • 飙升至熔断,巴基斯坦股市两大股指收盘涨逾9%
  • 浙江首个核酸药谷落子杭州,欢迎订阅《浪尖周报》第23期
  • 普京提议恢复直接谈判,泽连斯基:望俄明日停火,乌愿谈判