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.xdnf.cn/news/1410397.html

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

相关文章

Python与OpenCV:图像处理与计算机视觉实战指南

前言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;它包含了数百种计算机视觉算法&#xff0c;包括图像处理、视频分析、物体检测、面部识别等。结合Python语言的强大功能&#xff0c;OpenCV可以用于…

【哈希】Leetcode 面试题 01.02. 判定是否互为字符重排

题目讲解 面试题 01.02. 判定是否互为字符重排 算法讲解 直观的想法&#xff1a;我们找到一个字符串的全排列&#xff0c;然后对比当前的排列是否等于另一个字符串。如果两个字符串如果互为排列&#xff0c;所以我们知道两个字符串对应的字符出现的个数相同&#xff0c;那么…

【Linux—进程间通信】共享内存的原理、创建及使用

什么是共享内存 共享内存是一种计算机编程中的技术&#xff0c;它允许多个进程访问同一块内存区域&#xff0c;以此作为进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;的一种方式。这种方式相对于管道、套接字等通信手段&#xff0c;具有更高的效率&…

<2024年5月软考高项极限冲刺>《2 考试知识块》

&#x1fab8;&#x1fab8;把你所学串起来&#xff0c;欢迎订阅。&#x1fab8;&#x1fab8; 每章附独家脑图&#xff0c;原图。 冲刺 冲刺 冲刺 1 看下面的图&#xff0c;让你知道你要学习的全部知识是什么 2 章节解析 我们考试的重点是项目管理知识&#xff0c;但是因…

Python零基础-上【详细】

目录 一、Python简介 1、Python发展史 2、Python理解 3、Python的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 二、Python开发环境搭建 1、环境搭建 2、尝试写一个基础程序 &#xff08;1&#xff09;调整配置 &#xff08;2&#xff09;新…

sunshine+n2n+moonlight串流远程控制全教程

远程主机说明&#xff08;两台电脑不在同一局域网下&#xff09;&#xff1a; 控制台电脑 被控制电脑 所有工具下载地址&#xff1a;https://www.lanzouw.com/b00eepod7e 密码:1234 一、首先NTN组网 使用NTN技术创建虚拟局域网&#xff0c;实现设备之间的P2P连接。 NTN组网…

【IO操作】标准IO和文件IO

一.标准IO和文件IO的区别 &#xff08;1&#xff09;一般标准IO指的是C语言的IO操作&#xff0c;文件IO一般指的是Linux系统调用的IO操作。标准O因为是C语言提供的标准库&#xff0c;所以可以在其他操作系统平台编译后可以执行&#xff0c;但是文件IO只能在Linux下使用&#x…

设计编程网站集:真空成型工艺+真空成型机DIY

真空成型工艺 真空成型工艺是一种广泛应用于制造领域的工艺&#xff0c;主要用于制造复杂形状的塑料制品。真空成型工艺具有成本低、生产效率高、制品质量稳定等优点&#xff0c;因此在汽车、电子、医疗器械等行业得到广泛应用&#xff08;还可以用来制作面具&#xff0c;哈哈哈…

满上! —— 十年之约#22(ROI 48%)

原创 | 刘教链 空头在忍耐了很久之后&#xff0c;趁五一劳动节东方放假发动突袭&#xff0c;把BTC&#xff08;比特币&#xff09;打到6万刀以下。这使得我们终于终结了7个月七连涨的趋势&#xff0c;确定4月以收跌结束。 4月开盘70k&#xff0c;最高72.8k&#xff0c;最低59.6…

[随记]Mac安装Docker及运行开源Penpot

下载Docker Desktop for Mac&#xff1a;https://www.docker.com/products/docker-desktop/ 安装Docker Desktop for Mac&#xff0c;安装完成后&#xff0c;启动Docker&#xff0c;然后在终端输入&#xff1a; docker version 在Mac电脑的Desktop&#xff0c;随便创建一个文…

springBootAdmin监控

简介 用于对 Spring Boot 应用的管理和监控。可以用来监控服务是否健康、是否在线、以及一些jvm数据等等 Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client)&#xff0c;服务端和客户端之间采用 http 通讯方式实现数据交互&#xf…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

LeetCode-网络延迟时间(Dijkstra算法)

每日一题 今天刷到一道有关的图的题&#xff0c;需要求单源最短路径&#xff0c;因此使用Dijkstra算法。 题目要求 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 …

Noisy:一款功能强大的DNS和HTTPS网络流量噪声生成工具

关于Noisy Noisy是一款功能强大的DNS和HTTP/S网络流量噪音生成工具&#xff0c;该工具基于Python开发&#xff0c;可以帮助广大研究人员在进行常规网络浏览时&#xff0c;在后台生成随机的HTTP/DNS网络流量噪声&#xff0c;并以此来提升网络通信数据的安全性和隐蔽性。 支持的…

WSL2连接Windows主机的Mysql

文章目录 需求查看主机IP防火墙设置Mysql设置允许远程连接WSL2连接Mysql 需求 在WSL2&#xff08;本机Ubuntu20.04&#xff09;运行的程序需要将数据写入到本机的Mysql服务器中 查看主机IP 两种办法&#xff1a; Windows主机输入 ipconfig&#xff0c;找到带有WSL后缀的部分…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

如何利用ChatGPT撰写满分文案:技巧与实例解析

在当今社会&#xff0c;随着企业越来越重视宣传推广&#xff0c;文案写作已成为关键的营销手段之一。同时&#xff0c;人工智能的快速发展为文案创作提供了新的工具和方法。例如&#xff0c;ChatGPT这种基于自然语言处理的模型&#xff0c;在协助撰写多种文案方面展现出了极大的…

【智能算法】冠豪猪优化算法(CPO)原理及实现

1.背景 2024年&#xff0c;M Abdel-Basset等人受到冠豪猪防御行为启发&#xff0c;提出了冠豪猪优化算法&#xff08;Crested Porcupine Optimizer, CPO&#xff09;。 2.算法原理 2.1算法思想 CPO使用四种不同的保护机制:视觉、声音、气味和物理攻击。第一和第二防御策略(视…

Linux实训-用户和组的管理

实训1&#xff1a;用户的管理 创建一个新用户user1&#xff0c;设置其主目录为/home/user1。查看/etc/passwd文件的最后一行&#xff0c;看看是如何记录的。查看文件/etc/shadow文件的最后一行&#xff0c;看看如何记录的。给用户user1设置密码。再次查看文件/etc/shadow文件的…

暗区突围端游海外版|暗区突围怎么玩 新手游玩攻略分享

游戏中健康系统与其它射击游戏有很大区别&#xff0c;根据受伤部位、伤势的不同&#xff0c;会有不同的表现。除了头部之外&#xff0c;其它部位如果损坏后继续受到伤害&#xff0c;那么伤害将会分摊到身体其它部位。在暗区内或者暗区外都可以对角色进行治疗&#xff0c;角色不…