51单片机嵌入式开发:19、STC89C52R控制LCD1602码表+数码管+后台数显(串口)

news2024/9/27 23:26:34

STC89C52R控制LCD1602码表+数码管+后台数显(串口)

  • 1 概述
    • 1.1 项目概述
    • 1.2 项目组成部分
    • 1.3 功能描述
  • 2 开发环境
    • 2.1 支持设备
    • 2.2 硬件电路
  • 3 软件代码工程
  • 4 演示
    • 4.1 Proteus仿真
    • 4.2 实物演示
  • 5 总结


在这里插入图片描述

1 概述

1.1 项目概述

本项目旨在利用STC89C52R单片机实现一个多功能的显示系统,包括LCD1602码表、数码管和后台数码显示器。通过串口通信,单片机可以与后台数码显示器进行数据交换和控制,实现更加灵活和多样化的显示功能。

1.2 项目组成部分

(1)STC89C52R单片机:
(2)LCD1602码表:
(3)数码管:
(4)后台数码显示器(通过串口通信):
(5)按键:
(6)Proteus:
在这里插入图片描述

1.3 功能描述

(1)STC89C52R单片机计时:
单片机作为项目的核心控制单元,负责数据处理、显示控制以及与外部设备的通信,更重要的是实现数据计时功能。
(2)LCD1602:
LCD1602显示屏用于显示文字信息,可以显示日期、时间、温度等实时数据。
(3)数码管:
数码管用于显示数字信息,比如计数器数值、计时器时间等。
(4)后台数码显示器(通过串口通信):
通过串口通信,将单片机与后台数码显示器连接,实现双向数据传输和控制,扩展显示功能。
(5)按键:
通过按键截取码表计时时间,有2个按键。
按键1:准备,开始、停止,清零,根据按键的次数依次表示不同的功能;
按键2:截取时间;
(6)Proteus:
通过实物演示和Proteus方式进行仿真。

2 开发环境

2.1 支持设备

我们采用华晴51开发板、计算机Keil开发工具、PROTEUS仿真软件。结合华晴51开发板、Keil开发工具和PROTEUS仿真软件,开发人员可以进行完整的嵌入式系统开发流程。他们可以使用Keil开发工具编写、编译和调试8051单片机程序,然后通过PROTEUS仿真软件验证程序的正确性和系统的功能。一旦验证通过,程序可以下载到华晴51开发板中进行实际硬件调试和测试,从而完成嵌入式系统的开发。这些工具的结合使用使开发人员能够在软件和硬件层面对嵌入式系统进行全面的开发和验证,提高开发效率,降低开发成本,并确保系统的稳定性和可靠性。
(1)华晴51开发板:
华晴51开发板是一种基于8051系列单片机的开发板,通常用于学习、开发和测试嵌入式系统。该开发板具有丰富的外设接口,包括LED、按键、数码管、LCD显示屏、通信接口等,方便用户进行各种实验和项目开发。华晴51开发板通常支持多种编程方式,如汇编语言、C语言等,适合初学者和专业开发人员使用。
(2)Keil开发工具:
Keil开发工具是一套专业的嵌入式系统开发工具,主要用于针对ARM和8051等处理器的嵌入式软件开发。其中,Keil C51是用于8051系列单片机的C语言集成开发环境,提供了编译、调试、仿真等功能,使开发人员能够高效地进行嵌入式软件开发。Keil开发工具配备了强大的调试功能,能够帮助开发人员快速定位和解决程序中的问题,提高开发效率。
(3)PROTEUS仿真软件:
PROTEUS是一款广泛用于电子电路设计和仿真的软件。在嵌入式系统开发中,PROTEUS常被用于对电路设计和单片机程序进行仿真,以验证系统功能、调试程序和检测潜在问题。PROTEUS提供了丰富的元件库和仿真功能,用户可以方便地搭建电路原理图、加载单片机程序,并进行实时仿真。

2.2 硬件电路

(1)STC89C52R单片机:

在这里插入图片描述

晶振使用11.0592Mhz

在这里插入图片描述

(2)LCD1602码表:

在这里插入图片描述

(3)数码管:

在这里插入图片描述

(4)后台数码显示器(通过串口通信):

在这里插入图片描述

(5)按键:
按键使用独立按键形式,P32 P33引脚

在这里插入图片描述

(6)实物与Proteus:
在这里插入图片描述
在这里插入图片描述

3 软件代码工程

//main.c文件

#include "includes.h"



/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{
	while(us--)
	{
	}
}

/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{
	while(Ms--)
	{
		delay_us(100);
	}
}





/*------------------------------------------------
                    主函数
------------------------------------------------*/


unsigned int pro_stopwatch_time = 0;
unsigned char pro_key_data = 0;
unsigned int  pro_stopwatch_buf[10] = {0};
unsigned char pro_time_cnt = 0;
unsigned char pro_start_flag = 0;

void main (void)
{
	char Test2[] = "                ";
	unsigned char databuf[4] = {0};
	//串口外设初始化
	sys_uart_init();
	
	//定时器外设初始化
	sys_timer_init();

	//LCD1602显示屏初始化
	LCD_init();
	                                                                      
	//数据清零
	pro_stopwatch_time = 0;
	//主程序
	
	sprintf(Test2,"TIME:  .        ");
	LCD_write_strl(0,0,Test2,16);
	sprintf(Test2,"N:  . time:  .  ");
	LCD_write_strl(0,1,Test2,16);
    while (1)
    {
		pro_key_data = sys_key_single();
		
		switch(pro_key_data)
		{
			case 3:
				//截取数据量是有限的10个,只能在运行时截取
				/*
				pro_start_flag = 0://码表准备
				pro_start_flag = 1://码表开始
				pro_start_flag = 2://码表停止
				pro_start_flag = 3://码表清零
				*/
				pro_start_flag++;
				if(pro_start_flag>3)
				{
					pro_start_flag = 0;
				}
				
				if(pro_start_flag==3)
				{
					pro_stopwatch_time = 0;
					pro_time_cnt = 0;
					pro_stopwatch_buf[0] = 0;
					pro_stopwatch_buf[1] = 0;
					pro_stopwatch_buf[2] = 0;
					pro_stopwatch_buf[3] = 0;
					pro_stopwatch_buf[4] = 0;
					pro_stopwatch_buf[5] = 0;
					pro_stopwatch_buf[6] = 0;
					pro_stopwatch_buf[7] = 0;
					pro_stopwatch_buf[8] = 0;
					pro_stopwatch_buf[9] = 0;
				}
				break;//0按下相应的键显示相对应的码值
			case 4:
				if(pro_start_flag==1 && pro_time_cnt<10)
				{
					pro_stopwatch_buf[pro_time_cnt]=pro_stopwatch_time;
					pro_time_cnt += 1;
					if(pro_time_cnt>9)
					{
						pro_time_cnt = 10;
					}
				}
				//printf("Number:%d ,Time:%d~~~",pro_time_cnt,pro_stopwatch_time);
				Uart_SendChar(pro_time_cnt);
				Uart_SendChar(pro_stopwatch_buf[pro_time_cnt-1]>>8);
				Uart_SendChar(pro_stopwatch_buf[pro_time_cnt-1]&0xFF);

				break;//1 按下相应的键显示相对应的码值 
			default:break;
		}
		

		//数码管显示
		
		if(pro_time_cnt>0)
		{
			databuf[0] = pro_stopwatch_buf[pro_time_cnt-1]/1000;
			databuf[1] = pro_stopwatch_buf[pro_time_cnt-1]%1000/100;
			databuf[2] = pro_stopwatch_buf[pro_time_cnt-1]%100/10;
			databuf[3] = pro_stopwatch_buf[pro_time_cnt-1]%10;
			
			sys_keynum_ledon(pro_time_cnt,0);
			sys_keynum_ledon(11,1);
			sys_keynum_ledon(databuf[0],2);
			sys_keynum_ledon(databuf[1],3);
			sys_keynum_ledon(12,3);
			sys_keynum_ledon(databuf[2],4);
			sys_keynum_ledon(databuf[3],5);
			sys_keynum_ledon(0,6);
			//显示数据和刷新
			
			LCD_write_com(0xC0+2);
			lcd_number(pro_time_cnt/10);
			LCD_write_com(0xC0+3);
			lcd_number(pro_time_cnt%10);
			
			LCD_write_com(0xC0+11);
			lcd_number(databuf[0]);
			
			LCD_write_com(0xC0+12);
			lcd_number(databuf[1]);
			
			LCD_write_com(0xC0+14);
			lcd_number(databuf[2]);
			
			LCD_write_com(0xC0+15);
			lcd_number(databuf[3]);
			

		}
		else
		{
			sys_keynum_ledon(0,0);
			sys_keynum_ledon(11,1);
			sys_keynum_ledon(0,2);
			sys_keynum_ledon(0,3);
			sys_keynum_ledon(12,3);
			sys_keynum_ledon(0,4);
			sys_keynum_ledon(0,5);
			sys_keynum_ledon(0,6);
			
			
			LCD_write_com(0xC0+2);
			lcd_number(0);
			LCD_write_com(0xC0+3);
			lcd_number(0);
			
			LCD_write_com(0xC0+11);
			lcd_number(0);
			
			LCD_write_com(0xC0+12);
			lcd_number(0);
			
			LCD_write_com(0xC0+14);
			lcd_number(0);
			
			LCD_write_com(0xC0+15);
			lcd_number(0);
			
		}
		
		
		LCD_write_com(0x80+5);
		lcd_number(pro_stopwatch_time%10000/1000);
		LCD_write_com(0x80+6);
		lcd_number(pro_stopwatch_time%1000/100);
		LCD_write_com(0x80+8);
		lcd_number(pro_stopwatch_time%100/10);
		LCD_write_com(0x80+9);
		lcd_number(pro_stopwatch_time%10);
		
		
		P1= pro_start_flag;
    }
}

