物联网ARM开发-3协议-单总线应用红外遥控

news2024/11/16 1:56:30

前言:单总线类传感器-红外遥控的实现

目录

一、红外遥控工作原理讲解

1、光的基础知识

2、红外通信

3、红外NEC协议详解

二、红外遥控实例讲解

1、实验目的:按下遥控按键,主机通过红外接收器接收到信号并解码,识别出按键的命令码,打印出对应的按键符号。

2、Cubmx配置

3、实现思路分析

(1)协议分析:

(2)功能分析

(3)具体实现

(4)实验演示和源码


 

一、红外遥控工作原理讲解

1、光的基础知识

  • 光的本质:光的本质是电磁波,其传播本质上是一种粒子振动。广义上,光是指所有的电磁波谱。狭义上的光是人类眼睛可以看见的一种电磁波,也称可见光。
  • 光的波长:是指波在一个振动周期内传播的距离。光的波长由光的频率以及传播的介质决定,光通过不同介质的时候,频率不变而波长发生改变
  • 光的颜色: 是由它的波长来决定的,各种颜色有各自的波长,人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。
  • 可见光:光整个电磁波谱包括了无线电波、红外线、紫外线以及X射线等。它们的波长不同,其中波长在380~760纳米之间就是一般的可见光。依次为红、橙、黄、绿、青、蓝、紫。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。
  • 红外线:是波长介于微波与可见光之间的电磁波,波长在1mm到760纳米(nm)之间,比红光长的非可见光。    高于绝对零度(-273.15℃)的物质都可以产生红外线。现代物理学称之为热射线。我们把红光之外的辐射叫做红外线(紫光之外是紫外线),人的肉眼不可见。

2、红外通信

无线远程遥控技术:   又称为遥控技术,是指实现对被控目标的遥远控制,在工业控制、航空航天、家电领域应用广泛。

红外遥控:     是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。

红外通讯:就是通过红外线传输数据。发射器发出红外信号,接收器接收到信号进行解析。

红外遥控器:     红外遥控器是利用一个红外发光二极管,以红外光为载体来将按键信息传递给接收端的设备。红外光对于人眼是不可见的,因此使用红外遥控器不会影响人的视觉(可以打开手机摄像头,遥控器对着摄像头按,可以看到遥控器发出的红外光)。

信号调制:     日常生活环境中有很多红外光源,太阳、蜡烛火光、白炽灯、甚至是我们的身体。这些红外光源都可能会对我们的接收设备产生干扰,为了屏蔽干扰,只接收有效信息,我们就需要用到调制。     通过调制我们可以把指定的数字信号转换为特定频率的红外光进行发送,调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz

红外接受器:    红外线接收器是一种可以接收红外信号并能独立完成从红外线接收到输出与TTL电平信号兼容的器件,体积和普通的塑封三极管差不多,适合于各种红外线遥控和红外线数据传输。

信号解调:    解调就是将模拟信号转换成数字信号。红外接收器接收到外部发射器传过来的红外信号后,会按照固定的协议去解析信号,并转换成数字信号输出。

3、红外NEC协议详解

7b44464252ac474c97e7747d1abc7703.png

二、红外遥控实例讲解

 

1、实验目的:按下遥控按键,主机通过红外接收器接收到信号并解码,识别出按键的命令码,打印出对应的按键符号。

所要用到的硬件资源如下:
1) 红外接收头,遥控接收头在板子上,与MCU 的连接原理图如下
2) 红外遥控器

9bf92a338a4045f085bcd3600ba7b54f.png

 我们红外接收器连接的是PA8,一根总线实现通信协议。

2、Cubmx配置

使能led,使能168mhz时钟,定时器Tim5用于输入捕获,pa8外部中断配置

19c46e1070284f3cab39bd3a362020f7.png

 2f97e9fb095648f3a8c4200d0ac052ee.png

bf6fb9083f4c4c6c9587a9692f9cfc45.png 

 eff8c8e0e3ce4fab97cef32dac31d0dd.png

 2d95fa52d7eb4ae89b740f37ba62c373.png

