嵌入式学习--江协51单片机day5
江协每个模块的学习都是第一集讲原理,第二集将简单应用。如果比较着急的,可以不看第一集,只要明白怎么用就行。
今天学习DS1302时钟和蜂鸣器
DS1302
内部原理图,DS1302是有内部电源,电源的引脚名要注意
这两个原理图比较重要,第一个是寄存器(BIT7-BIT4的单位是10xx,second,minute等是BCD码的存储,在使用时要进行转换),第二个是写和读的过程,模拟这个过程就能对DS1302进行读和写(要注意读的时钟只有15个周期,在模拟的时候要通过重复赋值过滤一个)
DS1302时钟
#include <REGX52.H>//引脚定义
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;//寄存器写入地址/指令定义
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E//时间数组,索引0~6分别为年、月、日、时、分、秒、星期
unsigned char DS1302_Time[]={19,11,16,12,59,55,6};/*** @brief DS1302初始化* @param 无* @retval 无*/
void DS1302_Init(void)
{DS1302_CE=0;DS1302_SCLK=0;
}/*** @brief DS1302写一个字节* @param Command 命令字/地址* @param Data 要写入的数据* @retval 无*/
void DS1302_WriteByte(unsigned char Command,Data)
{unsigned char i;DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}for(i=0;i<8;i++){DS1302_IO=Data&(0x01<<i);DS1302_SCLK=1;DS1302_SCLK=0;}DS1302_CE=0;
}/*** @brief DS1302读一个字节* @param Command 命令字/地址* @retval 读出的数据*/
unsigned char DS1302_ReadByte(unsigned char Command)
{unsigned char i,Data=0x00;Command|=0x01; //将指令转换为读指令DS1302_CE=1;for(i=0;i<8;i++){DS1302_IO=Command&(0x01<<i);DS1302_SCLK=0;DS1302_SCLK=1;}for(i=0;i<8;i++){DS1302_SCLK=1;DS1302_SCLK=0;if(DS1302_IO){Data|=(0x01<<i);}}DS1302_CE=0;DS1302_IO=0; //读取后将IO设置为0,否则读出的数据会出错return Data;
}/*** @brief DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中* @param 无* @retval 无*/
void DS1302_SetTime(void)
{DS1302_WriteByte(DS1302_WP,0x00);DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);DS1302_WriteByte(DS1302_WP,0x80);
}/*** @brief DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中* @param 无* @retval 无*/
void DS1302_ReadTime(void)
{unsigned char Temp;Temp=DS1302_ReadByte(DS1302_YEAR);DS1302_Time[0]=Temp/16*10+Temp%16;//BCD码转十进制后读取Temp=DS1302_ReadByte(DS1302_MONTH);DS1302_Time[1]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DATE);DS1302_Time[2]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_HOUR);DS1302_Time[3]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_MINUTE);DS1302_Time[4]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_SECOND);DS1302_Time[5]=Temp/16*10+Temp%16;Temp=DS1302_ReadByte(DS1302_DAY);DS1302_Time[6]=Temp/16*10+Temp%16;
}
DS1302可调时钟
这个主要是比较复杂
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Delay.h"
#include "Timer0.h"
#include "Key.h"
unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;
void TimeShow()
{DS1302_ReadTime();LCD_ShowNum(1,1,DS1302_Time[0],2);LCD_ShowNum(1,4,DS1302_Time[1],2);LCD_ShowNum(1,7,DS1302_Time[2],2);LCD_ShowNum(2,1,DS1302_Time[3],2);LCD_ShowNum(2,4,DS1302_Time[4],2);LCD_ShowNum(2,7,DS1302_Time[5],2);
}void TimeSet()
{if(KeyNum==2){TimeSetSelect++;TimeSetSelect%=6;}if(KeyNum==3){DS1302_Time[TimeSetSelect]++;if(DS1302_Time[0]>99){DS1302_Time[0]=0;}if(DS1302_Time[1]>12){DS1302_Time[1]=1;}if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12){if(DS1302_Time[2]>31)DS1302_Time[2]=1;}else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11){if(DS1302_Time[2]>30)DS1302_Time[2]=1;}else if(DS1302_Time[1]==2){if(DS1302_Time[1]%4==0){if(DS1302_Time[2]>29){DS1302_Time[2]=1;}}else{if(DS1302_Time[1]>28){DS1302_Time[2]=1;}}}if(DS1302_Time[3]>23){DS1302_Time[3]=0;}if(DS1302_Time[4]>59){DS1302_Time[4]=0;}if(DS1302_Time[5]>59){DS1302_Time[5]=0;}}if(KeyNum==4){DS1302_Time[TimeSetSelect]--;if(DS1302_Time[0]<0){DS1302_Time[0]=99;}if(DS1302_Time[1]<1){DS1302_Time[1]=12;}if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12){if(DS1302_Time[2]<1)DS1302_Time[2]=31;//更改月后更改前的日和更改后的月不匹配if(DS1302_Time[2]>31)DS1302_Time[2]=1;}else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11){if(DS1302_Time[2]<1)DS1302_Time[2]=30;if(DS1302_Time[2]>30)DS1302_Time[2]=1;}else if(DS1302_Time[1]==2){if(DS1302_Time[1]%4==0){if(DS1302_Time[2]<1){DS1302_Time[2]=29;}if(DS1302_Time[2]>29){DS1302_Time[2]=1;}}else{if(DS1302_Time[1]<1){DS1302_Time[2]=28;}if(DS1302_Time[1]>28){DS1302_Time[2]=1;}}}if(DS1302_Time[3]<0){DS1302_Time[3]=23;}if(DS1302_Time[4]<0){DS1302_Time[4]=59;}if(DS1302_Time[5]<0){DS1302_Time[5]=59;}}//设置时闪烁if(TimeSetSelect==0&&TimeSetFlashFlag==1){LCD_ShowString(1,1," ");}else{ LCD_ShowNum(1,1,DS1302_Time[0],2);}if(TimeSetSelect==1&&TimeSetFlashFlag==1){LCD_ShowString(1,4," ");}else{ LCD_ShowNum(1,4,DS1302_Time[1],2);}if(TimeSetSelect==2&&TimeSetFlashFlag==1){LCD_ShowString(1,7," ");}else{ LCD_ShowNum(1,7,DS1302_Time[2],2);}if(TimeSetSelect==3&&TimeSetFlashFlag==1){LCD_ShowString(2,1," ");}else{ LCD_ShowNum(2,1,DS1302_Time[3],2);}if(TimeSetSelect==4&&TimeSetFlashFlag==1){LCD_ShowString(2,4," ");}else{ LCD_ShowNum(2,4,DS1302_Time[4],2);}if(TimeSetSelect==5&&TimeSetFlashFlag==1){LCD_ShowString(2,7," ");}else{ LCD_ShowNum(2,7,DS1302_Time[5],2);}
}void main()
{LCD_Init();DS1302_Init();LCD_ShowString(1,1," - - ");LCD_ShowString(2,1," : : ");//初始化并设置格式Timer0Init();DS1302_SetTime();while(1){KeyNum=Key();if(KeyNum==1)//按键一按下切换模式{if(MODE==0){MODE=1;}//1是设置0是展示else if(MODE==1){MODE=0;DS1302_SetTime();}}switch(MODE){case 0:TimeShow();break;case 1:TimeSet();break;}}}
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18; //设置定时初值TH0 = 0xFC; //设置定时初值T0Count++;if(T0Count>=500){T0Count=0;TimeSetFlashFlag=!TimeSetFlashFlag;}
}
蜂鸣器
这个不用了解地很清楚
蜂鸣器播放提示音
#include <REGX52.H>
#include "Delay.h"
#include <INTRINS.H>
//蜂鸣器端口
sbit Buzzer=P2^5;
/*** @brief 蜂鸣器私有延时函数* @param * @retval */
void Buzzer_Delay500us() //@12.000MHz
{unsigned char i;_nop_();i = 247;while (--i);
}
/*** @brief 蜂鸣器发生* @param ms 发生时长* @retval */
void Buzzer_Time(unsigned int ms)
{unsigned int i;for(i=0;i<ms*2;i++){Buzzer=!Buzzer;Buzzer_Delay500us();}
}
蜂鸣器播放音乐
#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"
sbit Buzzer=P2^5;
#define SPEED 250
//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P 0
#define L1 1
#define L1_ 2
#define L2 3
#define L2_ 4
#define L3 5
#define L4 6
#define L4_ 7
#define L5 8
#define L5_ 9
#define L6 10
#define L6_ 11
#define L7 12
#define M1 13
#define M1_ 14
#define M2 15
#define M2_ 16
#define M3 17
#define M4 18
#define M4_ 19
#define M5 20
#define M5_ 21
#define M6 22
#define M6_ 23
#define M7 24
#define H1 25
#define H1_ 26
#define H2 27
#define H2_ 28
#define H3 29
#define H4 30
#define H4_ 31
#define H5 32
#define H5_ 33
#define H6 34
#define H6_ 35
#define H7 36unsigned int FreqTable[]={0,63628,
63731,63836,63929,64021,64104,64185,64261,64332,64400,64464,64524,
64580,64634,64685,64733,64778,64820,64861,64899,64935,
64968,65000,65030,65058,65086,65111,65135,65157,65179,65199,65218,65235,65252,65268,65283
};
unsigned char code Music[]={//音符,时值,//1P, 4,P, 4,P, 4,M6, 2,M7, 2,H1, 4+2,M7, 2,H1, 4,H3, 4,M7, 4+4+4,M3, 2,M3, 2,//2M6, 4+2,M5, 2,M6, 4,H1, 4,M5, 4+4+4,M3, 4,M4, 4+2,M3, 2,M4, 4,H1, 4,//3M3, 4+4,P, 2,H1, 2,H1, 2,H1, 2,M7, 4+2,M4_,2,M4_,4,M7, 4,M7, 8,P, 4,M6, 2,M7, 2,//4H1, 4+2,M7, 2,H1, 4,H3, 4,M7, 4+4+4,M3, 2,M3, 2,M6, 4+2,M5, 2,M6, 4,H1, 4,//5M5, 4+4+4,M2, 2,M3, 2,M4, 4,H1, 2,M7, 2+2,H1, 2+4,H2, 2,H2, 2,H3, 2,H1, 2+4+4,//6H1, 2,M7, 2,M6, 2,M6, 2,M7, 4,M5_,4,M6, 4+4+4,H1, 2,H2, 2,H3, 4+2,H2, 2,H3, 4,H5, 4,//7H2, 4+4+4,M5, 2,M5, 2,H1, 4+2,M7, 2,H1, 4,H3, 4,H3, 4+4+4+4,//8M6, 2,M7, 2,H1, 4,M7, 4,H2, 2,H2, 2,H1, 4+2,M5, 2+4+4,H4, 4,H3, 4,H3, 4,H1, 4,//9H3, 4+4+4,H3, 4,H6, 4+4,H5, 4,H5, 4,H3, 2,H2, 2,H1, 4+4,P, 2,H1, 2,//10H2, 4,H1, 2,H2, 2,H2, 4,H5, 4,H3, 4+4+4,H3, 4,H6, 4+4,H5, 4+4,//11H3, 2,H2, 2,H1, 4+4,P, 2,H1, 2,H2, 4,H1, 2,H2, 2+4,M7, 4,M6, 4+4+4,P, 4,0xFF //终止标志
};unsigned char FreqSelect,MusicSelect;void main()
{Timer0Init();while(1){if(Music[MusicSelect]){FreqSelect=Music[MusicSelect];MusicSelect++;Delay(SPEED/4*Music[MusicSelect]);MusicSelect++;TR0=0;Delay(5);TR0=1;}else{TR0=0;while(1);}}}
void Timer0_Routine() interrupt 1
{if(FreqTable[FreqSelect]){TL0 = FreqTable[FreqSelect]%256; //设置定时初值TH0 = FreqTable[FreqSelect]/256; //设置定时初值}Buzzer=!Buzzer;
}
相关文章:
嵌入式学习--江协51单片机day5
江协每个模块的学习都是第一集讲原理,第二集将简单应用。如果比较着急的,可以不看第一集,只要明白怎么用就行。 今天学习DS1302时钟和蜂鸣器 DS1302 内部原理图,DS1302是有内部电源,电源的引脚名要注意 这两个原理图…...
记录算法笔记(2025.5.13)二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,null,2] …...
关于github使用总结
文章目录 一、本地使用git(一)创建一个新的本地Git库首先在本地创建一个新的git仓库然后进行一次初始提交提交过后就可以查看提交记录 (二)在本地仓库进行版本恢复先执行 git log 查看项目提交历史使用 git checkout 恢复版本 二、…...
进程与线程:09 进程同步与信号量
课程引入:进程同步与信号量 接下来这节课开始,我们再开始讲多进程图像。讲多进程图像的下一个点,前面我们讲清楚了多进程图像要想实现切换,调度是如何做的。同时,多个进程放在内存中,就会存在多进程合作的…...
鸿蒙 Core File Kit(文件基础服务)之简单使用文件
查看常用的沙箱目录 应用沙箱文件访问关系图 应用文件目录结构图 Entry Component struct Index {build() {Button(查看常用的沙箱目录).onClick(_>{let ctx getContext() // UI下只能使用这个方法,不能 this.contextconsole.log(--应用缓存文件保存目录&#x…...
游戏引擎学习第277天:稀疏实体系统
回顾并为今天定下基调 上次我们结束的时候,基本上已经控制住了跳跃的部分,达到了我想要的效果,现在我们主要是在等待一些新的艺术资源。因此,等新艺术资源到位后,我们可能会重新处理跳跃的部分,因为现在的…...
基于Win在VSCode部署运行OpenVINO模型
一、准备工作 1、Python 下载Win平台的Python安装包,添加环境变量,测试: python --version 在VSCode里( CtrlShiftP 打开命令面板),指定Python解释器为上面安装路径。写一个python脚本运行测试。 2、虚…...
关于maven的依赖下不下来的问题
相信大家对于maven下不下依赖会感到很烦,这里就来给大家进行解惑。 首先maven依赖报错基本是两种情况,一个是下载报错,这种情况就要考虑是否在maven的setting.xml文件中配了阿里云的相关配置没,其次就要检查是否真的存在这个依赖…...
按键精灵ios脚本新增元素功能助力辅助工具开发(一)
元素节点功能(iOSElement) 在按键精灵 iOS 新版 APP v2.2.0 中,新增了元素节点功能 iOSElement,该功能包含共 15 个函数。这一功能的出现,为开发者在处理 iOS 应用界面元素时提供了更为精准和高效的方式。通过这些函…...
【数据结构】——栈和队列OJ
一、有效的括号 题目链接: 20. 有效的括号 - 力扣(LeetCode) 题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢? 我们可以这样,我们遍历出传入的…...
Windows部署LatentSync唇形同步(字节跳动北京交通大学联合开源)
#工作记录 一、前言 LatentSync:基于音频驱动的端到端唇形同步框架 LatentSync是由ByteDance开源的一个先进唇形同步框架,旨在通过音频条件驱动的潜在扩散模型实现高精度的唇形同步。与传统基于像素空间扩散或两阶段生成的方法不同,Late…...
MySQL:关系模型的基本理论
系列文章目录 1.关系模型的基本概念 2.数据库的完整性 文章目录 系列文章目录前言一、关系模型的基本概念 1.基本术语: 2.关系的特征二、数据库的完整性 1.常见用例:2.三类完整性原则3.MySQL提供的约束 三、触发器 1.触发器的定义 2.…...
9.1 C#控制SW中零件的变色与闪烁
本文介绍:装配件中某零件隐藏与显示、零件的颜色修改。 探讨本话题的目的是为了实现如下目的:如果某个气缸报警,那么3D中该气缸红色并闪烁。 目前,当勾选部件1闪烁时,零件1-1将在显示与隐藏之间闪烁。 示例代码放到如下位置: C#与solidworks示例1-零部件的显示与隐藏资源…...
Spring Boot 跨域问题全解:原理、解决方案与最佳实践
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、跨域问题的本质 1.1 什么是跨域? 跨域(Cross-Origin)问题源于浏览器的同源策略(Same-Origin Policy&…...
C++学习之路,从0到精通的征途:继承
目录 一.继承的概念及定义 1.继承的概念 2.继承的定义 (1)继承的定义格式 (2)继承基类成员访问方式的变化 二.基类与派生类间的转换 1.派生类对象赋值给基类的引用/指针 2. 派生类对象直接赋值给基类对象 三.继承的作用域 四.派生类的默认成员函数 1.构造函数 2.拷…...
从零开始掌握FreeRTOS(2)链表之节点的定义
目录 节点 节点定义 节点实现 根节点 根节点定义 精简节点定义 根节点实现 在上篇文章,我们完成了 FreeRTOS 的移植。在创建任务之前,我们需要先了解FreeRTOS的运转机制。 FreeRTOS是一个多任务系统,由操作系统来管理执行每个任务。这些任务全都挂载到一个双向循…...
C 语言_常见排序算法全解析
排序算法是计算机科学中的基础内容,本文将介绍 C 语言中几种常见的排序算法,包括实现代码、时间复杂度分析、适用场景和详细解析。 一、冒泡排序(Bubble Sort) 基本思想:重复遍历数组,比较相邻元素,将较大元素交换到右侧。 代码实现: void bubbleSort(int arr[], i…...
LamaIndex rag(增强检索)入门
LamaIndex RAG 搭建 lamaindex rag 的简单是例 from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex from llama_index.llms.huggingface import HuggingFaceLLM#初始化一个…...
七、深入 Hive DDL:管理表、分区与洞察元数据
作者:IvanCodes 日期:2025年5月13日 专栏:Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据:SHOW 命令的威力结语:DDL 与 SHOW,Hive 管理的双翼练习题一、选择题二、代码题…...
SQLMesh信号机制详解:如何精准控制模型评估时机
SQLMesh的信号机制为数据工程师提供了更精细的模型评估控制能力。本文深入解析信号机制的工作原理,通过简单和高级示例展示如何自定义信号,并提供实用的使用技巧和测试方法,帮助读者优化数据管道的调度效率。 一、为什么需要信号机制…...
STM32 __main汇编分析
在STM32的启动流程中,__main是一个由编译器自动生成的C标准库函数,其汇编级调用逻辑可通过启动文件(如startup_stm32fxxx.s)观察到,但具体实现细节被封装在编译器的运行时库中。以下是其核心逻辑解析: 一、…...
Google Earth Engine(GEE) 代码详解:批量计算_年 NDVI 并导出(附 Landsat 8 数据处理全流程)
一、代码整体目标 基于 Landsat 8 卫星数据,批量计算 2013-2020 年研究区的 NDVI(归一化植被指数),实现去云处理、数据合成、可视化及批量导出为 GeoTIFF 格式,适用于植被动态监测、生态环境评估等场景。 二、代码分步解析(含核心原理与易错点) 1. 加载并显示研究区边…...
【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)
数据科学必备技能:填补缺失值(Imputing Missing Values) 在数据分析和机器学习项目中,缺失值(Missing Values) 是非常常见的问题。缺失的数据如果处理不当,会严重影响模型的训练效果࿰…...
c 中的哈希表
哈希是一种可以接受各种类型、大小的输入,输出一个固定长度整数的过程。你可以将哈希理解成一种特殊的映射,哈希映射,将一个理论无限的集合A映射到有限整数集合B上。 哈希函数:哈希函数是哈希过程的核心,它决定了哈希映…...
AI空域调度系统的社会角色与伦理边界
当AI空域调度系统成为城市运行不可或缺的一部分,其角色已不再是单纯的技术工具,而逐步具备了社会属性。平台既作为智能基础设施的调度中枢,也承担起数据治理、行为规训和公共资源分配等功能。本章聚焦AI调度系统的“类政府性”角色崛起&#…...
pringboot3+vue3融合项目实战-大事件文章管理系统-文章分类列表
GetMappingpublic Result <List<Category>>list(){List<Category> list categoryService.list();return Result.success(list);}然后在categoryservice接口新增 List list(); 然后再categoryserviceimpl实现类里面加入 Overridepublic List<Category&g…...
关于cleanRL Q-learning
内置变量 内置变量是由编程语言解释器或运行时环境预定义的变量。它们通常用于提供程序的元信息(如文件路径、模块名称)或控制程序行为。在 Python 中,内置变量通常以双下划线开头和结尾,例如 __file__、__name__。 以下是一些常…...
Electron-Vue3、Electron-React、Electron-Angular打造舆情监控系统项目
Electron是一个跨平台的桌面应用开发框架,可以让我们用html css js的技术开发跨平台桌面上可以安装的软件。视频详解: Electron教程 ElectronVue跨平台桌面软件开发教程-2024年更新(大地老师) 从Electron环境搭建开始到手把手教你调试、Elect…...
STM32 修炼手册
第一章 计算机体系结构(了解) 后续在板子上开发的时候,需要考虑是否有操作系统 方式一:有操作系统,通过c库通过os api操作硬件方式二:无操作系统, 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…...
React vs Vue:点击外部事件处理的对比与实现
React vs Vue:点击外部事件处理的对比与实现 在 Web 应用中,“点击外部事件监听”是一种常见需求,典型应用如:点击弹窗外部关闭弹窗、点击下拉菜单外关闭菜单。虽然在 React 和 Vue 中实现的原理类似——都是通过监听 document 的…...
rk3576--- HDMI CEC唤醒
文章目录 一、CEC唤醒的相关概念二、CEC唤醒实现(一)内核配置(二)设备树dts(三)驱动注册中断(四)休眠后开启MCU(五)验证 一、CEC唤醒的相关概念 CEC 是一种在…...
榕壹云搭子系统技术解析:基于Spring Boot+MySQL+UniApp的同城社交平台开发实践
一、引言 本文将分享一款基于Spring Boot、MySQL和UniApp开发的同城社交平台的技术实现细节,重点探讨其架构设计、核心功能及开发过程中的技术考量。该项目旨在为开发者提供可扩展的社交平台解决方案,支持快速二次开发与独立部署。 二、技术选型与架构设计 1. 技术栈概览 …...
Node.js事件循环中的FIFO原则
1. Node.js事件循环中的FIFO原则 Node.js的事件循环确实遵循先进先出(FIFO)原则,但这个原则的适用范围需要明确。具体来说: FIFO原则的适用范围:FIFO原则主要适用于每个阶段内部的任务队列,而不是跨越不同…...
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
服务器相关
虚拟机服务器搭建 virtualbox安装 下载地址:Downloads – Oracle VirtualBox centos镜像下载地址 centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 清华大学开源软件镜像站 | Tsinghua Open Source Mirror…...
Linux的文件查找与压缩
查找文件 find命令 # 命令:find 路径范围 选项1 选项1的值 \[选项2 选项2 的值…]# 作用:用于查找文档(其选项有55 个之多)# 选项:# -name:按照文档名称进行搜索(支持模糊搜索,\* &…...
Q1财报持续向好,腾讯音乐如何在不确定中寻找确定性?
最近一段时间,各家上市公司的财报都备受关注,腾讯音乐娱乐集团作为文娱类的头部企业也是备受市场关注的,今日腾讯音乐第一季度财报已公布,业绩持续向好。在这个不确定性的大环境下,腾讯音乐是如何寻找自己的确定性的&a…...
window 显示驱动开发-报告图形内存(一)
计算图形内存 在 VidMm 能够向客户端报告准确的帐户之前,它必须首先计算图形内存的总量。 VidMm 使用以下内存类型和公式来计算图形内存: 系统总内存 此值是操作系统可访问的系统内存总量。 BIOS 分配的内存不会出现在此数字中。 例如,一台…...
DELL R770 服务器,更换RAID卡教程!
今天的任务,是帮客户的一台戴尔DELL PowerEdge R770 服务器,更换RAID卡(也可以称之为PERC模块、阵列卡、RAID控制器等)。 根据我的个传统习惯,依然是顺便做一个教程,分享给有需要的粉丝们。如果看完教程&am…...
【Java】网络编程(Socket)
网络编程 Socket 我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则使用套接字Socket来进行分离 套接字就像是传输层为应用层开的一个小口,应用程…...
力扣-226.翻转二叉树
题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 class Solution { public:TreeNode *invertTree(TreeNode *root) {if (!root) {return NULL;}TreeNode *temp root->right;root->right root->left;root->left …...
数据结构——例题1
eg1:求解 S 1! 2! 3! ... n! #include<stdio.h> #include<stdlib.h>long sum(int n){long s 0,t,i,j;for(i1;i<n;i){t1;for(j1;j<i;j){t*j;}st;}return s; }int main(){int n;printf("请输入一个整数:");scanf("…...
INT202 Complexity of Algroithms 算法的复杂度 Pt.7 NP-Completeness NP完全性
文章目录 1.P与NP问题1.1 计算上难以解决的问题(Hard Computational Problems)1.2 决策问题和优化问题(Decision/Optimization problems)1.3 计算问题的正式定义1.4 复杂性类1.4.1 复杂性类 P P P1.4.2 证明(Certifica…...
K8s 图形界面管理kubesphere
1. 概述 KubeSphere 是一个开源的、基于 Kubernetes 的容器平台,旨在简化企业级 Kubernetes 集群的部署、管理和运维。KubeSphere 提供了丰富的功能,包括多租户管理、DevOps 流水线、应用商店、监控与日志、服务网格、网络策略等,帮助企业快…...
MCU程序加密保护(一)闪存读写保护法 加密与解密
MCU(微控制器单元)的加密方法可以从硬件、软件和通信协议三个层面来理解。以下是常见的MCU加密手段,按类型分类说明: 针对目前 STM32 系列微控制器在程序加密保护方面手段单一、保护效果有限的问题,本文介绍并分析了四…...
Windows下安装mysql8.0
一、下载安装离线安装包 (下载过了,可以跳过) 下载网站:MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/ 二、安装mysql 三、安装完成验证...
ubuntu----100,常用命令2
目录 文件与目录管理系统信息与管理用户与权限管理网络配置与管理软件包管理打包与压缩系统服务与任务调度硬件信息查看系统操作高级工具开发相关其他实用命令 在 Ubuntu 系统中,掌握常用命令可以大幅提升操作效率。以下是一些常用的命令,涵盖了文件管理…...
PYTHON训练营DAY24
# SO代码我们的感情好像跳楼机 # 元组创建时,可以省略括号:my_tuple4 10, 20, thirty # 字符串要加“ ” 元组 一、创建 my_tuple1 (1, 2, 3) my_tuple2 (a, b, c) my_tuple3 (1, hello, 3.14, [4, 5]) # 可以包含不同类型的元素 print(my_tupl…...
Element UI 双击事件(@cell-dblclick 与 @row-dblclick)
Element UI 双击事件(cell-dblclick 与 row-dblclick) 一、核心双击事件绑定 表格单元格双击 事件绑定: 通过 cell-dblclick 监听单元格双击,接收四个参数(row, column, cell, event)。 示…...
云原生|kubernetes|kubernetes的etcd集群备份策略
简介: 云原生|kubernetes|kubernetes的etcd集群备份策略 前言: etcd作为集群的关键组件之一,还是非常有必要进行定期备份的,本例将会就如何更快更好的备份etcd以及应该有哪些策略做一解析。(二进制部署的etcd集群&…...