单片机14-17

news2024/11/15 23:58:34

目录

LCD1602

LCD1602液晶显示屏

直流电机驱动(PWM)

LED呼吸灯

直流电机调速

 AD/DA(SPI通信)

AD模数转换

DA数模转换

红外遥控(外部中断)

红外遥控

红外遥控电机调速


LCD1602

LCD1602液晶显示屏

LCD1602.c

#include <REGX52.H>
#include "intrins.h"

sbit LCD_RS = P2^6;//引脚定义
sbit LCD_WR = P2^5;
sbit LCD_EN = P2^7;

#define LCD_DataPort 	P0//寄存器定义,define不要使用分号

void LCD_Delay()		//@11.0592MHz,2ms
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j) ;
	} while (--i);
}


/**
  * @brief  写指令
  * @param  Command	指令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)//写指令
{
	LCD_RS = 0;//1为数据,0为指令
	LCD_WR = 0;//1为读,0为写
	LCD_DataPort = Command;//放入指令
	LCD_EN = 1;//使能
	LCD_Delay();//延时一毫秒
	LCD_EN = 0;//结束使能
	LCD_Delay();
}

/**
  * @brief  写数据
  * @param  Data	数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)//写数据
{
	LCD_RS = 1;//1为数据,0为指令
	LCD_WR = 0;//1为读,0为写
	LCD_DataPort = Data;//放入数据
	LCD_EN = 1;//使能
	LCD_Delay();//延时一毫秒
	LCD_EN = 0;//结束使能
	LCD_Delay();
}

/**
  * @brief  初始化显示屏
  * @param  无
  * @retval 无
  */
void LCD_Init(void) 
{
	LCD_WriteCommand(0x38);//八位数据,两行显示,5*7点阵
	LCD_WriteCommand(0x0C);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//清屏
}

/**
  * @brief  移动光标到目标位置
  * @param  Line行	Column列
  * @retval	无 
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)//设置光标位置
{
	if(Line == 1)
	{
		LCD_WriteCommand(0x80|(Column - 1));//如果是第一行,那么实际地址即为列-1,
		//并设置光标位置,为什么是0x80,地址设置DDRAM
	}
	else
	{
		LCD_WriteCommand(0x80|(Column - 1) + 0x40);//如果是第二行,则进行偏移0x40即为实际地址
		//并设置光标位置
	}
}

/**
  * @brief  显示字符
  * @param  Line	行	
	* @param 	Column	列	
	* @param	Char	显示的字符	
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);//写入数据
}

/**
  * @brief  显示字符串
  * @param  Line	行	
	* @param 	Column	列	
	* @param	String	显示的字符串	
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column, unsigned char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i = 0;String[i] != '\0';i++)//遍历字符串String
	{
		LCD_WriteData(String[i]);//写入数据
	}
}

int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result = 1;
	for( i=0;i<Y;i++)
	{
		Result *= X;//X^Y
	}
	return Result;
}

/**
  * @brief  显示无符号数字
  * @param  Line	行	
	* @param 	Column	列	
	* @param	Num	显示的无符号数字	
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Len)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Len ; i>0 ;i--)
	{
		//LCD_WriteData(0x30 + Num / LCD_Pow(10,i-1)%10);	//获取各位数值并写入显示屏
		LCD_WriteData('0' + Num / LCD_Pow(10,i-1)%10);
		//或者转化为ascii码
	}
}

/**
  * @brief  显示有符号数字
  * @param  Line	行	
	* @param 	Column	列	
	* @param	Num	显示的有符号数字	
  * @retval 无
  */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Num,unsigned char Len)
{
	unsigned char i;
	unsigned int Num1;
	LCD_SetCursor(Line,Column);
	if(Num >= 0 )
	{
		LCD_WriteData('+');
		Num1 = Num;
	}
	else{
		LCD_WriteData('-');
		Num1 = -Num;
	}
	for(i=Len ; i>0 ;i--)
	{
		//LCD_WriteData(0x30 + Num / LCD_Pow(10,i-1)%10);	//获取各位数值并写入显示屏
		LCD_WriteData('0' + Num1 / LCD_Pow(10,i-1)%10);
		//或者转化为ascii码
	}
}

