51单片机入门_江协科技_19~20_OB记录的笔记

news2025/3/10 5:53:36

19. 串口通讯

  • 19.1. 串口介绍:
    •串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
    •单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
    •51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
    在这里插入图片描述

  • 19.2. 串口硬件电路
    •简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
    •TXD与RXD要交叉连接,TXD Transmit Exchange Data;RXD Receive Exchange Data
    •当只需单向的数据传输时,可以直接一根通信线
    •当电平标准不一致时,需要加电平转换芯片
    在这里插入图片描述

  • 19.3. 电平标准
    •电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
    •TTL电平:+5V表示1,0V表示0
    •RS232电平:-3-15V表示1,+3+15V表示0
    •RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)

  • 19.4. 接口及引脚定义
    在这里插入图片描述

  • 19.5. 常见通讯接口比较:
    在这里插入图片描述

  • 相关的术语有:
    •全双工:通信双方可以在同一时刻互相传输数据
    •半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
    •单工:通信只能有一方发送到另一方,不能反向传输
    •异步:通信双方各自约定通信速率
    •同步:通信双方靠一根时钟线来约定通信速率
    •总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

  • 19.6. 51单片机的UART
    •STC89C52有1个UART
    •STC89C52的UART有四种工作模式:
    模式0:同步移位寄存器
    模式1:8位UART,波特率可变(常用)
    模式2:9位UART,波特率固定
    模式3:9位UART,波特率可变
    在这里插入图片描述

  • 19.7. 串口参数及时序图
    •波特率:串口通信的速率(发送和接收各数据位的间隔时间)
    •检验位:用于数据验证,奇校验,偶数个1的时,校验位补1,奇数个1的时候,校验位补0;
    •停止位:用于数据帧间隔
    在这里插入图片描述

  • 19.8. 串口模式图
    在这里插入图片描述

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

  • 19.9. 串口和中断系统
    在这里插入图片描述

  • 19.10. 串口相关寄存器
    在这里插入图片描述

  • 19.11. 数据显示模式
    •HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
    •文本模式/字符模式:以原始数据编码后的形式显示

20. 串口向电脑发送数据&电脑通过串口控制LED

  • 20.1. STC89C52手册中的串口介绍如下:

  • STC89C52系列单片机内部集成一个功能很全双工串行通信口,与传统8051单片机的串口完全兼容。设2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。

  • 串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

  • STC89C52系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。

  • STC89C52系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多个并
    行I/O口,或作串—并转换,或用于扩展串行外设等。
    在这里插入图片描述

  • 20.2. 串口通讯程序初始化(新建工程8-1 串口向电脑发送数据),需要增加之前的模块程序“delay_xms.h”
    在这里插入图片描述

  • 20.3. 串口相关寄存器的配置:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • SM0=0, SM1=1, 适配当前学习环境

  • SM2=0;

  • REN=1单片机接受数据,测试程序REN=0先给0用于测试;

  • TB8=0, RB8=0;

  • TI=0必须用软件复位;标志位,发送后必须软件复位置0;

  • RI=0;

  • 综上SCON=0100 0000B=0x40;

在这里插入图片描述

  • SBUF初始化无需配置;

  • PCON初始化配置借助STC-ISP进行波特率的配置;

  • 除此以外还需要配置定时器,这里配置的是定时器1,因为定时器配置中涉及波特率计算,作者借助STC-ISP的工具直接进行配置,配置中的各项参数设置如图:
    在这里插入图片描述

  • 初始化函数如下

void Uart_Init(void)	//4800bps@12.000MHz
{
	PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差
	SCON = 0x50;	//8位数据,可变波特率
	//AUXR &= 0xBF;	//定时器时钟12T模式
	//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;	//设置定时器模式
	TMOD |= 0x20;	//设置定时器模式
	TL1 = 0xF3;		//设置定时初始值
	TH1 = 0xF3;		//设置定时重载值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}
  • 20.4. 测试发送数据0x66;
#include <REGX52.h>
#include "delay_xms.h"

void Uart_Init(void)	//4800bps@12.000MHz
{
	PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差
	SCON = 0x50;	//8位数据,可变波特率
	//AUXR &= 0xBF;	//定时器时钟12T模式
	//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;	//设置定时器模式
	TMOD |= 0x20;	//设置定时器模式
	TL1 = 0xF3;		//设置定时初始值
	TH1 = 0xF3;		//设置定时重载值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void Uart_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);//判断是否发送
	TI=0;		//发送后置0
}
	
void main()
{
	Uart_Init();
	Uart_SendByte(0x66);
	while(1)
	{
		
	}
	
}
  • Proteus中测试验证无误;
    在这里插入图片描述

  • STC-ISP中显示结果无误
    在这里插入图片描述

  • 20.5. 一个问题,如果程序稍微修改一下,重复快速发送数据0x66,有概率实际开发板接收数据为96(作者视频中演示),需要在发送语句后面加入1ms延时,以减少出错概率,main函数修改为如下:

void main()
{
	Uart_Init();
	
	while(1)
	{
		Uart_SendByte(0x66);//重复发送数据66
		delay_xms(1);//1ms的延时用于防止发送数据错误
	}
	
}
  • 20.6. 测试每隔1s发送一个数字,数字累加,程序如下:
#include <REGX52.h>
#include "delay_xms.h"
unsigned char sec;
void Uart_Init(void)	//4800bps@12.000MHz
{
	PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差
	SCON = 0x50;	//8位数据,可变波特率
	//AUXR &= 0xBF;	//定时器时钟12T模式
	//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;	//设置定时器模式
	TMOD |= 0x20;	//设置定时器模式
	TL1 = 0xF3;		//设置定时初始值
	TH1 = 0xF3;		//设置定时重载值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

void Uart_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);//判断是否发送
	TI=0;		//发送后置0
}
	
