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

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

每日一言

        把 “我不行” 换成 “我试试”,你会发现一片新的天地。

那关于优化

白盒测试

我们之前不是通过这个接线方式可以看到返回到信息嘛因为安信可的特性就是返回Esp8266的反馈,可以看到代码死在哪里了,导致连接不上,因为我们怎么知道5秒可以连接上路由器呢,所以说代码不太健壮,所以我们一定要让联网成功以后再让他去做数据透传这些事情

我们先通过这个测试来检测代码的好坏,那为什么要这样接线呢?

有两点

  1. 安可信助手是专门调试ESP8266的

因为原本ESP8266发送数据后都会发送这些成功和失败信息的信息的,但是一般的串口是不会返回信息的(只是不显示信息),由于安可信是做ESP8266的技术支持的,所以这个安可信串口助手会显示信息,那么我们就是可以利用这一点,来看我们的代码是否写得好,可以去不断调试,因为可以看到反馈信息

这个安可信的话会返回相关的信息     这个STCISP串口助手的话不会

那么我们可以先根据这一点先这样接线,目的就是调试代码,调试完之后我们再将单片机与ESP82664根线完全接通

展示代码

解释代码:

很简单,为什么我们要用这样的办法(标志位的方法),是因为延时是一个很容易炸的方法,我们可以去测试,每一次ESP8266联网的时间都不一样,那么就是很有可能会超过延时时间导致失败,或者导致时间的冗余,都是容易导致失败的原因,好的,现在我们根据标志位的方法

就等于是等待ESP8266进行连接WIFE、连接服务器、开启数据透传模式的操作,随后都会反馈数据,他只会一条一条执行,因为我们在中断的时候设置了。只有当我们在STCISP的串口助手输入带有W O这样的字眼才会跳出循环继续下去,为什么要这样做,取决于我们的接线测试,ESP8266的反馈在模拟阶段暂时要看得到的话必须要让安可信串口反馈现象,但是这个数据不会返回到单片机,如果不是测试的话,就会返回到单片机(测试测试,所以我们叫做测试!!!安可信的好处!!!)

当在安可信看到结果后说明ESP操作成功了,所以我们需要手动在STCISP(单片机的串口助手)发送WIFI GOT IP(相关字眼)发送后再发送OK 这个是对连WIFE的操作,当然我们的代码层面要讲OK这个标志复位为0,这样下面的指令才能用上OK的标志位

好啦,后面的都是我们看到安可信的成功信息后,我们STCISP那边就输入OK,就好了,就除了连WIFE我们是多设置了一个标志位要发送WIFE GOT IP 和OK,其他的都只要发送OK就行,

这样的成功率接近100%了,也就是一个成功的程序了,稳定性高

好了,测试完代码没有问题那我们就直接用单片机4根线直接连ESP8266,这样就不用我单片机还要输入信息才能开启下一条指令的发送了。复习一下原理:因为ESP8266会返回成功的信息,这样单片机收到后就会进行接收中断的判断,只要返回到字符数组里面有复合成功信息的相关的几个字符,那么我们就等于是判断出来了ESP8266成功的完成了联网等等相关操作

然后我们就可以通过TCP服务器来操控LED灯的亮灭了

比如说我们代码里面设置成这样我们就可以让LED灯灭

如果运用于手机上我们是不是就可以只要在一个局域网里面,我们就可以进行手机开关灯的操作了,惊喜吧!!!

其实我们已经可以完成很多了,如果你单片机的模块都堆上去,那我们是不是只要在家在一个局域网内都就可以通过手机对只要连接了ESP8266模块的模块进行操作了,那么是不是智能家居我们就可以去逐步实现了!!

最后一点优化点,要是出现了FALL现象,这个是小概率事件,但是我们要处理好他

我们在代码里面添加这个操作,我们这样可以根据灯的提示来判断,是否连接上了,如果没有连接上呢就会ESP8266给单片机返回FALL这个信息,那么我们设置了LED每个一秒亮一次,一共亮5次,后重启AT+RET是重启

