STM32F4X I2C LM75

STM32F4X I2C LM75

  • I2C协议讲解
    • I2C接线
    • I2C协议波形
    • I2C起始信号
    • I2C停止信号
    • I2C应答信号
    • I2C寻址
      • I2C地址格式
    • I2C数据传输
  • LM75A
    • LM75A介绍
    • LM75A引脚说明
    • LM75A地址
    • LM75A寄存器
    • LM75A I2C协议
      • 写配置寄存器
      • 读配置寄存器
      • 写Tos和Thyst寄存器
      • 读Tos Thyst Temp寄存器
      • LM75A温度计算
  • LM75A例程
    • i2c.c
    • i2c.h
    • lm75.c
    • lm75.h
    • main.c

I2C协议是飞利浦公司在1982年发明的一种用于芯片之间通信的协议,其特点是电路硬件简单,可连接多个设备。在进行I2C通信时,只需要用到2根信号线,I2C通信可以达到几百K左右,适合低速的通信领域。

I2C协议讲解

I2C接线

I2C设备分为主机和从机,主机负责发送时钟信号,从机不发送时钟信号。I2C通信时只需要两个通信线,分别是时钟线SCL和数据线SDA。其中SCL是单向数据线,是主机发给从机,而SDA是双向数据线。因为I2C协议规定在空闲时候SCL和SDA要保持高电平,所以在电路设计时SCL和SDA要接分别接一个上拉电阻到VCC。
在这里插入图片描述

I2C协议波形

在这里插入图片描述
I2C协议的波形有如下的几个特点

  • 开始数据传输时需要发送一个起始信号
  • 结束数据传输时需要发送一个停止信号
  • I2C每次传输的位数是8位,一个字节的数据
  • 每次传输完一个数据后,在第9位需要有应答信号
  • I2C每次进行数据传输前都需要发送一个从设备地址

I2C起始信号

在I2C开始通信前,主机要先发送一个起始信号,告诉从机开始准备通信。
在这里插入图片描述
首先要先把SCL和SDA拉高,保持一段时间,然后把SDA拉低,这时从机就会检测到一个起始信号。

I2C停止信号

当主机要结束通信时,需要发送一个停止信号,告诉从机,通信结束。
在这里插入图片描述
首先要先把SCL和SDA拉低,保持一段时间,然后把SDA拉高,这时从机就会检测到一个停止信号。

I2C应答信号

I2C协议规定,每传输完一个字节的数据,都需要有一个应答信号,应答信号的作用是确认数据是否已经被对方接受到,应答信号由接收数据的设备产生,可以是主机也可以是从机。
在这里插入图片描述

在数据发送或接收完成后,主机需要把SDA线拉高,然后等待从机或者主机把SDA线拉低,则代表有应答,如果SDA线保持为高电平,则代表没有应答。

I2C寻址

I2C的主机可以连接多个从机,这时候就会出现一个问题,当主机开始通信时,要怎么保证能找到对应的从机与之进行通信?为了解决这个问题,I2C协议引入了从机地址的概念,拿个日常生活的例子来说明。
某一天你的朋友来找你,他住在一家酒店里面,酒店里面有3间房间,房间号分别是101、102和103。在你出发前要先问清楚你朋友住在哪一间房间,这样才能保证不会找错。3个房间就代表3个I2C从机,房间号则代表I2C从机的地址。在I2C主机开始通信前,会先给所有的从机发送一个地址,如果有从机应答,则代表寻址正确,开始通信。这个从机地址在一个I2C总线上是唯一的。
I2C从机可以选择7位和10位,大多数的芯片都是7位地址,7位地址的模式下,一个I2C主机最多可以接128个从机设备,而10位地址模式下,一个I2C主机最多可以接1024个从机设备。

I2C地址格式

我们以7位地址模式为例,说一下I2C从机的地址格式

A6A5A4A3A2A1A0R/W
  • A6~A0:I2C从机的地址
  • R/W:设置主机读写模式,通常0为向I2C从机写数据,1为向I2C从机读数据

I2C数据传输

I2C协议规定,每次传输的数据为8位,在SCL为高电平时,SDA数据才有效,也就是说如果需要改变SDA的数据,则需要在SCL为低电平时进行修改。
在这里插入图片描述