void main()
{
	Uart_Init();
	
	while(1)
	{
		Uart_SendByte(sec);
		sec++;
		delay_xms(1000);
	}
	
}

模拟仿真结果如下:
在这里插入图片描述

  • 20.7. 示例程序STC-ISP中借用串口助手发送数据,开发板接受到相关的数据后在P2的8个LED灯中显示LED灯的相应状态:
#include <REGX52.h>
#include "delay_xms.h"
#include "Uart.h"


void main()
{
	Uart_Init();
	
	while(1)
	{
		
		
		
	}
	
}

void Uart_Routine() interrupt 4 //函数名任意,主要是interrupt 4定义中断
{
	if(RI==1) //判断接收数据中断
		P2=~SBUF; //接收到的数据取反后赋值P2口
		RI=0; //RI置0,等待下次接收数据判断
	
}
  • 模块化程序的Uart.c程序如下:
#include <REGX52.h>
/**
  * @brief 串口初始化4800bps@12.000MHz
  * @param 无
  * @retval 无
  */


void Uart_Init(void)	//4800bps@12.000MHz
{
	PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差
	SCON = 0x50;	//8位数据,可变波特率,可接收数据
	//AUXR &= 0xBF;	//定时器时钟12T模式
	//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;	//设置定时器模式
	TMOD |= 0x20;	//设置定时器模式
	TL1 = 0xF3;		//设置定时初始值
	TH1 = 0xF3;		//设置定时重载值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA=1;			//启动所有中断
	ES=1;			//启动串口中断
}

/**
  * @brief 串口发送一个字节数据
  * @param Byte 要发送的一个字节数据
  * @retval 无
  */


void Uart_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);//判断是否发送
	TI=0;		//发送后置0
}
	
  • 模块化程序的Uart.h如下:
#ifndef _UART_H_ 
#define _UART_H_  

void Uart_Init();
void Uart_SendByte(unsigned char Byte);

#endif
  • STC-ISP中发送数字11(0001 0001 B)有2个灯亮起,测试没有问题;;

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1569279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的CAN外设

我们的CAN控制器支持最高的通讯速率为1Mb/s&#xff0c;可以自动地接收和发送CAN报文&#xff0c;支持使用标准ID和扩展ID地报文&#xff0c;外设中具有3个发送邮箱&#xff0c;发送报文的优先级可以使用软件控制&#xff0c;还可以记录发送的时间&#xff0c;具有两个3级深度的…

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version&#xff1a;2023-05-15&#xff0c;就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home&#xff0c;点击更多服务&#xff1a; 我们点击Azure OpenAI&#…

MacBook安装使用XMind

MacBook安装使用XMind XMind简介 官方地址: https://www.xmind.cn/ XMind 是一个全功能的思维导图和头脑风暴软件,为激发灵感和创意而生。作为一款有效提升工作和生活效率的生产力工具,受到全球百千万用户的青睐。 XMind 是一款非常实用的商业思维导图软件&#xff0c;应用…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

【Java程序员面试专栏 综合面试指南】5年资深程序员面试指南

基础知识对于5年内工作经验的同学考察相对比较多。包括编程语言、计算机网络、操作系统、设计模式、分布式知识、MySQL、Redis这种。其中随着年限的增长,基础知识考察的会越来越少,例如操作系统基本上只在学生阶段考察,计算机网络对于5年经验来说也考察的相对较少。5年以上对…

蓝桥杯单片机速成8-NE555频率测量

一、原理图 NOTE&#xff1a;使用NE555测量频率之前&#xff0c;需要将J3-15(SIGNAL)与J3-16(P34短接) 在使用矩阵键盘的时候也记得把跳冒拔下&#xff0c;因为有公共引脚P34 又是因为他的输出引脚是P34&#xff0c;所以只能用定时器0来作为计数器进行频率测量了 二、代码实现 …

清明时节雨纷纷,AI达人用Bedrock(第一季)

今天是清明小长假第一天&#xff0c;没有外出踏青&#xff0c;在家体验Amazon Bedrock的强大能力。Amazon Bedrock是专门为创新者量身打造的平台&#xff0c;它提供了构建生成式人工智能应用程序所需的一切。 这次我主要尝试的是通过 Amazon Bedrock 里的 Stability AI SDXL 1…