触发中断方式是上升沿下降沿都触发

67d108d30c74471aa5afc8057c6cedb9.png

3、实现思路分析

7b44464252ac474c97e7747d1abc7703.png

(1)协议分析:

红外遥控传输的数据格式:地址码+地址反码+命令码+命令反码

根据协议规定,每个地址码或命令码8位,一条数据一共32位数据。

  • 我们定义一个结构体Remote_Infrared_data_struct,定义4个成员来表示地址码和命令码。
  • 再定义一个共同体Remote_Infrared_data_union,定义2个成员,一个保存上面的结构体和完整32位数据。不同数据类型的数据可以使用共同的存储区域

(2)功能分析

开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了接着是发送4个8位二进制码,第一二个是遥控识别码(REMOTE_ID),第一个为正码(0),第二个为反码(255),接着两个数据是键值,第一个为正码第二个为反码.发送完后40ms,遥控再发送一个9ms低,2ms高的脉冲,表示按键的次数,出现一次则证明只按下了一次,如果出现多次,则可以认为是持续按下该键。

处理红外接收

定义一个标志位 bBitCounter 记录键盘帧的位数。每次信号进来都加1,代表进来的次数。通过bBitCounter次数和计数器时长来判定起始码和数据码。最后读取按键值。

261fb691081b4e9d847d3fbde5888a1e.png​​​​​​​

(3)具体实现

RomoteInfrared.h

#include "stm32f4xx_hal.h"

#define	Remote_Infrared_DAT_INPUT HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)

typedef struct _Remote_Infrared_data_struct //定义红外线接收到的数据结构体类型
{
	uint8_t bKeyCodeNot; //按键的的ASIIC码值  按键反码
	uint8_t bKeyCode; //shift键按下标志  按键码
	uint8_t bIDNot; //断码标志位   用户反码
	uint8_t bID; //新键标志位   用户码
}Remote_Infrared_data_struct;

typedef union _Remote_Infrared_data_union //定义红外线接收到的数据结构体类型
{
	Remote_Infrared_data_struct RemoteInfraredDataStruct; //上面定义的红外线接收到的数据结构体类型
	uint32_t uiRemoteInfraredData;  // 记录 用户码用户反码按键码按键反码
}Remote_Infrared_data_union;

void Remote_Infrared_KEY_ISR(void);
uint8_t Remote_Infrared_KeyDeCode(void);

RomoteInfrared.c

#include "RemoteInfrared.h"

#define REPEAT_KEY  0xEE

extern __IO uint32_t GlobalTimingDelay100us;
extern __IO uint32_t GlobalTimingDelay100usTx;


__IO uint32_t FlagGotKey = 0;

__IO Remote_Infrared_data_union RemoteInfrareddata;


/************************************************************************
//处理红外接收  
-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是发送4个8位二进制码,第一二个是遥控识别码(REMOTE_ID),第一个为
正码(0),第二个为反码(255),接着两个数据是键值,第一个为正码
第二个为反码.发送完后40ms,遥控再发送一个9ms低,2ms高的脉冲,
表示按键的次数,出现一次则证明只按下了一次,如果出现多次,则可
以认为是持续按下该键.

*名称: Remote_Infrared_KEY_ISR(INT11_vect )													 
*功能: INT0中断服务程序		       									
*参数: 无					          									
*返回: 无		                           								
*************************************************************************/	
// 检测脉冲宽度最长脉宽为5ms
const uint32_t TIME_DELAY_6MS = 60;
const uint32_t TIME_DELAY_10MS = 100;