//includes.h文件

#ifndef __INCLUDES_H__
#define __INCLUDES_H__

//#include<reg52.h> 

#include<intrins.h> //汇编指令_nop_
#include<stdio.h> 	//标准输入输出

//_nop_(); 产生一条NOP指令
//作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。
//NOP指令为单周期指令,可由晶振频率算出延时时间。

//8051 为每个机器周期 12 时钟
//对于12M晶振,延时1uS。
//11.0592M晶振,延时1.0851uS。

//对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。


//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "STC89C5xRC_RDP.h"

//应用层头文件
//#include "c51_gpio.h"
#include "c51_ledtube.h"
#include "c51_key.h"
#include "c51_timer.h"
//#include "c51_exit.h"
#include "c51_lcd1602.h"
//#include "c51_iic.h"
//#include "c51_tx1838.h"
#include "c51_uart.h"
//#include "c51_28byj48.h"
//#include "c51_ds1302.h"

extern unsigned int pro_stopwatch_time;
extern unsigned char pro_ledtube_data;
extern unsigned char pro_key_data;
extern unsigned int pro_stopwatch_buf[10];
extern unsigned char pro_cnt;
extern unsigned char pro_time_cnt;
extern unsigned char pro_start_flag;



extern void delay_us(unsigned int us);//delay us;
extern void delay_ms(unsigned int Ms);//delay Ms;




#endif

//c51_ledtube.c文件

#include "includes.h"

 显示段码值01234567,可对应原理图查看显示不同图形对应的引脚高点电平配置状态
//unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F

code unsigned char ledmap[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40,0x80};


