串口模块详细讲解

目录

1.串口介绍

2。STC-ISP串口功能介绍

3.接口及引脚定义

4.串口知识点

[4.1 硬件电路](#4.1 硬件电路)

[4.2 电平标准](#4.2 电平标准)

[4.3 相关术语](#4.3 相关术语)

[4.4 常见通信接口比较](#4.4 常见通信接口比较)

[4.5 51单片机的UART](#4.5 51单片机的UART)

[4.6 串口参数及时序图](#4.6 串口参数及时序图)

[4.7 串口模式图](#4.7 串口模式图)

[4.8 串口和中断系统](#4.8 串口和中断系统)

[4.9 串口相关寄存器](#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

cs 复制代码
#include <REGX52.H>

/**
   *@brief	串口初识化,[email protected]
   *@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

cs 复制代码
#ifndef __UART_H__
#define __UART_H__

void UART_Init();
void UART_SendByte(unsigned char Byte);

#endif

main.c

cs 复制代码
#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

cs 复制代码
#include <REGX52.H>

/**
   *@brief	串口初识化,[email protected]
   *@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

cs 复制代码
#ifndef __UART_H__
#define __UART_H__

void UART_Init();
void UART_SendByte(unsigned char Byte);

#endif

main.c

cs 复制代码
#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

相关推荐
一支闲人1 天前
矩阵键盘模块
51单片机·入门教程·适用于新手小白
Camellia03112 天前
嵌入式学习--江协51单片机day2
嵌入式硬件·学习·51单片机
Star Curry3 天前
【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
stm32·单片机·嵌入式硬件·职场和发展·51单片机·学习方法
双叶8363 天前
(51单片机)LCD显示红外遥控相关数字(Delay延时函数)(LCD1602教程)(Int0和Timer0外部中断教程)(IR红外遥控模块教程)
c语言·数据库·c++·单片机·嵌入式硬件·mongodb·51单片机
Camellia03113 天前
嵌入式学习--江协51单片机day4
嵌入式硬件·学习·51单片机
weixin_460186133 天前
基于51单片机的自动洗衣机衣料材质proteus仿真
51单片机·proteus·材质
腾飞的信仰4 天前
51单片机同一个timer 作为定时器和波特率发生器么?
网络·单片机·51单片机
学习噢学个屁4 天前
基于51单片机步进电机控制—9个等级
c语言·单片机·嵌入式硬件·51单片机
Camellia03115 天前
嵌入式学习--江协51单片机day3
嵌入式硬件·学习·51单片机