51单片机(STC89C52RC版本)学习笔记(更新中...)

news2024/12/23 18:59:25

文章目录

  • 参考资料
  • 1. 准备工作
    • 1.1 win10配置51单片机开发环境
    • 1.1 Ubuntu配置51单片机开发环境
      • 问题1:`mcs51/8051.h`依赖于`mcs51/lint.h`
      • 问题2:提示找不到头文件`mcs51/8051.h`
  • 2. 认识51单片机
    • 2.1 STC89C52单片机
    • 2.2 管脚图
    • 2.3 原理图
    • 2.4 按键抖动
    • 2.5 头文件说明
    • 2.6 模块化函数
      • 2.6.1 延时函数
      • 2.6.2 矩阵键盘
  • 3. LED模块
    • 3.1 原理图
    • 实验1:点亮LED灯D1
    • 实验2:LED灯D8闪烁
    • 实验3:LED流水灯
  • 4. 独立按键模块
    • 4.1 原理图
    • 实验1:独立按键控制LED灯D1
  • 5. 动态数码管模块
    • 5.1 原理图
    • 实验1:数码管LED3显示2
    • 实验2:数码管LED8 ~ LED1分别显示0 ~ 8
  • 6. LCD1602接口
    • 6.1 原理图
  • 7. 矩阵按键模块
    • 7.1 原理图
    • 实验1:在LCD1602显示按下的键码(1 ~ 16)
    • 实验2:4位密码锁
  • 8. 定时器与中断
    • 8.1 原理图
    • 实验1:实现一个电子时钟
  • 9. 串口通信
    • 9.1 原理图

参考资料

51单片机入门教程-2020版 程序全程纯手打 从零开始入门
江协科技资料下载
51单片机(STC89C52RC)系统性学习笔记

1. 准备工作

1.1 win10配置51单片机开发环境

  1. 51单片机