/**
  * @brief  显示十六进制数字
  * @param  Line	行	
	* @param 	Column	列	
	* @param	Num	显示的十六进制数字	
  * @retval 无
  */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Len)
{
	unsigned char i;
	unsigned char SingleNum;
	LCD_SetCursor(Line,Column);
	for(i=Len ; i>0 ;i--)
	{
		SingleNum = Num / LCD_Pow(16,i-1)%16;
		if(SingleNum < 10){
				LCD_WriteData('0' + SingleNum);
			//获取各位数值并写入显示屏
		}
		else
		{
				LCD_WriteData('A' + SingleNum - 10);//修改偏移量
		}
	}
}

/**
  * @brief  显示二进制数字
  * @param  Line	行	
	* @param 	Column	列	
	* @param	Num	显示的二进制数字	
  * @retval 无
  */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Len)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Len ; i>0 ;i--)
	{
		LCD_WriteData('0' + Num / LCD_Pow(2,i-1)%2);
	} 
}
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"

void main(){
		LCD_Init();
	LCD_ShowChar(1,1,'A');//显示字符A
	LCD_ShowString(1,3,"Hello");//显示字符串
	LCD_ShowNum(1,9,66,2);//显示无符号数字
	LCD_ShowSignedNum(1,12,-66,2);//显示有符号数字
	LCD_ShowHexNum(2,1,0xA5,2);//显示十六进制
	LCD_ShowBinNum(2,4,0xA5,8);//显示二进制
	LCD_ShowChar(2,13,0xDF);//显示度数符号
	LCD_ShowChar(2,14,'C');//显示字符C
	
	LCD_ShowString(1,16,"Welcome to China!");
	while( 1 ){
		LCD_WriteCommand(0x18);//流动字幕(指令集)
		Delay(500);
	}

}

直流电机驱动(PWM)

LED呼吸灯

main.c

#include <REGX52.H>

sbit LED = P2^0;

void Delay(unsigned int t)
{
	while(t--);
}

void main(){

	unsigned char Time,i;
	while( 1 ){
		
		for(Time = 0; Time < 100;Time++)
		{
			for(i = 0; i < 20;i++)
			{
				LED = 0;
				Delay(Time);
				LED = 1;
				Delay(100 - Time);
			}
			
		}
		for(Time = 100; Time > 0;Time--)
		{
			for(i = 0; i < 20;i++)
			{
				LED = 0;
				Delay(Time);
				LED = 1;
				Delay(100 - Time);
			}
			
		}
		
		
	}

}
直流电机调速

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Timer0.h"

unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
sbit Motor = P1^0;//ULN2003D

void main(){
	Timer0Init();
	//Compare值看自己如何设置,主要看与之比较后你想输出高/低电平,
    //这里是小于输出高电平
	while( 1 ){
		KeyNum = Key();
		if(KeyNum == 1)
		{
			Speed++;
			Speed %= 4;//重置为0
			if(Speed==0){Compare=0;}
			if(Speed==1){Compare=50;}
			if(Speed==2){Compare=75;}
			if(Speed==3){Compare=100;}
		}
		Nixie(1,Speed);
	}

}

void Timer0_Routine() interrupt 1{
	
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
//100us定时器

	Counter++;
	Counter %= 100;//将Counter刷新为0
	
	if(Counter < Compare)
	{
		Motor = 1;//高电平转
	}else
	{
		Motor = 0;
	}
}

 AD/DA(SPI通信)

AD模数转换

ET2046.c

#include <REGX52.H>
#include "Delay.h"

