STC89C52单片机学习——第38节: [17-2] 红外遥控红外遥控电机

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.03.30

51单片机学习——第38节: [17-2] 红外遥控&红外遥控电机

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、
  • 二、红外遥控接受
  • 三、红外遥控直流电机
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始51单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习51单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。不再另外购买视频中的普中开发板了。
   原理图如下
在这里插入图片描述
视频中的都用这个开发板来实现,如果有资源就利用起来。
仔细看了看:开发板的晶振为:11.0592Mhz;12Mhz晶振是用来给CH340G芯片外置晶振;

下图是实物图
在这里插入图片描述

引用

51单片机入门教程-2020版 程序全程纯手打 从零开始入门
还参考了下图中的书籍:
手把手教你学51单片机(C语言版)
在这里插入图片描述
STC89C52手册
在这里插入图片描述

解答和科普

一、

1.1测试中断的执行

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "I2C.h"
#include "PCF8591.h"
#include "Init.h"unsigned char Num;
void main()
{LCD_Init();LCD_ShowString(1,1,"A");Nixie_OFF();DianZhengGuan();IT0=1;		//下降沿触发IE0=0;		//中断标志位EX0=1;		//打开中断EA=1;		//打开所有中断PX0=1;		//优先级while(1){LCD_ShowNum(2,1,Num,3);}
}void Into_Routine(void)  interrupt 0
{
Num++;
}

实验现象:

外部中断0低电平触发

外部中断0下降沿触发

1.2红外解码
在这里插入图片描述
如何把东西解码出来,包括读取时间值进行计时,还有中断。
状态机:定义一个变量表示当前的状态,0表示空闲状态,然后当他收到下降沿之后,把定时器打开,开始计时,再把状态转为1状态,寻找Start或者Repeat头部的这一个信号,1状态再来个下降沿的话,继续判断状态,判断中间的时间,如果是起始信号,就把状态转化为2状态,2状态定义为开始解码1012总共32,如果是重发,就把重发标志位置1,还有变量缓存区用来存取,还会置为正确是否。
1.Timer0