///********************************************************
//函数名称:sys_ledtube_on1
//函数功能:点亮一个数码管全为亮起来
//入口参数:
//出口参数:
//修    改:
//内    容:
//********************************************************/
//void sys_ledtube_on1(void)
//{
//	//根据原理图,将P0口全部输出高电平,P2选择0号数码管
//	P0=0xFF;//取显示数据,段码
//	P2=0;  	//取位码
//}

///********************************************************
//函数名称:sys_ledtube_on2
//函数功能:显示一组数据
//入口参数:
//出口参数:
//修    改:
//内    容:
//********************************************************/
//static unsigned char ledtube_cnt = 0;

//void sys_ledtube_on2(void)
//{
//	ledtube_cnt++;
//	if(ledtube_cnt>7)
//	{
//		ledtube_cnt = 0;
//	}
//	P0 = 0x00;				//防止切换数码管瞬间有虚影出现
//	P2 = 0x00;
//	P0 = ledmap[ledtube_cnt];	//取显示数据,段码
//	P2 = ledtube_cnt;  		//取位码
//	
//	//根据人眼适应虚影缓冲时间为50ms左右
//	//我们调整delay在500以下可以看到明显的看起来是一串数据一起显示
//	delay(100); 			
//}


///********************************************************
//函数名称:sys_keynum_ledon
//函数功能:显示按键数值
//入口参数:按键数值
//出口参数:
//修    改:
//内    容:
//********************************************************/
void sys_keynum_ledon(unsigned char num,unsigned char pn)
{
	//根据原理图,将P0口全部输出高电平,P2选择0号数码管
	P0 = 0x00;		//防止切换数码管瞬间有虚影出现
	P2 = pn;  		//取位码
	P0 = ledmap[num];	//取显示数据,段码
	delay_ms(1);
}

//c51_ledtube.h文件

#ifndef __C51_LEDTUBE_H__
#define __C51_LEDTUBE_H__


//extern unsigned char const EL[];

//extern void sys_ledtube_on1(void);
//extern void sys_ledtube_on2(void);

extern void sys_keynum_ledon(unsigned char num,unsigned char pn);


#endif

//c51_timer.c文件

#include "includes.h"


void sys_timer_init(void)
{
	TMOD |= 0x01;	//定时器设置 10ms in 11.0592M crystal,工作在模式1,16位定时
	TH0	  = 0xDC;
	TL0   = 0x00;
	TR0   = 1;     	//打开定时开关
	ET0   = 1;
	EA    = 1;  	//打开中断
}




/*------------------------------------------------
              10ms定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
	TH0=0xd8;             //重新赋值
	TL0=0xf0;

	if(pro_start_flag==1)
	{
		pro_stopwatch_time++;
		if(pro_stopwatch_time>9999)
		{
			pro_stopwatch_time = 9999;
		}
	}
}

//c51_timer.h文件

#ifndef __C51_TIMER_H__
#define __C51_TIMER_H__






//extern void timer0_set(unsigned int Value);
//extern unsigned int timer0_get(void);
//extern void timer0_run(unsigned char Flag);

extern void sys_timer_init(void);
extern void sys_timer0_init(void);
extern void Timer0_isr(void);
extern void sys_timer1_init(void);
extern void Timer1_isr(void);
extern void sys_timer2_init(void);
extern void Timer2_isr(void);

extern void sys_wdog_init(void);
extern void clr_wdg(void);

#endif

//c51_uart.c文件

#include "includes.h"



/*-----------------------------------------------
  名称:串口通信
  内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源
        打开串口调试程序,将波特率设置为9600,无奇偶校验
        晶振11.0592MHz,发送和接收使用的格式相同,如都使用
        字符型格式,在发送框输入 hello,I Love MCU ,在接
        收框中同样可以看到相同字符,说明设置和通信正确
------------------------------------------------*/
                    


/******************************************************************/
void sys_uart_init(void)
{


	SCON  = 0x50;		        /* SCON: 模式 1, 8-bit UART, 使能接收         */
	TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
	TH1   = 0xFD;               /* TH1:  reload value for 9600 baud @ 11.0592MHz   */
	TR1   = 1;                  /* TR1:  timer 1 run                          */
	EA    = 1;                  /*打开总中断*/
	//ES    = 1;                  /*打开串口中断*///当使用串口协议通讯时可以使用此型号中断

}