sbit ET2046_CS = P3^5;
sbit ET2046_DCLK = P3^6;
sbit ET2046_DIN = P3^4;
sbit ET2046_DOUT = P3^7;

/**
  * @brief  相当于当过电阻变化,来输出一些数据
  * @param  Command	控制字
  * @retval ADValue	读取到的数据
  */
unsigned int ET2046_ReadAD(unsigned char Command)//控制字
{
	unsigned char i;
	unsigned int ADValue = 0;
	ET2046_DCLK = 0;
	ET2046_CS = 0;//拉低进入时序
	
	for(i = 0; i<8 ; i++)//发送一个字节
	{
		ET2046_DIN = Command & (0x80 >> i);//获得最高位并将其放入DIN
		ET2046_DCLK = 1;
		ET2046_DCLK = 0;
	}
	for(i = 0; i < 16;i++)//读取两个字节长度
	{
		ET2046_DCLK = 1;
		ET2046_DCLK = 0;
		if(ET2046_DOUT)
		{
			ADValue |= (0x8000>>i);//提前给三位
		}
		Delay(50);
	}
		
	ET2046_CS = 1;//结束时序
	if(Command & 0x08)//查看为什么模式,若得出为1,则是12位。0则为8位
	{
		return ADValue>>8;
	}
	else{
		return ADValue>>4;
	}
}

ET2046.h

#ifndef __ET2046_H__
#define __ET2046_H__

#define ET2046_XP_8				0x9C//0x8C
#define ET2046_YP_8				0xDC
#define ET2046_VBAT_8			0xAC
#define ET2046_AUX_8			0xEC


#define ET2046_XP_12				0x94//0x84
#define ET2046_YP_12				0xD4
#define ET2046_VBAT_12			0xA4
#define ET2046_AUX_12				0xE4

	unsigned int ET2046_ReadAD(unsigned char Command);
#endif

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "ET2046.h"

unsigned int ADValue;

void main(){
		LCD_Init();
	LCD_ShowString(1,1,"ADJ  NTC  RG");
	
	while( 1 ){
		ADValue = ET2046_ReadAD(ET2046_XP_8);//XP
		LCD_ShowNum(2,1,ADValue,3);
		ADValue = ET2046_ReadAD(ET2046_YP_8);//YP
		LCD_ShowNum(2,6,ADValue,3);
		ADValue = ET2046_ReadAD(ET2046_VBAT_8);//
		LCD_ShowNum(2,11,ADValue,3);
		Delay(10);
	}

}
DA数模转换

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Timer0.h"

unsigned char Counter,Compare;

sbit DA = P2^1;//DA

unsigned char i;
void main(){
	Timer0Init();
	//Compare值越小LED越暗
	while( 1 ){
		
		for(i = 0;i < 100;i++)
		{
			Compare = i;
			Delay(10);
		}
		for(i = 100;i > 0;i--)
		{
			Compare = i;
			Delay(10);
		}
	}

}

void Timer0_Routine() interrupt 1{
	
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值

	Counter++;
	Counter %= 100;//将Counter刷新为0
	
	if(Counter < Compare)
	{
		DA = 1;
	}else
	{
		DA = 0;
	}
}

红外遥控(外部中断)

红外遥控

Int0.c

#include <REGX52.H>

/**
  * @brief  外部中断0初始化
  * @param  无
  * @retval 无
  */
void Int0_Init(void)
{
	IT0 = 1;//1下降沿触发,0低电平触发
	IE0 = 0;//中断标志
	EX0 = 1;//打开中断
	EA = 1;//允许所有中断
	PX0	=	1;//中断优先级
}
	
/*外部中断0函数模板
void Int0_Routine(void) interrupt 0
{
	Num++;
	
}	
	

*/

Timer0.c

#include <REGX52.H>

/**
  * @brief  定时器0初始化
  * @param  无
  * @retval 无
  */
void Timer0_Init(void)		//1微秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0开始计时
}

