51单片机的串口

目录

一、串口的介绍

 1、硬件电路

二、51单片机的UART

1、串口参数及时序图

2、串口模式图

3、串口和中断系统结构图

4、串口相关寄存器

 三、串口向电脑发送数据

1、通过STC-ISP软件

四、电脑通过串口控制LED

1、主函数

2、 UART串口通信模块

一、串口的介绍

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

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

51但潘集内部自带UART(通用异步收发器),可实现单片机的串口通信

 1、硬件电路

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

TXD与RXD要交叉连接

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

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

注:电平标准

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

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

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

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

扩展:常见通信接口比较

二、51单片机的UART

STC89C52有一个UART

STC89C52的UART有四种工作模式:

模式0:同步移位寄存器

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

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

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

注:我们这里也主要用模式1的形式

1、串口参数及时序图

2、串口模式图

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

3、串口和中断系统结构图

4、串口相关寄存器

这里我们根据串口中断结构图通过串口寄存器来配置,开启串口通信

 三、串口向电脑发送数据

1、通过STC-ISP软件

在STC-ISP软件中,有自带的波特率计算器,可以计算定时器的初值

如果板子型号是89C52RC,则选择如下参数

系统频率:11.0592MHZ

波特率:4800

UART选择:串口1

UART数据位:8位数据

波特率发生器:定时器1(8位自动重载)

定时器时钟:12T(FOSC/12)

注意:在江科大视频中的板子系统频率是12MHZ,所以他选择了波特率倍速,来减小误差,但是89C52RC的频率是11.0592MHZ,因此不需要选择波特率倍速

void UartInit(void)		//波特率计算器自动生成的串口初始化
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//这里打开了REN接收使能位
 
	AUXR &= 0xBF;		//89C52单片机中没有这项选择,更高级单片机才有
	AUXR &= 0xFE;		
 
	TMOD &= 0x0F;		//设置定时器工作方式
	TMOD |= 0x20;		
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}
void UART_Init()            //简化后的串口初始化
{
	SCON=0x40;				//0100 0000,SM0和SM1为0 1,采用方式1,REN位为0,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
 
}

2、编写程序

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

UART串口通信模块

#include <REGX52.H>
 
/**
  * @brief  串口初始化,4800bps@11.0592MHz
  * @param  无
  * @retval 无
  */
  
void UART_Init()			//串口初始化
{
	SCON=0x40;				//0100 0000,SM0和SM1为0 1,采用方式1,REN位为0,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
 
}
 
/**
  * @brief  串口发送的一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
 
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;				//赋值给SBUF会直接将数据通过串口发出
	while(TI==0);			//TI=0时循环,发送完一帧数据后,TI=1时,跳出循环
	TI=0;
}

四、电脑通过串口控制LED

1、主函数

#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;					//将电脑发送到SBUF的值赋值给P2
		UART_SendByte(SBUF);		//将电脑发送到单片机的数据同时也发送到电脑
		RI=0;
	}
 
}

2、 UART串口通信模块

#include <REGX52.H>
 
/**
  * @brief  串口初始化,4800bps@11.0592MHz
  * @param  无
  * @retval 无
  */
  
void UART_Init()			//串口初始化
{
	SCON=0x50;				//0101 0000,SM0和SM1为0 1,采用方式1,REN位为1,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
	EA=1;					//启动中断总允许位
	ES=1;					//启动串口中断
}
 
/**
  * @brief  串口发送的一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
 
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;				//赋值给SBUF会直接将数据通过串口发出
	while(TI==0);			//TI=0时循环,发送完一帧数据后,TI=1时,跳出循环
	TI=0;
}
 
/*串口中断函数模板
void UART_Routine() interrupt 4
{
	if(RI==1);
	{
		RI=0;
	}
}
*/