void Uart_SendChar(unsigned char  dat)
{
    SBUF = dat; 
    while(!TI); 
    TI = 0; 
}
 
char putchar(char c)//重定向
{
    Uart_SendChar(c);
    return c;

}

/******************************************************************/
/*                  串口中断程序                                  */
/******************************************************************/


static unsigned char uart_temp = 0;          //定义临时变量 
static unsigned char uart_cnt = 0;          //定义临时变量 


void UART_isr(void) interrupt 4 //串行中断服务程序
{
	if(RI)                        //判断是接收中断产生
	{
		RI=0;                      //标志位清零
		uart_temp=SBUF;                 //读入缓冲区的值
		if(uart_cnt==0)
		{
			if(0x02 == uart_temp)
			{
				uart_cnt = 1;
			}
			else
			{
				uart_cnt = 0;
			}
		}
		else if(uart_cnt==1)
		{
			if(0x05 == uart_temp)
			{
				uart_cnt = 2;
			}
			else
			{
				uart_cnt = 0;
			}
		}
		else if(uart_cnt==2)
		{
			uart_cnt = 0;
			//P1=uart_temp;                   //把值输出到P1口,用于观察
			SBUF=uart_temp;                 //把接收到的值再发回电脑端
		}
		else
		{
			uart_cnt = 0;
		}
	}
	if(TI)                        //如果是发送标志位,清零
	{
		TI=0;
	}
} 

//c51_uart.h文件

#ifndef __C51_UART_H__
#define __C51_UART_H__


extern void Uart_SendChar(unsigned char  dat);
extern char putchar(char c);//重定向

extern void sys_uart_init(void);
extern void UART_isr(void);


#endif

//c51_lcd1602.c文件

#include "includes.h"

#include <string.h>

/******************************************************************/
/*                   写入命令函数                                 */
/******************************************************************/
void LCD_write_com(unsigned char com) 
{  
	RS_CLR; 
	RW_CLR; 
	EN_SET; 
	P0 = com; 
	delay_us(5); 
	EN_CLR;
}

/******************************************************************/
/*                   写入数据函数                                 */
/******************************************************************/
void LCD_write_Data(unsigned char Data) 
{ 
	RS_SET; 
	RW_CLR; 
	EN_SET; 
	P0 = Data; 
	delay_us(5); 
	EN_CLR;
}


/****************************************
函数功能:LCD显示数字0-9
*****************************************/
void lcd_number(unsigned int number)
{
	int num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
	switch(number)
	{
		case 0:LCD_write_Data(num[0]);
		break;
		case 1:LCD_write_Data(num[1]);
		break;
		case 2:LCD_write_Data(num[2]);
		break;
		case 3:LCD_write_Data(num[3]);
		break;
		case 4:LCD_write_Data(num[4]);
		break;
		case 5:LCD_write_Data(num[5]);
		break;
		case 6:LCD_write_Data(num[6]);
		break;
		case 7:LCD_write_Data(num[7]);
		break;
		case 8:LCD_write_Data(num[8]);
		break;
		case 9:LCD_write_Data(num[9]);
		break;
	}
}

