单片机实验(二)

news2024/9/23 17:23:44

前言

实验一:用AT89C51单片机控制LCD 1602,使其显示两行文字,分别显示自己的学号和姓名拼音。

实验二:设计一个中断嵌套程序。要求K1和K2都未按下时,单片机控制8只数码管,滚动输出完整的学号。当按一下K1时,产生一个低优先级的外部中断0请求(负跳变触发),进入外部中断0中断服务程序,数码管显示学号中的年份3秒以上。此时按一下K2时,产生一个高优先级的外部中断1请求(负跳变触发),进入外部中断1中断服务程序,是数码管显示学号的后三位持续3秒钟。当显示3秒之后,再从外部中断1返回继续执行外部中断0为低优先级,外部中断1外高优先级。

实验三:36层的电梯控制设计,开门数码管显示AA,关门数码管显示bb,到达某一层以后显示AA,延时一段时间(人进入电梯时间)以后显示bb,再去另一层。

参考链接

LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客

字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)-CSDN博客

外中断的应用-CSDN博客

我用proteus仿真时,一运行很多元件的命名会自动修改.怎么回事_百度知道 (baidu.com)

keil编译错误KEY.c(44): error C141: syntax error near ‘unsigned’, expected ‘__asm’_syntax error near 'unsigned', expected '__asm_ONE_Day|的博客-CSDN博客

Proteus+51单片机模拟电梯运行(含源程序) - 知乎 (zhihu.com)

基于AT89C51单片机的简易电梯上下楼层间移动系统_柒月玖.的博客-CSDN博客

矩阵键盘独立接口设计(Keil+Proteus)-CSDN博客

Proteus设置网络标签_proteus怎么放置网络标号-CSDN博客

【精选】51单片机入门——数码管_单片机数码管_倾晨灬雨曦的博客-CSDN博客

实验一

Keil

需要修改的地方就是将每行显示的字符进行替换即可,书上面有一个光标右移的命令,我这里进行了取消。

#include<reg51.h>
#include<intrins.h>	//包含_nop_()空函数指令的头文件
#define uchar unsigned char 
#define uint unsigned int
#define out P0
sbit RS=P2^0;//位变量
sbit RW=P2^1;//位变量
sbit E=P2^2;//位变量
//函数声明部分
void lcd_initial(void);//LCD初始化函数
void check_busy(void);//检查忙标志位函数
void write_command(uchar com);//写命令函数
void write_data(uchar dat);//写数据函数
void string(uchar ad,uchar *s);//显示字符串
void delay(uint);//延时

void main(void){
	lcd_initial();//对LCD初始化
	while(1){
		string(0x83,"202140200126");//显示第一行的字符
		string(0xC4,"Liu Jian");//显示第二行的字符
		delay(200);//延时
		write_command(0x01);//清屏
		delay(100);//延时
	}
}

//延时
void delay(uint j){
	uchar i=250;
	for(;j>0;j--){
		while(--i);
		i=249;
		while(--i);
		i=250;
	}
}

//检查忙标志
void check_busy(void){
	uchar dt;
	do{
		dt=0xff;//dt为变量单元,初值为0xff
		//RS=0,E=1时才可以读忙标志位
		E=0;
		RS=0;
		RW=1;
		E=1;
		dt=out;//out为P0口,P0口的状态送入dt中
	}while(dt&0x80);//如果忙标志位BF=1,继续循环检测,等待BF=0
	E=0;//BF=0,LCD 1602不忙,结束检测
}

//写命令
void write_command(uchar com){
	check_busy();
	//按规定RS和E同时为0时,才可以写命令
	E=0;
	RS=0;
	RW=0;
	out=com;//将命令com写入P0口
	E=1;//写命令时,E应为正脉冲,即正跳变,所以前面先置E=0
	_nop_();//空操作1个机器周期,等待硬件反应
	E=0;//E由高电平变为低电平,LCD 1602开始执行命令
	delay(1);//延时,等待硬件反应
}

//写数据
void write_data(uchar dat){
	check_busy();//检测忙标志位BF=1则等待,若BF=0,则可对LCD 1602写入命令
	E=0;//按规定写数据时,E应为正脉冲,所以先置E=0
	//按规定RS=1和RW=0时,才可以写入数据
	RS=1;
	RW=0;
	out=dat;//将数据”dat“从P0口输出,即写入LCD 1602
	E=1;//E产生正跳变
	_nop_();//空操作1个机器周期,等待硬件反应
	E=0;//E由高电平变为低电平,写数据操作结束
	delay(1);
}

