【单片机基础】I2C通信-基于STC89C52RC

news2025/7/6 22:22:46

文章目录

    • 1、IIC总线结构
    • 2、IIC总线传输协议
    • 3、完成工程代码

1、IIC总线结构

  1. IIC总线是philips公司在八十年代初推出的一种串行、半双工总线。主要用于近距离、低速的芯片之间通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据一根时钟线SCL用于通信双方时钟同步。
  2. IIC总线硬件简单,成本较低,因此在各个领域得到广泛的应用。
  3. IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机。
  4. 主机有权发起和结束一次通信,而从机只能被主机呼叫。
  5. 当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能防止错误产生。
  6. 每个连接IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为8. 主机也可以作为从机(同一时刻只能有一个从机),总线上的器件增加和删除不影响其他器件正常工作。
  7. IIC总线在通信时总线上发送数据的器件位发送器,接收数据的器件位接收器
  8. 理论上一条IIC总线可以挂载127个从器件(由IIC地址觉定,8位地址减去1位广播位,2^7=128,但是0x00不用所以就是127个器件)

IIC完整通信过程
1、主机发送起始信号启动总线
2、主机发送一个字节数据指明从机地址后续字节传送的方向
3、被寻址的从机发送应答信号回应主机
4、发生器发送一个字节数据
(循环步骤4-5)
n、通信完成后发送停止信号释放总线

IIC总线寻址方式:
IIC总线上发送数据是广义的,既包括地址,又包括真正的数据
主机发送起始信号必须先发送一个字节数据,该数据的高7位为从机地址,最低位表示后续字节传送方向,‘0’表示主机发送数据,‘1’表示主机接收数据
总线上所有的从机接收的该字节数据后都将这7位地址与自己地址进行比较,如果相同,则认为自己被主机寻址,然后根据第八位将自己定义为发生器还是接收器。

2、IIC总线传输协议

  1. 数据位的有效性规定:SCL为高电平期间,数据线上的数据必须保持稳定,只有SCL信号为低电平期间,SDA状态才允许变化。
    请添加图片描述
  2. IIC的起始和终止信号
    -SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平变化表示终止信号。
    起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后,总线被认为再次处于空闲状态。
    请添加图片描述
    模拟IIC参考代码
//I2C总线起始信号
void I2cStart(void)
{
	SCL = 1;
	SDA = 1;
	I2cDelay_5us();//状态保持5us
	SDA = 0;
	I2cDelay_5us();//状态保持5us
}

//I2C总线停止信号
void I2cStop(void)
{
	SCL = 0;
	SDA = 0;
	SCL = 1;
	I2cDelay_5us();//状态保持5us
	SDA = 1;
	I2cDelay_5us();//状态保持5us
}
  1. 传输数据
    发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,每个字节后必须更上一个响应位。
    请添加图片描述
    主机在发送数据时,都需要读取从机应答位,当从机空闲可以接受该字节数据时,从机发出应答(低电平),当从机正忙于其他工作处理来不及接受时,从机发出非应答(高电平),主机可以通过从机发出的应答位来判断从机是否成功接收数据。
    当主机接收数据接收到最后一个数据字节后,必须向从机发出一个结束传送的信号,这个信号是由从机的“非应答”来实现,然后释放SDA线,以允许主机产生终止信号。
  2. 数据帧格式
    在IIC总线上传送数据信号是广义的,既包括地址信号,有包括真实数据。
    在起始信号后必须传送一个从机地址(7位),第八位数数据时传送方向位(R/T),用‘0’表示主机发送数据,‘1’表示主机接收数据。每次数据传送总是由主机产生终止信号。
    若主机希望继续占用总线进行新的数据传送,则可以不产生终止,马上再次发送起始信号对另一从机进行寻址。

模拟IIC参考代码

/********************************
 *函数名称:ReadACK(void)
 *函数输入:无
 *函数返回:1非应答,0应答
 *函数说明:I2C总线读从机应答信号
 ********************************/
