【51单片机】串口(江科大)

news/2025/1/16 2:58:14/

8.1串口通信

1.串口介绍

在这里插入图片描述

2.硬件电路

在这里插入图片描述

3.电平标准

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

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

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

4.常见通信接口

在这里插入图片描述
补充:相关术语(具体可在计算机网络或通信原理中学习)

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

·半双工:通信双方可以互相传输数据,但必须分时复用一根数据线(在同一时刻只能单向传输)

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

·异步:通信双方各自约定通信速率(没有时钟线)

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

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

5.51单片机的UART

在这里插入图片描述

6.串口参数即时序图

· 波特率:串口通信的速率(发送和接收各数据位的间隔时间)
· 检验位:用于数据验证
· 停止位:用于数据帧间隔
在这里插入图片描述

7.串口模式图

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

当要发送数据时,数据从总线传输到SBUF,通过控制门传输到TXD,将数据发送出去,控制门是一些控制逻辑电路,不用关心,发送数据由发送控制器来进行控制。接收数据时,数据从RXD接收到,通过接收控制器将数据送到移位寄存器,再送到SBUF。接收数据是由中断来进行的,数据传输速率由中间的逻辑电路(定时器1)来控制(波特率)

8.串口和中断系统

在这里插入图片描述

9.串口相关寄存器

在这里插入图片描述

8.2串口向电脑发送数据

1.配置寄存器

(1)SCON
在这里插入图片描述
该单片机使用模式一,8位UART
SMO/FE用于帧错误检测,8为UART不需要,所以SMO/FE=0
在这里插入图片描述

SM0=0,SM1=1
在这里插入图片描述
因为只有方式1,所以SM2不用管,配为0

REN:允许/禁止串行接收控制位。由软件置位REN,即REN=1允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。此时不需要,先给0

TB8:在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0。
RB8:在方式2或方式3,是接收到的第9位数据。
方式1不需要,所以TB8=0,RB8=0

TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。
RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=0。
初始化配置TI=0,RI=0
在这里插入图片描述
综上SCON=0x40;
(2)SBUF
SBUF为接收发送寄存器,初始化不需要配置
(3)PCON
在这里插入图片描述
(4)IE,IPH,IP,SADEN,SADDR都不需要配置

2.配置定时器

在这里插入图片描述

在这里插入图片描述
所以TMOD &= 0x0F; TMOD |= 0x20;

3.定时器初值

定时器初值与波特率有关,可以用STC-ISP软件生成波特率,完成串口的配置

本单片机是11.0592MHz的频率,没有误差,所以在直接就用9600波特率,不需要波特率倍速来减小误差
在这里插入图片描述

SCON先改为0x40

STC89C52没有AUXR这个寄存器,直接将那两行删除就行

定时器1只用作波特率发生器,不需要其产生中断,故与中断相关的配置就不需要了

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"unsigned char Sec;void main()
{UART_Init();			//串口初始化while(1){UART_SendByte(Sec);	//串口发送一个字节Sec++;				//Sec自增Delay(1000);		//延时1秒}
}

UART.c

#include <REGX52.H>/*** @brief  串口初始化,9600bps@11.0592MHz* @param  无* @retval 无*/
void UART_Init()
{SCON=0x40;PCON &=0x7F;TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断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

按下复位键,看见接收缓冲区收到数据,说明发送数据成功
在这里插入图片描述

8.3电脑通过串口控制LED

该实验需要接收数据,故SCON的REN位为1,SCON改为0x50

接收数据需要中断才能进行,所以需要中断使能(这个中断是串口中断,不是定时器1中断)
UART.c

#include <REGX52.H>/*** @brief  串口初始化,9600bps@11.0592MHz* @param  无* @retval 无*/
void UART_Init()
{SCON=0x50;PCON |= 0x7F;TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xFD;		//设定定时初值TH1 = 0xFD;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1EA=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;}
}
*/

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)					//如果接收标志位为1,接收到了数据{P2=~SBUF;				//读取数据,取反后输出到LEDUART_SendByte(SBUF);	//将受到的数据发回串口RI=0;					//接收标志位清0}
}