//液晶显示器初始化函数
void lcd_initial(void){
	write_command(0x38);//8位两行显示,5*7点阵字符
	_nop_();//空操作1个机器周期,等待硬件反应
	write_command(0x0C);//开整体显示,光标关,无闪烁
	_nop_();//空操作1个机器周期,等待硬件反应
	//write_command(0x05);//光标右移
	_nop_();//空操作1个机器周期,等待硬件反应
	write_command(0x01);//清屏
	delay(1);
}
//输出显示字符串
void string(uchar ad,uchar *s){
	write_command(ad);
	while(*s>0){
		write_data(*s++);//输出字符串,且指针增1
		delay(100);
	}
}

Proteus

 这个实验的原理图,在书上以及前面的博客都有提到,不需要进行修改。

实验需要的元器件

运行结果 

实验二

Keil

在试验一的基础上增加中断服务函数的代码,一个是显示学号中的年份,一个是显示学号的后三位,我这里是直接用到了一个数组来实现,外部中断0的服务函数是把年份在前面四个数码管显示,外部中断1的服务函数是将学号后面三位在前面三个数码管来显示,然后需要设置中断的优先级。

这里要注意的是:

在某些C编译器支持的C标准中,而keil支持的是ANSI C标准,该标准规定声明变量的位置应当在所有可执行语句之前。不然会导致变量没有定义而报错。

还有一个就是这个时间的问题,他需要保持三秒之后回去,这个我不知道怎么计算,所以还是自己调试超过三秒钟就没有管了。

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
	