LM75A

LM75A介绍

LM75A是NXP半导体公司推出的一具有I2C接口的数字温度传感器芯片,可广泛运用于系统温度管理、个人计算机、电子设备、工业控制器等方面。
特性:

  • I2C 总线接口,器件地址 7 位从机地址 1001xxx,同一总线上可以外扩 8 个器件;
  • 供电范围:2.8V~5.5V,温度范围:-55℃~+125℃;
  • 11 位 ADC 提供温度分辨率达 0.125℃;
  • 温度精度:±2℃(-25℃~100℃) ±3℃(-55℃~125℃)
  • 可编程温度阈值和滞后设定点;
  • 为了减低功耗,关断模式下消耗的电流仅为 1.0μA;
  • 上电时器件可用作一个独立的温度控制器;
  • 在 JEDEC 标准下(JESD78)所做的闩锁测试可达 100mA;
  • 小型 8 脚封装:SO8、TSSOP8 和超小型封装 XSON8U。

LM75A引脚说明

在这里插入图片描述

管脚号符号功能说明
1SDA数据线
2SCL时钟线
3OS过热关断输出,开漏
4GND地线
5A2用户定义地址2
6A1用户定义地址1
7A0用户定义地址0
8VCC电源线

LM75A地址

LM75A的地址为7位,其地址定义如下

A6A5A4A3A2A1A0R/W
1001A2A1A0

其中A0~A2是用户自定义的,可以接地和接VCC,但是不能悬空,根据其地址定义,同一个I2C总线上最多可以接8个LM75A器件。

LM75A寄存器

LM75内部有4个寄存器,其定义如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
除了配置寄存器为8位外,其他3个寄存器都是16位。

LM75A I2C协议

写配置寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送配置寄存器地址
  5. 主机等待从机应答
  6. 主机发送配置寄存器数据
  7. 主机等待从机应答
  8. 主机发送结束信号

读配置寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送配置寄存器地址
  5. 主机等待从机应答
  6. 主机重新发送起始信号
  7. 主机发送从机读地址
  8. 主机等待从机应答
  9. 主机读取从机数据
  10. 主机发送不应答信号
  11. 主机发送结束信号

写Tos和Thyst寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送Tos或Thyst寄存器地址
  5. 主机等待从机应答
  6. 主机发送16位数据中高8位数据
  7. 主机等待从机应答
  8. 主机发送16位数据中低8位数据
  9. 主机等待从机应答
  10. 主机发送结束信号

读Tos Thyst Temp寄存器

在这里插入图片描述

  1. 主机发送起始信号
  2. 主机发送从机写地址
  3. 主机等待从机应答
  4. 主机发送Tos、Thyst、Temp寄存器地址
  5. 主机等待从机应答
  6. 主机重新发送起始信号
  7. 主机发送从机读地址
  8. 主机等待从机应答
  9. 主机读取从机数据高8位数据
  10. 主机发送应答信号
  11. 主机读取从机数据低8位数据
  12. 主机发送不应答信号
  13. 主机发送结束信号

LM75A温度计算