单目标跟踪 多目标跟踪 目标跟踪 运动估计/光流 OPENCV光流源码分析 基于卷积神经网络的光流预测算法 相关滤波方法

目标跟踪 目标跟踪算法总结 目标跟踪算法是指通过视频分析技术,实时追踪视频序列中的目标并获取其位置、形状、速度等信息的一种算法。目标跟踪在多个领域有着广泛的应用,如监控安防、无人驾驶、人机交互以及虚拟现实等。 目标跟踪算法有多种分类方式。一种分类是基于主动…

Qt | 发布程序(以 minGW 编译器为例)

1、注意:修改 pro 文件后,最好执行“构建”>“重新构建项目”,否则 pro 文件的更改将不会反应到程序上。 2、发布程序的目的:就是让编译后生成的可执行文件(如 exe 文件),能在其他计算机上运行。 一、编译后生成的各种文件简介 Qt Creator 构建项目后产生的文件及目录…

KIl5:Stm32L071下载出现flash download faild “cortex-m0+“的解决方法

首先看看有没有芯片&#xff0c;没有芯片下载一下 下载并在device选择对应的芯片 选择调试器 选择flash

如何保护IP地址不被泄露?

当互联网成为每个家庭的重要组成部分后&#xff0c;IP地址就成了你的虚拟地址。您的请求从该地址开始&#xff0c;然后 Internet 将消息发送回该地址。那么&#xff0c;您担心您的地址被泄露吗&#xff1f; 对于安全意识高或者某些业务需求的用户&#xff0c;如果您正在寻找保护…

《YOLOv8:从入门到实战》专栏介绍 专栏目录

&#x1f31f;YOLOv8&#xff1a;从入门到实战 | 目录 | 使用教程&#x1f31f; 本专栏涵盖了丰富的YOLOv8基础知识源码解析入门实践算法改进项目实战系列教程&#xff0c;专为学习YOLOv8的同学而设计&#xff0c;堪称全网最详细的教程&#xff01;该专栏针对YOLOv8内容的学习…

蓝桥杯备考2

P8839 [传智杯 #4 初赛] 组原成绩 题目描述 花栗鼠科技大学&#xff08;Hualishu University of Science and Technology, HUST&#xff09;的计算机组成原理快要出分了。你现在需要计算你的组原成绩如何构成。 具体来说&#xff0c;组原成绩分为三部分&#xff0c;分别是平…

卡奥斯工业互联网平台分析

一、 背景 卡奥斯是海尔推出的具有中国自主知识产权、全球首家引入用户全流程参与体验的工业互联网平台。其核心是大规模定制模式&#xff0c;通过持续与用户交互&#xff0c;将硬件体验变为场景体验&#xff0c;将用户由被动的购买者变为参与者、创造者&#xff0c;将企业由原…

刷题之Leetcode34题(超级详细)

34. 在排序数组中查找元素的第一个和最后一个位置 力扣链接(opens new window)https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/ 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始…

3. python练习题3-自由落体

3. python练习题3-自由落体 【目录】 文章目录 3. python练习题3-自由落体1. 目标任务2. 解题思路3. 知识回顾-%占位符格式化处理3.1 概述3.2 占位符的多种用法3.3 格式化操作符辅助指令3.4 将整数和浮点数格式化为字符串 4. 解题思路4.1 球第1次下落4.2 球第2次下落 5. 最终代…

数字化导师坚鹏:招商银行数字化转型的4次模式升级与5大关键举措

招商银行数字化转型的4次模式升级与5大关键举措 招商银行数字化转型取得了较大的成功&#xff0c;从目前的财务数据来看&#xff0c;招商银行在数字化转型领域已经成为国内最优秀的股份制银行。招商银行是如何取得数字化转型成功的&#xff1f;从招商银行数字化转型的4次模式升…

MHA高可用配置与故障切换

前言&#xff1a; MHA高可用故障就是单点故障&#xff0c;那么我们如何解决单点故障MHA中Master如何将故障的机器停止&#xff0c;使用备用的Slave服务器 一 MHA定义 MHA&#xff08;MasterHigh Availablity&#xff09;是一套优秀的Mysql高可用环境下故障切换和主从复制的…

SpringBoot参数校验@Valid 和 @Validated注解使用详解

JSR-303 是 JAVA EE 6 中的一项子规范&#xff0c;叫做 Bean Validation&#xff0c;官方参考实现是Hibernate Validator。 注意&#xff1a;JSR-303实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。 Spring MVC 3.x 之中也大力支持 JS…

备战蓝桥杯---多路归并与归并排序刷题

话不多说&#xff0c;直接看题 1. 我们考虑一行一行合并&#xff0c;一共m次&#xff0c;我们合并两个并取前n小&#xff0c;那么我们怎么取&#xff1f; 我们采用分组的思想&#xff1a; 我们选第一列的min,然后把后面那个再纳入考虑&#xff0c;用优先队列实现即可。 下面…