//按键中断服务程序ISR
void Remote_Infrared_KEY_ISR(void)
{
	static __IO uint8_t  bBitCounter = 0; //键盘帧位计数 
  static __IO uint32_t bKeyCode = 0;
	bBitCounter++;  //每次信号进来都加加,代表进来的次数


	if(bBitCounter == 1)        // 开始拉低9ms
	{
        if(Remote_Infrared_DAT_INPUT) // 高电平无效
        {
            bBitCounter = 0;
        }
        else
        {
            GlobalTimingDelay100us = TIME_DELAY_10MS; //100赋给变量 ,这个变量会在中断函数里减
					  
        }
	}
	else if(bBitCounter == 2)   // 4.5ms的高脉冲
	{
        if(Remote_Infrared_DAT_INPUT)
        {
            if((GlobalTimingDelay100us > 2) && (GlobalTimingDelay100us < 18))  //GlobalTimingDelay100us检查到减到什么程度了 100-90应该是10 2-18范围内
            {
                GlobalTimingDelay100us = TIME_DELAY_6MS;
            }
            else
            { 
                bBitCounter = 0; 
                //printf(".");
            }
        }

        else
        {
            bBitCounter = 0;            
        }
	}
	else if(bBitCounter == 3)   // 4.5ms的高脉冲
	{
        if(Remote_Infrared_DAT_INPUT)
        {
            bBitCounter = 0; 
        }
        else
        {
            if((GlobalTimingDelay100us > 5) && (GlobalTimingDelay100us < 20))    //起始码 4.5ms   5<60-45<20
            {
                GlobalTimingDelay100us = TIME_DELAY_6MS;
                //printf("引导码");
            }
            else if((GlobalTimingDelay100us > 32) && (GlobalTimingDelay100us < 46))   //重复码 2.25ms
            {
							  //重复码
                bBitCounter = 0;                                           //检测到结束信号 次数置0
                RemoteInfrareddata.uiRemoteInfraredData = bKeyCode;               //把按键码保存到结构体
                //RemoteInfrareddata.uiRemoteInfraredData = REPEAT_KEY;
                bBitCounter = 0;
                FlagGotKey = 1;
            }            
            else
            {
                bBitCounter = 0; 
                //printf("%d&", GlobalTimingDelay100us);
            }          
        }
	}    
	else if(bBitCounter > 3 && bBitCounter < 68) //接收8位数据
	{  

        if(Remote_Infrared_DAT_INPUT)          //检测数据脉冲低电平的时间
        {
            if((GlobalTimingDelay100us > 50) && (GlobalTimingDelay100us < 58))
            {
                GlobalTimingDelay100us = TIME_DELAY_6MS;
            }
            else
            {
                bBitCounter = 0; 
                //printf("#");
            }           
        }
        else
        {
            if((GlobalTimingDelay100us > 50) && (GlobalTimingDelay100us < 58))       // '0'  0.56ms左右
            {
                GlobalTimingDelay100us = TIME_DELAY_6MS;
								bKeyCode <<= 1;  // MSB First 
                bKeyCode += 0x00;
            }
            else if((GlobalTimingDelay100us > 40) && (GlobalTimingDelay100us < 48))  //'1'   1.685ms左右
            {
                GlobalTimingDelay100us = TIME_DELAY_6MS;            
								bKeyCode <<= 1;  // MSB First 
                bKeyCode += 0x01;
            }              
            else
            {
                bBitCounter = 0; 
            }  
        }

       if(bBitCounter == 67)
        {
            RemoteInfrareddata.uiRemoteInfraredData = bKeyCode;
            bBitCounter = 0;
            FlagGotKey = 1;
            //printf("KeyCode = 0x%X", bKeyCode);
        }
	}
	else
	{
		bBitCounter = 0;
        //printf("KeyCode = 0x%X", bKeyCode);
	}
}