正在重新握手 ... 成功			[0.578"]
当前的波特率: 115200
正在擦除目标区域 ... 完成 !		[0.328"]
正在下载用户代码 ... 完成 !		[0.141"]
正在设置硬件选项 ... 完成 !		[0.031"]

更新后的硬件选项为:
  . 当前的时钟频率: 11.088MHz
  . 系统频率为12T(单倍速)模式
  . 振荡器的放大增益不降低
  . 当看门狗启动后,任何复位都可停止看门狗
  . MCU内部的扩展RAM可用
  . ALE脚的功能选择仍然为ALE功能脚
  . P1.0和P1.1与下次下载无关
  . 下次下载用户程序时,不擦除用户EEPROM区

  单片机型号: STC89C52RC/LE52RC
  固件版本号: 6.6.4C
  1. 编程工具 Keil5 C51 新建项目时选择AT89C51RC2

  2. 将程序载入到51单片机的工具 STC-ISP
    在这里插入图片描述

  3. 51单片机接入电脑,并配置驱动CH340_CH341
    在这里插入图片描述

1.1 Ubuntu配置51单片机开发环境

  1. 编辑器 VS Code 安装教程
  2. 安装VS Code插件 C/C++ Extension Pack
  3. 安装编译工具 sudo apt-get install sdcc
  4. 程序编译
    sdcc 1_LED_1.c
    将编译生成的文件输出到out目录,需要先通过sudo mkdir out创建out目录
    sdcc 1_LED_1.c -o out/

问题1:mcs51/8051.h依赖于mcs51/lint.h

#include <mcs51/lint.h>
#include <mcs51/8051.h>

问题2:提示找不到头文件mcs51/8051.h

在这里插入图片描述
8051.h是安装sdcc后产生的,请先确保sdcc已经安装,sudo find / -name 8051.h搜索一下头文件8051.h所在的目录
在这里插入图片描述
这里目录是/usr/share/sdcc/include,将该路径配置到includepath,先点击Quick Fix
在这里插入图片描述
再点击Edit “includePath” setting
在这里插入图片描述

添加/usr/share/sdcc/includeInclude path
在这里插入图片描述

2. 认识51单片机

2.1 STC89C52单片机

  • 所属系列:51单片机系列
  • 公司:STC公司
  • 位数:8位
  • RAM:512字节
  • ROM:8K(Flash)
  • 工作频率:12MHz(本开发板使用)
    在这里插入图片描述

2.2 管脚图

在这里插入图片描述

2.3 原理图

在这里插入图片描述
高清PDF可从这里下载江协科技资料下载

2.4 按键抖动

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。
在这里插入图片描述
因此,需要进行防抖处理,如下:

// 这是一个检测独立按键K1是否按下,并控制LED模块的简化代码
if(P3_1==0)			// 如果K1按键按下,P3_1的值会变为0
{
	Delay(20);		// 延时20毫秒消抖
	while(P3_1==0);	// 死循环空转,直到K1按键松开,P3_1变为1,跳出循环
	Delay(20);		// 延时20毫秒消抖
	
	P2_0=~P2_0;		// LED1的亮灭情况
}

2.5 头文件说明

#include <mcs51/lint.h>
#include <mcs51/8051.h>
#include <REGX52.H>

2.6 模块化函数

2.6.1 延时函数

#ifndef __DELAY_H__
#define __DELAY_H__

void Delayms(unsigned char k);

#endif
#include <INTRINS.H>

// 延时k ms
void Delayms(unsigned char k)		//@11.0592MHz
{
	unsigned char i, j;
	
	while (k --) {
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

2.6.2 矩阵键盘

#ifndef __MATRIXKEYBOARD_H__
#define __MATRIXKEYBOARD_H__

unsigned int matrixKeyboard();

#endif
#include <at89c51RC2.h>
#include "Delay.h"
// 反回键码(1 ~ 16),行优先遍历
// 按列扫描矩阵键盘
// 如果按行的话,P1_5和蜂鸣器冲突,会导致其发声
unsigned int matrixKeyboard() {
	unsigned int keyNum = 0;
	P1 = 0xFF;
	P1_3 = 0; // 第一列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 1;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 5;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 9;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 13;}
	
	P1 = 0xFF;
	P1_2 = 0; // 第二列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 2;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 6;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 10;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 14;}
	
	P1 = 0xFF;
	P1_1 = 0; // 第三列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 3;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 7;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 11;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 15;}
	
	P1 = 0xFF;
	P1_0 = 0; // 第四列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 4;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 8;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 12;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 16;}
	
	
	return keyNum;
}

3. LED模块

3.1 原理图

在这里插入图片描述
LED等的左侧接入VCC正极,若要使灯亮,则右侧需要接入负极,也就是对应的寄存器位需要赋值为0。

实验1:点亮LED灯D1

#include <AT89C51RC2.h>
/**
 * 点亮LED灯D1
*/
void main() {
	P2 = 0xFF; // 将所有灯熄灭
    P2_0 = 0; // D1灯亮起
    while (1); // 程序始终保持运行
}

实验2:LED灯D8闪烁

#include <AT89C51RC2.h>
#include <INTRINS.H>

/**
 * LED灯D8闪烁
*/
void main() {
    P2 = 0xFF; 
    while (1)
    {
        P2_7 = 0; // D8灯亮
        Delayms(1000); // 延迟1000ms = 1s
        P2_7 = 1; // D8灯灭
        Delayms(1000); // 延迟1000ms = 1s
    } 
}

实验3:LED流水灯

#include <AT89C51RC2.h>
#include "Delay.h"

/**
 * LED灯D1 ~ D8按顺序点亮,每次只有一个灯亮
*/
void main() {
    // 1111 1110
    // 1111 1101
    // 1111 1011
    // ...
    // 1111 1110
    // =》 其实就是实现循环左移
    P2 = 0xFE;
    while (1)
    {
        P2 <<= 1;
        if (P2 != 0xFE) P2 |= 0x01;
        Delayms(1000); // 延迟1000ms = 1s
    } 
}

4. 独立按键模块

4.1 原理图

在这里插入图片描述

实验1:独立按键控制LED灯D1

#include <AT89C51RC2.h>
#include "Delay.h"

/**
 * 独立按键K1控制LED灯D1
 * 按下按键并松开后,变换灯D1的状态
*/
void main() {
    while (1)
    {
        // 注意控制K1的是P3_1,控制K2的是P3_0
        // 当值为0是代表按键按下
        if (P3_1 == 0) 
        {
            Delay(20); // 消除按键抖动
            while (P3_1 == 0); // 一直保持按下的状态则卡在这
            Delay(20); // 消除按键抖动
            P2_0 = ~P2_0; // 状态取反
        }
    } 
}

5. 动态数码管模块

5.1 原理图

在这里插入图片描述在这里插入图片描述
LED1 ~ LED8的亮灭(位选)由P24, P23, P22三位决定,P24位高位,当这三个位表示数据n时,Yn对应的灯亮,Y0对应LED1
P0_0 ~ P0_6分别控制a ~ g晶体管,P0_7控制dp晶体管,为1代表选中。(P0_7是最高位,P0_0是最低位)

实验1:数码管LED3显示2

#include <AT89C51RC2.h>

/**
 * 数码管LED3显示2
*/
void main() {
    // 选中数码管LED3,对应Y2  P2_4 P2_3 P2_2 = 0 1 0
    P2_4 = 0;
    P2_3 = 1;
    P2_2 = 0;
    
    // a b c d e f g dp
    // 0 1 2 3 4 5 6 7
    // a b c d e f g dp
    // 1 1 0 1 1 0 1 0 => 0101 1011 = 0x5B
    // 数字2,需要点亮 a b g e d
    P0 = 0x5B;
    while (1);
}

实验2:数码管LED8 ~ LED1分别显示0 ~ 8

// 对应数字 0 ~ 9 的段码
unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 在LED-loc 显示num
void Nixie(unsigned char loc, unsigned char num) { 
    P2_4 = 0; P2_3 = 0; P2_2 = 0; // 1110 0011 = 0xE3 P2 &= 0xE3
    if ((loc & 0x01) == 1) P2_2 = 1;
    if ((loc & 0x02) == 2) P2_3 = 1;
    if ((loc & 0x04) == 4) P2_4 = 1;
    
    P0 = NixieTable[num];
	
	// 消影,数字清零,防止上一个位置的数字显示到下一个位置
	Delayms(1);
	P0 = 0x00;
}

/**
 * 数码管LED8 ~ LED1分别显示0 ~ 8
**/
void main() {
	unsigned char i;
    while (1) {
		for (i = 0; i <= 7; i ++) {
			Nixie(7 - i, i);
		}
	}
}

6. LCD1602接口

6.1 原理图

在这里插入图片描述

7. 矩阵按键模块

7.1 原理图

在这里插入图片描述

实验1:在LCD1602显示按下的键码(1 ~ 16)

#include <at89c51RC2.h>
#include "Delay.h"
// 反回键码(1 ~ 16),行优先遍历
// 没有按下任何键则返回0
// 按列扫描矩阵键盘
// 如果按行的话,P1_5和蜂鸣器冲突,会导致其发声
unsigned int matrixKeyboard() {
	unsigned int keyNum = 0;
	P1 = 0xFF;
	P1_3 = 0; // 第一列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 1;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 5;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 9;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 13;}
	
	P1 = 0xFF;
	P1_2 = 0; // 第二列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 2;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 6;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 10;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 14;}
	
	P1 = 0xFF;
	P1_1 = 0; // 第三列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 3;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 7;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 11;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 15;}
	
	P1 = 0xFF;
	P1_0 = 0; // 第四列
	if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 4;}
	if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 8;}
	if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 12;}
	if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 16;}
	
	
	return keyNum;
}

// 在LCD1602显示按下的键码(1 ~ 16)
void main() {
	unsigned int num = 0, newNum = 0;
	LCD_Init();
	while (1) {
		newNum = matrixKeyboard();
		if (newNum != 0) {
			num = newNum;
		}
		LCD_ShowNum(1, 1, num, 2); // 第一行第一列显示,占两个位置
	}
}

实验2:4位密码锁

// 10为0,11为确认,12为清空
void main() {
	// num,保存当前输入的密码
	// keyNum,记录矩阵键盘按下的键码
	// count,记录当前已经输入多少个数字
	unsigned int num = 0, keyNum = 0, count = 0;
	// LCD1602初始化
	LCD_Init();
	// 在第一行的前9个输入固定显示输入提示符
	LCD_ShowString(1, 1, "PASSWORD:");
	while (1) {
		// 第10个字符显示当前输入的密码
		LCD_ShowNum(1, 10, num, 4);
		// 获取当前矩阵键盘的键码(没有按下任何键则返回0)
		keyNum = matrixKeyboard();
		if (keyNum >= 1 && keyNum <= 9 && count < 4) {
			num = num * 10 + keyNum;
			count ++;
		} else if (keyNum == 11 && count == 4) {
			if (num == 1234) {
				LCD_ShowString(2, 1, "OK");
			} else {
				LCD_ShowString(2, 1, "ERR");
			}
		} else if (keyNum == 12) {
			num = 0;
			count = 0;
			LCD_ShowString(2, 1, "   ");
		}
	}
}

8. 定时器与中断

定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
定时器作用︰
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高CPU的运行效率和处理速度(…)

8.1 原理图

在这里插入图片描述

TL0和TH0发生溢出时(达到65535),TF0标志位被置位1,从而引发中断。

  1. 生成定时器初始化代码
    在这里插入图片描述
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	// 这两个开关配置需要自己加一下
	ET0 = 1; // 打开定时器0
	EA = 1; // 打开总开关
}

实验1:实现一个电子时钟

void Timer0Init()		//1毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值 
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	ET0 = 1; // 打开定时器0
	EA = 1; // 打开总开关
}