补充:数据显示模式
·HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

·文本模式/字符模式:以原始数据编码(ASCII码)后的形式显示

例如,发送数据为HEX模式,接收数据为文本模式,发送数据30则接收到0,因为数字0对应的ASCII码为0x30

发送数据为文本模式,接收数据为HEX模式,发送数据A则接收到41,因为A对应的ASCII码为0x41


http://www.ppmy.cn/news/1351807.html

相关文章

web3知识体系汇总

web3.0知识体系 1.行业发展 2. web3的特点&#xff1a; 1、统一身份认证系统 2、数据确权与授权 3、隐私保护与抗审查 4、去中心化运行 Web3.0思维技术思维✖金融思维✖社群思维✖产业思维”&#xff0c;才能从容理解未来Web3.0时代的大趋势。 3.技术栈 Web3.jsSolidit…

LeetCode “AddressSanitizer:heat-use-after-free on address“问题解决方法

heat-use-after-free &#xff1a; 访问堆上已经被释放的内存地址 现象&#xff1a;同样代码在LeetCode上报错&#xff0c;但是自己在IDE手动打印并不会报错 个人猜测&#xff0c;这个bug可能来源于LeetCode后台输出打印链表的代码逻辑问题。 问题描述 题目来自LeetCode的8…

C#,数值计算,矩阵的行列式(Determinant)、伴随矩阵(Adjoint)与逆矩阵(Inverse)的算法与源代码

本文发布矩阵&#xff08;Matrix&#xff09;的一些初级算法。 一、矩阵的行列式&#xff08;Determinant&#xff09; 矩阵行列式是指矩阵的全部元素构成的行列式&#xff0c;设A(a)是数域P上的一个n阶矩阵&#xff0c;则所有A(a)中的元素组成的行列式称为矩阵A的行列式&…

“反内卷”代码书写原则

有人相爱&#xff0c;有人夜里开车看海。有人看着这些代码一句话也说不出来。这是一个你的项目应该遵循的垃圾代码书写准则&#xff0c;只有这样写了才能让人看不懂&#xff0c;这才是真正的反内卷之道&#xff0c;请恪守以下原则&#xff0c;时刻铭记&#xff0c;切勿反向操作…

【JavaScript】如何压缩和解压数组

两个或多个数组的 Zipping&#xff0c;这就像把不同口袋里的零食倒在一起&#xff0c;拼成一盒豪华版“数组什锦礼包”。想象一下 const arrays [[a, b], [1, 2], [true, false]]; const zipped [[a, 1, true], [b, 2, false]]; 瞧&#xff0c;现在是不是觉得Zipping这个概念…

【go语言】一个简单HTTP服务的例子

一、Go语言安装 Go语言&#xff08;又称Golang&#xff09;的安装过程相对简单&#xff0c;下面是在不同操作系统上安装Go语言的步骤&#xff1a; 在Windows上安装Go语言&#xff1a; 访问Go语言的官方网站&#xff08;golang.org&#xff09;或者使用国内镜像站点&#xff0…

模型 煤气灯效应

系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。情感操控&#xff0c;认知扭曲。 1 煤气灯效应的应用 1.1 电影《煤气灯下》故事 宝拉继承了姨妈的一大笔遗产&#xff0c;居心不良的安东得知后&#xff0c;就动起了这笔钱的念头。安东利用…

山东:优化提升恶劣天气高影响路段保障工作

2023年9月1日&#xff0c;山东省气象局联合省公安厅、省交通运输厅联合印发《2023年山东省恶劣天气高影响路段优化提升气象保障工作方案》&#xff08;以下简称《方案》&#xff09;&#xff0c;扎实推进恶劣天气高影响路段优化提升气象保障工作&#xff0c;为公路网安全畅通提…