/**
  * @brief  定时器0设置计数器值
  * @param  Value,要设置的计数器值,范围:0~65535
  * @retval 无
  */
void Timer0_SetCounter(unsigned int Value)
{
	TH0 = Value / 256;
	TL0 = Value % 256;
}

/**
  * @brief  定时器0获取计数器值
  * @param  无
  * @retval 计数器值,范围:0~65535
  */
unsigned int Timer0_GetCounter(void)
{
	return (TH0 << 8 )| TL0;
}

/**
  * @brief  定时器0启动停止控制
  * @param  Flag 启动停止标志,1为启动,0为停止
  * @retval 无
  */
void Timer0_Run(unsigned char Flag)
{
	TR0 = Flag;
}

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"

unsigned char Num;
unsigned char Address;
unsigned char Command;

void main(){
	LCD_Init();
	LCD_ShowString(1,1,"ADDR   CMD   NUM");
	LCD_ShowString(2,1,"00     00    000");
	
	IR_Init();
	
	while( 1 ){
		if(IR_GetDataFlag() || IR_GetRepeatFlag())//如果收到数据帧或者连续发送
		{
			Address = IR_GetAddress();//获取遥控器地址码
			Command = IR_GetCommand();//获取遥控器命令码
			
			LCD_ShowHexNum(2,1,Address,2);//显示遥控器地址码
			LCD_ShowHexNum(2,8,Command,2);//显示遥控器命令码
			
			if(Command == IR_VOL_MINUS)//如果遥控器VOL-按键按下
			{
				Num --;
			}
			if(Command ==IR_VOL_ADD)//如果遥控器VOL+按键按下
			{
				Num ++;
			}
			LCD_ShowNum(2,14,Num,3);
		}
	}

}
红外遥控电机调速

Timer1.c

#include <REGX52.H>

/**
  * @brief  定时器1初始化,100微秒
  * @param  无
  * @retval 无
  */
void Timer1Init(void)		//100微秒@11.0592MHz
{

	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		//设置定时器模式
	TL1 = 0xA4;		//设置定时初值
	TH1 = 0xFF;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	
	ET1 = 1;	
	EA = 1;
	PT1 = 0;
}

/*	定时器中断函数模板
void Timer1_Routine() interrupt 3{
	static unsigned int T1Count;
	
	TL0 = 0xA4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	T1Count ++;
	if( T1Count >= 1000 ){
		T1Count = 0;
	}

}
*/

Timer0.c

#include <REGX52.H>

/**
  * @brief  定时器0初始化
  * @param  无
  * @retval 无
  */
void Timer0_Init(void)		//1微秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0开始计时
}

/**
  * @brief  定时器0设置计数器值
  * @param  Value,要设置的计数器值,范围:0~65535
  * @retval 无
  */
void Timer0_SetCounter(unsigned int Value)
{
	TH0 = Value / 256;
	TL0 = Value % 256;
}

/**
  * @brief  定时器0获取计数器值
  * @param  无
  * @retval 计数器值,范围:0~65535
  */
unsigned int Timer0_GetCounter(void)
{
	return (TH0 << 8 )| TL0;
}

/**
  * @brief  定时器0启动停止控制
  * @param  Flag 启动停止标志,1为启动,0为停止
  * @retval 无
  */
void Timer0_Run(unsigned char Flag)
{
	TR0 = Flag;
}

Motor.c

#include <REGX52.H>
#include "Timer1.h"

sbit Motor = P1^0;//ULN2003D
unsigned char Counter,Compare;

/**
  * @brief  电机初始化
  * @param  无
  * @retval 无
  */
void Motor_Init()
{
	Timer1Init();
}

/**
  * @brief  电机设置速度
  * @param  Speed 要设置的速度,范围0~100
  * @retval 无
  */
void Motor_SetSpeed(unsigned char Speed)
{
	Compare = Speed;
}

