热释电矢量传感器设计

 1  概述

使用4个热释电传感器组成一个2X2的矩阵。通过曲线的相位差、 峰峰值等特征量来计算相关信息。本文使用STM32单片机设计、制作了热释电传感器矩阵;使用C#.NET设计了上位机软件。为以上研究做了试验平台。

2 硬件电路设计

2.1  热释电传感器介绍

    热释电红外探测器的信号产生原理主要是利用热释电材料的热释电效应。热释电材料是一种压电材料,是不具有中心对称性的晶体(如钽酸锂、硫酸三甘肽等),当这类晶体发生温度变化时使得晶体内部的原子位置变化,导致了晶体某一方向产生表面极化电荷的现象,会使晶体两端产生一个微小的电压差。如图2.1 示意了热释电效应的基本原理。如果当温度保持不变的时候,该电压会因为与空气中离散的荷中和而消失掉,所以只有温度场变化时热释电传感器才会敏感变化。

图2.1热释电效应

当热释电材料表面受到经菲涅尔透镜调制过的人体红外辐射照射后,晶体表面温度便会上升𝛥𝑇,使垂直于自发极化轴方向的晶体单位表面上的电荷𝛥𝑞发生自极化,晶体的电容值表示为𝐶,两电极之间的电压便可表示为𝛥𝑉 = 𝛥𝑞/𝐶。通过检测这一变化微弱的电压信号可以获取温度场变化趋势。本文采用D203s型号传感器,其等效电路如下图所示。当移动人体穿过其感应区时,热释电传感器输出信号反应了各热释电元件接收热辐射的通量变化量之差。连续时刻,当两片热释电元件接收的热辐射量差值不同时,便会产生一个变化的电压输出信号。

D203s等效电路

当人体沿一定方向、一定距离移动时将产生电压输出信号。图中可以看出,热释电探头的两片热释电元件分别对应两个柱形视场区域并且将其感应视场划分为盲区和高敏感区。当人体穿过其中一个敏感区域时,便会对相应的热释电元件产生一个阶跃输入,从而通过后续电路产生热释电压;而当人体穿过两敏感区的中间盲区时,由于人体红外能不能辐射到热释电元件,导致不会产生对应的输出电压。因此可以根据传感器输出时域电压信号序列,寻找一些可用特征以实现人体的检测、定位与识别。其中传感器输出信号与移动速度、距离等之间的关系如下所示:

其中 f 为输出信号的频率(HZ),Vb 为目标移动速度(m/s),fb为菲涅尔透镜

焦距(mm), s 为敏感元件大小(mm), L为目标距传感器距离(m)。

2.2 工作原理示意图

2.2 采集电路设计

根据 PIR 传感器的工作原理,当人体走过或者在菲涅尔透镜明暗相间的区域运动时,会使热释电元件表面上产生微弱的电流,然后由电路转换为电压信号输出,这个电压信号的幅值非常小,大概在 1mV 左右。信号幅值太小会导致容易受到外界环境的干扰,这样采集的数据就没有分析的意义。为了减小实验误差增加数据可靠性,设计了如下图所示的信号调理电路。

图2.3信号调理电路

   传感器在供电时需要10K限流电阻,输出需要47K的匹配电阻。在经过RC滤波电路后,经过两级放大电路放大,本文采用LM358运算放大器组成放大电路。一级放大和二级放大电路间采用电容耦合,这样可以去掉传感器输出的直流分量。第二级放大电路倍数可调,通过测试选取合适放大倍数。第二级放大电路参考电压设置在1.65V,主要是因为后去ADC为0~3.3V输入。通过信号调理电路可以得到0~3.3V的电压信号,方便ADC转换。

2.3单片机电路

采用DC5V供电,电路内需要供电的芯片有3.3V和5V两种。其中D203S及其信号处理部分、蜂鸣器采用5V供电,单片机、通信芯片等采用3.3V供电。为方便操作电源输如后增加自锁电源开关,开关后设计电容滤波来提高5V电压的精度、减少文波干扰。3.3V电源使用lm1117-3.3V电源芯片,该芯片可提供500ma的稳定电流,足够系统使用。如图2.4(a)为电源电路部分。设计电源指示灯一个,用于检测3.3V电源工作与否。