bit ReadACK(void)
{
	SCL = 0;//拉低时钟总线,允许从机控制SDA
	SCL = 1;//拉高,读SDA
	I2cDelay_5us();
	if(SDA)//非应答
	{
		SCL = 0;
		return(1);//返回1
	}
	else
	{
		SCL = 0;
		return(0);//返回0
	}
}

/***************************************
 *函数名称:SendACK(bit i)
 *函数输入:1主机发送非应答,0发送应答
 *函数返回:无
 *函数说明:主机发送应答信号
 ***************************************/
void SendACK(bit i)
{
	SCL = 0;	//拉低时钟总线,允许主机控制SDA
	if(i)		//发送非应答
		SDA = 1;
	else
		SDA = 0;
	SCL = 1;	//拉高总线,让从机读SDA
	I2cDelay_5us();
	SCL = 0;	//拉低时钟总线,允许SDA释放
	SDA = 1;	//释放数据总线
}

/***************************************
 *函数名称:I2cSendByte(uchar DAT)
 *函数输入:DAT需要发送的数据
 *函数返回:无
 *函数说明:I2C发送一个字节数据
 ***************************************/
void I2cSendByte(uchar DAT)
{
	uchar i;
	for(i=0; i<8; i++)	//分别写8次,每次写1位
	{
		SCL = 0;		//拉低时钟总线,允许SDA变化
		if(DAT & 0x80)	//先写数据最高位
			SDA = 1;  	//写1
		else
			SDA = 0;  	//写0
		SCL = 1;	  	//拉高时钟,让从机读SDA
		DAT <<= 1;	  	//为发送下一位左移1位
	}
	SCL = 0;			//拉低时钟总线,允许SDA释放
	SDA = 1;			//释放数据总线
}


/*====================================
函数	:I2cReadByte()
参数	:无
返回值	:返回读出的一字节数据
描述	:I2C总线读一字节数据
====================================*/
uchar I2cReadByte(void)
{
	uchar i, DAT;
	for(i=0; i<8; i++)//分别读8次,每次读一位
	{
		DAT <<= 1; //数据左移1位,准备接收一位
		SCL = 0;   //拉低时钟总线,允许从机控制SDA变化
		SCL = 1;   //拉高时钟总线,读取SDA上的数据
		if(SDA)
			DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0
	}
	return(DAT); //返回读出的数据
}

基于EEPROM向4单元存数据(主机向从机写数据)

/*====================================
函数	:At24c02Read(uchar ADDR)
参数	:ADDR 单元地址	0-255
返回值	:返回指定单元的数据
描述	:读AT24C02指定单元内数据
====================================*/
uchar At24c02Read(uchar ADDR)
{
	uchar DAT;
	I2cStart();//I2C起始信号
	I2cSendByte(At24c02ADDR + I2cWrite);//发送器件地址加读写方向位
	if(ReadACK())		//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	
	I2cSendByte(ADDR);//I2C发送一个字节
	ReadACK();//读从机应答
	
	
	I2cStart();//再次产生I2C起始信号
	I2cSendByte(At24c02ADDR + I2cRead);//发送器件地址加读写方向位 读
	if(ReadACK())//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	
	DAT = I2cReadByte();//读一字节
	SendACK(1);//主机发送非应答
	I2cStop(); //I2C停止信号
	return(DAT);//返回读出数据
			
}

主函数调用情况

	//写数据
	At24c02Write(4,'1');//给第1单元写入数据'1'
	Delay_ms(1);//延时一段时间等待AT24C02处理

运行示波器解码图
请添加图片描述

A0表示AT24C02的硬件地址
EOT表示ASCLL表结束字符,十进制“04”
1表示存储‘1’这个字符

由此可以主机向从机发送数据,格式如下:
请添加图片描述

————————
读出EEPROM代码部分

