当前位置: 首页 > article >正文

学习STC51单片机20(芯片为STC89C52RCRC)

每日一言

        生活不会一帆风顺,但你的勇敢能让风浪变成风景。

串口助手的界面就等于是pc端的页面设置的是pc端的波特率等等参数    程序里面的是单片机的波特率等等参数

串口助手是 PC 端软件
串口助手(如 STC-ISP)是运行在 PC 上的工具,用于模拟 PC 的串口通信功能。它的所有界面元素(发送缓冲区、接收缓冲区、波特率设置等)都是为 PC 服务的

发送缓冲区和接收缓冲区属于 PC

    1. 发送缓冲区:PC 上的串口助手将用户输入的数据(如 'a')通过串口线发送给单片机。
    2. 接收缓冲区:PC 通过串口线接收单片机发送的数据(如 "helloworld"),并显示在界面上。

反正串口助手的发送缓冲区就是pc端的发送缓冲区,可以输入东西向单片机进行发送,接收缓冲区就是pc端的接收缓冲区,接收来自单片机的发送的数据

串口通信03_pc发送指令给单片机进行控制LED

这边我们要学习一个知识点R1是SCON寄存器的第0位他有个特性和T1是相对的

虽然他是叫做中断请求标志位,但是我们这边就是说无论你用不用中断,但是我们可以利用这个特性如果单片机接收到了信息,那么就会执行以下判断,就是这个R1和T1的特性永远都会生效的,就是接受到一帧数据10位后就会硬件就会进行置位,然后我们需要软件复位,(具体怎么置位,在哪个位置位自行看手册)

好了就是单片机会轮询的检查是否接收到信息,接收到后将单片机的SBUF里面的数据读取出来,然后进行判断,如果怎么样怎么样执行相应的代码,单片机这边就会执行相应的操作,这个是pc向单片机发送指令的操作

我们这段代码是,pc在发送缓冲区输入a 发送数据那么进入到单片机检查到了接收到的数据检查到了后就软件复位,然后将数据存放到SUBF接收缓冲区,那么将接收缓冲区SUBF里面的数据读取出来放到cmd这个我们自己定义的容器里,判断cmd的值,然后就是执行相应的操作了

串口通信04_pc串口中断控制LED

(这个是多指令的,单指令的话就是按一个o是否是o如果是就LED亮)

这个的话是利用串口的中断来进行检查我们的字符是否匹配开关灯的字符,我们这边用的不是精确匹配,用的是部分匹配,如果需要的话,后期可以自己去学。

解释代码

先初始化中断函数,那么我们这边是串口中断

用的是这个我们回顾一下interrupt 0 是外部中断0 , 1 是定时器0中断 ,2是外部中断1,3是定时器1中断, 4是串口中断 ,5是定时器2中断 , 6是外部中断2 ,7是外部中断3

好了那么我们的串口中断就是interrupt 4

好的那我们中断函数里面怎么写呢,我们的逻辑是因为每一次一个字符传进去这个RI就会中断一次那么我们因为想要电脑端输入open指令让LED亮,那么中断一次就将这个字符(这个字符指的是你在发送缓冲区输入的open那么会被拆分成o p e n,这4个字符也跟subf的特性有关因为只能存放1字节的大小,也就是一个字符了)传入到cmd[12]里面然后让 i++ 所以也要提前定义好i,我们这边让i不要每次都为0(因为我们想要在中断函数里面写),当然也可以定义为全局变量,那么我们在中断函数里面写的话,我们就只需要将它设置为静态函数static ,这样的好处就是满足了i只会在第一个字符进去的时候初始化,后面的字符都不会进行初始化了,就是让i++这个基础上用+后的的i了。

然后后面检测的字符都会先将字符存放到SUBF 然后cmd[i]就会先讲这个SUBF里面的值存放到cmd这个数组里面,然后进行i++,那么下一次的字符就会存放到cmd数组的第二个位置。依此类推,

好的这边有一个函数需要解释一下就是strstr这个是

strstr(cmd, "op") 会在整个 cmd 数组中查找 子字符串 "op"

  • 例如,输入 openoperation 甚至 xxopxx 都会触发 LED 点亮。
  • 这可能导致意外触发,建议改用精确匹配(如比较完整字符串)

虽然这个不是很精确,但是我们懂得原理就好,这边用的是部分匹配方便我们学习

随后其实我们就是去实现这个功能了,我们这个metset是为了将检查到字符相对应的时候,执行部分匹配成功之后将cmd里面都清为空字符串,\0这个就是空字符串的意思

最后这个#define SIZE 12,这个是宏定义,就是为了更好的更改值,只要更改宏定义就好了,所以每当需要更改数组大小的时候更改宏定义里面的数字12就好了

对于这段代码的原理差不多了。。。

http://www.lryc.cn/news/2392603.html

相关文章:

  • 链路追踪神器zipkin安装详细教程教程
  • RabbitMQ备份与恢复技术详解:策略、工具与最佳实践
  • bug: uniCloud 查询数组字段失败
  • Php JIT 使用详解
  • 视觉分析开发范例:Puppeteer截图+计算机视觉动态定位
  • Linux 基础开发工具的使用
  • ElasticSearch查询指定时间内出现的次数/2秒内出现的次数
  • 华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南
  • STP协议:如何消除网络环路风暴
  • 哈工大计算机系统2025大作业——Hello的程序人生
  • 物联网常用协议Modbus、CAN、BACnet介绍
  • Vue中van-stepper与input值不同步问题及解决方案
  • react基础技术栈
  • Three.js搭建小米SU7三维汽车实战(4)场景搭建
  • redis五种数据结构底层实现
  • Excel 统计某个字符串在指定区域出现的次数
  • 【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s
  • 前端开源JavaScrip库
  • 【Linux我做主】进度条小程序深度解析
  • MySQL 使用全局锁会导致的问题?
  • 从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用
  • 在Java对象转JSON字符串时不显示无值参数
  • 在 Ubuntu 服务器上 下载 Clash 文件使用代理
  • 微信小程序一次性订阅封装
  • Spring AI MCP的几个小问题
  • 安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全
  • Pycharm的简单介绍
  • 重新安装解决mac vscode点击不能跳转问题
  • Go语言中flag包的用法详解
  • Python自动化之selenium语句——打开、关闭浏览器和网页