当前位置: 首页 > news >正文

单片机-89C51部分:5、点亮LED

飞书文档https://x509p6c8to.feishu.cn/wiki/SlB5wYD1QiPRzWkfijEcIvv8nyc

一、应用场景

二、点灯原理

插件led灯珠长引脚为正极,短引脚为负极。

LED(发光二极管)两端存在电压差,有一定的电流流过时会亮起。电流可以理解为水流,电压差可以理解为水位差,当两个点水位高度不一样时,水流会从高水位流向低水位。

但是要注意:流过LED的电流需要在一定范围内,否则会烧坏LED,一般小于20ma,所以我们就需要串联电阻分压,那串联的电阻需要多大阻值呢?

LED的限流电阻计算:

一般插件LED电流是20ma左右,压降:红/黄色1.8V, 蓝/白色 3V, 实际电压要看 LED 规格书。

一般贴片LED电流是5ma左右,压降:红/绿/橙色1.8V,蓝/白色 3V

例如:供电电压是3.3V,黄色贴片LED

根据V = I * R ,则R= (3.3 - 1.8) /0.005 (5ma = 0.005), 所以 R = 300 欧姆.

很多时候你看到别人设计的电路中,LED串联的电阻去到几百欧或几千欧都有,是设计错了吗?

实际上这是非常合理的,因为大多数电路中,LED只是一个提示灯,对亮度没有要求,反而希望把功耗降低,所以需要增大限流电阻来实现超低电流,像产品中的贴片LED去到0.5ma也是能看清楚灯光的。

(3.3-1.8)/0.005 = 300欧

三、点亮LED

知道LED的点亮原理后,我们来看下如何用单片机点亮LED

首先是接线部分,我们可以通过单片机的引脚,又叫做GPIO,这些IO都是具备输出和输入能力的,什么是 GPIO 呢?GPIO 的 英文全程是 General-purpose input/output,翻译过来就是:通用输入输出,也就是我们可以设置某个引脚输出高低电平,或读取某个引脚输入的电平。

对于这种有44个引脚的封装方式的51单片机,它有以下IO口:

P0段:P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7

P1段:P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7

P2段:P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7

P3段:P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

P4段:P4.0 P4.1 P4.2 P4.3 P4.4 P4.5 P4.6

其中,P0段的GPIO口叫做P0 IO口,简称P0口。

所以,所以我们的做法是:将LED和电阻串联,一段接负极(接地),另一端接单片机IO口,然后 控制单片机的IO口电平 就可以决定LED是否点亮了

方式一

方式二
 

注意:通常我们不采用第一种情况,因为单片机IO口虽然可以达到高电压,但是输出电流不会大,因此单片机IO口给LED供电时可能会出现电流不足,导致LED不会全亮。
因此,我们一般选择第二种,利用电源直接供电,电流灌入单片机IO口的方式来给LED灯供电

那我们如何通过编程控制芯片某个IO输出高低电平呢?

其实就是操作芯片对应IO的寄存器即可,这部分我们可以在芯片手册上看到

51单片机的每组IO口的电平状态都被储存在一个单独的8位寄存器中,寄存器的位为0或1就分别对应其相应的GPIO电平为低或高。

那如何点亮LED呢?板卡LED部分的原理图如下:

我们可以看到LED1 LED2 LED3分别接在P2.7 P2.6 P2.5上,所以要点亮LED1,就需要设置P2.7输出低电平,如何用代码设置IO输出低电平呢?下面是操作方法:

因为摆放顺序错的原因,LED灯的顺序如下哦:

方法一:操作整个寄存器

直接在C语言代码中用赋值法即可,例如操作P2口的P2.0 P2.1 P2.4 P2.6口输出高电平的代码是

Java
P2 = 0x53;
0x53
的是16进制的53,即53H,对应二进制01010011,即01010011B,所以它对应P2.0 P2.1 P2.4 P2.6口输出高电平

这里的0x53是十六进制的表示方法,为什么需要十六进制,什么是十进制,什么是二进制呢?