/*====================================
函数	:At24c02Read(uchar ADDR)
参数	:ADDR 单元地址	0-255
返回值	:返回指定单元的数据
描述	:读AT24C02指定单元内数据
====================================*/
uchar At24c02Read(uchar ADDR)
{
	uchar DAT;
	I2cStart();//I2C起始信号
	I2cSendByte(At24c02ADDR + I2cWrite);//发送器件地址加读写方向位
	if(ReadACK())		//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	
	I2cSendByte(ADDR);//I2C发送一个字节
	ReadACK();//读从机应答
	
	
	I2cStart();//再次产生I2C起始信号
	I2cSendByte(At24c02ADDR + I2cRead);//发送器件地址加读写方向位 读
	if(ReadACK())//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	
	DAT = I2cReadByte();//读一字节
	SendACK(1);//主机发送非应答
	I2cStop(); //I2C停止信号
	return(DAT);//返回读出数据
			
}

主函数调用情况

	//读数据
	ch = At24c02Read(4);//读出第1单元内数据送给显示变量

请添加图片描述

A0表示AT24C02的硬件地址
EOT表示ASCLL表结束字符,十进制“04”
A1表示AT24C02的硬件地址 +1 (读)
1表示读取到的数据

数据格式如下
请添加图片描述

3、完成工程代码

STC89C52RC读取EEPROM向例程串口打印结果
main.c

#include <reg52.h>
#include <intrins.h>
#include "STC89C52RC_I2C.h"

/*数据类型宏定义*/
#define uchar unsigned char
#define uint unsigned int

/*常用变量宏定义*/
#define At24c02ADDR 	0xa0		//AT24C02硬件地址

/*全局变量定义*/
bit AckFlag;	//应答标志位

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

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

void Delay_ms(uint timer)
{
	uint i;
	for(i=0; i<timer; i++)
		Delay1ms();
}

//使用定时T1工作方式2,波特率9600,晶振11.0592MHZ
//禁止接收,不启动串口中断,波特率不加倍
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x40;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    TR1 = 1;
}

//向串口发送一个字符
void putchar(char ch)
{
	SBUF = ch;
	while(!TI);TI = 0;
}

//向串口发送一段字符串
void prints(char *s)
{
	while(*s != '\0')//发送字符串,直到遇到0才结束
	{
		SBUF = *s++;
		while(!TI);
		TI = 0;
	}
}

/*====================================
函数	:At24c02Write(uchar ADDR, DAT)
参数	:ADDR 单元地址0-255,DAT 需要输入的数据0-255
返回值	:无
描述	:At24c02指定单元写入一个字节数据
====================================*/
void At24c02Write(uchar ADDR, DAT)
{
	I2cStart();								//I2C起始信号
	
	I2cSendByte(At24c02ADDR + I2cWrite);	//发送器件地址加读写方向位
	if(ReadACK()) 		//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	I2cSendByte(ADDR);	//发送储存单元地址字节
	if(ReadACK()) 		//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	I2cSendByte(DAT);	//发送一字节数据
	if(ReadACK()) 		//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	I2cStop();			//I2C停止信号
}

/*====================================
函数	:At24c02Read(uchar ADDR)
参数	:ADDR 单元地址	0-255
返回值	:返回指定单元的数据
描述	:读AT24C02指定单元内数据
====================================*/
uchar At24c02Read(uchar ADDR)
{
	uchar DAT;
	I2cStart();//I2C起始信号
	I2cSendByte(At24c02ADDR + I2cWrite);//发送器件地址加读写方向位
	if(ReadACK())		//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	
	I2cSendByte(ADDR);//I2C发送一个字节
	ReadACK();//读从机应答
	
	
	I2cStart();//再次产生I2C起始信号
	I2cSendByte(At24c02ADDR + I2cRead);//发送器件地址加读写方向位 读
	if(ReadACK())//读从机应答
		AckFlag = 1;	//NOACK
	else
		AckFlag = 0;	//ACK
	
	
	DAT = I2cReadByte();//读一字节
	SendACK(1);//主机发送非应答
	I2cStop(); //I2C停止信号
	return(DAT);//返回读出数据
			
}