/******************************************************************/
/*                   初始化函数                                   */
/******************************************************************/
void LCD_init(void) 
{
	LCD_write_com(0x38);    /*显示模式设置*/ 
	delay_ms(5); 
	LCD_write_com(0x38); 
	delay_ms(5); 
	LCD_write_com(0x38); 
	delay_ms(5); 
	LCD_write_com(0x38);  
	LCD_write_com(0x08);    /*显示关闭*/ 
	LCD_write_com(0x01);    /*显示清屏*/ 
	LCD_write_com(0x06);    /*显示光标移动设置*/ 
	delay_ms(5); 
	LCD_write_com(0x0C);    /*显示开及光标设置*/
}


 
/******************************************************************/
/*                   写入字符串函数                                */
/*      X:第几列 Y:第几行  *s字符串为空时跳出                      */
/******************************************************************/
void LCD_write_strl(unsigned char x,unsigned char y,unsigned char *s,unsigned length) 
{     
	unsigned char cnt = 0;
	//LCD_write_com(0x01);    /*显示清屏*/ 
	
	if (y == 0) 
	{     
		LCD_write_com(0x80 + x);     
	}
	else 
	{     
		LCD_write_com(0xC0 + x);     
	}
       
	while(length--)
	{     
		LCD_write_Data( *s);     
		s ++;
		cnt++;
		
	}
}

//c51_lcd1602.h文件

#ifndef __C51_LCD1602_H__
#define __C51_LCD1602_H__



#include "STC89C5xRC_RDP.h"


//定义宏定义

sbit RS = P2^4;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^6;

#define RS_CLR RS=0 
#define RS_SET RS=1
#define RW_CLR RW=0 
#define RW_SET RW=1 
#define EN_CLR EN=0
#define EN_SET EN=1


extern void LCD_write_com(unsigned char com) ;
extern void LCD_write_Data(unsigned char Data) ;
extern void lcd_number(unsigned int number);
extern void LCD_init(void) ;
extern void LCD_write_strl(unsigned char x,unsigned char y,unsigned char *s,unsigned length) ;




#endif

//c51_key.c文件

#include "includes.h"


/********************************************************
函数名称:sys_key_single
函数功能:按键检测,带有消抖策略
入口参数:
出口参数:按键数值
修    改:
内    容:
********************************************************/

unsigned char sys_key_single(void)
{
	if(!P32)
	{
		delay_ms(20);
		if(!P32)
		{
			while(!P32);
			return 3;
		}
		else
		{
			return 0;
		}
	}
	else if(!P33)
	{
		delay_ms(20);
		if(!P33)
		{
			while(!P33);
			return 4;
		}
		else
		{
			return 0;
		}
	}
	else
	{
		return 0;
	}
	
}

//c51_key.h文件

#ifndef __C51_KEY_H__
#define __C51_KEY_H__


extern unsigned char sys_key_single(void);  //键盘扫描函数,使用行列反转扫描法

#endif

4 演示

4.1 Proteus仿真

在这里插入图片描述

4.2 实物演示

在这里插入图片描述

5 总结

将STC89C52R与LCD1602码表、数码管以及后台数码显示器(通过串口)结合起来的应用具有以下价值和优势:

  1. 多功能显示系统:
    通过整合LCD1602码表和数码管,您可以实现多种信息的显示,如时间、日期、计数器数值等。后台数码显示器通过串口通信扩展了显示功能,使系统更加灵活和多样化。
  2. 实时数据显示:
    LCD1602码表和数码管可以显示实时数据,如温度、湿度、计时等信息,帮助用户实时监测系统状态。
  3. 数据交互与控制:
    通过串口通信,后台数码显示器可以接收或发送数据,实现与系统的双向交互。这为用户提供了更多控制选项,使系统更具交互性。
  4. 灵活性和扩展性:
    结合这些组件,系统具有较强的灵活性和扩展性。可以根据需求增加更多显示设备或扩展更多功能,满足不同应用场景的需求。
  5. 教学和学习用途:
    这样的应用可以作为嵌入式系统开发的教学实践项目,帮助学生理解单片机控制、显示技术和串口通信的原理和应用。
  6. 嵌入式系统应用:
    这种应用在嵌入式系统中具有广泛的应用前景,可用于智能家居、工业控制、自动化系统等领域,提供实时监控和控制功能。
  7. 技术学习和应用实践:
    通过这种项目,开发人员可以学习嵌入式系统设计、硬件与软件的协同开发,串口通信协议等相关知识,并将其应用于实际项目中。
    综上所述,STC89C52R控制LCD1602码表、数码管和后台数码显示器的应用具有丰富的功能、灵活性和教学学习的价值,同时具备广泛的应用前景,可在各种嵌入式系统和电子设备中发挥重要作用。

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

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