<think>好的,用户之前问了关于公网IP的问题,现在又问串口线的作用。首先,我需要确定用户的技术背景。可能他们正在学习网络或硬件相关的知识,或者在搭建某个项目时需要连接设备。 接下来,用户的问题是关于串口线的用途。我需要先回忆串口线的基本概念,包括它的类型、工作原理和常见应用场景。然后,要确保内容结构清晰,按照用户之前喜欢的格式,比如分点、技术原理、应用场景等。 用户之前的问题回答中有使用LaTeX公式和代码块,但这次问题可能不需要太多数学公式。不过需要保持类似的格式,比如使用项目符号、表格或者流程图。另外,用户可能需要具体的例子,比如在路由器、工控设备中的应用,或者和调试相关的场景。 还要考虑用户可能的深层需求。他们可能遇到设备连接的问题,或者想了解不同线缆的区别。比如,为什么选择串口而不是USB或者其他接口。这时候需要解释串口的特点,比如稳定性、长距离传输、低层调试等。 需要注意常见的误区,比如串口线是否需要交叉线,或者不同设备之间的兼容性。可能还需要提到现在串口的使用场景是否被其他技术取代,比如USB转串口的使用,或者在工业环境中的持续需求。 另外,安全建议也很重要,比如配置参数时的注意事项,防止数据泄露或设备损坏。这部分可以放在常见问题或安全建议中。 最后,确保回答符合用户要求的格式,使用中文,结构清晰,分点明确,有实际应用例子和解决方案。可能还需要比较串口和其他接口的优缺点,帮助用户全面理解。</think>### **串口线核心解析** --- #### **一、基础定义** **串口线**(Serial Cable)是一种基于**串行通信协议**的物理连接线,用于在两个设备间**逐比特(bit-by-bit)** 传输数据。其核心特征包括: - **通信方式**:异步传输(无需统一时钟信号) - **接口标准**:常见类型包括RS-232、RS-485、TTL等 - **典型连接器**:DB9(9针)、DB25(25针)、RJ45(网络接口改造) --- #### **二、技术原理图解** ``` [数据传输流程] 发送端 → 串口线 → 电平转换 → 接收端 (TxD/RXD信号线) ``` 1. **信号标准** - **RS-232**:电压范围 ±3~15V(逻辑1:-3~-15V,逻辑0:+3~+15V) - **TTL**:0V表示逻辑0,+5V(或+3.3V)表示逻辑1 $$ V_{RS232} = \pm (3 \sim 15)V \quad vs \quad V_{TTL} = 0/+5V $$ 2. **硬件流控** 通过RTS/CTS引脚实现流量控制,公式化描述: $$ \text{发送端RTS有效} \iff \text{接收端CTS就绪} $$ --- #### **三、核心功能** 1. **设备调试** - 路由器/交换机Console口配置(波特率常用9600/115200) - 工业PLC程序烧录 2. **数据传输** - 早期POS机与电脑连接 - 医疗设备数据采集(如心电图机) 3. **系统控制** - 自动化产线设备控制 - 卫星通信地面站指令发送 --- #### **四、典型应用场景** | **场景** | **线缆类型** | **技术参数示例** | |-------------------------|--------------------|-------------------------------| | 思科路由器配置 | RS-232转RJ45 | 波特率9600, 8N1(数据位8/无校验/停止位1) | | 树莓派GPIO调试 | USB转TTL串口线 | 电压3.3V, 波特率115200 | | 工业传感器网络 | RS-485双绞线 | 差分信号传输,最大距离1200米 | | 老式打印机连接 | DB9直连线 | 最大传输速率20kbps | --- #### **五、接线标准与线序** **RS-232 DB9标准连接(DTE↔DCE)** | 引脚号 | 名称 | 功能 | |--------|-------|----------------------| | 2 | RxD | 接收数据 | | 3 | TxD | 发送数据 | | 5 | GND | 信号地 | | 7 | RTS | 请求发送 | | 8 | CTS | 清除发送 | **⚠️ 交叉线场景** 当连接两台DTE设备(如电脑↔电脑)时,需交叉连接TxD与RxD: $$ \text{设备A-TxD} \leftrightarrow \text{设备B-RxD} $$ $$ \text{设备A-RxD} \leftrightarrow \text{设备B-TxD} $$ --- #### **六、现代应用变体** 1. **USB转串口线** 通过CH340、CP2102等芯片实现USB与TTL/RS-232的协议转换 ```bash # Linux查看串口设备 dmesg | grep ttyUSB ``` 2. **无线串口模块** 使用蓝牙/WiFi(如HC-05、ESP8266)实现无线串口通信 $$ \text{传输距离} = \begin{cases} \text{蓝牙Class2} \approx 10m \\ \text{WiFi} \approx 100m \end{cases} $$ 3. **以太网串口服务器** 将串口设备接入网络(TCP/IP封装),支持远程访问 ```python # Python串口通信示例 import serial ser = serial.Serial('/dev/ttyUSB0', 9600) ser.write(b'AT+COMMAND\r\n') ``` --- #### **七、常见问题与解决方案** | **故障现象** | **诊断方法** | **解决方案** | |-------------------------|-------------------------------|-------------------------------| | 无法识别串口设备 | 检查`dmesg`输出 | 1. 安装CH340驱动<br>2. 更换USB端口 | | 数据传输乱码 | 校验波特率/数据位/停止位设置 | 使用示波器测量实际波特率 | | 长距离通信不稳定 | 测试线路阻抗(万用表) | 1. 改用RS-485<br>2. 增加终端电阻 | | USB转串口频繁断开 | 监测USB供电电压 | 使用带外接电源的USB Hub | --- #### **八、选型建议** 1. **工业环境** 选择带光电隔离的串口线(如MOXA UPort 1150),防雷击/抗干扰 2. **嵌入式开发** FT232RL芯片的USB转TTL线(稳定性优于CH340) 3. **高波特率需求** 确认线材支持速率(CAT5e网线改造可达1Mbps) --- #### **九、安全注意事项** 1. **热插拔风险** 避免带电插拔RS-232设备(可能损坏接口芯片) 2. **电压兼容性** TTL(5V)与RS-232(±12V)直接连接需电平转换器 3. **数据安全** 明文传输易被窃听,敏感场景应启用串口数据加密 --- 如需进一步诊断具体连接问题,可提供以下信息: 1. 设备接口类型(DB9/RS-485等) 2. 使用的转换器型号 3. `minicom`或`Putty`的通信参数配置截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值