单片机最小系统如图2.4(b)所示,包括了晶振电路、boot电路、以及ADC电源部分。同时设计了复位电路,通过电阻、电容的充放电时间来实现单片机的复位过程。为了方便观测程序的运行与否设计了可控LED指示灯一个,通过定时器控制闪烁提示使用者系统健康状况。单片机采用SW调试方式,该方式仅需要4跟线就可完成程序的烧写、在线调试等功能。设计了4个独立按键,用于按键操作。同时设计了一个有源蜂鸣器电路,用于产生提示、告警声音。

(a)电源电路

(b)单片机电路

(c)外围电路

(d)按键与蜂鸣器

图2.4 单片机系统电路设计

  2.4串行通信电路

串行通信指数据是一位一位按顺序传送的通信方式,相对于并行通信,其突出优点是只需要一对传输线,缺点是传输速度较低。串行通信的传输方向通常有三种,单工、半双工和全双工。单向顾名思义只允许数据向一个方向传输;半双工允许两个方向传输,但在同一时刻只能往一个方向传输;全双工则允许双向同时传输数据。

串行通信有两种基本通信方式,异步通信和同步通信。异步通信不需要传输时钟信号,通信双方的时钟是各自独立的,但双方必须是相同的通信速率和数据格式,即相同的通信协议。其帧格式一般为:起始位+数据位+奇偶校验位+停止位。同步通信需要时钟同步,双方的数据收发是同时进行的。同步通信中一般字符与字符之间没有间隙,相对于异步通信不需要起始位和停止位,只需要同步信号和同步开始时的同步字符。波特率也称码元速率,为单位时间内传输符号的个数或载波调制状态改变次数,单位是Bd(Baud)。比特率又称码率,表示单位时间内传输的比特数,单位是bps(bit/s)。比特率和波特率的转换关系与信号的调制方式有关,通常为:比特率=波特率*调制位数(调制位数即码元位数)。在异步串行通信中,由于采用二进制编码,码元位数为一,通常情况下比特率=波特率。

串行异步通信

RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。DCE可以理解为数据通信端,比如modem设备;DTE可以理解为数据终端,比如电脑。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。现在RS232接口常用于仪器仪表设备,PLC以及嵌入式领域当作调试口来使用。图2.5给出了本文设计的RS232接口电路,为了调试方便保留了TTL电平接口(P2)。

图2.5通信电路

PCB设计

3  软件设计

软件由传感器系统软件和上位机软件组成,两个软件间通过异步串行通信进行数据交互。

3.1单片机软件设计

单片机软件架构如下图所示:包括驱动层,数据层和逻辑控制层。(具体源代码参见附录 单片机程序源码)

单片机软件设计流程如下图所示。首先初始化,然后通过定时器定时循环,采集4个热释电传感器数据,然后通过串口发送给上位机。同时预留了4个按键和一个蜂鸣器用于后续工作储备。

主函数代码,其它详见附录。

