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

“智能检测,精准把控。温湿度检测系统,为您的生活带来全方位的健康保障。”#非标协议项目【上】

“智能检测,精准把控。温湿度检测系统,为您的生活带来全方位的健康保障。”#非标协议项目【上】

    • 前言
    • 预备知识
    • 1温湿度检测系统需求
    • 2.代码整合
      • 2.1找到`编程实现LCD1602显示一行工程`,打开`代码文件`,将所需的`LCD1602驱动代码`拷贝到`温湿度检测系统_1602显示串口发送工程`内。
      • 2.2找到`串口编程03_PC发送指令控制LED`工程,打开`代码文件`,将所需的`LCD1602驱动代码`拷贝到`温湿度检测系统_1602显示串口发送工程`内。
      • 2.3找到`温湿度通过串口传到PC显示`工程,打开`代码文件`,将所需的`LCD1602驱动代码`拷贝到`温湿度检测系统_1602显示串口发送工程`内。
    • 3.构造DHT11温湿度数据处理函数
      • 3.1定义存放`温度`的`字符数组`和存放`湿度`的`字符数组`
      • 3.2在DHT11温湿度数据处理函数内将温湿度数据存入相应字符数组。
    • 4.主函数调用API顺序
      • 4.1延时1秒,稳定系统
      • 4.2初始化串口
      • 4.3初始化LCD1602
      • 4.4延时2秒,稳定DHT11模块
      • 4.5在`while(1)`死循环内调用延时一秒函数,实现每隔1秒刷新温湿度数据
      • 4.6在`while(1)`死循环内调用读取DHT11温湿度函数
      • 4.7在`while(1)`死循环内调用DHT11温湿度数据处理函数
      • 4.8在`while(1)`死循环内多次调用发送字符串函数,实现向PC发送温湿度数据
      • 4.9在`while(1)`死循环内多次调用LCD1602显示一行字符函数,实现在LCD1602上显示温湿度数据
    • 5.完整工程代码
    • 6项目运行结果
    • 结束语

前言

  本篇博文介绍的是用51单片机的非标准写协议项目温湿度检测系统【上】,包含温湿度检测系统需求,代码整合,构造DHT11温湿度数据处理函数,主函数调用API顺序,完整工程代码,项目运行结果。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、基本电路标识识别和接线,例如VCC,GND。
  二、电脑基本操作复制粘贴
  三、C变量
  四、基本输入输出
  五、流程控制
  六、函数

  七、指针
  八,字符串

  如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!

1温湿度检测系统需求

  • 能够实时通过51单片机串口发送温湿度信息
  • 能够实时通过51单片机驱动LCD1602显示温湿度信息

2.代码整合

2.1找到编程实现LCD1602显示一行工程,打开代码文件,将所需的LCD1602驱动代码拷贝到温湿度检测系统_1602显示串口发送工程内。

  • LCD1602 IO口定义代码
//数据线定义
//D0到D7 -- P0.1到P0.7
#define dataBuffer P0//控制线定义
/*
RS--P1.0
RW--P1.1
EN--P1.4
*/
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;
  • LCD1602初始化必要延时代码
void Delay15ms()		//@11.0592MHz
{unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i);
}void Delay5ms()		//@11.0592MHz
{unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i);
}
  • 检测LCD1602忙代码
void checkBusy()
{char tmp   = 0x80;dataBuffer = 0x80;while(tmp & 0x80)    //只要dataBuffer中的第8位为1就为忙,因为BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。{RS = 0;            //根据手册中指令表可知RS=0,RW=1RW = 1;            //RW=1为读的操作,所以需要配置读的时序图EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高EN = 1;            //根据手册中的读时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();tmp = dataBuffer;  //读取dataBuffer中的忙信号EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平}
}
  • 向LCD1602写地址也就是指令代码和写数据代码
void writeCmd(char cmd)
{       checkBusy();       //检测忙信号RS = 0;            //RS等于零,是写指令操作RW = 0;            //RW在手册中写的时序图是可以全程低电平EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高dataBuffer = cmd;  //根据手册中的写时序图,数据在EN还在低电平时就建立数据EN = 1;            //根据手册中的写时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平
}void weiteData(char cData)
{checkBusy();       //检测忙信号RS = 1;            //RS等于1,是写数据操作RW = 0;            //RW在手册中写的时序图是可以全程低电平EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高dataBuffer = cData;  //根据手册中的写时序图,数据在EN还在低电平时就建立数据EN = 1;            //根据手册中的写时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平
}
  • 初始化LCD1602代码