void main(void)
{
	char ch;
	
	InitUART();//串口初始化
	prints("OK!\n");//串口初始化完成,向串口发送“OK”字符串
	
	//写数据
//	At24c02Write(4,'1');//给第1单元写入数据'1'
//	Delay_ms(1);//延时一段时间等待AT24C02处理
	
	
	//读数据
	ch = At24c02Read(4);//读出第1单元内数据送给显示变量
	if(AckFlag)//当从机非应答
		P1 = 0;//亮P1所有灯
	else
		P1 = 0XFF;//灭P1所有灯
	
	prints("AT24C02 data:");
	putchar(ch);
	
	while(1);
}

STC89C52RC_I2C.c

#include "STC89C52RC_I2C.h"

/*I2C硬件接口定义*/
sbit SCL = P2^1;		//I2C时钟总线
sbit SDA = P2^0;		//I2C数据总线

/**********************************
89C52RC单片机模拟IIC通信代码
***********************************/

//5us延时函数
void I2cDelay_5us(void)
{
	_nop_();
}

//I2C总线起始信号
void I2cStart(void)
{
	SCL = 1;
	SDA = 1;
	I2cDelay_5us();//状态保持5us
	SDA = 0;
	I2cDelay_5us();//状态保持5us
}

//I2C总线停止信号
void I2cStop(void)
{
	SCL = 0;
	SDA = 0;
	SCL = 1;
	I2cDelay_5us();//状态保持5us
	SDA = 1;
	I2cDelay_5us();//状态保持5us
}

/********************************
 *函数名称:ReadACK(void)
 *函数输入:无
 *函数返回:1非应答,0应答
 *函数说明:I2C总线读从机应答信号
 ********************************/
bit ReadACK(void)
{
	SCL = 0;//拉低时钟总线,允许从机控制SDA
	SCL = 1;//拉高,读SDA
	I2cDelay_5us();
	if(SDA)//非应答
	{
		SCL = 0;
		return(1);//返回1
	}
	else
	{
		SCL = 0;
		return(0);//返回0
	}
}

/***************************************
 *函数名称:SendACK(bit i)
 *函数输入:1主机发送非应答,0发送应答
 *函数返回:无
 *函数说明:主机发送应答信号
 ***************************************/
void SendACK(bit i)
{
	SCL = 0;	//拉低时钟总线,允许主机控制SDA
	if(i)		//发送非应答
		SDA = 1;
	else
		SDA = 0;
	SCL = 1;	//拉高总线,让从机读SDA
	I2cDelay_5us();
	SCL = 0;	//拉低时钟总线,允许SDA释放
	SDA = 1;	//释放数据总线
}

/***************************************
 *函数名称:I2cSendByte(uchar DAT)
 *函数输入:DAT需要发送的数据
 *函数返回:无
 *函数说明:I2C发送一个字节数据
 ***************************************/
void I2cSendByte(uchar DAT)
{
	uchar i;
	for(i=0; i<8; i++)	//分别写8次,每次写1位
	{
		SCL = 0;		//拉低时钟总线,允许SDA变化
		if(DAT & 0x80)	//先写数据最高位
			SDA = 1;  	//写1
		else
			SDA = 0;  	//写0
		SCL = 1;	  	//拉高时钟,让从机读SDA
		DAT <<= 1;	  	//为发送下一位左移1位
	}
	SCL = 0;			//拉低时钟总线,允许SDA释放
	SDA = 1;			//释放数据总线
}


/*====================================
函数	:I2cReadByte()
参数	:无
返回值	:返回读出的一字节数据
描述	:I2C总线读一字节数据
====================================*/
uchar I2cReadByte(void)
{
	uchar i, DAT;
	for(i=0; i<8; i++)//分别读8次,每次读一位
	{
		DAT <<= 1; //数据左移1位,准备接收一位
		SCL = 0;   //拉低时钟总线,允许从机控制SDA变化
		SCL = 1;   //拉高时钟总线,读取SDA上的数据
		if(SDA)
			DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0
	}
	return(DAT); //返回读出的数据
}
/*****************************************************************/