进制的作用:更好的表示数值。
十进制:十进制是人类最自然的数字系统,因为我们有十个手指,所以我们使用十进制进行计数,使用 0-9 来表示数字,逢10进1。
二进制:二进制的出现是因为数字电路中,数字信号只有高/低或开/关两种状态,所以只需要使用两个数字 0 和 1 来表示数字,优点是非常直观,缺点是书写起来冗长,过长的二进制容易记录错误,不便阅读和书写。
十六进制:为了可以更紧凑地表示二进制数据,就有了十六进制,使用十六个数字 0-9 和字母 A-F 来表示数字,在代码中,使用0x前缀来表示十六进制。

Java
十进制
char i = 10;
十六进制
char i = 0x0a;

所以,我们可以设置P2.0-P2.7输出都为低电平,代码这样写。

Java
#include <reg52.h>
void main(){
  P2=0x00;  //0000 0000
  while(1)
  {
   
  }
}

那如果我们只想控制某个IO,例如P2.7,不想控制P2所有IO呢?是否有办法?

方法二 操作寄存器的某个位

在C语言中,先定义你要操作的位,使用关键字sbit(这是标准C语言没有的关键字,是C51编译器的拓展关键字,用于定义寄存器的某个位)。你就可以理解成sbit就是给寄存器的某个位起一个别名。之后用等号赋值即可更改此位的0或1

sbit led1= Px^y;

符号^在C51中也表示寄存器的第某位。如上方代码,Px^y表示Px寄存器的第y位。

//定义变量led1表示P2寄存器的第7位
sbit led1= P2^7;

注意:"^"实质代表的是异或运算,可以算一下,恰好符合。

Java
//定义变量led1表示P2寄存器的第7位
sbit led1= P2^7;
//定义变量led2表示P2寄存器的第6位
sbit led2= P2^6;
        ...
        //将P2.7口 输出低电平
        led1= 0;
        //将P2.6口 输出高电平
        led2= 1;
        ...

所以,我们可以这样来定义P2.7这个引脚的输出高电平。

C
#include <reg52.h>
sbit led = P2^7;
void main(void)
{
    led = 0;

    while(1)
    {
               
    }
}
 

四、闪烁控制

前面,我们通过设置某个引脚输出低电平,点亮LED,也就是我们设置输出高电平时,会关闭LED,那我们需要实现LED闪烁的功能时,如何实现呢?

答案是:先点亮LED,延时一段时间,关闭LED,再延时一段时间,如此反复,就可以得到一个闪烁的LED功能。

在单片机中如何实现延时功能呢?有以下几种生成延时函数的生成方法

1、让芯片循环执行一些无意义的代码

我们知道,芯片执行每一句代码都需要时间,假设执行一句代码的时间为1ms,那我们点亮LED,然后执行500句(500ms)无意义的代码,再关闭LED,就可以得到闪烁的效果啦。

Java
51单片机的时钟、机器周期和指令周期
①时钟周期
主频:芯片主时钟的频率,通常以MHz或者GHz为单位,单片机的主时钟频率是外部晶振。
时钟周期(振荡周期) = 晶振频率的倒数。例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。

③机器周期
在芯片中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成。

④指令周期
CPU从存储器中取出并执行一条指令所需的全部时间称之为指令周期。
CPU执行一条指令的过程,计算机每执行一条指令的过程,可分解为如下步骤:
Instruction Fetch(取指令):指令放在存储器,通过PC寄存器和指令寄存器取出指令的过程,由控制器(Control Unit)操作。 从PC寄存器找到对应指令地址,据指令地址从内存把具体指令加载到指令寄存器,然后PC寄存器自增;
Instruction Decode(译码):据指令寄存器里面的指令,是哪一种类型的指令,解析成要进行什么操作,具体要操作哪些寄存器、数据或内存地址。该阶段也是由控制器执行;
Execute(执行):实际执行算术逻辑操作、数据传输或者直接的地址跳转操作。无论是算术操作、逻辑操作的指令,还是数据传输、条件分支的指令,都由算术逻辑单元(ALU)操作,即由运算器处理。如果是一个简单的无条件地址跳转,那可直接在控制器里完成,无需运算器
重复1~3的过程,这个循环完成的时间即指令周期,指令不同,所需的机器周期数也不同,一般由1~4个机器周期组成。
如:MOV A, Rn (数据传送指令) 就只需要一个机器周期, DIV AB (除法指令)就需要四个机器周期。