void initLCD1602()
{
//(1) 延时 15msDelay15ms();
//(2) 写指令 38H(不检测忙信号)writeCmd(0x38);
//(3) 延时 5msDelay5ms();
//(4) 以后每次写指令,读/写数据操作均需要检测忙信号
//(5) 写指令 38H:显示模式设置writeCmd(0x38);
//(6) 写指令 08H:显示关闭writeCmd(0x08);
//(7) 写指令 01H:显示清屏writeCmd(0x01);
//(8) 写指令 06H:显示光标移动设置writeCmd(0x06);
//(9) 写指令 0CH:显示开及光标设置writeCmd(0x0C);
}
  • 让LCD1602显示一行字符的代码
void LCD1602ShowARow(char line,char column,char *str)
{switch(line) //选择哪行显示{case 1:                                        //第一行显示writeCmd(0x80 + column);                   //选择哪个位置显示,因为位置地址的最高位必须为1,所以0x80+列数while(*str)                                //判断字符串指针变量不为空执行循环,不用判断字符串结束标志{weiteData(*str);                         //发送字符串单个字符str++;                                   //字符串指针变量偏移}break;case 2:                                        //第二行显示writeCmd(0x80 + 0x40 + column);            //选择哪个位置显示,因为位置地址的最高位必须为1,所以0x80+列数,又因为第二行的列从0x40开始while(*str)                                //所以是从0x80 + 0x40 + 列数(特别注意){                     weiteData(*str);str++;}break;}
}
  • 最后将以上代码整合到温湿度检测系统_1602显示串口发送工程内。

2.2找到串口编程03_PC发送指令控制LED工程,打开代码文件,将所需的LCD1602驱动代码拷贝到温湿度检测系统_1602显示串口发送工程内。

  • 串口初识化代码
void UartInit(void)		//自己配
{//配置串口工作方式为方式1,从只收不发改为能收能发SCON =  0x50;//配置辅助寄存器,减少电磁辐射,稳定晶振频率  AUXR =  0x01;//设置定时器工作方式为定时器1的8位自动重装TMOD &= 0x0F;TMOD |= 0x20;//设置串口波特率为9600,0误差TH1   = 0xFD;TL1   = 0xFD;//打开定时器1TR1   = 1;
}
  • 发送字节和发送字符串代码
void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0;          //一定要软件置零,不然会出现乱序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}

2.3找到温湿度通过串口传到PC显示工程,打开代码文件,将所需的LCD1602驱动代码拷贝到温湿度检测系统_1602显示串口发送工程内。

  • 存放温湿度数据代码
char THdata[5];      //存放温湿度数据变量
  • 打开DHT11高速模式和读取DHT11温湿度数据必要延时代码
void Delay30ms()		//@11.0592MHz
{unsigned char i, j; i = 54;j = 199;do{while (--j);} while (--i);
}void Delay40us()		//@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}
  • 打开DHT11高速模式代码
void startDHT()
{Data = 1;Data = 0;//至少延时18ms,那么延时30msDelay30ms();Data = 1;//检测d点while(Data);//检测e点while(!Data);//检测f点while(Data);
}
  • 读取DHT11温湿度数据代码
void readDHTData()
{char i; //轮次char j; //次数char flag;char tmp;//打开DHT11高速模式startDHT();for(i=0; i<5; i++){for(j=0; j<8; j++){//检测G点while(!Data);//根据传送1和0的时间不同,0是26us,1是70us。等待60us后,如果Data = 1,就传1,Data = 0;就传0//Delay60us();   延时60微妙太长了,可能在读0时读到下一个发送序列了,延时40微妙Delay40us();if(Data == 1){flag = 1;while(Data); //传1的时间比较久,所以要等传1结束}else{flag = 0;}tmp = tmp << 1;tmp |= flag;}THdata[i] = tmp;}
}

3.构造DHT11温湿度数据处理函数