完整的代码

#include "reg52.h"
#include "intrins.h"
#include  <string.h>
sbit D5 = P3^7;
sbit D6 = P3^6;
sfr AUXR = 0x8E;

#define SIZE 12

char buffer[SIZE];
code char LJWL[] = "AT+CWJAP=\"RedmiK50Pro\",\"12345678\"\r\n";
code char LJFWQ[]= "AT+CIPSTART=\"TCP\",\"192.168.167.197\",8880\r\n";
char TCMS[]      = "AT+CIPMODE=1\r\n";  //Êý¾Ý·¢ËÍģʽΪÊý¾Ý͸´«Ä£Ê½
char SJCS[]      = "AT+CIPSEND\r\n";
char RESET[]     = "AT+RST\r\n";
char AT_OK_Flag = 0;
char AT_Connect_Net_Flag = 0;

void Uart1_Init(void)    //9600bps@11.0592MHz
{
    AUXR  = 0x01;
    SCON  = 0x50;//ÅäÖô®¿Ú¹¤×÷·½Ê½1£¬RENʹÄܽÓÊÕ
    TMOD &= 0xF0;//ÅäÖö¨Ê±Æ÷ģʽΪ¶¨Ê±Æ÷1£¬8λ×Ô¶¯ÖØ×°ÔØ
    TMOD |= 0x20;
    TH1   = 0xFD;//É趨¶¨Ê±³õÖµ
    TL1   = 0xFD;//ÉèÖö¨Ê±Æ÷֨װֵ
    TR1   = 1;     //Æô¶¯¶¨Ê±Æ÷
    ES = 1;
    EA = 1;
}


void sendByte(char data_msg){
        SBUF = data_msg;
        while(!TI);
        TI=0;
}

void sendString(char *str){
        while(*str!='\0'){
            sendByte(*str);
            str++;
        }
}