uchar code dis_code[]={0xA4,0xC0,0xA4,0xF9,0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//202140200126(共阳极段码表)
uchar code wei_code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//对应输出的位置

//延时
void Delay(uint i){
	uint j;
	for(;i>0;i--)//晶体振荡器为12MHz,j的选择与晶体振荡器的频率有关
	for(j=0;j<333;j++){;}
}

void main(){
	uchar i,j=0x80;
	while(1){
		EA=1;//总中断允许
		EX0=1;//允许外部中断0
		EX1=1;//允许外部中断1
		IT0=1;//选择外部中断0为下降沿触发
		IT1=1;//选择外部中断1为下降沿触发
		PX0=0;//设置中断0为低优先级
		PX1=1;//设置中断1为高优先级

		for(i=0;i<12;i++){
			j=_crol_(j,1);//循环左移一位
			P0=dis_code[i];//P0口输出段码
			P2=j;//P2口输出位控码
			Delay(200);//延时
		}
	}
}


//外部中断0,显示学号中的年份3秒以上
void int0() interrupt 0{
	uchar i,j=0;
	EX0=0;//禁止外部中断0
	while(1){
	for(i=0;i<4;i++){
			P0=dis_code[i];//P0口输出段码
			P2=wei_code[i];//P2口输出位控码
			Delay(200);//延时
		}
	j++;
	if(j==3)
		break;
	}
	EX0=1;//打开外部中断0
}
 
//外部中断1,显示学号中的后三位3秒以上
void int1() interrupt 2{
	uchar i,j=0;
	EX1=0;//禁止外部中断1
	while(1){
	for(i=0;i<3;i++){
			P0=dis_code[i+9];//P0口输出段码
			P2=wei_code[i];//P2口输出位控码
			Delay(200);//延时
		}
		j++;
	if(j==4)
		break;
	}
	EX1=1;//打开外部中断1
}

Proteus

实验需要的元器件:元器件都是之前用到过的。

这个就是出现一个 元器件的参考值在仿真的时候自己发生改变,人为进行修改之后他又自己回去了,而且就是一直报错,说你器件的名称重复了。

解决:查阅网上信息说是因为电脑的用户名称是中文的导致的,然后没说解决办法,我是直接删除元件的参考,就可以仿真了。

原理图就是在实验一的基础上面添加两个中断要用的按钮即可,连接就参考中断的部分。

实验三

Keil

这个不知道题目的意思,目前就实现了楼层的移动,就是从第一层到第十六层不是直接从1显示16,而是从1到16中间的数字也需要 一起显示。

这样就是把前面矩阵键盘的程序修改一下就行了。

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit L1=P1^0;//定义列
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;

uchar code digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极字型码0~9

uchar future_keyval=1;//保存电梯将要取到的楼层
uchar previous_keyval=1;//保存之前电梯处在的楼层

void Delay(uint i);//延时函数
void key_scan(void);//矩阵键盘扫描函数
void display(uchar i);//显示当前楼层函数


void main(){
	while(1){
		key_scan();
		//电梯处在的楼层和将要去的楼层不一致,需要电梯变化
		if(future_keyval!=previous_keyval){
			//将去到的楼层比现在高,表示需要上楼
			while(future_keyval>previous_keyval){
				//逐层显示
				previous_keyval++;
				display(previous_keyval);
			}
			//将去到的楼层比现在低,表示需要下楼
			while(future_keyval<previous_keyval){
				//逐层显示
				previous_keyval--;
				display(previous_keyval);
			}
		}else{
			//一致表示不需要移动
			display(future_keyval);
		}
	}
}

//延时
void Delay(uint i){
	uint j;
	for(;i>0;i--)//晶体振荡器为12MHz,j的选择与晶体振荡器的频率有关
	for(j=0;j<333;j++){;}
}

//矩阵键盘扫描函数
void key_scan(void){
	uchar i,temp;
	P1=0xEF;//行扫描初值1110 1111(扫描P1^4)
		for(i=0;i<4;i++){//逐行为低,按行扫描,一共4行
			if(L1==0)future_keyval=i*4+1;//判断第一列有无键被按下
			if(L2==0)future_keyval=i*4+2;//判断第二列有无键被按下
			if(L3==0)future_keyval=i*4+3;//判断第三列有无键被按下
			if(L4==0)future_keyval=i*4+4;//判断第四列有无键被按下
			Delay(10);//延时
			temp=P1;//读入P1口的状态
			temp=temp|0x0F;//将P1^3~P1^0为1
			temp=temp<<1;//左移,准备扫描下一行
			temp=temp|0x0F;
			P1=temp;//为扫描下一行做准备
		}
}

//自己定义楼层显示函数
void display(uchar i){
	switch(i){
		case 1:P0=digit[0];P2=digit[1];break;
		case 2:P0=digit[0];P2=digit[2];break;
		case 3:P0=digit[0];P2=digit[3];break;
		case 4:P0=digit[0];P2=digit[4];break;
		case 5:P0=digit[0];P2=digit[5];break;
		case 6:P0=digit[0];P2=digit[6];break;
		case 7:P0=digit[0];P2=digit[7];break;
		case 8:P0=digit[0];P2=digit[8];break;
		case 9:P0=digit[0];P2=digit[9];break;
		case 10:P0=digit[1];P2=digit[0];break;
		case 11:P0=digit[1];P2=digit[1];break;
		case 12:P0=digit[1];P2=digit[2];break;
		case 13:P0=digit[1];P2=digit[3];break;
		case 14:P0=digit[1];P2=digit[4];break;
		case 15:P0=digit[1];P2=digit[5];break;
		case 16:P0=digit[1];P2=digit[6];break;
	}
	Delay(150);//延时
}

Proteus

所需要的器件

元件名称Proteus关键字
51单片机AT89C51
复位按钮BUTTON
蓝色数码管7SEG-COM-AN-BLUE
红色数码管7SEG-COM-ANODE

拓展

老师没回我信息,我也不知道他是什么意思,然后就写着好玩对数字的移动进行了拓展。

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit L1=P1^0;//定义列
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;
sbit L5=P1^4;
sbit L6=P1^5;
sbit L7=P1^6;
sbit L8=P1^7;

uchar code digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极字型码0~9

uchar future_keyval=1;//保存电梯将要取到的楼层
uchar previous_keyval=1;//保存之前电梯处在的楼层

void Delay(uint i);//延时函数
void key_scan(void);//矩阵键盘扫描函数
void display(uchar i);//显示当前楼层函数


void main(){
	while(1){
		key_scan();
		//电梯处在的楼层和将要去的楼层不一致,需要电梯变化
		if(future_keyval!=previous_keyval){
			//将去到的楼层比现在高,表示需要上楼
			while(future_keyval>previous_keyval){
				//逐层显示
				previous_keyval++;
				display(previous_keyval);
			}
			//将去到的楼层比现在低,表示需要下楼
			while(future_keyval<previous_keyval){
				//逐层显示
				previous_keyval--;
				display(previous_keyval);
			}
		}else{
			//一致表示不需要移动
			display(future_keyval);
		}
	}
}

//延时
void Delay(uint i){
	uint j;
	for(;i>0;i--)//晶体振荡器为12MHz,j的选择与晶体振荡器的频率有关
	for(j=0;j<333;j++){;}
}

//矩阵键盘扫描函数
void key_scan(void){
	uchar i,temp;
	P1=0xFF;//列都置为1
	P3=0xFE;//逐行扫描
	for(i=0;i<8;i++){//逐行为低,按行扫描,一共4行
		if(L1==0)future_keyval=i*8+1;//判断第一列有无键被按下
		if(L2==0)future_keyval=i*8+2;//判断第二列有无键被按下
		if(L3==0)future_keyval=i*8+3;//判断第三列有无键被按下
		if(L4==0)future_keyval=i*8+4;//判断第四列有无键被按下
		if(L5==0)future_keyval=i*8+5;//判断第五列有无键被按下
		if(L6==0)future_keyval=i*8+6;//判断第六列有无键被按下
		if(L7==0)future_keyval=i*8+7;//判断第七列有无键被按下
		if(L8==0)future_keyval=i*8+8;//判断第八列有无键被按下
		Delay(10);//延时
		temp=P3;//读入P3口的状态
		P1=0xFF;
		P3=_crol_(temp,1);//需要采用循环左移,扫描下一行(不然会导致出现很多个0,低位补0)
	}
}

//自己定义楼层显示函数
void display(uchar i){
	P0=digit[i/10];
	P2=digit[i%10];
	Delay(150);//延时
}

这个我还是不知道怎么实现,这个线都没有这么多了,目前是用了一个LED灯代替,36层的话需要12根线。

采用静态的数码管显示要显示数组可以采用4根线的7SEG-BCD数码管,采用的是7448,这个我不知道怎么输出字符。

采用7SEG-COM-AN-BLUE的,线就需要7*4+12=40>32根。

采用7SEG-MPX8-CA-BLUE,但是不知道是我电脑的原因还是什么的,不管怎么设置两次显示的延迟时间,达不到同时人眼观看是两个同时显示的效果,时间太短的结果是两个显示都不完全。

目前是采用用LED灯来表示电梯有没有打开如下:

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
	
sbit L1=P1^0;//定义列
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;
sbit L5=P1^4;
sbit L6=P1^5;
sbit L7=P1^6;
sbit L8=P1^7;

uchar code digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极字型码0~9

uchar future_keyval=1;//保存电梯将要取到的楼层
uchar previous_keyval=1;//保存之前电梯处在的楼层

void Delay(uint i);//延时函数
void key_scan(void);//矩阵键盘扫描函数
void display(uchar i);//显示当前楼层函数


void main(){
	while(1){
		key_scan();
		//电梯处在的楼层和将要去的楼层不一致,需要电梯变化
		if(future_keyval!=previous_keyval){
			//将去到的楼层比现在高,表示需要上楼
			while(future_keyval>previous_keyval){
				//逐层显示
				previous_keyval++;
				display(previous_keyval);
			}
			//将去到的楼层比现在低,表示需要下楼
			while(future_keyval<previous_keyval){
				//逐层显示
				previous_keyval--;
				display(previous_keyval);
			}
		}else{
			//一致表示不需要移动
			display(future_keyval);
		}
	}
}

//延时
void Delay(uint i){
	uint j;
	for(;i>0;i--)//晶体振荡器为12MHz,j的选择与晶体振荡器的频率有关
	for(j=0;j<333;j++){;}
}

//矩阵键盘扫描函数
void key_scan(void){
	uchar i,temp;
	P1=0xFF;//列都置为1
	P3=0xFE;//逐行扫描
	for(i=0;i<8;i++){//逐行为低,按行扫描,一共4行
		if(L1==0)future_keyval=i*8+1;//判断第一列有无键被按下
		if(L2==0)future_keyval=i*8+2;//判断第二列有无键被按下
		if(L3==0)future_keyval=i*8+3;//判断第三列有无键被按下
		if(L4==0)future_keyval=i*8+4;//判断第四列有无键被按下
		if(L5==0)future_keyval=i*8+5;//判断第五列有无键被按下
		if(L6==0)future_keyval=i*8+6;//判断第六列有无键被按下
		if(L7==0)future_keyval=i*8+7;//判断第七列有无键被按下
		if(L8==0)future_keyval=i*8+8;//判断第八列有无键被按下
		Delay(10);//延时
		temp=P3;//读入P3口的状态
		P1=0xFF;
		P3=_crol_(temp,1);//需要采用循环左移,扫描下一行(不然会导致出现很多个0,低位补0)
	}
}

//自己定义楼层显示函数
void display(uchar i){
	//显示高位
	P0=digit[i/10];
	//显示低位
	P2=digit[i%10];
	if(future_keyval==previous_keyval){
			//亮(高位置0)
			P0=P0&0x7F;
	}else{
			//不亮(高位置1)
			P0=P0|0x80;
	}
	Delay(150);//延时
}

电梯移动的时候

电梯停止的时候

 

总之目前实现的功能就是数码管的显示,以前就是按钮点击就是单纯显示那个数字,现在是会将沿途的数字也一起显示,但是没有这么智能,如果有多个按下的时候,比如我现在在一层,先按下了十六,然后按下了八,他不会停在第八层,这显然是不符合逻辑的,其次就是按下电梯还有内部按下和外部按下,这个我也没有区分。总之实验远远没有达到要求,老师也没有给参考的原理图,我也不太懂他要干嘛,所以暂时就这样了。 

总结

这次的实验比上次明显难很多,上次把程序稍微修改一下就行了,现在的话还需要对原理图进行添加器件。

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

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

相关文章

中间件安全:Apache 目录穿透.(CVE-2021-41773)

中间件安全&#xff1a;Apache 目录穿透.&#xff08;CVE-2021-41773&#xff09; Apache 的 2.4.49、2.4.50 版本 对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c…

微服务调用链路追踪

概述 本文介绍微服务调用链路追踪&#xff0c;涉及技术有&#xff1a;sleuth和zipkin。sleuth负责追踪调用链路数据&#xff0c;zipkin负责调用链路数据可视化展现。 本文的操作是在 服务网关实践 的基础上进行。 环境说明 jdk1.8 maven3.6.3 mysql8 spring cloud2021.0.8 …

【开源】基于Vue.js的独居老人物资配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4.2 新增物资4.3 查询物资4.4 查询物资配送4.5 新增物资配送 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的独居老人物资配送系统&#xff0c;包含了社区档案、…

Node.js之TCP(net)

Hi I’m Shendi Node.js之TCP&#xff08;net&#xff09; 最近使用Nodejs编写程序&#xff0c;需要用到自己编写的分布式工具&#xff0c;于是需要将Java版的用NodeJs重新写一遍&#xff0c;需要使用到TCP通信&#xff0c;于是在这里记录下Node.js TCP 的使用方法 依赖 需要使…

LRU最近最少使用算法

LRU(LeastRecentlyUsed)“最近最少使用”算法&#xff1a; 1.当缓存空间已满耗用时&#xff0c;淘汰最近最少使用数据的缓存对象以释放更多的缓存空间(用于历史缓存对象的维护)。 2. 哈希表:快速查找缓存对象&#xff1b;双向链表:维护 历史数据所在的节点顺序。 步骤&#xff…

T10 数据增强

文章目录 一、准备环境和数据1.环境2. 数据 二、数据增强&#xff08;增加数据集中样本的多样性&#xff09;三、将增强后的数据添加到模型中四、开始训练五、自定义增强函数六、一些增强函数 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…

CSS的选择器(一篇文章齐全)

目录 Day26&#xff1a;CSS的选择器 1、CSS的引入方式 2、CSS的选择器 2.1 基本选择器​编辑 2.2 组合选择器 2.3 属性选择器 2.4 伪类选择器 2.5 样式继承 2.6 选择器优先级 3、CSS的属性操作 3.1 文本属性 3.2 背景属性 3.3 边框属性 3.4 列表属性 3.5 dispal…

Vue3+Vite实现工程化,事件绑定以及修饰符

我们可以使用v-on来监听DOM事件&#xff0c;并在事件触发时执行对应的Vue的Javascript代码。 用法&#xff1a;v-on:click "handler" 或简写为 click "handler"vue中的事件名原生事件名去掉 on 前缀 如:onClick --> clickhandler的值可以是方法事件…

Rust开发——切片(slice)类型

1、什么是切片 在 Rust 中&#xff0c;切片&#xff08;slice&#xff09;是一种基本类型和序列类型。在 Rust 官方文档中&#xff0c;切片被定义为“对连续序列的动态大小视图”。 但在rust的Github 源码中切片被定义如下&#xff1a; 切片是对一块内存的视图&#xff0c;表…

系列十一、你平时工作用过的JVM常用基本配置参数有哪些?

一、常用参数 1.1、-Xms 功能&#xff1a;初始内存大小&#xff0c;默认为物理内存的1/64&#xff0c;等价于 -XX:InitialHeapSize 1.2、-Xmx 功能&#xff1a;最大分配内存&#xff0c;默认为物理内存的1/4&#xff0c;等价于 -XX:MaxHeapSize 1.3、-Xss 功能&#xff1a;设置…

树,二叉树,二叉树遍历,哈夫曼树(详解+刷题)

&#x1f442; 后街男孩经典之精选 - 歌单 - 网易云音乐 &#x1f442; 年轮&#xff08;电视剧《花千骨》男声版插曲&#xff09; - 汪苏泷 - 单曲 - 网易云音乐 目录 &#x1f33c;5.1 -- 树 &#x1f33c;5.2 -- 二叉树 1&#xff0c;性质 2&#xff0c;存储 3&#x…

RTMP协议和源码解析

一、背景 实时消息传输协议&#xff08;Real-Time Messaging Protocol&#xff09;是目前直播的主要协议&#xff0c;是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议。RTMP协议是目前各大云厂商直线直播业务所公用的基本直播推拉流协议&a…

02 elementplus前端增删改查【小白入门SpringBoot+Vue3】

视频教程来源于 B站青戈 https://www.bilibili.com/video/BV1H14y1S7YV 只用elementplus&#xff0c;学点增删改查&#xff0c;还没有于后端连接起来&#xff0c;具体在下一篇 搭建一个小页面&#xff0c;显示数据 补充&#xff1a;webstorm格式化代码&#xff0c;修改了快捷…

二叉树oj题集(LeetCode)

100. 相同的树 关于树的递归问题&#xff0c;永远考虑两方面&#xff1a;返回条件和子问题 先考虑返回条件&#xff0c;如果当前的根节点不相同&#xff0c;那就返回false&#xff08;注意&#xff0c;不要判断相等时返回什么&#xff0c;因为当前相等并不能说明后面节点相等…

记录:RK3568显示异常。

最近调一个RK3568的新板子&#xff0c;板子其它接口功能都调试ok。可唯独在适配显示时发现&#xff0c;HDMI和MIPI显示均出现异常。当系统启动要进入桌面时候内核就开始报错。 因为这套源码之前在其它的板子上适配过&#xff0c;所以第一反应就是硬件问题或者是那个电压没配置…

5 redis的GEO操作

一、GEO Redis 3.2版本提供了GEO(地理信息定位)功能&#xff0c;支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。 有效纬度从-85.05112878度到85.05112878度 注意&#xff1a;当坐标位置超出上述指定范围时&#xff0c;将会返回一个错误。 …

音视频技术在手机上的应用与挑战

// 编者按&#xff1a;随着手机相机功能日益强大&#xff0c;4k&#xff0c;8k&#xff0c;各类特色短视频的拍摄&#xff0c;编辑、播放需求日益增长&#xff0c;短视频应用的火爆也对当前的手机音视频技术提出了更高的要求&#xff0c;如何更好地提高用户体验成为了行业共同…

Linux——编译器gcc/g++、调试器gdb以及自动化构建工具makefilemake详解

编译器—gcc/g、调试器—gdb以及自动化构建工具—makefile&&make 文章目录 编译器—gcc/g、调试器—gdb以及自动化构建工具—makefile&&make1. 编译器——gcc/g1.1 生成可执行文件与修改默认可执行文件1.2 程序的翻译过程以及对应的gcc选项1.2.1 预处理 gcc -E…

VMware Workstation 与 Device/Credential Guard 不兼容 解决办法

问题描述 问题描述&#xff1a; VMware 启动虚拟机会报错。无法运行。 错误信息&#xff1a;VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 原因分析&#xff1a; 通常原因是 Window 系统开启了 内置的Hyper-V 虚拟机。 解决方案&…

C++模拟实现——红黑树封装set和map

一、红黑树迭代器的实现 基本的框架和实现链表的迭代器思路是一样的&#xff0c;都是对指针进行封装处理&#xff0c;然后实现一些基本的运算符重载&#xff0c;最重要的是operator&#xff0c;需要不递归的实现走中序的规则&#xff0c;这里只实现那最核心的几个基本功能&…