STC89C52RC_I2C.h

#ifndef __STC89C52RC_H__
#define __STC89C52RC_H__

#include <reg52.h>
#include <intrins.h>

/*数据类型宏定义*/
#define uchar unsigned char
#define uint unsigned int

/*I2C常用变量宏定义*/
#define I2cRead 		1			//I2C读方向位
#define I2cWrite 		0			//I2C写方向

//5us延时函数
extern void I2cI2cDelay_5us(void);

//I2C总线起始信号
extern void I2cStart(void);

//I2C总线停止信号
extern void I2cStop(void);

//I2C总线读从机应答信号
extern bit ReadACK(void);

//主机发送应答信号
extern void SendACK(bit i);

//I2C发送一个字节数据
extern void I2cSendByte(uchar DAT);

//I2C总线读一字节数据
extern uchar I2cReadByte(void);

#endif

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

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

相关文章

Mac 使用paralles 从零搭建hadoop集群

目录 1. 虚机的安装与配置 1.1 安装parallels 1.2 安装fedora系统 1.3 fedora的配置 1.3.1 内存和硬盘配置 1.3.2 网络配置 1.3.3 共享文件夹 1.4 虚拟机克隆 与 加载 2. 免密登录 2.1 分别查看master&#xff0c; slave01&#xff0c;slave02 的ip 2.2 查看各虚机的…

关于mpy电压采集模块的那些事儿(ads1256 ads8688 ad7606)

先来个人生碎碎念&#xff0c;越狱第三次失败了&#xff0c;而且第四次也可能失败&#xff0c;没错就是这么尴尬&#xff0c;绝对越狱的事件还有917天&#xff0c;其实比较麻木了&#xff0c;越狱成功与否都无所谓了&#xff0c;其实现在出去&#xff0c;外头的疫情&#xff0c…

【学生网页设计作业源码】基于HTML+CSS+JavaScript简单的大学生书店(13个页面) 二手书店电子商务网站模板源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

常见的数据结构基本介绍

文章目录常见的数据结构介绍栈和队列的介绍数组数据结构链表数据结构二叉树和二叉查找树平衡二叉树红黑树结构常见的数据结构介绍 数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下&#xff0c;精心选择的数据结构可以带来更…

应用ceph文件系统存储(ceph-13.2.10)

记录&#xff1a;333 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;部署ceph-13.2.10集群。应用ceph文件系统(ceph file system)&#xff1b;主要是创建ceph文件系统、客户端挂载ceph文件系统等操作。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 ceph版本&am…

JS获取音频的总时长,解决audio.duration 为 NaN || Infinity 问题

目录一、需求分析二、发现问题1.使用浏览器内置播放器<audio>无法显示时长2.获取总时长为 NaN || Infinity三、疑惑点四、解决方案一、需求分析 后端的接口中包含音频链接&#xff0c;前端需要自定义一个播放器播放音频。 二、发现问题 1.使用浏览器内置播放器<audi…

JPA 中使用 @OneToMany 、@ManyToOne 等关系映射注解