3.1定义存放温度字符数组和存放湿度字符数组

char Temperature[9]; //定义温度字符数组
char Humidness[9];    //定义湿度字符数组

3.2在DHT11温湿度数据处理函数内将温湿度数据存入相应字符数组。

void THDataHandler()
{//湿度数据处理Humidness[0] = 'H';Humidness[1] = ':';Humidness[2] = THdata[0]/10 + 0x30;Humidness[3] = THdata[0]%10 + 0x30;Humidness[4] = '.';Humidness[5] = THdata[1]/10 + 0x30;Humidness[6] = THdata[1]%10 + 0x30;Humidness[7] = '%';Humidness[8] = '\0';//温度处理Temperature[0] = 'T';Temperature[1] = ':';Temperature[2] = THdata[2]/10 + 0x30;Temperature[3] = THdata[2]%10 + 0x30;Temperature[4] = '.';Temperature[5] = THdata[3]/10 + 0x30;Temperature[6] = THdata[3]%10 + 0x30;Temperature[7] = 'C';Temperature[8] = '\0';
}

4.主函数调用API顺序

4.1延时1秒,稳定系统

Delay1000ms();

4.2初始化串口

UartInit();

4.3初始化LCD1602

initLCD1602();

4.4延时2秒,稳定DHT11模块

Delay1000ms();       //等待DHT模块稳定
Delay1000ms();

4.5在while(1)死循环内调用延时一秒函数,实现每隔1秒刷新温湿度数据

Delay1000ms();

4.6在while(1)死循环内调用读取DHT11温湿度函数

readDHTData();

4.7在while(1)死循环内调用DHT11温湿度数据处理函数

THDataHandler();

4.8在while(1)死循环内多次调用发送字符串函数,实现向PC发送温湿度数据

//通过串口发送温湿度数据
sendString(Humidness);
sendString("\r\n");
sendString(Temperature);
sendString("\r\n");
sendString("\r\n");

4.9在while(1)死循环内多次调用LCD1602显示一行字符函数,实现在LCD1602上显示温湿度数据

LCD1602ShowARow(1,4,Humidness); 
LCD1602ShowARow(2,4,Temperature);

5.完整工程代码