// 主函数 程序从这里开始
int main(void)
{u8 i=0,k=0;u8 sum;//发送数据的校验//串口有关变量u8 number=0;u8 State1=0x7F;u8 State2=0x0F;/*通信状态有关变量*///接收标志u8  nGotTDZHT=0;u16 nBufTD=0;u8  nGotTDZHTBY=0;u16 nBufTDBY=0;//主控计算机接收标志u8  nGotMPC=0;u16 nBufMPC=0;	//串口2的一些变量初始化	Inform_OUTPUT.DATA.Frame_Head1=0xAA;Inform_OUTPUT.DATA.LEN=14;Inform_OUTPUT.DATA.state1=State1;Inform_OUTPUT.DATA.state2=State2;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(168);  LED_Init();//LED初始化// 定时器初始化TIM3_Int_Init(1000-1,168-1);RS422_Init(115200);//初始化串口2用于连接工控机DMA1_Config(DMA1_Stream6,DMA_Channel_4,(u32)&USART2->DR,(u32)BUF2,SENTDATA_LEN);//串口2DMA初始化Adc_Init();delay_us(2000);delay_ms(100);Beep=0;//关闭beep	while(1){//接收到工控机数据(预留)if(New_PC==1) {New_PC=0;nGotMPC=5;nBufMPC++;State2=State2|0X01;}if(TIME_on==1) //控制周期时间到,进行ADC和数据发送{TIME_on=0;//接收MIPC监控if(nGotMPC>0){nGotMPC--;State2=State2|0X01;}else{State2=State2&0XFC;}// 读取ADC获得传感器采样值getAdcValues();i=i+1;if(i==50) //控制D1亮{ i=0;LED1=!LED1;}//串口2,给工控机发送数据Inform_OUTPUT.DATA.Sonser1Value=AdcValue[0];Inform_OUTPUT.DATA.Sonser2Value=AdcValue[1];Inform_OUTPUT.DATA.Sonser3Value=AdcValue[2];Inform_OUTPUT.DATA.Sonser4Value=AdcValue[3];	number++;number=number%16;Inform_OUTPUT.DATA.number=number<<4;	sum=0;for(k=1;k<SENTDATA_LEN;k++)//计算校验和{if(k==3) continue;sum += Inform_OUTPUT.ARRAY[k];}Inform_OUTPUT.DATA.checksum=sum;// 发送数据memcpy(BUF2,&Inform_OUTPUT,SENTDATA_LEN);DMA_ClearFlag(DMA1_Stream6,  DMA_FLAG_TCIF6);//   MYDMA_TxEnable(DMA1_Stream6,SENTDATA_LEN,USART2); }		else{}}}

3.2  上位机软件设计

C#是一种高级编程语言,当今主流开发语言占有率排名前五,该语言由微软2000年推出、面世,被微软誉为.NET平台最佳编程语言。C#以.NET类库为基础,是兼顾系统开发与应用程序开发的最佳语言。继承了C/C++简明的编程语法,封装了大多数C++类库。

C#.NET可以编写四类应用程序:

(1)桌面应用程序,主要包括Winform和WPF。二者都是优秀的桌面解决方案首选。Winform的使用者居多,主要因为Winform控件较丰富,其他语言也都用相应的winform开发环境,转行C#后选择Winform入手较快。

(2)Windows Store 应用程序。主要应用于移动、触摸设备的开发。

(3)Web应用程序。通过Web浏览器可以查看的Web页面,如ASP.NET。

    (4)WCF服务。一种灵活的分布式应用程序解决方案,可以通过局域网、广域网在各种操作系统间传递任何数据。

本文将使用Visual Studio 2010和C#语言开发一款基于.NET的winform应用程序。根据系统需求本文将针对应用程序在以下几个方面展开研究:

(1)用户系统

(2)可视化界面

(3)通信系统

(4)数据库系统

应用程序主题框架如下图所示:

考虑到程序的运行效率,将采用多线程方案。在windows系统中每一个应用程序都是一个独立的进程,进程之间不能共享资源。和进程类似,每一个进程中,独立运行的程序片段叫做线程,线程间可以共享本进程中的公共资源。每个线程间是并列关系,在CPU资源充足的情况下,他们是并行运行的。

多线程可以提高应用程序的响应。特别是复杂的图形界面,如果应用程序在等待某一资源,不会按时处理图形界面,这将导致图形界面出现卡顿。如果此时采用多线程技术,将等待处理交给后台线程处理,这样等待时间过长时,就不会影响图形界面的更新。

C#通过 System.Threading.Thread类实现线程的创建和管理。创建一个线程:

    Thread WriteLogThread = new Thread(new ThreadStart(WritingLog));

WriteLogThread.Start();

    其中线程名 WriteLogThread,线程函数 WritingLog。WriteLogThread.Start()将开启线程,线程启动后将调用WritingLog()函数。我将在此函数中写线程要执行的程序。具体使用请见CSDN Thread类。

3.2.1 曲线图界面

GDI全称Graphics Device Interface(图形设备接口),主要负责Window系统上的图形和图像输出,开发人员利用其后续版本GDI+内置函数可以方便在设备处理和动态显示图形图像。GDI+提供的主要功能包含二维几何图形的处理、图形图像显示、排版等。System. Drawing. dll程序集中就已经封装了GDI+的功能,在开始使用GDI+类时,需在项目工程中添加System. Drawing. dll的引用,通过GDI+技术程序员可以编写与图形设备进行交互的Windows或Web图形应用程序,应用程序与图形设备之间不能直接通信,而GDI+库的作用就是将程序发送的数据转换并传递给设备。

通过GDI+提供的API函数可以实现曲线图的绘制。本文使用GDI+、checkbox等控件实现了曲线图绘制。如下图所示,具有多种颜色的曲线图,曲线图上部为曲线名称(图例),向下有四行数字分别是鼠标当前值,圈取区间最大、最小以及平均值。改曲线图可以完好的显示出实时变化的传感器曲线和各项计算结果,有助于传感器数据的理解与应用。

3.2.2通信程序

软件通过SerialPort实现异步串行通讯。

由于串口不知道数据何时到达,因此有线程实时读串口和事件触发方式两种串口数据的读取方法。实质事件方式也是在一个独立线程中处理的。

串口的初始化如下:

建立串口处理事件:

serialPort1.DataReceived +=new SerialDataReceivedEventHandler(this.serialPort1_DataReceived);

开启串口:

serialPort1.PortName = toolStripComboBox1.Text;serialPort1.BaudRate = 115200;serialPort1.Open();

串口接收处理:通过接收中断处理数据,中断函数如下所示,其中数据处理也在其中。

   

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){int i=0;if(portOpen)nbyte2rec = serialPort1.BytesToRead;while (nbyte2rec >= 18&&portOpen){int res = serialPort1.ReadByte();if (res == 0xAA){nRecBuf++;if (nBuf < 15) nBuf++; else nBuf = 0;//recbuffer[0] = 0xAA;serialPort1.Read(recbuffer, 1, 18);// byte[] cheak = BytesCheck.GetCRC16ByPoly(recbuffer,0x0000, 0x8005, 0x0000,false,false,true, 1, 16);//0x8005sum = recbuffer[1] + recbuffer[2];for ( i = 4; i < 18; i++){sum += recbuffer[i];}sum &= 0xFF;if (sum != recbuffer[3]){nErrBuf++;}this.nGot = 10;_nBuf = recbuffer[2] >> 4;if (frist){frist = false;RecFirstTime = DateTime.Now;nBuf = _nBuf;}else{if (nBuf != _nBuf){if (_nBuf - nBuf < 0){nLoseBuf += _nBuf - nBuf + 16;}else{nLoseBuf += _nBuf - nBuf;}nBuf = _nBuf;}}this.DataLen = recbuffer[1];nGroup = recbuffer[2] & 0x0F;if (nGroup == 0){//Sovalue[0] = BitConverter.ToUInt16(recbuffer, 4);//Sovalue[1] = BitConverter.ToUInt16(recbuffer, 6);//Sovalue[2] = BitConverter.ToUInt16(recbuffer, 8);//Sovalue[3] = BitConverter.ToUInt16(recbuffer, 10);RunTim=(DateTime.Now-StartTime).TotalSeconds;for (i = 0; i < 4; i++){Sovalue[i] =Math.Min(4095, (int)BitConverter.ToUInt16(recbuffer, 4+i*2));}RDSoValues[0] = 0.05F * Kso[0] * (Sovalue[1] - D0so[0]) + 0.95F * RDSoValues[0];RDSsum[0] = RDSoValues[0];RDSoValues[1] = 0.05F * Kso[1] * (Sovalue[0] - D0so[1]) + 0.95F * RDSoValues[1];RDSsum[1] = RDSoValues[1];RDSoValues[2] = 0.05F * Kso[2] * (Sovalue[2] - D0so[2]) + 0.95F * RDSoValues[2];RDSsum[2] = RDSoValues[2];RDSoValues[3] = 0.05F * Kso[3] * (Sovalue[3] - D0so[3]) + 0.95F * RDSoValues[3];RDSsum[3] = RDSoValues[3];coudis(RDSoValues);//disdrawlinesControl1.Lines[0].Add(RDSoValues[0]);drawlinesControl1.Lines[1].Add(vuVpp[0]);drawlinesControl1.Lines[2].Add(dis[0]*1000);drawlinesControl1.Lines[3].Add(RDSoValues[1]);drawlinesControl1.Lines[4].Add(vuVpp[1]);drawlinesControl1.Lines[5].Add(dis[1] * 1000);drawlinesControl1.Lines[6].Add(RDSoValues[2]);drawlinesControl1.Lines[7].Add(vuVpp[2]);drawlinesControl1.Lines[8].Add(dis[2] * 1000);drawlinesControl1.Lines[9].Add(RDSoValues[3]);drawlinesControl1.Lines[10].Add(vuVpp[3]);drawlinesControl1.Lines[11].Add(dis[3] * 1000);//_list_V1.Add(RunTim, RDSoValues[1]);//_list_V2.Add(RunTim, RDSoValues[0]);//_list_V3.Add(RunTim, RDSoValues[2]);//_list_V4.Add(RunTim, RDSoValues[3]);}}nbyte2rec = serialPort1.BytesToRead;}}

3.2.3定时器与界面刷新

上位机与下位机一样,需要定时器定时刷新、更新界面显示。

初始化定时器时间,单位毫秒;

timer1.Interval = 100;

启动定时器

timer1.Start();

定时中断函数,函数内为界面刷新命令。

private void timer1_Tick(object sender, EventArgs e){//数据显示刷新label_S1.Text = dis[0].ToString("F2")+" m";label_S2.Text = dis[1].ToString("F2") + " m";label_S3.Text = dis[2].ToString("F2") + " m";label_S4.Text = dis[3].ToString("F2") + " m";drawlinesControl1._Refresh();//绘图控件刷新}

附录I

电路设计原理图和PCB:https://download.csdn.net/download/w267309080/88298439

单片机软件源码:https://download.csdn.net/download/w267309080/88298418

上位机软件源码:https://download.csdn.net/download/w267309080/88298400

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

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

相关文章

c++异步框架workflow分析

简述 workflow项目地址 &#xff1a; https://github.com/sogou/workflow workflow是搜狗开源的一个开发框架。可以满足绝大多数日常服务器开发&#xff0c;性能优异&#xff0c;给上层业务提供了易于开发的接口&#xff0c;却只用了少量的代码&#xff0c;举重若轻&#xff…

Fastjson_1.2.24_unserialize_rce漏洞复现

fastjson_1.2.24_unserialize_rce 说明内容漏洞编号CNVD-2017-02833漏洞名称FastJson < 1.2.24 远程代码执行漏洞评级高危影响范围1.2.24漏洞描述通过parseObject/parse将传入的字符串反序列化为Java对象时由于没有进行合理检查修复方案升级组件&#xff0c;打补丁&#xf…

9.11C高级day4

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 sum0 function add() {for i in $*  #$*接收传来的所有参数do((sumi))doneecho $sum }#定义一个数组 arr(1 2 3 4 5 7 9)#向函数传参 add ${arr[*]}写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并…

SQL6 查找学校是北大的学生信息

描述 题目&#xff1a;现在运营想要筛选出所有北京大学的学生进行用户调研&#xff0c;请你从用户信息表中取出满足条件的数据&#xff0c;结果返回设备id和学校。 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male…

干了三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;19年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

【RabbitMQ】介绍及消息收发流程

介绍 RabbitMQ 是实现 AMQP&#xff08;高级消息队列协议&#xff09;的消息中间件的一种&#xff0c;最初起源于金融系统&#xff0c;用于在分布式系统中存储转发消息&#xff0c;在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实…

对Excel表中归类的文件夹进行自动分类

首先把excel表另存为.txt文件&#xff08;注意&#xff1a;刚开始可能是ANSI格式&#xff0c;需要转成UTF-8格式&#xff09;&#xff1b;再新建一个.txt文件&#xff0c;重命名成.bat文件(注意&#xff1a;直接创建的如果是是UTF-8格式&#xff0c;最好转成ANSI格式&#xff0…

ToBeWritten之基于ATTCK的模拟攻击:闭环的防御与安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

智慧安防/视频分析云平台EasyCVR不显示告警图片该如何解决?

安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;也…

电脑硬盘数据恢复一般需要收费多少钱

随着电子信息时代的发展&#xff0c;个人和企业对电脑硬盘中存储的数据越发重视。然而&#xff0c;由于各种原因&#xff0c;硬盘数据丢失的情况屡见不鲜。如果您正陷入这样的困境&#xff0c;您可能会好奇恢复失去的数据需要花费多少钱。本文将为您介绍电脑硬盘数据恢复的一般…

LabVIEW利用局部放电分析高压电气设备状态诊断

LabVIEW利用局部放电分析高压电气设备状态诊断 目前&#xff0c;高压电气设备状态的监控系统解决了早期故障检测的问题。局部放电起源于电力电气装置的绝缘。局部放电会导致绝缘层逐渐磨损和加速老化&#xff0c;因此可能导致绝缘完全击穿。因此&#xff0c;局部放电检测及其特…

Linux 6.6 初步支持AMD 新一代 Zen 5 处理器

AMD 下一代 Zen 5 CPU 现已开始为 Linux 6.6 支持提交相关代码&#xff0c;最新补丁包括提供温度监控和 EDAC 报告等。 最新的 Linux 6.6 代码中已经加入了包括支持硬件监视器温度监控和 EDAC 报告的补丁。此外&#xff0c;新版本还加入了 x86 / misc 补丁&#xff0c;Phoronix…

C++在C语言基础上的优化

目录 一、命名空间 1、命名空间的定义 2、命名空间的使用 二、输入&输出 三、缺省参数 1、缺省参数的概念 2、缺省参数的分类 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3、引用和指针的区别 六、内联函数 七、基于范围的for循环 一、命名空间 命名空…

探讨前后端分离开发的优势、实践以及如何实现更好的用户体验?

随着互联网技术的迅猛发展&#xff0c;前后端分离开发已经成为现代软件开发的一种重要趋势。这种开发模式将前端和后端的开发工作分开&#xff0c;通过清晰的接口协议进行通信&#xff0c;旨在优化开发流程、提升团队协作效率&#xff0c;并最终改善用户体验。本文将深入探讨前…

SpringBoot原理-自动配置-原理分析-源码跟踪

自动配置原理 SpringBootApplication 该注解标识在SpringBoot项目的启动类上&#xff0c;是SpringBoot中最为重要的注解&#xff0c;该注解由三个部分组成。 SpringBootConfiguration&#xff1a;该注解与Configuration注解作用一样&#xff0c;用来声明当前类为一个配置类Comp…

C++学习之list的实现

在了解学习list实现之前我们首先了解一下关于迭代器的分类&#xff1a; 按功能分类&#xff1a; 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 按性质分类&#xff1a; 单向迭代器 只能 例如单链表 双向迭代器 可&#xff0c;也可-- 例如双…

荣耀崛起礼包码2023,荣耀崛起攻略

荣耀崛起是一款传统的卡牌手游&#xff0c;它将区域探索游戏无缝集成到卡牌游戏中。相信很多玩家都很好奇&#xff0c;荣耀崛起礼包码2023是什么&#xff1f;有没有给新手的一些攻略建议呢&#xff1f;下面小编就和大家简单分享一下&#xff0c;感兴趣的朋友&#xff0c;一起来…

【ARM CoreLink 系列 2 -- CCI-400 控制器简介】

文章目录 CCI-400 介绍DVM 机制介绍DVM 消息传输过程TOKEN 机制介绍 下篇文章&#xff1a;ARM CoreLink 系列 3 – CCI-550 控制器介绍 CCI-400 介绍 CCI&#xff08;Cache Coherent Interconnect&#xff09;是ARM 中 的Cache一致性控制器。 CCI-400 将 Interconnect 和coh…

Ajax + Promise复习简单小结simple

axios使用 先看看老朋友 axios axios是基于Ajaxpromise封装的 看一下他的简单使用 安装&#xff1a;npm install axios --save 引入&#xff1a;import axios from axios GitHub地址 基本使用 axios({url: http://hmajax.itheima.net/api/province}).then(function (result…

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…