/************************************************************************
*名称: unsigned char Remote_Infrared_KeyDeCode(unsigned char bKeyCode)					 
*功能: PS2键盘解码程序		       									    
*参数: bKeyCode 键盘码 							
*返回: 按键的ASIIC码		                           								
************************************************************************/
uint8_t Remote_Infrared_KeyDeCode(void)
{
//	uint8_t Key = 0xFF;

	if (FlagGotKey == 1)//通码   0没按,1按了,外部会判断解析按没按并返回值
	{
        FlagGotKey = 0;//方便下次再进来
		
        if((RemoteInfrareddata.RemoteInfraredDataStruct.bID == (uint8_t)~ RemoteInfrareddata.RemoteInfraredDataStruct.bIDNot)  //校验用户码
            && (RemoteInfrareddata.RemoteInfraredDataStruct.bKeyCode == (uint8_t)~ RemoteInfrareddata.RemoteInfraredDataStruct.bKeyCodeNot))  //校验按键码
        {
            printf("\n\r IR Receive KeyCode = 0x%02X, ", RemoteInfrareddata.RemoteInfraredDataStruct.bKeyCode);
						switch(RemoteInfrareddata.RemoteInfraredDataStruct.bKeyCode)  //提取按键码
						{

							case 0: printf("ERROR");
								break;			   
							case 162:printf("POWER");
								break;	    
							case 98:printf("UP");
								break;	    
							case 2:printf("PLAY");
								break;		 
							case 226:printf("ALIENTEK");
								break;		  
							case 194:printf("RIGHT");
								break;	   
							case 34:printf("LEFT");
								break;		  
							case 224:printf("VOL-");
								break;		  
							case 168:printf("DOWN");
								break;		   
							case 144:printf("VOL+");
								break;		    
							case 104:
								printf("1");
								HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET);
								break;		  
							case 152:printf("2");
								HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET);
								break;	   
							case 176:printf("3");
								break;	    
							case 48:printf("4");
								break;		    
							case 24:printf("5");
								break;		    
							case 122:printf("6");
								break;		  
							case 16:printf("7");
								break;			   					
							case 56:printf("8");
								break;	 
							case 90:printf("9");
								break;
							case 66:printf("0");
								break;
							case 82:printf("DELETE");
								break;	
											default:
													printf("Unknown key!");
						}
        }
        else
        {
          printf("\n\r ERR 0x%08X", RemoteInfrareddata.uiRemoteInfraredData);
        }
    }

		return RemoteInfrareddata.RemoteInfraredDataStruct.bKeyCode;
}

main.c

#include "main.h"
#include "stm32f4xx_hal.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
#include<stdio.h>
#include "RemoteInfrared.h"
/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
__IO uint32_t GlobalTimingDelay100us;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
int fputc(int ch,FILE *p)
{
	while(!(USART1->SR & (1<<7)));
	USART1->DR = (uint8_t)ch;
	return ch;
}
/* USER CODE BEGIN 0 */
int fputc(int ch,FILE *p)
{
	while(!(USART1->SR & (1<<7)));
	USART1->DR = (uint8_t)ch;
	return ch;
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM5_Init();
  /* USER CODE BEGIN 2 */
		/*设置SYSTICK为 100us中断一次 */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/10000);        //原本主频/1000得到的是1ms中断,因为我们需要用到计时器100us计数,所以我们除10000,得到的是100us计数1次
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
	
	printf("remote test");
	printf("\n\r");
	printf("\n\r-------------------------------------------------");
	printf("\n\r FS-STM32开发板 IR红外线接收实验程序");
	printf("\n\r 请将红外线接收头连接到开发板的对应接口");
	printf("\n\r 然后用红外遥控器进行控制,注意串口输出");
	printf("\n\r-------------------------------------------------");  
	printf("\n\r----------------- 协议如下 ----------------------");
	printf("\n\r 首先是引导码: 开始拉低9ms,接着一个4.5ms的高脉冲.");    
	printf("\n\r       引导码的作用是通知接收方器准备接收数据;");
	printf("\n\r 引导码之后是4个字节的二进制码, 其中前两个字节是");
	printf("\n\r       遥控识别码(ID), 第一个为正码,第二个为反码,");
	printf("\n\r       后两字节是键值, 第一个为正码,第二个为反码.");
	printf("\n\r 最后可能有持续按下通知, 上述数据发送完后如果刚才");
	printf("\n\r       的按键持续被按下, 则发送9ms低,2ms高的脉冲。");
	printf("\n\r---------------- 载波为38kHz --------------------");  
	printf("\n\r 传输一个逻辑1需要2.25ms(560us低电平+1680us高电平)");
	printf("\n\r 传输一个逻辑0需要1.125ms(560us低电平+560us高电平)");
	printf("\n\r-------------------------------------------------");  
	printf("\n\r----- 本实验在中断中检测接收IR红外线的数据 ------\n\r");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET);
		HAL_Delay(1000);
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET);
		HAL_Delay(1000);
		Remote_Infrared_KeyDeCode();

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}