#include "reg52.h"
#include "intrins.h"//数据线定义
//D0到D7 -- P0.1到P0.7
#define dataBuffer P0sbit LED1 = P3^7; //用尾定义声明LED1
sbit Data = P3^3; //把DHT11接在单片机的P1.0口
sfr AUXR = 0x8e;   //声明AUXR寄存器地址//控制线定义
/*
RS--P1.0
RW--P1.1
EN--P1.4
*/
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;char THdata[5];      //存放温湿度数据变量
char Temperature[9]; //定义温度字符数组
char Humidness[9];    //定义湿度字符数组void Delay15ms()		//@11.0592MHz
{unsigned char i, j;i = 27;j = 226;do{while (--j);} while (--i);
}void Delay5ms()		//@11.0592MHz
{unsigned char i, j;i = 9;j = 244;do{while (--j);} while (--i);
}void Delay30ms()		//@11.0592MHz
{unsigned char i, j; i = 54;j = 199;do{while (--j);} while (--i);
}void Delay40us()		//@11.0592MHz
{unsigned char i;_nop_();i = 15;while (--i);
}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 checkBusy()
{char tmp   = 0x80;dataBuffer = 0x80;while(tmp & 0x80)    //只要dataBuffer中的第8位为1就为忙,因为BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。{RS = 0;            //根据手册中指令表可知RS=0,RW=1RW = 1;            //RW=1为读的操作,所以需要配置读的时序图EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高EN = 1;            //根据手册中的读时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();tmp = dataBuffer;  //读取dataBuffer中的忙信号EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平}
}void writeCmd(char cmd)
{       checkBusy();       //检测忙信号RS = 0;            //RS等于零,是写指令操作RW = 0;            //RW在手册中写的时序图是可以全程低电平EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高dataBuffer = cmd;  //根据手册中的写时序图,数据在EN还在低电平时就建立数据EN = 1;            //根据手册中的写时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平
}void weiteData(char cData)
{checkBusy();       //检测忙信号RS = 1;            //RS等于1,是写数据操作RW = 0;            //RW在手册中写的时序图是可以全程低电平EN = 0;            //根据手册中的写时序图,EN开始为低电平_nop_();           //执行空函数等待EN拉高dataBuffer = cData;  //根据手册中的写时序图,数据在EN还在低电平时就建立数据EN = 1;            //根据手册中的写时序图,EN被拉高_nop_();           //执行空函数等待tpw和tF高电平过程_nop_();EN = 0;            //根据手册中的写时序图,EN被拉低_nop_();           //根据手册中的写时序图,让EN保持一段时间的低电平
}void initLCD1602()
{
//(1) 延时 15msDelay15ms();
//(2) 写指令 38H(不检测忙信号)writeCmd(0x38);
//(3) 延时 5msDelay5ms();
//(4) 以后每次写指令,读/写数据操作均需要检测忙信号
//(5) 写指令 38H:显示模式设置writeCmd(0x38);
//(6) 写指令 08H:显示关闭writeCmd(0x08);
//(7) 写指令 01H:显示清屏writeCmd(0x01);
//(8) 写指令 06H:显示光标移动设置writeCmd(0x06);
//(9) 写指令 0CH:显示开及光标设置writeCmd(0x0C);
}void UartInit(void)		//自己配
{//配置串口工作方式为方式1,从只收不发改为能收能发SCON =  0x50;//配置辅助寄存器,减少电磁辐射,稳定晶振频率  AUXR =  0x01;//设置定时器工作方式为定时器1的8位自动重装TMOD &= 0x0F;TMOD |= 0x20;//设置串口波特率为9600,0误差TH1   = 0xFD;TL1   = 0xFD;//打开定时器1TR1   = 1;
}void sendByte(char data_mas)
{SBUF = data_mas;while(!TI);TI = 0;          //一定要软件置零,不然会出现乱序
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void startDHT()
{Data = 1;Data = 0;//至少延时18ms,那么延时30msDelay30ms();Data = 1;//检测d点while(Data);//检测e点while(!Data);//检测f点while(Data);
}void LCD1602ShowARow(char line,char column,char *str)
{switch(line) //选择哪行显示{case 1:                                        //第一行显示writeCmd(0x80 + column);                   //选择哪个位置显示,因为位置地址的最高位必须为1,所以0x80+列数while(*str)                                //判断字符串指针变量不为空执行循环,不用判断字符串结束标志{weiteData(*str);                         //发送字符串单个字符str++;                                   //字符串指针变量偏移}break;case 2:                                        //第二行显示writeCmd(0x80 + 0x40 + column);            //选择哪个位置显示,因为位置地址的最高位必须为1,所以0x80+列数,又因为第二行的列从0x40开始while(*str)                                //所以是从0x80 + 0x40 + 列数(特别注意){                     weiteData(*str);str++;}break;}
}void readDHTData()
{char i; //轮次char j; //次数char flag;char tmp;//打开DHT11高速模式startDHT();for(i=0; i<5; i++){for(j=0; j<8; j++){//检测G点while(!Data);//根据传送1和0的时间不同,0是26us,1是70us。等待60us后,如果Data = 1,就传1,Data = 0;就传0//Delay60us();   延时60微妙太长了,可能在读0时读到下一个发送序列了,延时40微妙Delay40us();if(Data == 1){flag = 1;while(Data); //传1的时间比较久,所以要等传1结束}else{flag = 0;}tmp = tmp << 1;tmp |= flag;}THdata[i] = tmp;}
}void THDataHandler()
{//湿度数据处理Humidness[0] = 'H';Humidness[1] = ':';Humidness[2] = THdata[0]/10 + 0x30;Humidness[3] = THdata[0]%10 + 0x30;Humidness[4] = '.';Humidness[5] = THdata[1]/10 + 0x30;Humidness[6] = THdata[1]%10 + 0x30;Humidness[7] = '%';Humidness[8] = '\0';//温度处理Temperature[0] = 'T';Temperature[1] = ':';Temperature[2] = THdata[2]/10 + 0x30;Temperature[3] = THdata[2]%10 + 0x30;Temperature[4] = '.';Temperature[5] = THdata[3]/10 + 0x30;Temperature[6] = THdata[3]%10 + 0x30;Temperature[7] = 'C';Temperature[8] = '\0';
}void main()
{LED1 = 1;            //一上电就让灯灭Delay1000ms();UartInit();          //初始化串口initLCD1602();               //初始化LCD1602Delay1000ms();       //等待DHT模块稳定Delay1000ms();while(1)             //防止程序退出主函数,导致LED1微弱闪烁{Delay1000ms();     //间隔1秒读一次readDHTData();     //读取DHT11温湿度数据THDataHandler();   //将DHT11传回的数据装入温湿度字符数组//通过串口发送温湿度数据sendString(Humidness);sendString("\r\n");sendString(Temperature);sendString("\r\n");sendString("\r\n");LCD1602ShowARow(1,4,Humidness); LCD1602ShowARow(2,4,Temperature);}}

6项目运行结果

在这里插入图片描述

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

相关文章:

“智能检测,精准把控。温湿度检测系统,为您的生活带来全方位的健康保障。”#非标协议项目【上】

“智能检测&#xff0c;精准把控。温湿度检测系统&#xff0c;为您的生活带来全方位的健康保障。”#非标协议项目【上】 前言预备知识1温湿度检测系统需求2.代码整合2.1找到编程实现LCD1602显示一行工程&#xff0c;打开代码文件&#xff0c;将所需的LCD1602驱动代码拷贝到温湿…...

牛客网SQL进阶137:第二快/慢用时之差大于试卷时长一半的试卷

官网链接&#xff1a; 第二快慢用时之差大于试卷时长一半的试卷_牛客题霸_牛客网现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别,。题目来自【牛客题霸】https://www.nowcoder.com/practice/b1e2864271c14b63b0df9fc08b559166?tpId240 0 问题描述 试…...

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述&#xff1a;flag在数据库里面。 开题&#xff1a; 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面&#xff0c;有一个搜索框。 F12看看network。 又出现了这个Wor…...

WordPress突然后台无法管理问题

登录WordPress后台管理评论&#xff0c;发现点击编辑、回复均无反应。 尝试清除缓存、关闭CF连接均无效。 查看插件时发现关闭wp-china-yes插件可以解决问题。 后来又测试了下发现加速管理后台这项&#xff0c;在启用时会发生点击无效问题&#xff0c;禁用就好了&#xff0c;不…...

STM32F1 - 标准外设库_规范

STM32F10x_StdPeriph_Lib_V3.6.0 1> 头文件包含关系2> .c文件内部结构3> 宏定义位置4> 位掩码bit mask5> .c文件中定义私有变量6> 枚举类型定义 1> 头文件包含关系 1个头文件stm32f10x.h 就把整个MCU以及标准外设库&#xff0c;就管理了&#xff1b; 2>…...

推荐系统|召回04_离散特征处理

离散特征处理 离散特征是什么 怎么处理离散特征 One-hot编码 Embedding嵌入 从one-hot到Embedding&#xff0c;已经节省了很多的存储空间&#xff0c;但当数据量大的时候&#xff0c;还是占空间&#xff0c;所以工业界仍会对Embedding进行优化 而一个物品所对应的Embedding参数…...

一个查看armv8系统寄存器-值-含义的方式

找到解压后的SysReg_xml_v86A-2019-12目录 wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-architecture/2019-12/SysReg_xml_v86A-2019-12.tar.gz wget https://developer.arm.com/-/media/developer/products/architecture/armv8-a-archi…...

LLMs之miqu-1-70b:miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略

LLMs之miqu-1-70b&#xff1a;miqu-1-70b的简介、安装和使用方法、案例应用之详细攻略 目录 miqu-1-70b的简介 miqu-1-70b的安装和使用方法 1、安装 2、使用方法 miqu-1-70b的案例应用 miqu-1-70b的简介 2024年1月28日&#xff0c;发布了miqu 70b&#xff0c;潜在系列中的…...

npm 下载报错

报错信息 : 证书过期 (CERT_HAS_EXPIRED) D:\Apps\nodejs-v18.16.1\npx.cmd --yes create-next-app"latest" . --ts npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/create-next-app failed…...

GPT-4登场:多模态能力革新,提升ChatGPT与必应体验,开放API助力游戏革新

GPT-4登场&#xff1a;多模态能力革新&#xff0c;提升ChatGPT与必应体验&#xff0c;开放API助力游戏革新 引言 在人工智能领域&#xff0c;GPT-4的发布标志着一个新时代的到来。这一多模态大模型不仅在技术性能上实现了飞跃&#xff0c;更在功能层面带来全新的突破。GPT-4的…...

【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】

文章目录 移位运算与乘法状态机简介SystemVerilog中的测试平台VCS 波形仿真 阻塞赋值和非阻塞赋值有限状态机&#xff08;FSM&#xff09;与无限状态机的区别 本篇文章接着上篇文章【芯片设计- RTL 数字逻辑设计入门 11 – 移位运算与乘法】 继续介绍&#xff0c;这里使用状态机…...

MongoDB系列:管道操作:聚合阶段操作符(二)

MongoDB系列&#xff1a;管道操作&#xff1a;聚合阶段操作符&#xff08;二&#xff09; 聚合阶段操作符介绍 本节只编写了个人认为可能用到的操作符&#xff0c;详细更多的操作符以及使用注意事项请前往MongoDB官网。 $match 过滤匹配数据。 // 插入数据 db.orders.inse…...

C++ //练习 5.12 修改统计元音字母的程序,使其能统计以下含有两个字符的字符序列的数量:ff、fl和fi。

C Primer&#xff08;第5版&#xff09; 练习 5.12 练习 5.12 修改统计元音字母的程序&#xff0c;使其能统计以下含有两个字符的字符序列的数量&#xff1a;ff、fl和fi。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /****…...

C语言-----自定义类型-----结构体枚举联合

结构体和数组一样&#xff0c;都是一群数据的集合&#xff0c;不同的是数组当中的数据是相同的类型&#xff0c;但是结构体中的数据类型可以不相同&#xff0c;结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型&#xff0c;我们前面已经了解到过int,char,fl…...

elasticsearch下载及可视化工具下载使用

elasticsearch下载及配置、启动 一、下载 Download Elasticsearch | Elastic 二、启动 双击bat即可。 出现如下说明启动成功&#xff1a; 访问测试&#xff1a; 三、注意 &#xff08;1&#xff09;因为es启动默认端口是&#xff1a;9200,所以需要检查此端口是否被占用。…...

vim常用命令以及配置文件

layout: article title: “vim文本编译器” vim文本编辑器 有三种模式: 命令模式 文本模式, 末行模式 vim命令大全 - 知乎 (zhihu.com) 命令模式 插入 i: 切换到输入模式&#xff0c;在光标当前位置开始输入文本。 a: 进入插入模式&#xff0c;在光标下一个位置开始输入文…...

2024年的VUE2下的无效指令npm install --save vue-i18n

vue官网已经声明了不再维护vue2, vue-i18n安装依赖的时候就只接安装vue3的vue-i18, 直接报错&#xff1a; > npm install --save vue-i18n npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: yudao-ui-admin…...

计算机视觉主要知识点

计算机视觉是指利用计算机和算法来解析和理解图片和视频中的内容。这是一个跨学科领域&#xff0c;融合了计算机科学、图像处理、机器学习和模式识别等多方面的技术。以下是一些计算机视觉入门的基本知识点&#xff1a; 图像基础&#xff1a; 像素&#xff1a;图片的最基本组成…...

python 基础知识点(蓝桥杯python科目个人复习计划35)

今日复习计划&#xff1a;阶段总结&#xff08;新年贺礼&#xff09; 1.python简介&#xff08;定义&#xff0c;优点&#xff0c;缺点&#xff0c;应用领域&#xff09; python&#xff1a;一种广泛使用的解释型&#xff0c;高级和通用的编程语言 python极简&#xff0c;生…...

使用HTML、CSS和JavaScript来创建一个粒子效果,粒子会跟随鼠标点击位置生成

文章目录 一、粒子效果二、JavaScript三、HTML四、CSS五、热门文章 一、粒子效果 以下是一个简单的示例&#xff0c;使用HTML、CSS和JavaScript来创建一个粒子效果&#xff0c;粒子会跟随鼠标点击位置生成&#xff1a; <!DOCTYPE html> <html> <head><t…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...