unsigned int count = 0;
// 设置时钟为 23:59:45 方便调试
unsigned int second = 45;
unsigned int minute = 59;
unsigned int hour = 23;

void main() {
//	// TMOD不可位寻址, M0给1 => 0x01
//	// TMOD = 0x01; // 配置定时器0
//	// 防止对定时器1的配置产生影响,使用与或赋值法
//	TMOD &= 0xF0; // 清空定时器0的配置
//	TMOD |= 0x01; // 配置定时器0
//	
//	// TCON可位寻址,TF0 = 0, TR0 = 1
//	TF0 = 0;
//	TR0 = 1;
//	
//	// 64635 到 65535 相差1000,也就是1ms会发生中断
//	TH0 = 64535 / 256; // 取高8位
//	TL0 = 54535 % 256; // 取低8位
//	
//	// 定时器开关
//	ET0 = 1; // 打开定时器0
//	EA = 1; // 打开总开关
	PT0 = 0;
	
	Timer0Init();
	LCD_Init();
	LCD_ShowChar(1, 3, ':');
	LCD_ShowChar(1, 6, ':');
	while (1) {
		if (second == 60) {
			second = 0;
			minute ++;
		}
		if (minute == 60) {
			minute = 0;
			hour ++;
		}
		if (hour == 24) {
			hour = 0;
		}
		LCD_ShowNum(1, 1, hour, 2);
		LCD_ShowNum(1, 4, minute, 2);
		LCD_ShowNum(1, 7, second, 2);
	}
}