/* USER CODE BEGIN 4 */
void HAL_SYSTICK_Callback(void)
{
	if(GlobalTimingDelay100us != 0)
    {
       GlobalTimingDelay100us--;
    }
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
		Remote_Infrared_KEY_ISR();
}
/* USER CODE END 4 */


a4c1ce193f794d1d89b4c4a3398dc82e.png

(4)实验演示和源码

后期上传实验效果和源码

 

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

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

相关文章

大学生计算机相关专业有什么血泪建议吗?

工作多年后才发现大学期间错过太多&#xff01;&#xff01;&#xff01;给正在攻读CS的你&#xff0c;以下建议&#xff1a; 神级编程网站&#xff0c;堪称程序员的充电站&#xff0c;我给你找好了不能错过_程序员编程指南的博客-CSDN博客_程序员充电网站 大的课程很多&…

LA-PEG-NH2,Lipoic acid-PEG-Amine,硫辛酸PEG氨基用于量子点表面

表面反应性聚乙二醇聚乙二醇化试剂LA-PEG-NH2&#xff0c;又名Lipoic acid-PEG-Amine其中文名为硫辛酸-聚乙二醇-氨基。所属分类为Amine PEG Lipoic acid&#xff08;LA&#xff09;PEG。 该科研试剂Lipoic acid-PEG-Amine的分子量均可定制有&#xff1a;&#xff08;5000、20…

uboot移植一一更换控制台串口

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、场景需求 X210开发板的SOC中一共有4个串口&#xff08;串口0~3&#xff09;&#xff0c;并且用DB9接口引出了2个串口&#xff0c;分别是串口0和串口2。其中靠近网口的是串口0&#xff0c;远离网口…

java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏

基于javajava-swing的泡泡堂网络游戏设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javajava-swing的泡泡堂网络游戏设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&#xff1a; 基于javajava-…

多旋翼无人机仿真 rotors_simulator:基于PID控制器的位置控制---高度控制

多旋翼无人机仿真 rotors_simulator&#xff1a;基于PID控制器的位置控制---高度控制前言构建软件框架编译 cpp构建代码main函数构建构建类的定义订阅无人机里程计信息垂直位置控制串级P控制收敛结果收敛过程串级PID控制前言 无人机&#xff08;Unmanned Aerial Vehicle&#…

Oracle中分割字符串的方法

Oracle中分割字符串的方法1. 使用 regexp_substr() 函数1.1 方式11.2 方式22. 自定义函数2.1 自定义类型 table2.2 自定义函数2.2.1 自定义函数2.2.2 效果如下&#xff1a;2.3 Oracle查看&#xff1c;Collection&#xff1e; 类型数据3.1. 使用 regexp_substr() 函数 1.1 方式…

日志三个时间,动静态库的建立与使用

文章目录日志时间ModifyChangeAccessmake与g库lddfile静态库动态库静态库静态的制作静态库的使用动态库动态库的制作动态库的使用日志时间 Modify 最近修改文件内容的时间在一定条件下&#xff0c;修改文件内容时&#xff0c;可能修改文件属性&#xff1a;文件大小属性改变了 …

实验2:Numpy手写多层神经网络

引言 这个作业的目的是给你们介绍建立&#xff0c;训练和测试神经系统网络模型。您不仅将接触到使用Python包构建神经系统网络从无到有&#xff0c;还有数学方面的反向传播和梯度下降。但在实际情况下&#xff0c;你不一定要实现神经网络从零开始(你们将在以后的实验和作…

【数据结构与算法】详解快排