LM75A的温度值保存在TEMP寄存器里面,温度寄存器是一个只读寄存器,包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。在这两个字节中只用到 11 位,来存放分辨率为 0.125℃的Temp数据(以二进制补码数据的形式。
在这里插入图片描述
根据 11 位的 Temp 数据来计算 Temp 值的方法:
若 D10=0,温度值(℃)=+(Temp 数据)×0.125℃;
若 D10=1,温度值(℃)=-(Temp 数据的二进制补码)×0.125℃。

LM75A例程

i2c.c

#include "i2c.h"void cpu_delay(unsigned int tns)
{int i = 0;while(i < tns){__asm("NOP");i++;}
}//初始化IIC
void IIC_Init(void)
{			GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(I2C_SCL_CLK,ENABLE);RCC_AHB1PeriphClockCmd(I2C_SDA_CLK,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SCL_PORT,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SDA_PORT,&GPIO_InitStructure);IIC_SDA_H;IIC_SCL_H;
}static void i2c_sda_out(void)	
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = I2C_SDA_PIN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SDA_PORT,&GPIO_InitStruct);
}
static void i2c_sda_in(void)	
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin = I2C_SDA_PIN;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_SDA_PORT,&GPIO_InitStruct);
}//产生IIC起始信号
void IIC_Start(void)
{i2c_sda_out();     //sda线输出IIC_SDA_H;	  	  IIC_SCL_H;cpu_delay(4);IIC_SDA_L;//START:when CLK is high,DATA change form high to low cpu_delay(4);IIC_SCL_L;//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{i2c_sda_out(); //sda线输出IIC_SDA_L;	  	  IIC_SCL_L;cpu_delay(4);IIC_SDA_H;	  	  IIC_SCL_H;cpu_delay(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;i2c_sda_in();      //SDA设置为输入  IIC_SDA_H;cpu_delay(1);	   IIC_SCL_H;cpu_delay(1);	 while(IIC_SDA_READ() == SET){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL_L;//时钟输出0 	   return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL_L;i2c_sda_out();IIC_SDA_L;cpu_delay(2);IIC_SCL_H;cpu_delay(2);IIC_SCL_L;
}
//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL_L;i2c_sda_out();IIC_SDA_H;cpu_delay(2);IIC_SCL_H;cpu_delay(2);IIC_SCL_L;
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        u8 t;   i2c_sda_out(); 	    IIC_SCL_L;//拉低时钟开始数据传输for(t=0;t<8;t++){              if((txd&0x80) >> 7)IIC_SDA_H;elseIIC_SDA_L;txd<<=1; 	  delay_ms(1);   IIC_SCL_H;delay_ms(1); IIC_SCL_L;	delay_ms(1);}	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;i2c_sda_in();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL_L; delay_ms(2);IIC_SCL_H;receive<<=1;if(IIC_SDA_READ())receive++;   delay_ms(1); }					 if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

i2c.h

#ifndef __I2C_H
#define __I2C_H#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"#define I2C_SCL_CLK RCC_AHB1Periph_GPIOB
#define I2C_SDA_CLK RCC_AHB1Periph_GPIOB#define I2C_SCL_PORT GPIOB
#define I2C_SDA_PORT GPIOB#define I2C_SCL_PIN GPIO_Pin_8
#define I2C_SDA_PIN GPIO_Pin_9#define IIC_SDA_H       GPIO_SetBits(I2C_SDA_PORT, I2C_SDA_PIN)
#define IIC_SDA_L       GPIO_ResetBits(I2C_SDA_PORT, I2C_SDA_PIN)                                                                  #define IIC_SCL_H       GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN)
#define IIC_SCL_L       GPIO_ResetBits(I2C_SCL_PORT, I2C_SCL_PIN)                                                                   #define IIC_SDA_READ()  GPIO_ReadInputDataBit(I2C_SDA_PORT, I2C_SDA_PIN)   void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号
#endif

lm75.c

#include "lm75.h"unsigned char lm75_init(void)
{IIC_Init();}void lm75_write_conf(unsigned char data)
{IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(LM75_CONF_REG);IIC_Wait_Ack();IIC_Send_Byte(data);IIC_Wait_Ack();IIC_Stop();
}unsigned char lm75_read_conf(void)
{unsigned char data;IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(LM75_CONF_REG);IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(LM75_ADDRESS + 0x1);IIC_Wait_Ack();data = IIC_Read_Byte(0);IIC_Stop();return data;
}void lm75_write_tos_thyst(unsigned char reg,unsigned short data)
{IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(reg);IIC_Wait_Ack();IIC_Send_Byte((data >> 8) & 0xFF);IIC_Wait_Ack();IIC_Send_Byte(data & 0xFF);IIC_Wait_Ack();IIC_Stop();}unsigned char lm75_read_tos_thyst_temp(unsigned char reg,unsigned short *data)
{unsigned char datah,datal;float temp;IIC_Start();IIC_Send_Byte(LM75_ADDRESS);IIC_Wait_Ack();IIC_Send_Byte(reg);IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(LM75_ADDRESS + 0x1);IIC_Wait_Ack();datah = IIC_Read_Byte(1);datal = IIC_Read_Byte(0);IIC_Stop();*data = datah << 8 | datal;}

lm75.h