#include <REGX52.H>void Timer0_Init(void)		//1毫秒@11.0592MHz
{//	TMOD不能复制,如果同时使用定时器1和0,它会覆盖淹没,TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0;		//设置定时初值TH0 = 0;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 0;		//定时器0不计时
}void Timer0_SetCounter(unsigned char Value)
{TH0=Value/256;TL0=Value%256;}unsigned int Timer0_Getcounter(void)
{return (TH0<<8)|TL0;}void Timer0_Run(unsigned char Flag)
{TR0=Flag;}```c
#ifndef		__TIMER0_H
#define 	 __TIMER0_Hvoid Timer0_Init(void)	;
void Timer0_SetCounter(unsigned char Value);
unsigned int Timer0_Getcounter(void);
void Timer0_Run(unsigned char Flag);
#endif
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "I2C.h"
#include "PCF8591.h"
#include "Init.h"
#include "INT0.h"
#include "Timer0.h"
#include "IR.h"unsigned int Time;
void main()
{LCD_Init();LCD_ShowString(1,1,"A");Nixie_OFF();DianZhengGuan();Timer0_Init();Timer0_SetCounter(0);Timer0_Run(1);Delay(1);Time=Timer0_Getcounter();while(1){LCD_ShowNum(2,1,Time,3);}
}

实验现象:
在这里插入图片描述
测试遥控的进入

#include <REGX52.H>
#include "Timer0.h"
#include "INT0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];			//缓存
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepearFlag;
unsigned char IR_Address;			//Data又要接受数据又要输出数据 变搜变输出,可能会出错
unsigned char IR_Command;void IR_Init(void)
{Timer0_Init();Int0_Init();
}void Into_Routine(void)  interrupt 0
{if(IR_State==0){P1=0x00;Timer0_SetCounter(0);Timer0_Run(1);IR_State=1;}else if(IR_State==1){IR_Time=Timer0_Getcounter();Timer0_SetCounter(0);	if(IR_Time>12442-500&& IR_Time<12442+500)		//13500{IR_State=2;}else if(IR_Time>10368-500&& IR_Time<10368+500){IR_RepearFlag=1;Timer0_Run(0);	IR_State=0;	}else{IR_State=1;}}}

遥控能进入的话,会产生中断,进入状态0,然后会让LED灯全亮。
实验现象:

测试遥控灯

二、红外遥控接受

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "I2C.h"
#include "PCF8591.h"
#include "Init.h"
#include "INT0.h"
#include "Timer0.h"
#include "IR.h"unsigned int Time;
unsigned char Address;
unsigned char Command;
void main()
{LCD_Init();LCD_ShowString(1,1,"LED");Nixie_OFF();DianZhengGuan();IR_Init();while(1){if(IR_GetDataFlag()){Address=IR_GetAddress();Command=IR_GetCommand();LCD_ShowHexNum(2,1,Address,2);LCD_ShowHexNum(2,6,Command,2);}if(Command==0x16){P1=0x00;}}
}
#include <REGX52.H>void Timer0_Init(void)		//1毫秒@11.0592MHz
{//	TMOD不能复制,如果同时使用定时器1和0,它会覆盖淹没,TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0;		//设置定时初值TH0 = 0;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 0;		//定时器0不计时
}void Timer0_SetCounter(unsigned char Value)
{TH0=Value/256;TL0=Value%256;}unsigned int Timer0_GetCounter(void)
{return (TH0<<8)|TL0;}void Timer0_Run(unsigned char Flag)
{TR0=Flag;}
#include <REGX52.H>
#include "Timer0.h"
#include "INT0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;/*** @brief  红外遥控初始化* @param  无* @retval 无*/
void IR_Init(void)
{Timer0_Init();Int0_Init();
}/*** @brief  红外遥控获取收到数据帧标志位* @param  无* @retval 是否收到数据帧,1为收到,0为未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到连发帧标志位* @param  无* @retval 是否收到连发帧,1为收到,0为未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到的地址数据* @param  无* @retval 收到的地址数据*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief  红外遥控获取收到的命令数据* @param  无* @retval 收到的命令数据*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}//外部中断0中断函数,下降沿触发执行
void Int0_Routine(void) interrupt 0
{if(IR_State==0)				//状态0,空闲状态{Timer0_SetCounter(0);	//定时计数器清0Timer0_Run(1);			//定时器启动IR_State=1;				//置状态为1}else if(IR_State==1)		//状态1,等待Start信号或Repeat信号{IR_Time=Timer0_GetCounter();	//获取上一次中断到此次中断的时间Timer0_SetCounter(0);	//定时计数器清0//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)if(IR_Time>12442-500 && IR_Time<12442+500){IR_State=2;			//置状态为2}//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)else if(IR_Time>10368-500 && IR_Time<10368+500){IR_RepeatFlag=1;	//置收到连发帧标志位为1Timer0_Run(0);		//定时器停止IR_State=0;			//置状态为0}else					//接收出错{IR_State=1;			//置状态为1}}else if(IR_State==2)		//状态2,接收数据{IR_Time=Timer0_GetCounter();	//获取上一次中断到此次中断的时间Timer0_SetCounter(0);	//定时计数器清0//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)if(IR_Time>1032-500 && IR_Time<1032+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));	//数据对应位清0IR_pData++;			//数据位置指针自增}//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)else if(IR_Time>2074-500 && IR_Time<2074+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));	//数据对应位置1IR_pData++;			//数据位置指针自增}else					//接收出错{IR_pData=0;			//数据位置指针清0IR_State=1;			//置状态为1}if(IR_pData>=32)		//如果接收到了32位数据{IR_pData=0;			//数据位置指针清0if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))	//数据验证{IR_Address=IR_Data[0];	//转存数据IR_Command=IR_Data[2];IR_DataFlag=1;	//置收到连发帧标志位为1}Timer0_Run(0);		//定时器停止IR_State=0;			//置状态为0}}
}

实验现象:

红外遥控显示键码值并控制LED

2.3遥控键码值

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "I2C.h"
#include "PCF8591.h"
#include "Init.h"
#include "INT0.h"
#include "Timer0.h"
#include "IR.h"unsigned char Num;
unsigned char Address;
unsigned char Command;
void main()
{LCD_Init();LCD_ShowString(1,1,"ADDR  CMD  NUM");LCD_ShowString(2,1,"00    00   000");Nixie_OFF();DianZhengGuan();IR_Init();while(1){if(IR_GetDataFlag()||IR_GetRepeatFlag()){Address=IR_GetAddress();Command=IR_GetCommand();LCD_ShowHexNum(2,1,Address,2);LCD_ShowHexNum(2,7,Command,2);if(Command==IR_VOL_X){Num--;}if(Command==IR_VOL_Z){Num++;}LCD_ShowNum(2,12,Num,3);}}
}

实验现象:

红外遥控键码值控制值增加和减少

三、红外遥控直流电机

1.Motor.c

#include <REGX52.H>
#include "Timer1.h"sbit Moter= P1^7;
unsigned char Counter,Compare;void Motor_Init(void)
{Timer1_Init();}void Motor_SetSpeed(unsigned char Speed)
{Compare=Speed;	
}void Timer1_Routine()   interrupt  3	//跳转到这里,触发中断
{TL1 = 0xA4;		//设置定时初值TH1 = 0xFF;		//设置定时初值Counter++;			//定时器定时递增Counter%=100;			//周期清零if(Counter<Compare)	//比较{Moter=1;		//给1转}else{Moter=0;}
}
#ifndef		__MOTOR_H
#define 	 __MOTOR_Hvoid Motor_Init(void);
void Motor_SetSpeed(unsigned char Speed);#endif

2.Timer1.c

#include <REGX52.H>void Timer1_Init(void)		//100us @11.0592MHz
{//	TMOD不能复制,如果同时使用定时器1和0,它会覆盖淹没,TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x10;		//设置定时器模式TL0 = 0xA4;		//设置定时初值TH1 = 0xFF;		//设置定时初值TF1 = 0;		//清除TF0标志TR1 = 1;		//定时器0开始计时ET1=1;EA=1;PT1=0;
}/*
void Timer1_Routine()   interrupt  3	//跳转到这里,触发中断
{static unsigned int T0Count;		//Tcount为计数值  static只有本函数使用TL1 = 0x66;					//重新设置定时初值TH1 = 0xFC;					//重新设置定时初值T0Count++;if(T0Count>=1000){T0Count=0;P1_0=~P1_0;}}*/
#ifndef		__TIMER1_H
#define 	 __TIMER1_Hvoid Timer1_Init(void)	;
#endif

3.IR.c

#include <REGX52.H>
#include "Timer0.h"
#include "INT0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];
unsigned char IR_pData;unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;/*** @brief  红外遥控初始化* @param  无* @retval 无*/
void IR_Init(void)
{Timer0_Init();Int0_Init();
}/*** @brief  红外遥控获取收到数据帧标志位* @param  无* @retval 是否收到数据帧,1为收到,0为未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到连发帧标志位* @param  无* @retval 是否收到连发帧,1为收到,0为未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag=0;return 1;}return 0;
}/*** @brief  红外遥控获取收到的地址数据* @param  无* @retval 收到的地址数据*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief  红外遥控获取收到的命令数据* @param  无* @retval 收到的命令数据*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}//外部中断0中断函数,下降沿触发执行
void Int0_Routine(void) interrupt 0
{if(IR_State==0)				//状态0,空闲状态{Timer0_SetCounter(0);	//定时计数器清0Timer0_Run(1);			//定时器启动IR_State=1;				//置状态为1}else if(IR_State==1)		//状态1,等待Start信号或Repeat信号{IR_Time=Timer0_GetCounter();	//获取上一次中断到此次中断的时间Timer0_SetCounter(0);	//定时计数器清0//如果计时为13.5ms,则接收到了Start信号(判定值在12MHz晶振下为13500,在11.0592MHz晶振下为12442)if(IR_Time>12442-500 && IR_Time<12442+500){IR_State=2;			//置状态为2}//如果计时为11.25ms,则接收到了Repeat信号(判定值在12MHz晶振下为11250,在11.0592MHz晶振下为10368)else if(IR_Time>10368-500 && IR_Time<10368+500){IR_RepeatFlag=1;	//置收到连发帧标志位为1Timer0_Run(0);		//定时器停止IR_State=0;			//置状态为0}else					//接收出错{IR_State=1;			//置状态为1}}else if(IR_State==2)		//状态2,接收数据{IR_Time=Timer0_GetCounter();	//获取上一次中断到此次中断的时间Timer0_SetCounter(0);	//定时计数器清0//如果计时为1120us,则接收到了数据0(判定值在12MHz晶振下为1120,在11.0592MHz晶振下为1032)if(IR_Time>1032-500 && IR_Time<1032+500){IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));	//数据对应位清0IR_pData++;			//数据位置指针自增}//如果计时为2250us,则接收到了数据1(判定值在12MHz晶振下为2250,在11.0592MHz晶振下为2074)else if(IR_Time>2074-500 && IR_Time<2074+500){IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));	//数据对应位置1IR_pData++;			//数据位置指针自增}else					//接收出错{IR_pData=0;			//数据位置指针清0IR_State=1;			//置状态为1}if(IR_pData>=32)		//如果接收到了32位数据{IR_pData=0;			//数据位置指针清0if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))	//数据验证{IR_Address=IR_Data[0];	//转存数据IR_Command=IR_Data[2];IR_DataFlag=1;	//置收到连发帧标志位为1}Timer0_Run(0);		//定时器停止IR_State=0;			//置状态为0}}
}
#ifndef __IR_H__
#define __IR_H__#define IR_CH_X			0x45
#define IR_CH			0x46
#define IR_CH_Z			0x47
#define IR_PREV			0x44
#define IR_NEXT			0x40
#define IR_PAUSE		0x43
#define IR_VOL_X		0x07
#define IR_VOL_Z		0x15
#define IR_EQ			0xD9
#define IR_0			0x16
#define IR_100+			0x19
#define IR_200+			0x0d
#define IR_1			0x0C
#define IR_2			0x18
#define IR_3			0x5E
#define IR_4			0x08
#define IR_5			0x1C
#define IR_6			0x5A
#define IR_7			0x42
#define IR_8			0x52
#define IR_9			0x4Avoid IR_Init(void);
unsigned char IR_GetDataFlag(void);
unsigned char IR_GetRepeatFlag(void);
unsigned char IR_GetAddress(void);
unsigned char IR_GetCommand(void);
#endif

4.main.c

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Timer1.h"
#include "Nixie.h"
#include "Init.h"
#include "IR.h"
#include "Motor.h"unsigned char KeyNum,Speed,Command;void main()
{DianZhengGuan();Motor_Init();IR_Init();while(1){
//		KeyNum=Key();
//		if(KeyNum==1)
//		{
//			Speed++;
//			Speed%=4;
//		
//				if(Speed==0){Motor_SetSpeed(0);}
//				if(Speed==1){Motor_SetSpeed(50);}
//				if(Speed==2){Motor_SetSpeed(75);}
//				if(Speed==3){Motor_SetSpeed(100);}
//			
//				Nixie(1,Speed);		//数码管静态显示会锁存
//		}if(IR_GetDataFlag()){Command=IR_GetCommand();if(Command==IR_0) {Speed=0;}if(Command==IR_1) {Speed=1;}if(Command==IR_2) {Speed=2;}if(Command==IR_3) {Speed=3;}if(Speed==0){Motor_SetSpeed(0);}if(Speed==1){Motor_SetSpeed(50);}if(Speed==2){Motor_SetSpeed(75);}if(Speed==3){Motor_SetSpeed(100);}Nixie(1,Speed);		//数码管静态显示会锁存}	}	
}

5.INT0

#include <REGX52.H>void Int0_Init(void)
{IT0=1;		//下降沿触发IE0=0;		//中断标志位EX0=1;		//打开中断EA=1;		//打开所有中断PX0=1;		//优先级}
#ifndef __INT0_H__
#define __INT0_H__
void Int0_Init(void);
#endif

实验现象:

红外控制直流电机

总结

本节课主要学了红外遥控了,对定时器写入和写出的,还有解码的功能,最重要的是这个解码过程,设置了3个状态,每个状态执行分别执行不同的功能,识别出开始的信号和设置很多个标志位,通过操作进行定时器的开始,进而解码出开始和连发,进而分辨出是发送的是信号0还是信号1,最后读取值进入数组中,拆分为4个unsigned char类型,分别存入最后变量地址和数据中,并根据数据Command进行有关的操作。
2、最后进行了实验:红外遥控直流电机,根据读到的Command,相当于读取按键值,然后执行相关的功能,完成本次实验。

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

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

相关文章

计算机组成原理————计算机运算方法精讲<1>原码表示法

第一部分:无符号数和有符号数的概念 1.无符号数 计算机中的数均存放在寄存器当中,通常称寄存器的位数为机器字长,所谓无符号数,就是指没有fu5号的数,在寄存器中的每一位均可用来存放数值,当存放有符号数时,需要留出位置存放符号,机器字长相同时,无符号数与有符号数所…

【什么是机器学习——多项式逼近】

什么是机器学习——多项式逼近 机器学习可以分成三大类别,监督学习、非监督学习、强化学习。三大类别背后的数学原理不同。监督学习使用了数学分析中的函数逼近方法和概率统计中的极大似然方法;非监督学习使用聚类和EM算法;强化学习使用马尔可夫决策过程的想法。 机器学习的…

Ubuntu 22.04 上安装阿里云 CLI(命令行工具)

在 Ubuntu 22.04 上安装阿里云 CLI&#xff08;命令行工具&#xff09;可以通过以下步骤完成&#xff1a; 步骤 1&#xff1a;下载阿里云 CLI 安装包 打开终端&#xff0c;首先更新你的软件包索引&#xff1a; sudo apt update安装 curl&#xff08;如果还没有安装&#xff09…

​Android Gradle 插件(AGP)版本与 ​Gradle 版本需要严格对应

一、AGP 与 Gradle 版本对照表 Android Gradle 插件版本对应 Gradle 版本适用 Android Studio 版本​8.1.x8.2Arctic Fox (2020.3.1+)​8.0.x8.0Arctic Fox (2020.3.1+)​7.4.x7.5.1IntelliJ IDEA 2022+​7.3.x7.4IntelliJ IDEA 2022+​7.2.x7.3.3IntelliJ IDEA 2021.3+​7.1.x…

【Matlab】-- 基于MATLAB的灰狼算法优化支持向量机的回归算法

文章目录 文章目录 01 内容概要02 GWO-SVR模型03 部分代码04 运行结果05 参考文献06 代码下载 01 内容概要 GWOSVR&#xff08;基于灰狼算法优化的支持向量机回归&#xff09;是一种先进的机器学习技术&#xff0c;它结合了灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO…

Google Play Games PC版即将正式上线!

早在 2021 年&#xff0c;谷歌就推出 Google Play Games PC 版&#xff0c;本质上是基于虚拟化创建安卓系统在 Windows 上运行 Google Play 平台的各种游戏。 在测试了 4 年后&#xff0c;谷歌准备在今年晚些时候正式上线该平台&#xff0c;谷歌将在下周举办 2025 游戏开发者大…

【SpringBoot】深入解析使用配置文件解决硬编码问题综合练习(三):解析验证码拓展问题

校验输入验证码接口 check( ) 5. 为什么要用静态内部类接收配置文件中的 Seisson 对象&#xff1f; 为什么我们接收配置文件的 Session 对象时&#xff0c;使用静态内部类给 Session 对象的 key&#xff0c;date 属性赋值呢&#xff1f;不加 static 可以吗&#xff1f; 在 Cap…

day16 学习笔记

文章目录 前言一、广播机制二、数组遍历1.for循环2.nditer函数 三、数组操作1.reshape函数2.flat属性3.flatten函数4.revel函数5.数组转置6.升维与降维7.数组的连接与分割8.数组运算 前言 通过今天的学习&#xff0c;我进一步掌握了更多numpy的语法知识 一、广播机制 广播&am…

使用FastExcel时的单个和批量插入的问题

在我们用excel表进行插入导出的时候&#xff0c;通常使用easyexcel或者FastExcel&#xff0c;而fastexcel是easy的升级版本&#xff0c;今天我们就对使用FastExcel时往数据库插入数据的业务场景做出一个详细的剖析 场景1 现在我们数据库有一张组织表&#xff0c;组织表的字段…

Cannot find a valid baseurl for repo: centos-sclo-sclo/x86_64

​ rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-latest-5.0.el7.noarch.rpmyum clean allyum macache fast​ 编辑配置文件 /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository. [zabbix-frontend]...enabled1... 下载相关…

AI基础02-图片数据采集

上篇文章我们学习了文本的数据采集&#xff0c;今天主要了解一下图片数据采集的方法。图片采集方法通常有网页采集和实时采集&#xff08;传感器采集&#xff09;两种。我们学习一下如何利用python 工具和笔记本计算机摄像头进行图片数据的实时采集。 1&#xff09;cv2库简介 …

【CSS】相对位置小练习

要求&#xff1a; 成果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>相对位置小练习</title><link rel"stylesheet" href"./css/style.css…

外设的中断控制

如ADC、SPI、I2C、TIM等使用STM32 HAL库时的中断函数调用方式和UART非常类似&#xff0c;都有底层直接使能中断和上层库函数管理两种方式。下面详细说明几种典型外设&#xff1a; 一、ADC外设 &#xff08;1&#xff09;直接使能中断&#xff08;底层控制&#xff09;&#xf…

网络传输优化之多路复用与解复用

一、基本概念 多路复用 发送端将来自多个应用或进程的数据流合并到同一物理信道中传输的过程。核心目的是提高信道利用率&#xff0c;减少资源浪费。例如&#xff0c;多个网络应用&#xff08;如浏览器、邮件客户端&#xff09;通过不同端口将数据封装为报文段&#xff0c;共享…

【软考-架构】10.1、软件工程概述-CMM-软件过程模型-逆向工程

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 软件工程基础知识软件工程概述能力成熟度模型能力成熟度模型CMM能力成熟度模型集成CMMI &#x1f4af;考试真题第一题第二题 软件过程模型瀑布模型&#xff08;SDLC&#…

python将整个txt文件写入excel的一个单元格?

要将整个txt文件写入Excel的一个单元格&#xff0c;可以使用Python的openpyxl库来实现。以下是一个简单的示例代码&#xff1a; from openpyxl import Workbook# 读取txt文件内容 with open(file.txt, r) as file:txt_content file.read()# 创建一个新的Excel工作簿 wb Work…

车载以太网网络测试 -25【SOME/IP-报文格式-1】

1 摘要 本专题接着上一专题对SOME/IP进行介绍&#xff0c;主要对SOME/IP报文格式以及定义的字段进行详细介绍&#xff0c;有助于在实际项目过程中对SOME/IP报文的理解。 上文回顾&#xff1a; 车载以太网网络测试 -24【SOME/IP概述】 2 SOME/IP-报文格式 通过上个专题介绍&a…

【区块链安全 | 第五篇】DeFi概念详解

文章目录 DeFi1. DeFi 生态概览2. 去中心化交易所&#xff08;DEX&#xff09;2.1 AMM&#xff08;自动做市商&#xff09;模型2.2 订单簿模式&#xff08;现货交易&#xff09; 3. 借贷协议3.1 Aave3.2 使用闪电贷&#xff08;Flash Loan&#xff09; 4. 稳定币&#xff08;St…

问题:md文档转换word,html,图片,excel,csv

文章目录 问题&#xff1a;md文档转换word&#xff0c;html&#xff0c;图片&#xff0c;excel&#xff0c;csv&#xff0c;ppt**主要职责****技能要求****发展方向****学习建议****薪资水平** 方案一&#xff1a;AI Markdown内容转换工具打开网站md文档转换wordmd文档转换pdfm…

代码随想录刷题day53|(二叉树篇)106.从中序与后序遍历序列构造二叉树(▲

目录 一、二叉树理论知识 二、构造二叉树思路 2.1 构造二叉树流程&#xff08;给定中序后序 2.2 整体步骤 2.3 递归思路 2.4 给定前序和后序 三、相关算法题目 四、易错点 一、二叉树理论知识 详见&#xff1a;代码随想录刷题day34|&#xff08;二叉树篇&#xff09;二…