void Timer1_Routine() interrupt 3{
	
	TL1 = 0xA4;		//设置定时初值
	TH1 = 0xFF;		//设置定时初值

	Counter++;
	Counter %= 100;//将Counter刷新为0
	
	if(Counter < Compare)
	{
		Motor = 1;//高电平转
	}else
	{
		Motor = 0;
	}
}

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Motor.h"
#include "IR.h"


unsigned char Command,Speed;


void main(){
	Motor_Init();
	IR_Init();
	while( 1 ){
		
		if(IR_GetDataFlag())//如果收到数据帧
		{
			Command = IR_GetCommand();//获取遥控器命令码
			
			if(Command == IR_0){Speed = 0;}	//根据遥控器命令码设置速度
			if(Command == IR_1){Speed = 1;}
			if(Command == IR_2){Speed = 2;}
			if(Command == IR_3){Speed = 3;}
			
			if(Speed==0){Motor_SetSpeed(0);}//速度输出
			if(Speed==1){Motor_SetSpeed(50);}
			if(Speed==2){Motor_SetSpeed(75);}
			if(Speed==3){Motor_SetSpeed(100);}
		}
		Nixie(1,Speed);
	}

}

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

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

相关文章

智能语音识别源码系统+语义理解+对话管理+语音合成 带完整的搭建教程

人工智能技术的不断发展&#xff0c;智能语音识别技术逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;目前市场上的智能语音识别产品大多存在一定的局限性&#xff0c;如识别率不高、功能单一等。为了解决这些问题&#xff0c;罗峰给大家分享一款基于智能语音…

pytorch学习笔记(十一)

优化器学习 把搭建好的模型拿来训练&#xff0c;得到最优的参数。 import torch.optim import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoaderdataset torchvision.datas…

【Python】采用OpenCV和Flask来进行网络图像推流的低延迟高刷FPS方法(项目模板)

【Python】采用OpenCV和Flask来进行网络图像推流的低延迟高刷FPS方法&#xff08;项目模板&#xff09; gitee项目模板&#xff1a; 网络图像推流项目模板&#xff08;采用OpenCV和Flask来进行网络图像推流的低延迟高刷FPS方法&#xff09; 前文&#xff1a; 【最简改进】基于…

深入浅出 diffusion(2):pytorch 实现 diffusion 加噪过程

我在上篇博客深入浅出 diffusion&#xff08;1&#xff09;&#xff1a;白话 diffusion 原理&#xff08;无公式&#xff09;中介绍了 diffusion 的一些基本原理&#xff0c;其中谈到了 diffusion 的加噪过程&#xff0c;本文用pytorch 实现下到底是怎么加噪的。 import torch…

最小覆盖子串(Leetcode76)

例题&#xff1a; 分析: 比如现在有字符串&#xff08;s&#xff09;&#xff0c;s "ADOBECODEBANC", 给出目标字符串 t "ABC", 题目就是要从原始字符串&#xff08;s&#xff09;中找到一个子串&#xff08;res&#xff09;可以覆盖目标字符串 t &…

UE使用C++添加FGameplayTag(游戏标签)

首先Ue会有一个UGameplayTagsManager类型的对象 游戏标签管理器(全局中就有一个) 我们直接通过 UGameplayTagsManager::Get()静态函数拿到 全局唯一的游戏标签管理器的实例 返回的是个左值引用 之后通过调用 AddNativeGameplayTag()函数就可添加游戏标签了 就这么简单 第…

Java+Spring Cloud +Vue+UniApp微服务智慧工地云平台源码

目录 智慧工地云平台功能 【劳务工种】所属工种有哪些&#xff1f; 1.管理人员 2.信息采集 3.证件管理 4.考勤管理 5.考勤明细 6.工资管理 7.现场统计 8.WIFI教育 9.课程库管理 10.工种管理 11.分包商管理 12.班组管理 13.项目管理 智慧工地管理平台是以物联网、…

算法题 — 删除排序数组中的重复项