#ifndef __LM75_H
#define __LM75_H#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "i2c.h"#define LM75_ADDRESS (0x48 << 1)#define LM75_TEMP_REG (0x0)
#define LM75_CONF_REG (0x1)
#define LM75_THYST_REG (0x2)
#define LM75_TOS_REG   (0x3)unsigned char  lm75_init(void);
void lm75_read_temp(void);
void lm75_write_conf(unsigned char data);
unsigned char lm75_read_conf(void);void lm75_write_tos_thyst(unsigned char reg,unsigned short data);
unsigned char lm75_read_tos_thyst_temp(unsigned char reg,unsigned short *data);#endif

main.c

#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "lm75.h"
extern u8 rx_buf[RX_BUF_SIZE];
extern u16 USART_RX_STA;
int main(void)
{int i;unsigned short temp_data,tempforh;float temp;NVIC_PriorityGroupConfig(2);system_tick_init();bsp_usart_init(115200);lm75_init();while(1){delay_ms(1000);lm75_read_tos_thyst_temp(LM75_TEMP_REG,&temp_data); // 读取温度if(temp_data & 0x8000) // 温度为负数{tempforh = (temp_data >> 5 & 0xFFF);tempforh = (tempforh ^ 0x7FF) + 1;temp= tempforh * -0.125;}	else // 温度为正数temp=(temp_data >> 5 & 0xFFF) * 0.125; printf("temp = %f\r\n",temp);}}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣(LeetCode)2578. 最小和分割(C++)

哈希集合 请读者思考&#xff0c;num拆分成num1和num2&#xff0c;要使得num1 num2最小&#xff0c;应满足两条性质&#xff1a; num1和num2位数相同&#xff0c;或最多差一位。num1和num2应按数值从小到大在num中取数。 想到统计num的位数&#xff0c;以实现性质1的需要&a…

淘宝天猫商品历史价格API接口

获取淘宝商品历史价格接口的步骤如下&#xff1a; 注册淘宝开放平台&#xff1a;首先在淘宝开放平台上注册一个账号&#xff0c;并进行登录。创建应用&#xff1a;在淘宝开放平台上创建一个应用&#xff0c;并获取该应用的App Key和App Secret&#xff0c;用于后续的接口调用。…

【数据结构】二叉树的链式结构及实现

目录 1. 前置说明 2. 二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 3. 节点个数及高度等 4. 二叉树的创建和销毁 1. 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二叉树结构…

区块链技术的飞跃: 2023年的数字革命

随着时代的推进和技术的不断创新&#xff0c;2023年成为区块链技术飞跃发展的一年。区块链&#xff0c;一个曾经只是数字货币领域的技术&#xff0c;现在已经逐渐渗透到各个行业&#xff0c;成为推动数字经济发展的重要力量。在这个数字革命的时代&#xff0c;我们探讨区块链技…

什么是存储服务器?

随着互联网的发展&#xff0c;越来越多的信息会在网络上暴露&#xff0c;所以企业就会更加重视数据&#xff0c;因此更加安全可靠的数据存储服务器受到了大多数人的信赖&#xff0c;今天就让小编带大家了解一下什么是存储服务器吧&#xff01; 存储服务器的含义。存储服务器是…

代理IP端口是什么意思呢?

今天&#xff0c;咱们来聊聊一个小众但很有料的话题——代理IP端口&#xff0c;它可是你纵横互联网世界的好搭子哦&#xff01; 首先&#xff0c;我们得先弄明白&#xff0c;代理IP端口是个啥? 代理IP端口就像是通往网络世界的门票&#xff0c;是你和代理服务器之间的桥梁。…

使用注解新开事务 @Transactional

使用注解新开事务 Transactional(propagation Propagation.REQUIRES_NEW)

使用Perl脚本编写爬虫程序的一些技术问题解答

网络爬虫是一种强大的工具&#xff0c;用于从互联网上收集和提取数据。Perl 作为一种功能强大的脚本语言&#xff0c;提供了丰富的工具和库&#xff0c;使得编写的爬虫程序变得简单而灵活。在使用的过程中大家会遇到一些问题&#xff0c;本文将通过问答方式&#xff0c;解答一些…

Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行

一、前言 由于 Jetson 系列的开发板 CPU 性能不是很好&#xff0c;因此在处理图像数据时往往需要 GPU 加速&#xff0c;而 VINS-Fusion 是针对同步定位与建图&#xff08;SLAM&#xff09;问题中十分出色的视觉算法&#xff0c;但是其在图像处理过程中资源消耗较大&#xff0c…

执行make menuconfig问题的解决

执行make menuconfig 出现问题 在终端输入以下命令执行。 make menuconfig在终端输入上面命令执行时&#xff0c;没有成功运行&#xff0c;出现了如下的问题。 出现这个错误提示意味着在运行 make menuconfig 命令时&#xff0c;系统找不到 ncurses 库。ncurses 是一种文本用…

iPhone手机记笔记工具选择用哪个

iPhone手机大家应该都比较熟悉&#xff0c;其使用性能是比较流畅的&#xff0c;在iPhone手机上记录笔记可以帮助大家快速地进行总结工作、记录工作内容等&#xff0c;在iPhone手机上记笔记工具选择用哪个呢&#xff1f; 可以在iPhone手机上使用的笔记工具是比较多的&#xff0…

Vue3中使用tinymce全功能演示,包括开源功能

效果图&#xff1a; 1、下载插件: npm i tinymce npm i tinymce/tinymce-vue 2、在node_modules文件夹中找到tinymce下的skins复制到项目public文件夹中 &#xff08;可以先创建一个tinymce文件夹&#xff09;&#xff1a; 3、在tinymce官网中下载中文包&#xff0c;并放在刚…

FISCO BCOS | 构建第一个区块链应用程序

本章将介绍基于FISCO BCOS区块链的业务应用场景开发的全流程。介绍包括业务场景分析、合约设计实现、合约编译、区块链开发等。最后&#xff0c;我们介绍一个应用模块实现&#xff0c;即通过我们提供的Java SDK实现对区块链上合约的调用访问。 本教程要求用户熟悉Linux操作环境…

NCV6324CMTAATBG---车规级3MHz 2A 高效同步降压转换器

同步降压转换器&#xff1f; 是一种电源管理电路&#xff0c;它可以将输入电压转换为较低的输出电压。与传统的降压转换器相比&#xff0c;同步降压转换器具有更高的效率和更好的动态响应。 同步降压转换器的工作原理是通过控制开关管的导通和截止来实现电能的转换。在导通状…

Go语言入门心法(一)

一: go语言中变量认知 go语言中变量的定义: &#xff08;要想飞|先会走&#xff09;||&#xff08;翻身仗|抹遗憾 &#xff09;(1)go语言中变量认知升维(2)go语言中变量与强类型语言java类似,变量使用必须先声明后使用(3)go语言中变量标准的声明使用var关键字进行声明: var 变…

微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件

因为只是做个小案例 我就直接代码写page页面里了 其实很简单 组件稍微改一下就好了 wxss /* 设置movable-area的宽度 */ .area{width: 100%; }/* a b c 每条元素的样式 */ movable-view {width: 100%;background-color: red;height: 40px;line-height: 40px;color: #FFFFFF;tex…

如何进行pyhon的虚拟环境创建及管理

无论服务器或者本地&#xff0c;创建虚拟环境都是&#xff1a; 【Python】搭建虚拟环境_python创建虚拟环境_今天自洽了吗的博客-CSDN博客 虚拟环境绑定到项目 这个是运行环境&#xff0c;可以切换任意运行环境 如果是服务器上&#xff1a;可以先source xx/bin/active&#xf…

Python皮卡丘

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

canvas基础2 -- 形状

七巧板 七巧板本质上就是 分别由几个直线 拼成一个个图形&#xff0c;再将这些图形结合起来 var tangram [{ p: [{ x: 0, y: 0 }, { x: 800, y: 0 }, { x: 400, y: 400 }], color: "#caff67" },{ p: [{ x: 0, y: 0 }, { x: 400, y: 400 }, { x: 0, y: 800 }], col…

1808_ChibiOS基本的架构介绍

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 简单看了一下ChibiOS的架构介绍&#xff0c;感觉这种OS以及组件非常适合快速构建一个应用。这里做一个简单的资料整理。。 1. 不同于其他的OS&#…