void Delay1000ms(void)    //@11.0592MHz
{
    unsigned char data i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


void main()
{
        int mark=0;
        D5 = 1;
      Uart1_Init();
        Delay1000ms();
    
        sendString(LJWL);
        while(!AT_Connect_Net_Flag);
        while(!AT_OK_Flag);
        AT_OK_Flag = 0;
        sendString(LJFWQ);    
        while(!AT_OK_Flag);
        AT_OK_Flag = 0;
        sendString(TCMS);
        while(!AT_OK_Flag);
        AT_OK_Flag = 0;
      sendString(SJCS);
        while(!AT_OK_Flag);
    

        if(AT_Connect_Net_Flag){
             D5    =    0;//´ú±íÈëÍø³É¹¦
        }
        if(AT_OK_Flag){
             D6    =    0;//´ú±íÁ´½Ó·þÎñÆ÷²¢´ò¿ªÍ¸´«Ä£Ê½³É¹¦
        }
        
        while(1){
                        Delay1000ms();
                        sendString("helloworld\r\n");
        }
}

void UART_handler() interrupt 4
{
        static int i = 0;
        int w;
        char tmp;
        if(RI == 1){
            RI = 0;
            tmp = SBUF;
            if(tmp =='W' || tmp =='O' || tmp=='L' ||tmp=='F' ){
                    i = 0;
            }
            buffer[i++]=tmp;
            
            if(buffer[0]=='W' && buffer[5]=='G'){
                 AT_Connect_Net_Flag=1;
                 memset(buffer,'\0',SIZE);
            }
            if(buffer[0]=='O' && buffer[1]=='K'){
                 AT_OK_Flag=1;
                 memset(buffer,'\0',SIZE);
            }
            if(buffer[0]=='F' && buffer[1]=='A'){
                    for(w=0;w<5;w++){
                            D5 = 0;
                            Delay1000ms();
                            D5 = 1;
                            Delay1000ms();
                    }
                    sendString(RESET);
            }
            
            if(buffer[0]=='L' && buffer[2]=='1'){
                D5 = 0;
            }
            if(buffer[0]=='L' && buffer[2]=='0'){
                D5 = 1;
                 memset(buffer,'\0',SIZE);
            }
            
            if(i==12){
                    i=0;
                 memset(buffer,'\0',SIZE);
            }
            
        }
        if(TI);
}

相关文章:

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

每日一言 把 “我不行” 换成 “我试试”&#xff0c;你会发现一片新的天地。 那关于优化 白盒测试 我们之前不是通过这个接线方式可以看到返回到信息嘛因为安信可的特性就是返回Esp8266的反馈&#xff0c;可以看到代码死在哪里了&#xff0c;导致连接不上&#xff0c;因为我们…...

LabVIEW基于 DataSocket从 OPC 服务器读取数据

LabVIEW 中基于 DataSocket 函数从 OPC 服务器读取数据的功能&#xff0c;为工业自动化等场景下的数据交互提供了解决方案。通过特定函数实现 URL 指定、连接建立与管理、数据读取&#xff0c;相比传统 Socket 通信和 RESTful API &#xff0c;在 OPC 服务器数据交互场景有适配…...

阿里云无影云桌面深度测评

阿里云无影桌面深度测评&#xff1a;解锁云端工作“新范式”的“未来之钥”&#xff01; 在数字化浪潮席卷全球的2025年&#xff0c;远程办公与混合办公已不再是权宜之计&#xff0c;而是职场不可逆转的新常态。然而&#xff0c;如何确保员工无论身在何处&#xff0c;都能拥有…...

【208】VS2022 C++ 32位整数和unsigned char数组之间互相转换

一、场景 在实际应用中&#xff0c;特别是在数据传输的时候&#xff0c;需要读取unsigned char数组&#xff0c;再转换成 32 位整数&#xff1b;或者把 32 位整数转换成 unsigned char数组进行写入。比如对接西门子PLC的 snap7 就是这样。32 位整数分成有符号的无符号的&#…...

数据库技术

InnoDB是什么&#xff1f;MySQL 和 InnoDB的关系是什么&#xff1f; InnoDB是MySQL数据库系统中最重要且默认的存储引擎。MySQL采用插件式存储引擎架构&#xff0c;作为数据库管理系统本身不直接处理数据存储&#xff0c;而是通过存储引擎接口与InnoDB等引擎交互。InnoDB作为M…...

深入浅出:Oracle 数据库 SQL 执行计划查看详解(1)——基础概念与查看方式

背景 在当今的软件开发领域&#xff0c;尽管主流开发模式往往倾向于采用单表模式&#xff0c;力图尽可能地减少表之间的连接操作&#xff0c;以期达到提高数据处理效率、简化应用逻辑等目的。然而&#xff0c;对于那些已经上线运行多年的运维老系统而言&#xff0c;它们内部往…...

前端​​HTML contenteditable 属性使用指南

​​什么是 contenteditable&#xff1f; HTML5 提供的全局属性&#xff0c;使元素内容可编辑类似于简易富文本编辑器兼容性​​ 支持所有现代浏览器&#xff08;Chrome、Firefox、Safari、Edge&#xff09; 移动端&#xff08;iOS/Android&#xff09;部分键盘行为需测试 &l…...

自动化采集脚本与隧道IP防封设计

最近群里讨论问如何编写一个自动化采集脚本&#xff0c;要求使用隧道IP&#xff08;代理IP池&#xff09;来防止IP被封。这样的脚本通常用于爬虫或数据采集任务&#xff0c;其中目标网站可能会因为频繁的请求而封禁IP。对于这些我还是有些经验的。 核心思路&#xff1a; 1、使…...

【设计模式-4.7】行为型——备忘录模式

说明&#xff1a;本文介绍行为型设计模式之一的备忘录模式 定义 备忘录模式&#xff08;Memento Pattern&#xff09;又叫作快照模式&#xff08;Snapshot Pattern&#xff09;或令牌模式&#xff08;Token Pattern&#xff09;指在不破坏封装的前提下&#xff0c;捕获一个对…...

docker离线镜像下载

背景介绍 在某些网络受限的环境中&#xff0c;直接从Docker Hub或其他在线仓库拉取镜像可能会遇到困难。为了在这种情况下也能顺利使用Docker镜像&#xff0c;我们可以提前下载好所需的镜像&#xff0c;并通过离线方式分发和使用。 当前镜像有&#xff1a;python-3.8-slim.ta…...

Vert.x学习笔记-Verticle原理解析

Vert.x学习笔记 一、设计理念&#xff1a;事件驱动的组件化模型二、生命周期管理三、部署方式与策略四、通信机制&#xff1a;事件总线&#xff08;Event Bus&#xff09;五、底层实现原理六、典型应用场景七、Verticle与EventLoop的关系1、核心关系&#xff1a;一对一绑定与线…...

Cobra CLI 工具使用指南:构建 Go 语言命令行应用的完整教程

Cobra CLI 工具使用指南&#xff1a;构建 Go 语言命令行应用的完整教程 在 Go 语言开发中&#xff0c;构建功能强大的命令行界面&#xff08;CLI&#xff09;应用是常见需求。Cobra 作为 Go 生态中最受欢迎的 CLI 库&#xff0c;凭借其灵活的设计和丰富的功能&#xff0c;成为…...

jQuery和CSS3卡片列表布局特效

这是一款jQuery和CSS3卡片列表布局特效。该卡片布局使用owl.carousel.js来制作轮播效果&#xff0c;使用简单的css代码来制作卡片布局&#xff0c;整体效果时尚大方。 预览 下载 使用方法 在页面最后引入jquery和owl.carousel.js相关文件。 <link rel"stylesheet&qu…...

不连网也能跑大模型?

一、这是个什么 App&#xff1f; 你有没有想过&#xff0c;不用连网&#xff0c;你的手机也能像 ChatGPT 那样生成文字、识别图片、甚至回答复杂问题&#xff1f;Google 最近悄悄发布了一个实验性 Android 应用——AI Edge Gallery&#xff0c;就是为此而生的。 这个应用不在…...

强化学习鱼书(10)——更多深度强化学习的算法

&#xff1a;是否使用环境模型&#xff08;状态迁移函数P(s’|s,a)和奖 励函数r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用环境模型的方法叫作无模型&#xff08;model-free&#xff09;的方法&#xff0c;使用环境模型的方法叫作有模型&#xff08;model-based&#…...

K8S上使用helm部署 Prometheus + Grafana

一、使用 Helm 安装 Prometheus 1. 配置源 地址&#xff1a;prometheus 27.19.0 prometheus/prometheus-community # 添加repo $ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts "prometheus-community" has been added…...

十四、【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)