目录一、快排的定义及思路二、快排的代码实现一、快排的定义及思路 快排就是快速排序&#xff0c;是通过不断比较和移动交换来进行排序&#xff0c;相当于冒泡排序的一种升级。 其基本思想是&#xff1a; 分而治之&#xff0c;也就是把一组数组分成两个独立数组&#xff0c;再对…

【初学者入门C语言】之结构体(十一)

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 &#x1f4ac; 刷题网站&#xff1a;一款立志于C语言的题库网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com) 特别标注&#xff1a;该博主将长期更新c语言内容&#xff0c;初学c语言的友友们&#xff0c…

【树莓派不吃灰】使用中经常看到的安装命令 wget、rpm、yum、dpkg、apt-get

目录1. 前言2. Linux系统两种主流软件包2.1 rpm包2.2 deb包3. 解决软件依赖问题 —— yum、apt3.1 yum3.2 apt 和 apt-get4. wget 网络文件下载工具5. 总结❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-10-28 ❤️❤️ 本篇…

设计模式之备忘录模式 - 简书

备忘录模式是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 解决方案 我们刚才遇到的所有问题都是封装 “破损” 造成的。 一些对象试图超出其职责范围的工作。 由于在执行某些行为时需要获取数据&#xff0c; 所以它们侵入了其…

ipv6学习笔记221029

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写 ipv6的长度有128位, ipv4的长度是32位 ipv6以冒号:分隔 , ipv4以点.分隔 8个16位等于128位 , 4个十六进制表示16位(一个16进制表示4位) ipv6的128位 由 8 个 16位 16bit 组成 每…

【LeetCode】【两个数组的交集】

力扣 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2] 示例 2&#xff1a; 输入&#xff1a;num…

基于MATLAB的指纹识别算法仿真实现

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 在指纹图像预处理部分&#xff0c;论文对预处理的各个步骤包括规格化、图像分割、中值滤波、二值化、细化等以及各个步骤的方法进行了深入的分析和研究&#xff0c;选择了一种图像预处理方案。在指纹特征提取部分…

基于javaweb的医疗挂号管理系统(java+springboot+freemarker+layui+mysql)

基于javaweb的医疗挂号管理系统(javaspringbootfreemarkerlayuimysql) 运行环境 Java≥8、MySQL≥5.7 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计&#xff0c;大作业&#xff0c;毕业设计&#xff0c;项目练习&#xff0c;学习演示等 功能说明 基…

幼儿园小程序实战开发教程(终篇)

我们已经写了四篇教程&#xff0c;涵盖了需求分析及各个页面&#xff0c;本篇是我们的最终篇。 咨询信息 我们小程序需要收集家长和孩子的信息&#xff0c;为此我们也规划了数据源。如果按照传统开发思路&#xff0c;那我们是要依次实现信息采集的每个字段&#xff0c;然后再…

<Linux系统复习>文件描述符

一、本章重点 1、进程和打开文件的关系 2、简单复习c语言文件操作 3、介绍系统调用&#xff1a;open、clos、write、read 4、理解文件描述符 5、文件描述符分配规则 6、理解stdin、stdout、stderr与fd的关系 7、理解linux下一切皆文件 8、理解重定向的本质 9、理解stdin和stdou…

《吉师作业》(1)之我是web手为啥让我学C

前言 &#x1f340;作者简介&#xff1a;吉师散养学生&#xff0c;为挣钱努力拼搏的一名小学生。 &#x1f341;个人主页&#xff1a;吉师职业混子的博客_CSDN博客-python学习,HTML学习,清览题库--C语言程序设计第五版编程题解析领域博主 &#x1fad2;文章目的&#xff1a;我不…

freeRTOS学习(二)

堆内存管理 先决条件 FreeRTOS是作为一组C源文件提供的&#xff0c;因此成为一个合格的C程序员是使用FreeRTOS的先决条件。 动态内存分配及其与FreeRTOS的相关性 内核对象&#xff1a;如任务、队列、信号量和事件组。为了使FreeRTOS尽可能易于使用&#xff0c;这些内核对象不…