8051模板移植
8051模板移植
- 一,新建工程文件
- 二,Keil配置
一,新建工程文件
在工程文件下建立Driver和User
打开Keil,点击扳手选择芯片型号
出现下图情况,选择是,然后会多出一个启动文件,以后有用
二,Keil配置
按照下图,勾选生成hex文件
将桌面上的头文件路径添加到Keil
建立main.c文件,保存到User
将下面的代码粘贴到main.c
/*** 包含的头文件区域*/
// 芯片相关头文件
#include <STC15F2K60S2.H>// 自定义外设头文件
#include "led.h" // LED显示驱动
#include "key.h" // 按键驱动
#include "seg.h" // 数码管驱动
#include "iic.h" // IIC总线通信
#include "onewire.h" // 单总线协议(DS18B20温度传感器)
#include "uart.h" // 串口通信
#include "ultrasound.h" // 超声波测距
#include "ds1302.h" // 实时时钟
#include "init.h" // 系统初始化// 系统头文件
#include "stdio.h" // 标准输入输出
#include "string.h" // 字符串处理
#include "intrins.h" // 内联汇编指令/*** 全局变量声明区*/
// 按键相关变量
idata unsigned char Key_Val; // 当前按键值
idata unsigned char Key_Down; // 按键按下标志
idata unsigned char Key_Old; // 上次按键值
idata unsigned char Key_Up; // 按键释放标志
idata unsigned char Key_Slow_Down; // 按键消抖延时计数器// 数码管显示相关变量
pdata unsigned char Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // 数码管显示缓冲区,初始为全不显示
idata unsigned char Seg_Pos; // 当前扫描的数码管位置
idata unsigned int Seg_Slow_Down; // 数码管显示更新延时计数器// LED显示相关变量
pdata unsigned char ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // LED显示缓冲区// 串口通信相关变量
idata unsigned char Uart_Recv_Tick; // 串口接收超时计数器
idata unsigned char Uart_Rx_Flag; // 串口接收标志
idata unsigned char Uart_Recv[10]; // 串口接收数据缓冲区,默认10个字节,可根据需要调整
idata unsigned char Uart_Recv_Index; // 串口接收数据索引// 频率计相关变量
idata unsigned int Freq; // 频率值
idata unsigned int Time_1s; // 1秒计时器// 实时时钟相关变量
pdata unsigned char ucRtc[3] = {11, 12, 13}; // 时、分、秒
idata unsigned char RTC_Slow_Down; // 时钟读取延时计数器// 传感器相关变量
idata unsigned int Temperature_Val_100x; // 温度值(放大100倍)
idata unsigned int AD_Light_Val_100x; // 光敏电阻值(放大100倍)
idata unsigned int AD_RB2_Val_100x; // 滑动变阻器值(放大100倍)
idata unsigned char AD_Slow_Down; // AD转换延时计数器
idata unsigned int Temperature_Slow_Down; // 温度读取延时计数器
idata unsigned char Distance_Val; // 超声波测距距离值
idata unsigned char Distance_Slow_Down; // 超声波测距延时计数器// PWM调光相关变量
idata unsigned char pwm_period = 10; // PWM周期值
idata unsigned char pwm_compare = 1; // PWM比较值(占空比)// 显示模式控制
idata unsigned char Seg_Show_Mode; // 显示模式:0-时间、1-温度、2-距离、3-光敏+变阻器、4-频率/*** 功能函数区*//*** AD/DA转换处理函数* 功能:读取AD转换值并输出DA值*/
void AD_DA()
{// 延时控制,限制AD转换频率if (AD_Slow_Down < 160)return;AD_Slow_Down = 0;// 读取滑动变阻器AD值(通道0x43)并转换为百分比(放大100倍)AD_RB2_Val_100x = Ad_Read(0x43) * 100 / 51.0;// 读取光敏电阻AD值(通道0x41)并转换为百分比(放大100倍)AD_Light_Val_100x = Ad_Read(0x41) * 100 / 51.0;// 输出DA值(2V)Da_Write(102);
}/*** 实时时钟读取函数* 功能:从DS1302读取当前时间*/
void Get_Time()
{// 延时控制,限制读取频率if (RTC_Slow_Down < 100)return;RTC_Slow_Down = 0;// 读取时钟数据Read_Rtc(ucRtc);
}/*** 温度读取函数* 功能:从DS18B20读取温度值*/
void Get_Temperature()
{// 延时控制,限制读取频率if (Temperature_Slow_Down < 300)return;Temperature_Slow_Down = 0;// 读取温度并放大100倍,便于处理小数Temperature_Val_100x = rd_temperature() * 100;
}/*** 超声波测距函数* 功能:获取超声波测距距离*/
void Get_Distance()
{// 延时控制,限制测距频率if (Distance_Slow_Down < 100)return;Distance_Slow_Down = 0;// 获取超声波距离值Distance_Val = Ut_Wave_Data();
}/*** 按键处理函数* 功能:扫描按键并处理按键事件*/
void Key_Proc()
{// 延时控制,按键消抖if (Key_Slow_Down < 10)return;Key_Slow_Down = 0;// 读取当前按键值Key_Val = Key_Read();// 检测按键下降沿(按下瞬间)Key_Down = Key_Val & (Key_Old ^ Key_Val);// 检测按键上升沿(释放瞬间)Key_Up = ~Key_Val & (Key_Old ^ Key_Val);// 保存当前按键值作为下次扫描的旧值Key_Old = Key_Val;// 按键4:切换显示模式if (Key_Down == 4){Seg_Show_Mode = (++Seg_Show_Mode) % 6; // 循环切换显示模式}// 按键8:增加PWM占空比if (Key_Down == 8)pwm_compare = (++pwm_compare) % 10;// 按键9:减少PWM占空比if (Key_Down == 9)pwm_compare = (pwm_compare == 0) ? 0 : pwm_compare - 1;
}/*** 数码管显示处理函数* 功能:根据当前显示模式更新数码管显示数据*/
void Seg_Proc()
{// 延时控制,限制显示刷新频率if (Seg_Slow_Down < 500)return;Seg_Slow_Down = 0;// 根据当前显示模式处理数据switch (Seg_Show_Mode){case 0:// 模式0:显示时间(时:分:秒)Seg_Buf[0] = ucRtc[0] / 10; // 时-十位Seg_Buf[1] = ucRtc[0] % 10; // 时-个位Seg_Buf[2] = 10; // 空位(分隔符)Seg_Buf[3] = ucRtc[1] / 10; // 分-十位Seg_Buf[4] = ucRtc[1] % 10; // 分-个位Seg_Buf[5] = 10; // 空位(分隔符)Seg_Buf[6] = ucRtc[2] / 10; // 秒-十位Seg_Buf[7] = ucRtc[2] % 10; // 秒-个位break;case 1:// 模式1:显示温度值(带小数点)Seg_Buf[0] = Temperature_Val_100x / 1000; // 温度-十位Seg_Buf[1] = Temperature_Val_100x / 100 % 10 + ','; // 温度-个位(带小数点)Seg_Buf[2] = Temperature_Val_100x / 10 % 10; // 温度-小数第一位Seg_Buf[3] = Temperature_Val_100x % 10; // 温度-小数第二位Seg_Buf[4] = 10; // 空位Seg_Buf[5] = 10; // 空位Seg_Buf[6] = 10; // 空位Seg_Buf[7] = 10; // 空位break;case 2:// 模式2:显示超声波测距距离Seg_Buf[0] = Distance_Val / 100; // 距离-百位Seg_Buf[1] = Distance_Val / 10 % 10; // 距离-十位Seg_Buf[2] = Distance_Val % 10; // 距离-个位Seg_Buf[3] = 10; // 空位Seg_Buf[4] = 10; // 空位Seg_Buf[5] = 10; // 空位Seg_Buf[6] = 10; // 空位Seg_Buf[7] = 10; // 空位break;case 3:// 模式3:显示AD转换值(光敏+滑动变阻器)Seg_Buf[0] = AD_Light_Val_100x / 100 + ','; // 光敏-整数位(带小数点)Seg_Buf[1] = AD_Light_Val_100x / 10 % 10; // 光敏-小数第一位Seg_Buf[2] = AD_Light_Val_100x % 10; // 光敏-小数第二位Seg_Buf[3] = 10; // 空位Seg_Buf[4] = 10; // 空位Seg_Buf[5] = AD_RB2_Val_100x / 100 + ','; // 变阻器-整数位(带小数点)Seg_Buf[6] = AD_RB2_Val_100x / 10 % 10; // 变阻器-小数第一位Seg_Buf[7] = AD_RB2_Val_100x % 10; // 变阻器-小数第二位break;case 4:// 模式4:显示频率值Seg_Buf[0] = Freq / 10000000; // 频率-千万位Seg_Buf[1] = Freq / 1000000 % 10; // 频率-百万位Seg_Buf[2] = Freq / 100000 % 10; // 频率-十万位Seg_Buf[3] = Freq / 10000 % 10; // 频率-万位Seg_Buf[4] = Freq / 1000 % 10; // 频率-千位Seg_Buf[5] = Freq / 100 % 10; // 频率-百位Seg_Buf[6] = Freq / 10 % 10; // 频率-十位Seg_Buf[7] = Freq % 10; // 频率-个位break;}// 调试输出示例(注释状态)// printf("%f,%bu,%f,%f,%u\r\n",// (float)Temperature_Val_100x / 100.0f,// Distance_Val,// (float)AD_Light_Val_100x / 100.0f,// (float)AD_RB2_Val_100x / 100.0f,// Freq);
}/*** LED灯显示处理函数* 功能:控制LED灯显示*/
void Led_Proc()
{// 设置所有LED灯亮ucLed[0] = 1;ucLed[1] = 1;ucLed[2] = 1;ucLed[3] = 1;ucLed[4] = 1;ucLed[5] = 1;ucLed[6] = 1;ucLed[7] = 1;
}/*** 串口通信处理函数* 功能:处理接收到的串口数据*/
void Uart_Proc()
{unsigned char x, y;// 无数据接收时直接返回if (Uart_Recv_Index == 0)return;// 接收超时处理(10ms无新数据视为一帧结束)if (Uart_Recv_Tick >= 10){Uart_Rx_Flag = 0;Uart_Recv_Tick = 0;// 数据解析示例:解析"x,y"格式的坐标数据if (sscanf(Uart_Recv, "%bu,%bu", &x, &y) == 2)printf("my get x=%bu,y=%bu", x, y);elseprintf("error");// 清空接收缓冲区,准备下一次接收memset(Uart_Recv, 0, Uart_Recv_Index);Uart_Recv_Index = 0;}
}/*** 定时器0初始化函数* 功能:配置定时器0工作在计数模式,用于频率测量* 频率:外部输入*/
void Timer0_Init(void)
{AUXR &= 0x7F; // 定时器时钟12T模式TMOD &= 0xF0; // 清除定时器0模式位TMOD |= 0x05; // 设置为计数模式,计数外部输入脉冲TL0 = 0x00; // 计数器低8位清零TH0 = 0x00; // 计数器高8位清零TF0 = 0; // 清除TF0溢出标志TR0 = 1; // 启动定时器0计数
}/*** 定时器1初始化函数* 功能:配置定时器1工作在定时模式,周期为1ms* 频率:@12.000MHz晶振*/
void Timer1_Init(void) // 1毫秒@12.000MHz
{AUXR &= 0xBF; // 定时器时钟12T模式TMOD &= 0x0F; // 设置定时器模式TL1 = 0x18; // 设置定时初始值TH1 = 0xFC; // 设置定时初始值TF1 = 0; // 清除TF1标志TR1 = 1; // 定时器1开始计时ET1 = 1; // 使能定时器1中断EA = 1; // 使能总中断
}/*** 定时器1中断服务函数* 功能:系统主要定时任务处理* 周期:1ms*/
void Timer1_Isr(void) interrupt 3
{// 各模块计时器递增Key_Slow_Down++;Seg_Slow_Down++;RTC_Slow_Down++;Temperature_Slow_Down++;AD_Slow_Down++;Distance_Slow_Down++;// 数码管动态扫描控制if (++Seg_Pos == 8)Seg_Pos = 0;// 数码管显示处理(带小数点判断)if (Seg_Buf[Seg_Pos] > 20)Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos] - ',', 1); // 显示带小数点elseSeg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], 0); // 显示无小数点// PWM调光处理if (++pwm_period >= 10)pwm_period = 0;if (pwm_period >= pwm_compare)Led_Disp(ucLed); // PWM高电平时显示LEDelseLed_Off(); // PWM低电平时关闭LED// 串口接收超时计数if (Uart_Rx_Flag == 1)Uart_Recv_Tick++;// 频率计1秒采样控制if (++Time_1s == 1000){Time_1s = 0;Freq = TH0 << 8 | TL0; // 读取定时器0计数值作为频率值TH0 = TL0 = 0; // 清零计数器,开始下一次计数}
}/*** 串口1中断服务函数* 功能:处理串口接收中断*/
void Uart1Server() interrupt 4
{if (RI == 1) // 接收中断{Uart_Rx_Flag = 1; // 设置接收标志Uart_Recv_Tick = 0; // 清零接收超时计数器Uart_Recv[Uart_Recv_Index] = SBUF; // 保存接收数据Uart_Recv_Index++; // 接收索引增加RI = 0; // 清除接收中断标志// 接收缓冲区溢出保护if (Uart_Recv_Index > 10){Uart_Recv_Index = 0;memset(Uart_Recv, 0, 10); // 清空接收缓冲区}}
}/*** 主函数* 功能:系统初始化和主循环*/
void main()
{// 系统初始化System_Init(); // 初始化系统基本配置Set_Rtc(ucRtc); // 设置初始时间Timer0_Init(); // 初始化定时器0(频率计)Uart1_Init(); // 初始化串口Timer1_Init(); // 初始化定时器1(系统定时)// 系统主循环while (1){Key_Proc(); // 按键处理Seg_Proc(); // 数码管显示处理Led_Proc(); // LED显示处理Uart_Proc(); // 串口通信处理AD_DA(); // AD/DA转换处理Get_Time(); // 时钟读取Get_Distance(); // 超声波测距处理Get_Temperature(); // 温度读取处理}
}
将模板粘贴到Driver下
接下来将桌面上的文件(main.c和底层.c)添加到Keil
编译一下,发现5个报错:2个EEPROM函数和3个LED函数没有调用。以后使用到自然清除
移植完毕
相关文章:
8051模板移植
8051模板移植 一,新建工程文件二,Keil配置 一,新建工程文件 在工程文件下建立Driver和User 打开Keil,点击扳手选择芯片型号 出现下图情况,选择是,然后会多出一个启动文件,以后有用 二&…...
轻松制作高质量视频,实时生成神器LTX-Video重磅登场!
探索LTX-Video:实时视频生成跨越新高度 在如今这个视觉内容主导的数字时代,视频生成成为推动创意表达的关键。而今天,我们将带您深入探索LTX-Video,一个强大的开源项目,致力于通过尖端技术将视频生成提升到一个全新的…...
两个数组的交集(暴力、set、哈希)
一.题目 给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2]示例 2: 输入…...
[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
[架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离(十六) 摘要:本文深入剖析Spring Boot多环境配置的5种实现方案,涵盖YAML分组配置、Maven Profile集成、Kubernetes适配等企业级实践,并附赠配置加密方案…...
LWIP的IP协议笔记
IP协议简介 IP协议是TCP/IP协议族的基石,它为上层提供无连接、不可靠的服务 无连接:指IP通信双方都不长久的维持对方的任何信息。这表示上层协议每次发送数据,都需要明确指出对方的IP地址 不可靠:指IP协议不能把IP数据报准确到…...
matlab介绍while函数
MATLAB 中的 while 语句介绍 在 MATLAB 中,while 语句是一种循环结构,用于在满足特定条件时反复执行一段代码块。与 for 循环不同,while 循环的执行次数是动态的,取决于循环条件是否为真。 语法 while condition% 循环体代码 e…...
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
4.LC 旋转矩阵(中等,学习) 面试题 01.07. 旋转矩阵 - 力扣(LeetCode) 思想: 法一: 额外空间数组来回赋值拷贝 法二: 1.翻转90度得到等式a[j][n-i-1]a[i][j],但是会改变a[j][n-i-1]原始值,再去看该位置变到哪一位置 分析可得,4个…...
【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
1.约定前后端交互接口 [请求] /book/getListByPage [参数] currentPage1&pageSize10 [响应] 返回封装的result对象对应的Json数据 2. 整体逻辑 2.1 Controller的逻辑 (1)把接收的参数封装为PageRequest类,里面有属性:curren…...
本地大模型工具深度评测:LM Studio vs Ollama,开发者选型指南
引言 在大语言模型本地化部署的技术浪潮中,隐私保护与成本优化成为核心诉求。LM Studio与Ollama作为两款明星级本地大模型工具,凭借对开源模型的支持能力,成为开发者关注的焦点。本文将从技术架构、应用场景、实操体验三个维度展开深度对比&a…...
天线的PCB设计
目录 天线模块设计的重要性 天线模块的PCB设计 天线模块设计的重要性 当智能手表突然断连、无人机信号飘忽不定——你可能正在经历一场来自天线模块的"无声抗议"。这个隐藏在电子设备深处的关键组件,就像数字世界的隐形信使,用毫米级的精密结…...
《P1226 【模板】快速幂》
题目描述 给你三个整数 a,b,p,求 abmodp。 输入格式 输入只有一行三个整数,分别代表 a,b,p。 输出格式 输出一行一个字符串 a^b mod ps,其中 a,b,p 分别为题目给定的值, s 为运算结果。 输入输出样例 输入 #1复制 2 10 9输…...
推荐一款免费开源工程项目管理系统软件,根据工程项目全过程管理流程开发的OA 办公系统
在当今的工程项目管理领域,许多企业和团队面临着诸多难题。传统的管理方式往往依赖于人工记录和分散的工具,导致项目进度难以实时把控,任务分配不够清晰,合同管理混乱,事件提醒不及时,财务管理缺乏系统性&a…...
AZScreenRecorder最新版:功能强大、操作简便的手机录屏软件
AZScreenRecorder最新版是一款功能强大的手机录屏软件,专为安卓设备设计。它无需ROOT权限,支持无限录制时长,操作简单,录制过程中可以随时暂停,满足不同用户的个性化录屏需求。此外,用户还可以自定义分辨率…...
[sklearn机器学习概述]机器学习-part3
获取数据、数据处理、特征工程后,就可以交给预估器进行机器学习,流程和常用API如下。 1.实例化预估器(估计器)对象(estimator), 预估器对象很多,都是estimator的子类(1)用于分类的预估器sklearn.neighbors.KNeighbors…...
[模型选择与调优]机器学习-part4
七 模型选择与调优 1 交叉验证 (1) 保留交叉验证HoldOut HoldOut Cross-validation(Train-Test Split) 在这种交叉验证技术中,整个数据集被随机地划分为训练集和验证集。根据经验法则,整个数据集的近70%被用作训练集ÿ…...
PyTorch API 1 - 概述、数学运算、nn、实用工具、函数、张量
文章目录 torch张量创建操作索引、切片、连接与变异操作 加速器生成器随机采样原地随机采样准随机采样 序列化并行计算局部禁用梯度计算数学运算常量逐点运算归约操作比较运算频谱操作其他操作BLAS 和 LAPACK 运算遍历操作遍历操作遍历操作遍历操作遍历操作遍历操作遍历操作遍历…...
如何在mac上使用便利贴
可以在 App Store 下载便利贴应用实现在电脑上贴便条的效果。 以 「桌面便利贴」这款应用为例,创建的便利贴会像桌面上的文件一样展示在桌面上,随时可以查看。还可以修改便笺的颜色、透明度、字体、高亮等等。 我比较喜欢的功能是将便签固定在所有窗口的…...
Linux——Mysql索引和事务
目录 一,Mysql索引介绍 1,索引概述 1,索引的优点 2,索引的缺点 2,索引作用 3,索引分类 普通索引 唯一索引 主键索引 组合索引 全文索引 4,查看索引 5,删除索引 6&…...
vim 查看复杂的宏扩展
在一些复杂项目中,使用宏可以简化代码。但是对于刚接触项目的人来说,分析层层嵌套的宏,是件头疼的事情。 使用 vim 的多窗口功能,可以为此提供一些帮助。 如下图,分析4层嵌套的宏,DEFINE_I440FX_MACHINE -…...
【计算机视觉】OpenCV项目实战:基于OpenCV的图像分割技术深度解析与实践指南
基于OpenCV的图像分割技术深度解析与实践指南 项目概述与技术背景项目核心特点传统分割算法分类 环境配置与项目结构系统要求安装步骤项目结构解析 核心算法实现解析1. 阈值分割(Otsu方法)2. Canny边缘检测3. 分水岭算法 实战应用指南1. 基础分割流程2. …...
线性表-顺序表(Sequential List)
1 线性表 1.1 顺序表(Sequential List) 顺序表并不难理解,主要是知道顺序表是在内存中连续存储的一段数据,知道这个后,相应的算法也就非常简单了。 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的…...
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-🎮 俄罗斯方块:用旋转矩阵打造经典 🧊 大家好!今天我将带大家用MATLAB实现经典的俄罗斯方块游戏。我们将从数学原理出发…...
通过user-agent来源判断阻止爬虫访问网站,并防止生成[ error ] NULL日志
一、TP5.0通过行为(Behavior)拦截爬虫并避免生成 [ error ] NULL 错误日志 1. 创建行为类(拦截爬虫) 在 application/common/behavior 目录下新建BlockBot.php ,用于识别并拦截爬虫请求: <?php name…...
微服务的“迷宫” - 我们为何需要服务网格?
微服务的“迷宫” - 我们为何需要服务网格? 你好!欢迎来到我们的服务网格探索之旅。近年来,“微服务架构”无疑是软件开发领域最热门的词汇之一。它将庞大的单体应用拆分成一组小而独立的、可以独立开发、部署和扩展的服务单元,带来了前所未有的敏捷性和弹性。开发团队可以…...
Ubuntu 安装 HAProxy
HAProxy 是什么 HAProxy(High Availability Proxy) 是一个 高性能、高可用的 TCP 和 HTTP 负载均衡器与代理服务器。 HAProxy 的特点 特性说明支持协议HTTP、HTTPS、TCP高性能使用 C 语言编写,性能极高高可用与 Keepalived 配合可实现主备健…...
VUE CLI - 使用VUE脚手架创建前端项目工程
前言 前端从这里开始,本文将介绍如何使用VUE脚手架创建前端工程项目 1.预准备(编辑器和管理器) 编辑器:推荐使用Vscode,WebStorm,或者Hbuilder(适合刚开始练手使用),个…...
Nginx高级配置
目录 一.网页的状态页 二. Nginx第三方模块 2.1 echo模块 三. 变量 3.1 内置变量 3.2 自定义变量 四. 自定义访问日志 (优化) 4.1 自定义访问日志的格式 4.2 自定义json 格式日志 五. Nginx压缩功能 六 . HTTPS 功能 6.1 https概述 6.2 配置实例-----自签名证…...
Docker镜像搬运工:深入解析export与import,实现容器环境无缝迁移!
Docker作为现代开发运维的利器,其镜像和容器的管理技巧直接影响效率。当我们需要跨环境迁移容器状态时,docker export和docker import这对组合命令就能大显身手。本文带你彻底搞懂它们的核心逻辑、使用场景及避坑指南! 一、Docker export&…...
数字孪生实战笔记(1)数字孪生的含义、应用及技术体系
一、含义 数字孪生(Digital Twin)是一种通过数字化模型在虚拟世界中实时映射和模拟物理实体、系统或过程的技术。它的核心目的是通过对现实对象的建模、感知、分析和预测,实现对物理世界的全面感知、智能控制和优化决策。数字孪生 实体对象 …...
计算机网络 4-2-2 网络层(IPv4)
2.7 网络地址转换NAT 引入端口号:IP地址端口号→一个特定的进程,(不同主机可能存在相同端口号) 网络层实现了“主机到主机”的通信。网络层在IP数据报的首部,指明源IP地址、目的IP地址 传输层实现了“端到端” &#…...
第二个简单的SpringBoot和Vue前后端全栈的todoapp案例
项目源于哔哩哔哩,按视频手敲了一下,补充上代码和一些细节。 全栈项目实践:1小时快速入门SpringBootvue3element-plus_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LH4y1w7Nd/?spm_id_from333.1387.favlist.content.click&vd_…...
探秘 Canva AI 图像生成器:重塑设计创作新范式
Canva 凭借简洁易用的界面和海量模板资源,早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出,更是为设计领域带来了一场深刻变革,以智能化的手段重塑了图像创作的方式与边界。 技术内核:AI 如何驱动图像生成 Can…...
栈应用:辅助站(c++)
干货 今天讲讲最大辅助栈和最小辅助栈 主栈进入元素的时候 最大辅助栈:保证新元素大于等于(辅助栈)顶的时候,再进入辅助栈这样就能保证最大辅助栈的栈顶元素 是主栈中的最大值 主栈出栈的时候 最大辅助栈:主栈出栈元素如果等于(辅助栈)的栈顶元素,再…...
AI时代的数据可视化:未来已来
你有没有想过,数据可视化在未来会变成什么样?随着人工智能(AI)的飞速发展,数据可视化已经不再是简单的图表和图形,而是一个充满无限可能的智能领域。AI时代的可视化不仅能自动解读数据,还能预测…...
常见音频主控芯片以及相关厂家总结
音频主控芯片是音频设备(如蓝牙耳机、音箱、功放等)的核心组件,负责音频信号的解码、编码、处理和传输。以下是常见的音频主控芯片及其相关厂家,按应用领域分类: 蓝牙音频芯片 主要用于无线耳机、音箱等设备࿰…...
湖仓一体架构在金融典型数据分析场景中的实践
在数字经济与金融科技深度融合的今天,数据已成为金融机构的核心战略资产。然而,传统数据架构面临着三大困局,制约着金融机构数据价值的充分释放。 一、需求驱动更多银行数据分析场景 金融机构,特别是银行业,面临着双重…...
VBA —— 学习Day5
子程序与函数 子程序:实现特定功能的程序代码块 子程序语法: [修饰符] Sub 子程序名称([参数1,参数2,参数3]) 代码块 End Sub 子程序如何调用: 1 . 子程序名 [参数1,参数2,...] 2. Cal…...
Flink 实时数据一致性与 Exactly-Once 语义保障实战
在构建企业级实时数仓的过程中,“数据一致性” 是保障指标准确性的核心能力,尤其是在金融、电商、医疗等对数据敏感度极高的场景中。Flink 作为流批一体的实时计算引擎,其内建的 Exactly-Once 语义为我们提供了强有力的保障机制。本篇将围绕如何实现端到端的数据一致性、如何…...
Java云原生到底是啥,有哪些技术
☁️ Java云原生:程序员の修仙飞升指南(附渡劫技巧) 一、修仙世界观:传统程序 vs 云原生程序 🏡 传统Java程序(老宅院) 特点:单体大瓦房、扩建要拆墙(耦合度高…...
IPM IMI111T-026H 高效风扇控制板
概述: REF-MHA50WIMI111T 是一款专为风扇驱动设计的参考开发板,搭载了英飞凌的IMI111T-026H iMOTION™智能功率模块(IPM)。这个模块集成了运动控制引擎(MCE)、三相栅极驱动器和基于IGBT的功率级,全部封装在一个紧凑的DSO22封装中。REF-MHA50…...
JavaScript基础-局部作用域
在JavaScript中,理解不同种类的作用域是掌握这门语言的关键之一。作用域决定了变量和函数的可访问性(即可见性和生命周期)。与全局作用域相对应的是局部作用域,它限制了变量和函数只能在其定义的特定范围内被访问。本文将深入探讨…...
[特殊字符]Meilisearch:AI驱动的现代搜索引擎
前言 大家好,我是MAI麦造! 上文介绍一了Manticore Search 这款轻量级的搜索引擎,这次又有了新的发现!传送门: Elasticsearch太重?它的超轻量的替代品找到了! 这是一个让我超级兴奋的AI搜索引…...
K8S Svc Port-forward 访问方式
在 Kubernetes 中,kubectl port-forward 是一种 本地与集群内资源(Pod/Service)建立临时网络隧道 的访问方式,无需暴露服务到公网,适合开发调试、临时访问等场景。以下是详细使用方法及注意事项: 1. 基础用…...
SD06_前后端分离项目部署流程(采用Nginx)
本文档详细描述了如何在Ubuntu 20.04服务器上从零开始部署Tlias前后端分离系统。Tlias系统由Spring Boot后端(tlias-web-management)和Vue前端(vue-tlias-management)组成。 目录 环境准备安装MySQL数据库部署后端项目部署前端项…...
计算机网络:家庭路由器WiFi信号的发射和手机终端接收信号原理?
WiFi路由器与手机之间的信号传输涉及多个技术层面的协作,以下是其工作原理的详细步骤: 一、数据封装与协议处理 应用层数据生成 用户操作(如浏览网页、视频播放)产生数据包,经TCP/IP协议栈逐层封装,添加IP地址(网络层)和MAC地址(数据链路层)。协议封装 数据包被封装…...
【Redis】string
文章目录 string 字符串常用命令设置和获取setgetmget & mset 计数操作incr & incrbydecr & decrbyincrbyfloat 字符串操作appendstrlengetrangesetrange string 字符串 关于 Redis 的字符串,有几点需要注意 Redis 所有的 key 的类型都是字符串类型va…...
vue3的响应式设计原理
Vue 3 的响应式设计是其核心特性之一,依赖于 Proxy 和 依赖收集机制,相比 Vue 2 的 Object.defineProperty,Vue 3 的响应式系统更加高效、灵活且易于维护。 以下是 Vue 3 响应式设计的核心原理: 一、核心机制概览 使用 Proxy 实现…...
学习黑客5 分钟深入浅出理解Linux Logs [特殊字符]
5 分钟深入浅出理解Linux Logs 📝 大家好!今天我们将探索Linux系统中的日志机制——这是系统管理和安全分析的重要组成部分。在网络安全学习特别是TryHackMe平台上的挑战中,理解和分析日志是发现入侵痕迹、追踪攻击者行为和收集证据的关键技…...
【Docker系列】docker inspect查看容器部署位置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
journalctl使用
journalctl 可以查看很多服务的日志,比如 docker,ollama 等。 1. 查看 xx 服务的最新日志(实时滚动) sudo journalctl -u docker -f -f 参数表示 跟随(follow),会持续输出最新日志࿰…...