注意:上面讲的指令周期是51单片机的汇编指令,但我们写的程序是用C语言,C语言最终是会编译成汇编指令,在keil上的debug中可以看得到,后面讲的内容中延时程序就是通过以上的指令周期来进行计算的。

具体如何计算呢:使用编译器编译为汇编代码,结合芯片的指令周期计算时间,可以参考https://godbolt.org/

Java
//带参延时函数
void delay_ms(unsigned int xms)   //@12MHz
{
    unsigned int i, j;
    for(i=xms;i>0;i--)
    {
        for(j=124;j>0;j--)
        {}
    }
}

2、使用STC-ISP工具生成

Java
//延时函数,延时500ms
void delay_500ms()
{
        unsigned char i, j, k;
        i = 4;
        j = 129;
        k = 119;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

最终效果

Java
#include <reg52.h>

sbit led = P2^7;

//
带参延时函数
void delay_ms(unsigned int xms)   //@12MHz
{
    unsigned int i, j;
    for(i=xms;i>0;i--)
    {
        for(j=124;j>0;j--)
        {}
    }
}

void main()
{
    while(1)
    {
        led = 0;
        delay_ms(500);
        led = 1;
        delay_ms(500);
    }
}

五、流水灯

如果需要实现多个灯的显示和熄灭呢?

其实就是流水灯的效果

C
#include "reg52.h"
#include "intrins.h"

sbit LED1 = P2^7;
sbit LED2 = P2^6;
sbit LED3 = P2^5;

void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 8;
        j = 1;
        k = 243;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void main(){
        while(1){
                LED1 = 0;
                LED2 = 1;
                LED3 = 1;
                Delay1000ms();
                LED2 = 0;
                LED1 = 1;
                LED3 = 1;
                Delay1000ms();
                LED3 = 0;
                LED1 = 1;
                LED2 = 1;
                Delay1000ms();
        }
}

代码优化

Java
#include <reg52.h>

void delay_ms(unsigned int xms)
{
    unsigned int i, j;
    for(i=xms;i>0;i--)
    {
        for(j=124;j>0;j--)
        {}
    }
}

void main()
{
    while(1)
    {
        P2 = 0xDF; //1101 1111
        delay_ms(500);
        P2 = 0xBF; //1011 1111
        delay_ms(500);
        P2 = 0x7F; //0111 1111
        delay_ms(500);
    }
}

继续优化:

Java
#include <reg52.h>

void delay_ms(unsigned int xms)
{
    unsigned int i, j;
    for(i=xms;i>0;i--)
    {
        for(j=124;j>0;j--)
        {}
    }
}

void open_led(unsigned int num){
    P2 = 0xFF & ~(1 << num);
}

void main()
{
    while(1)
    {
        open_led(7);
        delay_ms(500);
        open_led(6);
        delay_ms(500);
        open_led(5);
        delay_ms(500);
    }
}

 

六、扩展

bit、sbit、sfr的区别

首先,bit和sbit都是C51扩展的变量类型

bit是一种数据类型,ta就跟int、char、double这些数据类型一样,只不过char=8位, bit=1位而已,这种变量只有两种值存在0或是1,和bool类似

sbit更像是define或者typedef一样(define和typedef也有区别,这又是另外一个坑,这里就不说了),ta是为已经分配了内存空间的变量重新取一个别名,一般用来定义特殊功能寄存器的位变量,以方便对寄存器的某位进行操作的,例如

Java
bit i = 0;意思就是在内存中划一块空间给i,让他存储0这个数据位。
sbit Flag = P0^1;意思就是给P0^1取一个别名,它叫做Flag,他是一个位操作变量,它代表访问的地址是P0^1,0x80的第二位数据位。

sbit的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR名称^变量位地址值

第三种方法:sbit 位变量名=SFR地址值^变量位地址值

Java
如定义PSW中的OV可以用以下三种方法:
sbit OV=0xd2 (1)说明:0xd2是OV的位地址值
sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好
sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值
因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了。

sfr 不是标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:

sfrt 变量名=地址值。

例:sfr P1 = 0x90;

这样的一行即定义P1 与地址0x90 对应,P1 口的地址就是0x90.

SFR的定义在头文件reg51.h或reg52.h中。

相关文章:

单片机-89C51部分:5、点亮LED

飞书文档https://x509p6c8to.feishu.cn/wiki/SlB5wYD1QiPRzWkfijEcIvv8nyc 一、应用场景 二、点灯原理 插件led灯珠长引脚为正极,短引脚为负极。 LED&#xff08;发光二极管&#xff09;两端存在电压差&#xff0c;有一定的电流流过时会亮起。电流可以理解为水流&#xff0c;…...

Lua 第10部分 模式匹配

10.1 模式匹配的相关函数 字符串标准库提供了基于模式的 4 个函数。 我们已经初步了解过函数 find 和 gsub&#xff0c;其余两个函数分别是 match 和 gmatch (Global Match 的缩写&#xff09;。 函数 string.find 用于在指定的目标字符串中搜索指定的模式。最简单的模式就是一…...

Maven 4.0.0 模式-pom.xml配置详解

Maven 4.0.0 模式-pom.xml配置详解 ​ 此 pom.xml 文件涵盖了 Maven 4.0.0 模式支持的所有主要标签&#xff0c;包括项目元数据、依赖管理、构建配置、发布管理等。每个标签都配有详细注释&#xff0c;说明其作用、常见用法和可能的值。 ​ 此文件旨在展示标签的完整性&#…...

IDEA 连接 Oracle 数据库

IDEA 连接 Oracle 数据库...

机器人快速启动

机器人快速启动 ES机器人开机操作流程 方法一&#xff08;一体化底座启动&#xff09; 接通48V电源点击底座“Power”按钮观察电源指示灯亮起&#xff0c;蜂鸣器发出“嘀”声&#xff0c;代表底座启动完成 方法二&#xff08;控制手柄启动&#xff09; 长按手柄开关机键2秒后松…...

使用 MediaPipe 和 OpenCV 快速生成人脸掩膜(Face Mask)

在实际项目中&#xff0c;尤其是涉及人脸识别、换脸、图像修复等任务时&#xff0c;我们经常需要生成人脸区域的掩膜&#xff08;mask&#xff09;。这篇文章分享一个简单易用的小工具&#xff0c;利用 MediaPipe 和 OpenCV&#xff0c;快速提取人脸轮廓并生成二值掩膜图像。 …...

《全球反空间能力》报告翻译——部分1

全球反空间能力 已进行过破坏性反卫星测试的国家 美国 美国目前拥有世界上最先进的军事太空能力&#xff0c;尽管与中国的相对差距正在缩小。在冷战期间&#xff0c;美国开创了许多现今使用的国家安全太空应用&#xff0c;并在几乎所有类别中保持技术领先地位。美国军方在将…...

云原生课程-Docker

一次镜像&#xff0c;到处运行。 1. Docker详解&#xff1a; 1.1 Docker简介&#xff1a; Docker是一个开源的容器化平台&#xff0c;可以帮助开发者将应用程序和其依赖的环境打包成一个可移植的&#xff0c;可部署的容器。 docker daemon:是一个运行在宿主机&#xff08;DO…...

组件的基本知识

组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签&#xff0c;抽离放在一个独立的vue文件中&#xff0c;以供主vue文件使用 组成 三部分构成 template&#xff1a;HTML 结构 script: JS 逻辑 style: CSS 样…...

空间矩阵的思考

今天又看了些线性代数&#xff0c;引发了许多思考。   矩阵是以长和宽存储数据&#xff0c;那有没有一种新型的矩阵&#xff0c;以长宽高的形式存储数据呢&#xff1f;我不知道有没有&#xff0c;所以暂且称其为空间矩阵。   它肯定是存在的&#xff0c;可以这样抽象&#…...

【数据挖掘】时间序列预测-常用序列预测模型

常用序列预测模型 &#xff08;1&#xff09;AR&#xff08;自回归&#xff09;模型&#xff08;2&#xff09;ARIMA模型&#xff08;3&#xff09;Prophet模型&#xff08;4&#xff09;LSTM模型&#xff08;5&#xff09;Transformer模型&#xff08;6&#xff09;模型评估6.…...

将你的本地项目发布到 GitHub (新手指南)

目录 第 1 步&#xff1a;在 GitHub 上创建新的仓库 (Repository)第 2 步&#xff1a;将本地仓库连接到 GitHub 远程仓库第 3 步&#xff1a;(可能需要) 重命名你的默认分支第 4 步&#xff1a;将本地代码推送到 GitHub第 5 步&#xff1a;在 GitHub 上检查结果后续工作流程 你…...

[论文梳理] 足式机器人规划控制流程 - 接触碰撞的控制 - 模型误差 - 自动驾驶车的安全合规(4个课堂讨论问题)

目录 问题 1&#xff1a;足式机器人运动规划 & 控制的典型流程 (pipline) 1.1 问题 1.2 目标 1.3 典型流程&#xff08;Pipeline&#xff09; 1.3.1 环境感知&#xff08;Perception&#xff09; 1.3.2 高层规划&#xff08;High-Level Planning&#xff09; 1.3.3 …...

初中级前端面试全攻略:自我介绍模板、项目讲解套路与常见问答

为了给面试官留下专业而亲切的第一印象&#xff0c;自我介绍要突出与岗位相关的技能和项目经验&#xff0c;同时以自己擅长的领域开放式结尾​。通常可以按照以下思路组织自我介绍内容&#xff1a;首先简单介绍个人信息和工作年限&#xff0c;然后列出精通的前端技术栈&#xf…...

Android开发中svg转xml工具使用

要使用 svg2vector-cli 工具通过命令行将 SVG 文件转换为 Android 可用的 XML 矢量图标文件&#xff0c;可以单个文件转换或者整个文件夹批量转换&#xff0c;以下是详细的步骤和说明&#xff1a; 1. 准备工作 1.1 下载工具 首先需要下载 svg2vector-cli-1.0.0.jar 或更高版本…...

爬虫技术入门:基本原理、数据抓取与动态页面处理

引言 在当今数据驱动的时代&#xff0c;网络爬虫技术已成为获取和分析互联网数据的重要手段。无论是搜索引擎的网页收录、竞品数据分析&#xff0c;还是学术研究的语料收集&#xff0c;爬虫技术都发挥着关键作用。本文将深入浅出地讲解爬虫的基本原理&#xff0c;分析它能获取…...

AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月27日第65弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀6-8个和值&#xff0c;可以做到100-300注左右。 (1)定…...

服务器数据备份,服务器怎么备份数据呢?

企业数据量呈指数级增长&#xff0c;服务器数据备份已成为保障业务连续性、抵御勒索攻击与合规审查的核心技术环节。当前&#xff0c;服务器数据备份方案需兼顾数据完整性、恢复时效性、存储经济性三大核心诉求&#xff0c;其实现路径可根据技术架构、数据规模及容灾等级划分为…...

语音识别质量的跟踪

背景 这个项目是用来生成结构化的电子病历的。数据的来源是医生的录音。中间有一大堆的处理&#xff0c;语音识别&#xff0c;关键字匹配&#xff0c;结构化处理&#xff0c;病历编辑......。最多的时候给上百家医院服务。 语音识别质量的跟踪 一、0225医院的训练后的情况分…...

【数据挖掘】时间序列预测-时间序列的平稳性

时间序列的平稳性 &#xff08;1&#xff09;平稳性定义&#xff08;2&#xff09;平稳性处理方法2.1 差分法2.2 季节调整&#xff08;Seasonal Adjustment&#xff09;2.3 趋势移除&#xff08;Detrending&#xff09;2.4 对数转换&#xff08;Logarithmic Transformation&…...

成都蒲江石象湖旅游攻略之石象湖郁金香最佳观赏时间

石象湖坐落于成都蒲江&#xff0c;拥有绝美的郁金香花海&#xff0c;吸引了很多的游客。如果大家想要观赏比较诱惑人的郁金香&#xff0c;那自然就应该知道正确的观赏时间。 心想郁金香合适的时间是每年的3月份到3月底。石象湖会还会举办盛大的郁金香节&#xff0c;在花园内有数…...

大模型、知识图谱和强化学习三者的结合,可以形成哪些研究方向?

大模型(Large Language Models, LLMs)、知识图谱(Knowledge Graph, KG)与强化学习(Reinforcement Learning, RL)作为人工智能领域的三大核心技术,其融合正推动着认知智能迈向新高度。本文结合2023-2025年的最新研究成果,系统梳理三者结合的七大科研方向及其技术路径。 …...

Linux文件操作

在C语言中&#xff0c;我们已经学习了文件相关的知识&#xff0c;那么在Linux中我们为什么还要再来学习文件呢&#xff1f;这是因为C语言中和Linux中&#xff0c;"文件"是2个不同的概念。所以我们要来学习Linux中对文件的操作。 在学习之前&#xff0c;我们先来回顾一…...

PostSwigger Web 安全学习:CSRF漏洞3

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服务端生成的唯一、随机且不可预测的字符串&#xff0c;用于验证客户端合法校验。 作用&#xff1a;防止攻击…...

【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务

一、引言 DPlayer官网&#xff1a;DPlayer 官方弹幕后端服务&#xff1a;DPlayer-node MoePlayer/DPlayer-node&#xff1a;使用 Docker for DPlayer Node.js 后端&#xff08;https://github.com/DIYgod/DPlayer&#xff09; 本来想直接使用官网提供的DPlayer-node直接搭建…...

淘宝tb.cn短链接生成

淘宝短链接简介 1. 一键在线生成淘宝短链接tb.cn,m.tb.cn等 2. 支持淘宝优惠券短链接等淘宝系的所有网址 3. 生成的淘宝短链接是官方的&#xff0c;安全稳定有保证 4.适合多种场景下使用&#xff0c;如&#xff1a;网站推广&#xff0c;短信推广 量大提供api接口&#xff0…...

在web应用后端接入内容审核——以腾讯云音频审核为例(Go语言示例)

腾讯云对象存储数据万象&#xff08;Cloud Infinite&#xff0c;CI&#xff09;为用户提供图片、视频、语音、文本等文件的内容安全智能审核服务&#xff0c;帮助用户有效识别涉黄、违法违规和广告审核&#xff0c;规避运营风险。本文以音频审核为例给出go语言示例代码与相应结…...

优化无头浏览器流量:使用Puppeteer进行高效数据抓取的成本降低策略

概述 使用 Puppeteer 进行数据抓取时&#xff0c;流量消耗是一个重要考虑因素。特别是在使用代理服务时&#xff0c;流量成本可能显著增加。为了优化流量使用&#xff0c;我们可以采用以下策略&#xff1a; 资源拦截&#xff1a;通过拦截不必要的资源请求来减少流量消耗。请求…...

【C语言】fprintf与perror对比,两种报错提示的方法

它们的主要区别在于 信息来源 和 自动包含的系统错误详情。 1. fprintf(stderr, "自定义错误信息\n"); 功能: 这是标准库中的一个通用格式化输出函数。你可以用它向任何文件流&#xff08;包括 stdout 标准输出, stderr 标准错误, 或任何用 fopen 打开的文件&#x…...

C语言复习笔记--内存函数

在复习完字符函数和字符串函数之后,今天让我们复习一下内存函数吧.这一块的东西不太多,并且与之前的字符串函数有一些地方很相似,所以这里应该会比较轻松. memcpy使用和模拟实现 老规矩,先看函数原型 void * memcpy ( void * destination, const void * source, size_t num );…...

前端面试高频算法

前端面试高频算法 1 排序算法&#xff1b;1.1 如何分析一个排序算法1.1.1 执行效率3.1.2 内存消耗1.1.3 稳定性 1.2 冒泡排序&#xff08;Bubble Sort&#xff09;1.3 插入排序&#xff08;Insertion Sort&#xff09;1.4 选择排序&#xff08;Selection Sort&#xff09;1.5 归…...

云原生--核心组件-容器篇-4-认识Dockerfile文件(镜像创建的基础文件和指令介绍)

1、Dockerfile的定义与作用 定义&#xff1a; Dockerfile是一个文本文件&#xff0c;包含一系列Docker指令&#xff0c;用于自动化构建Docker镜像。Docker 在构建镜像时会按照Dockerfile中的指令逐步执行&#xff0c;每一行指令都会生成一个新的镜像层&#xff08;layer&#x…...

13.组合模式:思考与解读

原文地址:组合模式&#xff1a;思考与解读 更多内容请关注&#xff1a;7.深入思考与解读设计模式 引言 在软件开发中&#xff0c;是否曾经遇到过这样一种情况&#xff1a;你有一个对象&#xff0c;它本身很简单&#xff0c;但是它包含了其他类似的对象。随着系统变得越来越复…...

Pycharm(十七)生成器

一、生成器介绍 1.1 概述 生成器指的是Generator对象&#xff0c;它不再像以往一样&#xff0c;一次性生成所有的数据&#xff0c;而是用一个&#xff0c;再生成一个&#xff0c;基于用户写的规则&#xff08;条件&#xff09;来生成数据&#xff0c;如果条件不成立&#xff…...

盛元广通实验材料管理系统-实验室管理系统-LIMS

一、引言 在当下科学研究及各类实验日益频繁的背景下&#xff0c;实验材料管理成为实验室高效运作的核心环节。从“人工低效”到“智能自动化”&#xff0c;盛元广通可覆盖实验材料的采购、存储、使用、追踪等全流程&#xff0c;从功能适配性、技术性能、成本效益、供应商服务…...

检查 NetCDF Fortran的版本

执行 nf-config --all命令后&#xff0c;它会输出一堆信息&#xff0c;大致像这样&#xff1a; This netCDF-Fortran version: 4.6.0 netCDF-Fortran installation dir: /usr/local/netcdf4 Fortran compiler: gfortran Fortran compiler flags: -g -O2 Fortran preprocesso…...

MySQL 存储引擎与服务体系深度解析

一、存储引擎核心概念 基本定义 存储引擎:MySQL服务的核心组件,负责数据的存储、检索和管理版本演进: MySQL 5.0/5.1 默认使用MyISAM引擎MySQL 5.5/5.6+ 默认采用InnoDB引擎关键特性 不同存储引擎采用不同的数据存储结构和处理机制直接影响表的CRUD操作性能和数据安全特性作…...

乐企数电发票分布式发票号码生成重复的问题修复思路分享

文章目录 1.前言2.解决思路2.1错误姿势2.2歪打正着2.3正确姿势 3.总结 1.前言 由于之前接了乐企数电开票&#xff0c;服务上线之后&#xff0c;使用的公司少没有啥问题&#xff0c;后面切换了两家日开票量大的公司上线之后&#xff0c;就发现发票号码生成重复了&#xff0c;后面…...

多级缓存架构设计与实践经验

多级缓存架构设计与实践经验 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于多级缓存的架构设计和实践经验。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们公司的面试现场。请问您对多级…...

LCD1602液晶显示屏详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图​编辑 2.接口说明 三、程序设计 main文件 lcd1602.h文件 lcd1602.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 LCD1602A字符型液晶显示模块是专门用于显示字母、数字元、符号等的点阵型液晶显示模块。分4位和8位数据…...

Golang | 集合求交

文章目录 bitmap求交集2个有序链表多个有序链表跳表 bitmap求交集 2个有序链表 多个有序链表 为什么非最大的所有都要往后移动呢&#xff1f;因为现在已经知道交集即使有&#xff0c;也最小都是这个目前最大的了&#xff0c;其他不是最大的不可能是交集&#xff0c;所有除了最大…...

手机充电进入“秒充“时代:泡面刚下锅,电量已满格

现代人的生活节奏越来越快&#xff0c;手机充电技术也在飞速发展。从最初的"充电一整晚"到如今的"秒充"时代&#xff0c;充电效率的提升正在悄然改变着我们的生活习惯。最新数据显示&#xff0c;目前最快的手机充电技术仅需4分30秒就能充满一部手机的电量&…...

网站字体文件过大 导致字体从默认变成指定字体的时间过长

1.选择字体中只用到的字符集较小的包 只用到了数字&#xff0c;所以使用了 xx-sans.ttf的版本(86kb) 2.转换ttf格式为woff2 转换后26kb 3.使用字体 // 定义字体 font-face {font-family: "myFont";src: url(/assets/fonts/myFont.woff2) format(woff2);font-weigh…...

WPF常用技巧汇总 - Part 2

WPF常用技巧汇总-CSDN博客 主要用于记录工作中发现的一些问题和常见的解决方法。 目录 WPF常用技巧汇总-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一样 3. DataGrid Tooltip - Cell值和ToolTip值不一样 4. DataGrid - Ctrl A /…...

C++中析构函数

析构函数 析构函数&#xff08;Destructor&#xff09;是类的一种特殊成员函数&#xff0c;用于在对象的生命周期结束时执行清理操作&#xff0c;他的主要作用是释放对象占用资源&#xff0c;例如动态分配的内存&#xff0c;文件句柄或网络连接等。 特点 名称与类名称相同 单…...

树莓派超全系列教程文档--(44)如何在树莓派上编译树莓派内核

如何在树莓派上编译树莓派内核 构建内核下载内核源代码 本地构建内核构建配置使用 LOCALVERSION 自定义内核版本构建安装内核 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 构建内核 操作系统预装的默认编译器和链接器被配置为构建在该操作系统…...

flask返回文件的同时返回其他参数

参考:flask实现上传文件与下载文件_flask 文件上传和下载-CSDN博客 在 Flask 中,返回文件的同时附加额外参数(如处理时间)可以通过 自定义 HTTP 响应头 或 返回 JSON 数据与文件结合 的方式实现。以下是具体方法和示例: 方法 1:通过 HTTP 响应头 附加参数(推荐) 将参…...

C++23 std::move_only_function:一种仅可移动的可调用包装器 (P0288R9)

文章目录 一、定义与基本概念1.1 定义1.2 基本概念 二、特点2.1 仅可移动性2.2 支持多种限定符2.3 无target_type和target访问器2.4 强前置条件 三、使用场景3.1 处理不可复制的可调用对象3.2 性能优化3.3 资源管理 四、与其他可调用包装器的对比4.1 与std::function的对比4.2 …...

Zookeeper实现分布式锁实战应用

Zookeeper实现分布式锁实战应用示例 1. 分布式锁概述 在分布式系统中&#xff0c;当多个进程或服务需要互斥地访问共享资源时&#xff0c;就需要分布式锁来协调。Zookeeper因其强一致性和临时节点特性&#xff0c;非常适合实现分布式锁。 2. Zookeeper实现分布式锁的核心原理…...

使用 Playwright 构建高效爬虫:原理、实战与最佳实践

随着网站前端技术日益复杂,传统的基于请求解析(如 requests、BeautifulSoup)的爬虫在处理 JavaScript 渲染的网站时变得力不从心。Playwright,作为微软推出的一款强大的自动化浏览器控制框架,不仅适用于自动化测试,也成为了处理现代网站爬取任务的利器。 本篇文章将带你…...