// 发生时钟中断时,会触发该函数,中断号为1
void Timer0_Routube() interrupt 1 {
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	count ++;
	if (count == 1000) {
		second ++;
		count = 0;
		// 中断程序应该尽量简短
//		if (second == 60) {
//			second = 0;
//			minute ++;
//			if (minute == 60) {
//				minute = 0;
//				hour ++;
//				if (hour == 24) {
//					hour = 0;
//				}
//			}
//		}
	}
}

9. 串口通信

9.1 原理图

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

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

相关文章

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

计算机的错误计算(一百七十四)

摘要 探讨 MATLAB 关于计算机的错误计算&#xff08;一百七十三&#xff09;中多项式的秦九韶&#xff08;或Horner&#xff09;形式的计算误差。 在计算机的错误计算&#xff08;一百七十三&#xff09;中&#xff0c;我们讨论了一个多项式的计算误差。本节探讨其对应秦九韶&…

Magento2如何创建CRUD Models

Mageno2 Model的创建不同于其他框架&#xff0c;需要3个不同目录层级的文件 例如需要为表hello_test创建model&#xff1a; 1、app/code/Hello/Test/Model/Test.php <?phpnamespace Hello\Test\Model;class Test extends \Magento\Framework\Model\AbstractModel {protec…

Visual Studio 2022 项目配置常用选项

作为一名C++开发者,经常需要配置第三方库,今天来跟大家截图一下,方便大家快速配置: 头文件包含目录: 或者: 库文件包含目录:

基于Vue实现的移动端手机商城项目 电商购物网站 成品源码

&#x1f4c2;文章目录 一、&#x1f4d4;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站演示 &#x1f4f8;部分截图 &#x1f3ac;视频演示 五、⚙️网站代码 &#x1f9f1;项目结构 &#x1f492;vue代码预览 六、&#x1f527;完整…

PHP使用RabbitMQ(正常连接与开启SSL验证后的连接)

代码中包含了PHP在一般情况下使用方法和RabbitMQ开启了SSL验证后的使用方法&#xff08;我这边消费队列是使用接口请求的方式&#xff0c;每次只从中取出一条&#xff09; 安装amqp扩展 PHP使用RabbitMQ前&#xff0c;需要安装amqp扩展&#xff0c;之前文章中介绍了Windows环…