相关文章

C语言程序设计结构(未完待续...)

文章目录 **C**语言设计的核心&#xff08;灵魂&#xff09;**C**语言程序设计的设计结构顺序结构选择结构循环结构 **C**语言的语句 C语言设计的核心&#xff08;灵魂&#xff09; 程序 数据结构 算法 算法&#xff1a;对于问题解决的方法思路或者步骤 算法的特征&#x…

mac|安装PostgreSQL

1、官网下载&#xff1a;EDB: Open-Source, Enterprise Postgres Database Management 选择需要的版本&#xff1a; 双击得到的.dmg文件 双击&#xff0c;弹窗选择打开&#xff0c;一路next&#xff0c;然后输入你要设置的密码&#xff0c;默认账号名字为&#xff1a;postgres…

vite构建vue3项目hmr生效问题踩坑记录

vite构建vue3项目hmr生效问题踩坑记录 hmr的好处 以下是以表格形式呈现的前端开发中HMR&#xff08;热模块替换&#xff09;带来的好处&#xff1a; 好处描述提升开发效率允许开发者在不刷新整个页面的情况下实时更新修改的代码&#xff0c;减少等待时间保持应用状态在模块替…

一起学Java(1)-新建一个Gradle管理的Java项目

一时兴起&#xff0c;也为了便于跟大家同步学习进展和分享样例代码&#xff0c;遂决定创建一个全新的Java项目&#xff0c;并通过Github与大家分享。本文就是记录该项目的创建过程以及其中的一些知识要点&#xff08;如Gradle等&#xff09;。为了紧跟技术潮流和提高操作效率&a…

怎么给PDF文件加密码?关于PDF文件加密的四种方法推荐

怎么给PDF文件加密码&#xff1f;给PDF文件加上密码是保护文件安全的一种重要方法&#xff0c;特别是当需要在不受授权的访问下保护敏感信息时。这个过程不仅仅是简单地设置密码&#xff0c;而是涉及到对文档内容和访问控制的深思熟虑。加密PDF文件可以有效防止未经授权的用户查…

electron TodoList网页应用打包成linux deb、AppImage应用

这里用的是windows的wsl的ubuntu环境 electron应用打包linux应用需要linux下打包&#xff0c;这里用windows的wsl的ubuntu环境进行操作 1&#xff09;linux ubuntu安装nodejs、electron 安装nodejs&#xff1a; sudo apt update sudo apt upgrade ##快捷安装 curl -fsSL http…

数据缺失补全方法综述

数据缺失补全方法综述 摘要1. 引言2. 数据缺失的类型3. 数据缺失补全方法3.1 简单插补方法3.1.1 均值插补3.1.2 中位数插补3.1.3 众数插补3.1.4 前向填充和后向填充3.1.5 线性插值3.1.6 多重插补 3.2 基于模型的插补方法3.2.1 线性回归插补3.2.2 加权回归插补3.2.3 主成分分析&…

如何改桥接模式

桥接模式主要是解决 路由功能的 因为NAT多层 主要是网络连接数太多时 然后路由器要好 不然光猫 比差路由要强的 光猫 请注意&#xff0c;对光猫的任何设置进行修改前&#xff0c;请一定要备份光猫的配置文件&#xff0c;并在每次修改前都截图保存原始设置信息&#xff01;不要…

Jacoco 单元测试配置

前言 编写单元测试是开发健壮程序的有效途径&#xff0c;单元测试写的好不好可以从多个指标考量&#xff0c;其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算&#xff0c;…

pytest结合allure-pytest插件生成测试报告

目录 一、安装allure-pytest插件 二、下载allure 三、生成allure报告 四、效果展示 一、安装allure-pytest插件 二、下载allure 下载之后解压&#xff0c;解压之后还要配置环境变量&#xff08;把allure目录下bin目录配置到系统变量的path路径&#xff09;&#xff0c;下…