@[TOC](【测试执行篇】让测试跑起来:API 接口测试执行器设计与实现 (后端执行逻辑)) 前言 测试执行是测试平台的核心价值所在。一个好的测试执行器需要能够: 准确解析测试用例: 正确理解用例中定义的请求参数和断言条件。可靠地发送请求: 模拟真实的客户端行为与被测 API…...

Java面试八股--07-项目篇

致谢:2025年 Java 面试八股文(20w字)_java面试八股文-CSDN博客 目录 1、介绍一下最近做的项目 1.1 项目背景: 1.2 项目功能 1.3 技术栈 1.4自己负责的功能模块 1.5项目介绍参考: 1.6整体业务介绍: 1.8后台管理系统功能: 1.8.1后台主页: 1.8.2 商品模块: 1.8…...

MCP架构全解析:从核心原理到企业级实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

从0到1认识EFK

一、ES集群部署 操作系统Ubuntu22.04LTS/主机名IP地址主机配置elk9110.0.0.91/244Core8GB100GB磁盘elk9210.0.0.92/244Core8GB100GB磁盘elk9310.0.0.93/244Core8GB100GB磁盘 1. 什么是ElasticStack? # 官网 https://www.elastic.co/ ElasticStack早期名称为elk。 elk分别…...

快速了解GO+ElasticSearch