uniapp h5 vue3 m3u8 和 mp4 外链视频播放

m3u8视频播放 使用mui-player 和hls.js。 安装npm install mui-player hls.js我的版本是"hls.js": "^1.5.17"和"mui-player": "^1.8.1"使用 页面标签&#xff1a; 引用&#xff1a; 点击目录播放视频&#xff1a; m3u8视频播放&a…

给el-table表头添加icon图标,以及鼠标移入icon时显示el-tooltip提示内容

在你的代码中&#xff0c;你已经正确地使用了 el-tooltip 组件来实现鼠标划过加号时显示提示信息。el-tooltip 组件的 content 属性设置了提示信息的内容&#xff0c;placement 属性设置了提示信息的位置。 你需要确保 el-tooltip 组件的 content 属性和 placement 属性设置正…

node.js实现分页,jwt鉴权机制,token,cookie和session的区别

文章目录 1. 分⻚功能2. jwt鉴权机制1.jwt是什么2.jwt的应用3.优缺点 3. cookie&#xff0c;token&#xff0c;session的对比 1. 分⻚功能 为什么要分页 如果数据量很⼤&#xff0c;⽐如⼏万条数据&#xff0c;放在⼀个⻚⾯显⽰的话显然不友好&#xff0c;这时候就需要采⽤分⻚…

大数据新视界 -- Hive 元数据管理:核心元数据的深度解析(上)(27 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SpringBoot如何使用EasyExcel实现表格导出(简洁快速入门版本)

前言 前面给大家介绍了动态表头的导入&#xff0c;这篇文章给大家介绍如何实现导出 前面给大家介绍了动态表头的导入&#xff0c;我们了解了如何通过EasyExcel灵活地读取结构不固定的Excel文件。这次&#xff0c;我们将目光转向数据导出——即如何将数据以Excel文件的形式输出…

快速上手 RabbitMQ:使用 Docker 轻松搭建消息队列系统

在现代的分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件、提高系统可扩展性和可靠性的重要工具。RabbitMQ 是一个广泛使用的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xf…

ELK的Filebeat

目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考&#xff08;不要直接拷贝用&#xff09;多行匹配配置过滤配置最终配置&#xff08;一、多行匹配、直接读取日志文件、EFK方案&#…

UE5 像素流进行内网https证书创建

确定证书需求 内网 HTTPS 通信通常需要以下内容&#xff1a; 自签名证书&#xff08;适用于内网环境&#xff0c;不需要通过公开的证书颁发机构 CA&#xff09; 或者通过内部的企业 CA 签发的证书&#xff08;更安全&#xff09;。 生成自签名证书 使用工具&#xff08;如 Ope…

44页PDF | 信息化战略规划标准框架方法论与实施方法(限免下载)

一、前言 这份报告详细介绍了企业信息化战略规划的标准框架、方法论以及实施方法&#xff0c;强调了信息化规划应以业务战略和IT战略为驱动力&#xff0c;通过构筑企业架构&#xff08;EA&#xff09;来连接长期战略和信息化建设。报告提出了信息化规划原则&#xff0c;探讨了…

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…

任务管理法宝:甘特图详解

在项目管理中&#xff0c;如何清晰、直观地展示项目的进度和任务分配&#xff1f; 甘特图作为一种经典的项目管理工具&#xff0c;提供了有效的解决方案。无论是团队合作还是个人项目管理&#xff0c;甘特图都能帮助你轻松追踪各项任务的进展。今天&#xff0c;我们将详细介绍…

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…

PyQt 中的无限循环后台任务

在 PyQt 中实现一个后台无限循环任务&#xff0c;需要确保不会阻塞主线程&#xff0c;否则会导致 GUI 无响应。常用的方法是利用 线程&#xff08;QThread&#xff09; 或 任务&#xff08;QRunnable 和 QThreadPool&#xff09; 来运行后台任务。以下是一些实现方式和关键点&a…

云计算vsphere 服务器上添加主机配置

这里是esxi 主机 先把主机打开 然后 先开启dns 再开启 vcenter 把每台设备桌面再vmware workstation 上显示 同上也是一样 &#xff0c;因为在esxi 主机的界面可能有些东西不好操作 我们选择主机和集群 左边显示172.16.100.200