问题&#xff1a;一个有序数组 nums&#xff0c;原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;返回删除后数组的新长度。 注&#xff1a;不能使用额外的数组空间&#xff0c;必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 例&#xff…

【考研结束了,不管上不上岸,我建议你先....】

*** 考研结束&#xff0c;一定要做这几件事&#xff01; 又一年考研季的落幕&#xff0c;经历了漫长考研岁月的学子们&#xff0c;终于迎来了期盼已久的解脱。参加考研的同学们必须都顺利上岸。 然而对于技术类专业的考生而言&#xff0c;新的征程与机遇才刚刚启航。 此时此刻…

专业144总分410+华南理工大学811信号与系统考研经验华工电子信息与通信

今年专业811信号与系统144&#xff08;二战&#xff0c;感谢信息通信Jenny老师专业课对我的巨大提高&#xff0c;第一年自己复习只考了90&#xff0c;主要栽专业课和数学&#xff09;总分410含泪&#xff08;二战的同学都知道苦&#xff0c;成功来之不易&#xff09;考上华南理…

InterSystem IRIS BS BP BO配置

应用&#xff1a;根据请求的BS&#xff0c;通过BP&#xff0c;到BO的处理&#xff0c;集成平台BO获取数据并推送给指定第三方 操作步骤&#xff1a; 一、事前准备&#xff1a; 创建交互服务前提前将SQL网关创建和连接好。需记录网关连接名称&#xff0c;配置在BS设置的DSN处…

HMI-Board以太网数据监视器(二)MQTT和LVGL

E ∫ d E ∫ k d q r 2 k L ∫ d q r 2 E \int dE \int \frac{kdq}{r^2} \frac{k}{L} \int \frac{dq}{r^2} E∫dE∫r2kdq​Lk​∫r2dq​ E Q 2 π ϵ L 2 E \frac{Q}{2\pi\epsilon L^2} E2πϵL2Q​ Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n…

实习日志5

活字格图片上传功能&#xff08;批量&#xff09; 这个报错真的恶心&#xff0c;又看不了他服务器源码&#xff0c;接口文档又是错的 活字格V9获取图片失败bug&#xff0c;报错404-CSDN博客 代码BUG记录&#xff1a; 问题&#xff1a;上传多个文件的base64编码被最后一个文…

eclipse启动Java服务及注意事项

1、导入项目 选择file——》import…——》Generate——》Exiting Projects into Workspace——》选择要导入的项目 2、添加tomcat 1&#xff09;点击Serves——》No servers are available. Click this link to create a new server… 2&#xff09;点击“Add…” 3&…

【Servlet】如何编写第一个Servlet程序

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; Servlet是Java编写的服务器端…

STM32第一节——初识STM32

1 硬件介绍 1.1 硬件平台 配套硬件&#xff1a;以野火的STM32 F1霸道开发板为平台&#xff0c;若用的是别的开发板&#xff0c;可自己进行移植。 1.2 什么是STM32 STM32是由意法半导体&#xff08;STMicroelectronics&#xff09;公司推出的一系列32位的ARM Cortex-M微控制…

CMIP6数据驱动WRF和WRF-Chem模式、WRF-Chem的未来大气污染变化模拟

目录 一、CMIP6数据及运行平台建设 二、CMIP6数据驱动WRF和WRF-Chem模式 三、WRF-Chem的未来情景模拟 更多应用 对模式比较计划的全球气候预估数据进行动力降尺度&#xff0c;结合预估的未来气候变化&#xff0c;运用区域气候模式和气候-化学耦合模式&#xff0c;实现对未来…

【数据结构】数据结构初识

前言&#xff1a; 数据结构是计算存储&#xff0c;组织数据的方式。数据结构是指相互间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 Data Structure Vi…

day2 C++

封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostre…

笔记--写代码好习惯

原文&#xff1a;写代码有这16个好习惯&#xff0c;可以减少80%非业务的bug