PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据?

首先要打开SCON中的串行接收控制位REN。当REN=1时为允许接收状态,可以接收信息。
因此令SCON = 0x50;

怎么知道收到数据?

利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI=1,向主机请求中断,响应中断后必须用软件复位。
在程序中,不断查询RI的值,当RI=1时进行检查PC端发送的值做出对应的操作,注意要软件复位!代码如下:

#include "reg52.h"
#include <intrins.h>sfr AUXR = 0x8E;
sbit led = P3^7;void Delay1000ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;	//定义串口工作方式为方式1,8位UART//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可AUXR = 0x01;TMOD &= 0x0F;TMOD |= 0x20;	//配置定时器1为8为自动重载定时器TL1 = 0xFD;TH1 = 0xFD;	//9600波特率初值TR1 = 1;	//打开中断
}void sendByte(char data_msg){SBUF = data_msg;//当8位数据没有传送结束时,卡在while循环中while(!TI);	//TI发送中断请求标志位,第8位数据传送结束时,硬件自动置1TI = 0;
}void sendString(char* str){while(*str != '\0'){sendByte(*str++);}
}void main()
{char cmd;led = 1;//配置C51串口的通信方式UartInit();while(1){Delay1000ms();//往发送缓冲区写入数据,就完成数据的发送sendString("hello world\r\n");if(RI == 1){RI = 0;cmd = SBUF;if(cmd == 'o'){led = 0;}if(cmd == 'c'){led = 1;}}}
}

但是操作过程中会发现,o开灯和c灭灯的速度会比较慢,原因出在while循环中会不断的delay,因此我们可以考虑引入串口中断。
在这里插入图片描述
在这里插入图片描述
因此我们可以在程序最后面添加一个中断函数 interrupt 4;但是我们并不知道这个是对接收进行中断还是对发送进行中断,因此我们可以分为接收和发送两个方面进行编程:

void Uart_Handler() interrupt 4
{if(RI){	//中断处理函数中,对于接收中断的响应RI = 0;cmd = SBUF;if(cmd == 'o'){led = 0;}if(cmd == 'c'){led = 1;}}if(TI);
}

在这里插入图片描述
查中断系统结构图,在打开UART中断时需要打开ES和EA,即在串口初始化函数中进行修改:

void UartInit(void)		//9600bps@11.0592MHz
{SCON = 0x50;	//定义串口工作方式为方式1,8位UART//PCON初值为00x1 0000符合我们的要求,我们只需要SMOD=0不加倍即可AUXR = 0x01;TMOD &= 0x0F;TMOD |= 0x20;	//配置定时器1为8为自动重载定时器TL1 = 0xFD;TH1 = 0xFD;	//9600波特率初值TR1 = 1;	//打开中断EA = 1;	//开启总中断ES = 1;	//开启UART中断
}

串口协议

一帧为10位,1位起始位,8位数据位(低位在先)和1位停止位。
在这里插入图片描述
start bit为起始位0,接下去数据位从低位开始依次传输,到stop bit停止位1结束。此时会让TI置1
在这里插入图片描述
接收的过程也类似,start bit为起始位0,接下去数据位从低位开始依次传输,到stop bit停止位1结束。同时拉高RI。

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

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

相关文章

机器人系统ros2-开发实践04-ROS2 中 tf2的定义及示例说明

1. what ros2 tf2 &#xff1f; tf2的全称是transform2&#xff0c;在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;它是专门用于处理和变换不同坐标系间位置和方向的库。这个名字来源于“transform”这个词&#xff0c;表示坐标变换&#xff0c;而“2”则…

【抽代复习笔记】17-群(十一):置换的练习题(1)

练习1&#xff1a;计算&#xff1a; 解&#xff1a; 解析&#xff1a;①左边的置换是1保持不变&#xff0c;2变成3&#xff0c;3变成4&#xff0c;4变成5&#xff0c;5变成2&#xff0c;因此可以简写为(2345)&#xff1b;右边的置换是2和5保持不变&#xff0c;1变成3&#xff…

NPDP产品经理认证报考条件及流程

你是否经常感到无法准确了解用户需求&#xff0c;市场细分让你困扰不已&#xff1f;你是否经常觉得自己创意匮乏&#xff0c;无法持续进行创新&#xff1f;你是否时常发现沟通效率低下&#xff0c;团队协作总是充满摩擦&#xff1f;你是否因为提出的方案被否决而感到失望和挫折…

Git从旧的仓库迁移到新的仓库后clone lfs的文件出现错误

一、问题描述 利用git转移仓库从gitee的testA.git仓库到coding的testB.git利用命令 git clone --mirror gitgitee.com:dev/testA.git cd testA.git git push --mirror gitgit.e.coding.test.clund:dev/testB.git 可以迁移成功&#xff0c;但是在clone新的仓库时候会发现存在l…

购物网站-批发

https://p4psearch.1688.com/hamlet.html 1688&#xff0c;批发采购为主&#xff0c;货物全 https://www.wsy.com/ 网商园&#xff1a;鞋包衣服&#xff0c;进价略低 https://www.yiwugo.com/ 义乌购&#xff1a;义乌小商品城线上平台 http://www.k3.cn/ 开山网&#xff1a;专门…

k8s环境部署gpu以及CUDA兼容性分析

本文记录和学习在实用gpu搭建k8s支持上层应用时的功能实践和遇到的问题。 1. 基础概念 CUDA本质上就是NVIDIA专为通用高性能并行计算设计的一套计算平台和编程模型&#xff0c;换句话使用GPU并行编程的规范方法&#xff0c;所以CUDA在软件层面包含了众多库&#xff0c; 那这里…

万兴PDF专家 PDFelement Pro v10.3.8 破姐版!

&#x1f9d1;‍&#x1f4bb;万兴PDF专家 PDFelement Pro v10.3.8 破姐版 (https://docs.qq.com/sheet/DRVVxTHJ3RXJFVHVr)

docker mysql更新升级版本

一、环境说明 操作系统&#xff1a;Centos7 数据库版本&#xff1a;MySql 8.0.22 数据库中数据量不大&#xff0c;处于开发/测试环境&#xff0c;风险较低 二、升级原因 升级是因为测评漏洞&#xff0c;在进行国家三级等级保护测评过程中&#xff0c;漏扫发现多个MySql漏洞…

Linux学习之IP协议

前言&#xff1a; 在学习IP协议i前&#xff0c;我们其实知道网络协议栈是一层层的&#xff0c;上层封装好之后就传给下层&#xff0c;对于我们治安学习到的TCP协议&#xff0c;在对数据进行封装之后&#xff0c;并不是直接就将数据进行传输&#xff0c;而是交给下一层网络层进…

C++顺序容器3——容器适配器

容器适配器 除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff1a;stack、queue和priority_queue。 适配器&#xff08;adaptor&#xff09;是标准库中的一个通用概念。容器、迭代器和函数都有适配器。 本质上&#xff0c;一个适配器是一种机制&#xff…

C++11 右值与移动语义

前言&#xff1a; 我们首先汇总一下在C11中新的变化&#xff1a; 1、新容器 —— unodered_xxx 2、新接口 cbegin等&#xff0c;无关痛痒initializer_list系列的构造push_xxx / insert / emplace 等增加右值引用插入版本&#xff0c;意义重大&#xff0c;提高效率容器新增移…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;一&#xff09;基本概念-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;二&#xff09;代码组织原则-CSDN博客 DDD基本概念 DDD 是一种面向复杂需求的软件设计方法&#xff0c;将软件开…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图&#xff08;引js文件版&#xff09; 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue&#xff0c;创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

通信光缆主要敷设方式有哪些(续)

在《通信光缆主要敷设方式有哪些》一文中&#xff0c;介绍了光缆的直埋、架空和管道敷设方式。此外&#xff0c;根据敷设场景的不同&#xff0c;光缆的常见敷设方式还包括&#xff1a;高铁槽道内敷设、水底敷设、墙壁敷设、引上、室内敷设等。 1 高铁槽道内光缆敷设 光缆顺沿高…

vscode设置免密登录远程服务器

文章目录 1. 问题描述2. 解决方案3. 原理 1. 问题描述 当我们使用vscode的ssh连接远程服务器后&#xff0c;过一段时间后&#xff0c;总是要求登录服务器的密码。 这就导致一个麻烦就是: 无论是在公司还是在学校&#xff0c;密码往往不是自己设置的&#xff0c;所以记忆起来就…

Python反射

1、何为反射 1.1、概念 反射&#xff08;Reflection&#xff09;是计算机科学中的一个术语&#xff0c;指的是一种在运行时动态地获取、操作和修改一个语言的特定对象的能力。在编程中&#xff0c;反射可以让程序在运行时动态地获取类的信息&#xff0c;包括类的属性、方法和…

《QT实用小工具·五十二》文本或窗口炫酷有趣的滚动条——果冻条

1、概述 源码放在文章末尾 该项目实现了文本或窗口纤细的滚动条——果冻条 一个可以像弓弦一样拉出来&#xff0c;并且来回弹动的普通滚动条。 思路为此&#xff0c;但发现实际效果更像条状果冻&#xff0c;并且略有谐音&#xff0c; 故&#xff0c;称之为——“果冻条”&am…

【QT学习】12.UDP协议,广播,组播

一。Udp详细解释 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输层协议&#xff0c;它提供了一种简单的、不可靠的数据传输服务。与TCP相比&#xff0c;UDP不提供可靠性、流量控制、拥塞控制和错误恢复等功能&#xff0c;但由于其简单性和低开销&#x…

【Linux-点灯烧录-SD卡/USB烧写】

目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编&#xff1a;led.elf->led.dis 3. 烧写之烧录到SD卡上&#xff1a;3.1 开启烧录软件权限&#xff1a;3.2 确定SD卡的格式&#xff1a;FAT323.3 烧录到SD卡上3.…

【蓝桥杯】基于STM32G431模块总结

目录 一.LED部分 二.按键部分 三.ADC部分 四.基于IIC的24c02读写部分&#xff08;EEPROM&#xff09; 五.LCD显示部分 六.定时器部分 1.定时器中断回调 2. PWM输出改变频率和占空比 3.输入捕获测量占空比和频率(利用主从模式) 4.方波输出回调 七.RTC部分 一.LED部分 …