JPA 做 ORM(Object Relational Mapping&#xff0c;对象关系映射)时&#xff0c;为了开发效率&#xff0c;通常会在实体类上用 hibernate 的关系关联注解。 包括&#xff1a;OneToOne、 OneToMany 、ManyToOne 、ManyToMany 、JoinTable、以及 JoinColumn 以及 OrderBy&#xf…

汽车Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…

面向大规模队列,百万并发的多优先级消费系统设计

大规模队列的核心诉求&#xff0c;不仅需要「快」&#xff0c;还需要兼顾「公平」。01 引言 HTTP是一种常用的通信协议&#xff0c;除了常见网站访问、上传下载&#xff0c;HTTP协议还经常被用在消息推送场景上。 设想你搭建了一个电商平台&#xff0c;有很多大型商家入驻了该…

Kotlin协程Flow浅析

Kotlin协程中的Flow主要用于处理复杂的异步数据&#xff0c;以一种”流“的方式&#xff0c;从上到下依次处理&#xff0c;和RxJava的处理方式类型&#xff0c;但是比后者更加强大。 Flow基本概念 Flow中基本上有三个概念&#xff0c;即 发送方&#xff0c;处理中间层&#x…

HTML+CSS大作业 (水果之家10个网页)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

数字验证学习笔记——SystemVerilog芯片验证11 ——类的继承

一、类和继承 类的第二核心要素&#xff0c;即类的“继承”&#xff0c;继承也符合我们认识实际的观点&#xff0c;在自然界和科学界我们对世界的认识无外乎归纳法和演绎法。 归纳论证是一种由个别到一般的论证方法。它通过许多个别的事例或分论点&#xff0c;然后归纳出它们所…

17、Mybatis获取参数值的情况3(若mapper接口方法的参数为多个时,可以手动将这些参数放入map中存储)

Mybatis获取参数值的情况3&#xff08;若mapper接口方法的参数为多个时&#xff0c;可以手动将这些参数放入map中存储&#xff09; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a;

Linux系统tcp连接设置

目录net.ipv4.tcp_syn_retriesnet.ipv4.ip_local_port_rangenet.ipv4.tcp_net.core.somaxconnnet.ipv4.tcp_max_syn_backlognet.core.netdev_max_backlognet.ipv4.tcp_synack_retriesnet.ipv4.tcp_abort_on_overflownet.ipv4.tcp_syncookiesnet.ipv4.tcp_fastopennet.ipv4.tcp_…

兆易创新GD32 (四)FreeRTOS 移植 与 CMSIS OS2

可以完全参考STM32系列的方法 FreeRTOS 逛网下载 FreeRTOS源码 https://www.freertos.org/a00104.html GitHub地址 https://github.com/FreeRTOS/FreeRTOS-Kernel 下载后的FreeRTOS-Kernel复制到LIB文件夹下 在KEIL中添加文件&#xff0c;首先是公共部分 添加MDK移植文件CM4F…

含抽水蓄能电站系统的调峰经济调度研究matlab程序(粒子群算法)

含抽水蓄能电站系统的调峰经济调度研究matlab程序&#xff08;粒子群算法&#xff09; 参考文献&#xff1a;抽水蓄能电站的最佳调度方案研究 调峰电源的优化调度是促进电力系统安全稳定运行&#xff0c;实现可靠供电的要措施。因为目前我国的调峰电源严重不足&#xff0c;尤其…

【畅购商城】订单模块之收货人列表

目录 构建订单服务&#xff1a;8100 收货人列表 接口 后端实现&#xff1a;JavaBean 后端实现 前端实现 构建订单服务&#xff1a;8100 步骤一&#xff1a;构建项目&#xff0c;changgou4-service-orders 步骤二&#xff1a;修改pom.xml文件&#xff0c;添加依赖 <de…

Spring核心与设计思想

文章目录Spring 是什么&#xff1f;什么是容器&#xff1f;什么是IoC&#xff1f;传统程序开发控制反转式程序开发对比总结规律理解 Spring IoCDI 概念Spring 是什么&#xff1f; 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff…

ignite集群

ignite集群 基础知识 集群中的结点 Ignite 是一个分布式系统&#xff0c;集群是标配功能。 集群中的 节点&#xff0c;有两类&#xff1a; 服务器结点。具备完全功能的结点。 客户端结点&#xff1a;这个我没有完全理解&#xff0c;但从编程的角度&#xff0c;我初步认为这个…

Jenkins-CentOS安装jenkins

CentOS安装jenkins jenkins适配的jdk版本是17和11 第一步&#xff1a;安装jdk11 &#xff08;1&#xff09;在oracle下载jdk11 jdk-11.0.16.1_linux-x64_bin.tar,放到非root用户的家目录下 &#xff08;2&#xff09;解压&#xff0c;tar -zxvf jdk-11.0.16.1_linux-x64_bin…