AcWing1维差分

输入数据a数组 a[i]a0a1a2 … \dots …anb[i]b0b1b2 … \dots …bn b1a1 b2a2-a1 … \dots … bnan-an-1 以上各式累加相消得到 b1b2 … \dots …bnan 也就是说任一an可以由b数组累加求和得到并且任一个bi加上元素c等于在an上面c。 对于区间[L,R], aLb1b2 … \dots …bL aL1…

【短视频矩阵系统源码如何构建?】

在数字化时代&#xff0c;短视频已成为信息传播的重要载体。针对这一趋势&#xff0c;短视频矩阵系统的构建应运而生&#xff0c;集混剪、发布、数据分析及线索跟进于一体&#xff0c;旨在为内容创作者和品牌提供全方位的服务支持。 系统通过混剪功能&#xff0c;能够将长视频或…

接口测试 ★ ✔【接口测试理论、http协议、接口测试文档解析、Postman使用、接口测试用例设计、Request库、UnitTest框架、】

接口测试 接口测试-第01天&#xff08;接口测试理论、HTTP协议、接口测试流程、接口文档解析&#xff09;学习⽬标能够分析HTTP协议的请求和响应数据完成ihrm系统指定接⼝的API⽂档解析接⼝测试理论概念作用 ★实现⽅式 ★HTTP协议 ★HTTP协议简介URL格式 ★练习 HTTP请求 ★整…

A Comprehensive Study of Knowledge Editing for Large Language Models

大型语言模型&#xff08;LLMs&#xff09;在理解和生成与人类交流密切相关的文本方面表现出了非凡的能力。然而&#xff0c;一个主要的限制在于训练期间的大量计算需求&#xff0c;这是由于它们的广泛参数化而产生的。世界的动态性质进一步加剧了这一挑战&#xff0c;需要经常…

Java面试八股之Spring-boot-starter-parent的作用是什么

Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM&#xff08;Project Object Model&#xff09;&#xff0c;它主要的作用是提供一系列默认的配置和依赖管理&#xff0c;以便简化项目的构建过程。以下是spring-boot-sta…

【Python Web】Flask扩展开发指南

Flask是一个轻量级的Python Web框架&#xff0c;它提供了丰富的扩展库和工具&#xff0c;可以帮助开发者快速构建Web应用。本篇博客将介绍如何进行Flask扩展开发&#xff0c;包括扩展的创建、配置、使用等方面的内容。 目录 Flask扩展开发指南 一、Flask扩展简介 二、创建Fl…

java面向对象进阶进阶篇--《成员、静态、局部、匿名内部类》

个人主页→VON 收录专栏→java从入门到起飞 接口和接口与抽象类综合案例 目录 一、成员内部类 特性&#xff1a; 定义方式&#xff1a; 访问规则&#xff1a; 实例化&#xff1a; 生命周期&#xff1a; 静态成员&#xff1a; 使用场景&#xff1a; 示例&#xff1a; O…

快速入门了解Ajax

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Ajax的初识 意义&#xff1a;AJAX&#xff08;Asynchronous JavaScript and…

C语言 | Leetcode C语言题解之第287题寻找重复数

题目&#xff1a; 题解&#xff1a; int findDuplicate(int* nums, int numsSize){int *b(int*)calloc(100001,sizeof(int));for(int i0;i<numsSize;i){ b[nums[i]];if(b[nums[i]]2) return nums[i];}return 0;}

【C语言】 二叉树创建(结构体,先序遍历,中序遍历,后续遍历)

二叉树的创建&#xff1a;首先先定义一个结构体&#xff0c;里面包含数据&#xff08;data&#xff09;&#xff0c;指向左子树的指针&#xff08;L&#xff09;&#xff0c;指向右子树的指针&#xff08;R&#xff09;三个部分 在创建树的函数中&#xff0c;首先先输入…