更多个人笔记见&#xff1a; &#xff08;注意点击“继续”&#xff0c;而不是“发现新项目”&#xff09; github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习&#xff0c;学习过程中还会不断补充&…...

定制开发开源AI智能名片驱动下的海报工厂S2B2C商城小程序运营策略——基于社群口碑传播与子市场细分的实证研究

摘要 本文聚焦“定制开发开源AI智能名片S2B2C商城小程序”技术与海报工厂业务的融合实践&#xff0c;探讨其如何通过风格化海报矩阵的精细化开发、AI技术驱动的用户体验升级&#xff0c;以及S2B2C模式下的社群裂变机制&#xff0c;实现“工具功能-社交传播-商业变现”的生态…...

【Unity开发】控制手机移动端的震动

&#x1f43e; 个人主页 &#x1f43e; 阿松爱睡觉&#xff0c;横竖醒不来 &#x1f3c5;你可以不屠龙&#xff0c;但不能不磨剑&#x1f5e1; 目录 一、前言二、Unity的Handheld.Vibrate()三、调用Android原生代码四、NiceVibrations插件五、DeviceVibration插件六、控制游戏手…...

JAVA中的注解和泛型

目录 JAVA注解介绍 概念 注解的本质 4种标准元注解 自定义注解 泛型介绍 泛型的定义 JAVA泛型 泛型方法( ) 泛型类&#xff08; &#xff09; 类型通配符 类型擦除 JAVA注解介绍 概念 注解是 JDK 5.0 引入的一种元数据机制&#xff0c;用来对代码进行标注。它不会影…...

Cesium快速入门到精通系列教程二:添加地形与添加自定义地形、相机控制

一、添加地形与添加自定义地形 在 Cesium 1.93 中添加地形可以通过配置terrainProvider实现。Cesium 支持多种地形数据源&#xff0c;包括 Cesium Ion 提供的全球地形、自定义地形服务以及开源地形数据。下面介绍几种常见的添加地形的方法&#xff1a; 使用 Cesium Ion 全球地…...

汽车零配件---ecu开发工厂学习

ecu成品制作工艺流程 一、PCB 设计与制作&#xff08;打板&#xff09; 工艺流程步骤 需求分析与电路设计 根据 ECU 功能&#xff08;如发动机控制、变速箱控制&#xff09;确定所需芯片&#xff08;如 MCU、传感器接口芯片&#xff09;、外围电路&#xff08;如电源、通信接…...

python学习打卡day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 浙大疏锦行 数据集使用猫狗数据集&#xff0c;训练集中包含猫图像4000张、狗图像4005张。测试集包含猫图像1012张&#xff0c;狗图像1013张。以下是数据集的下…...

Microsoft Word使用技巧分享(本科毕业论文版)

小铃铛最近终于完成了毕业答辩后空闲下来了&#xff0c;但是由于学校没有给出准确地参考模板&#xff0c;相信诸位朋友们也在调整排版时感到头疼&#xff0c;接下来小铃铛就自己使用到的一些排版技巧分享给大家。 注&#xff1a;以下某些设置是根据哈尔滨工业大学&#xff08;威…...

windows安装多个版本composer

一、需求场景 公司存在多个项目&#xff0c;有的项目比较老&#xff0c;需要composer 1.X版本才能使用 新的项目又需要composer 2.X版本才能使用 所以需要同时安装多个版本的composer二、下载多个版本composer #composer官网 https://getcomposer.org/download/三、放到指定目…...

【办公类-22-05】20250601Python模拟点击鼠标上传CSDN12篇

、 背景需求: 每周为了获取流量券,每天上传2篇,获得1500流量券,每周共上传12篇,才能获得3000和500的券。之前我用UIBOT模拟上传12篇。 【办公类-22-04】20240418 UIBOT模拟上传每天两篇,获取流量券,并删除内容_csdn 每日任务流量券-CSDN博客文章浏览阅读863次,点赞18…...