实时时钟芯片DS1307单片机C语言驱动程序

实时时钟RTC相关索引

1.单片机RTC及时钟芯片的时间到底从哪一年起始?
2.STM32F103单片机内部RTC实时时钟驱动程序
3.实时时钟芯片DS1302单片机C语言驱动程序
4.实时时钟芯片DS1307单片机C语言驱动程序

一、DS1307简介

DS1307是一款非易失性实时时钟(RTC)芯片,采用IIC总线接口进行通信,可以提供秒、分、时、日、月、年等时间和日期信息。DS1307还具有控制和配置寄存器,可以通过读写这些寄存器来设置和调整时间、日期和其他功能。主要特点如下:
1.提供秒、分钟、小时、日、月、星期及年计时,带闰年补偿,有效期至2100年;
2.56字节通用RAM,写次数不受限制;
3. IIC串口通信;
4. 可编程方波输出信号;
5. 自动电源失效检测和切换电路;
6. 电池备份模式下,振荡器运行功耗低于500nA;
7. -40°C至+85°C工作温度范围;
8. 可用于8引脚DIP等封装;
DS1307的引脚如下图示意,其中X1/X2接32.768KHz的晶振, V B A T {V}_{BAT} VBAT为后备电池供电引脚,Vcc为主电源供电引脚,SCL、SDA为IIC接口引脚,SQW/OUT为方波输出引脚;
在这里插入图片描述

二、驱动程序

DS1307与DS1302有很多相似之处,大同小异,学会其中任何一个的使用,再学习另一个都易如反掌,我们可以在实时时钟芯片DS1302单片机C语言驱动程序的基础上,学习DS1307的驱动程序的编写,会轻松很多。DS1307的通信接口为IIC,IIC驱动程序可参考4位数码管显示模块TM1637芯片C语言驱动程序。

2.1 读写时序

在这里插入图片描述在这里插入图片描述上图Figure4-Figure6是DS1307的读写时序,与EEPROM的操作十分类似,关于EEPROM的读写驱动程序可以参见AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序,可以更好地理解DS1307的读写。器件地址是1101000,十六进制为0x68,只有7位,最低位是读写标志位,0为写,1为读,因此我们可以认为器件地址为(0x68 << 1) = 0xD0,在读或写操作的时候,再将器件地址字节Slave Address的最低位置为1或0;
①上图Figure4类似于EEPROM的页写Page Write操作,但因为我们在读写DS1307的时候,一般只会用到对单个寄存器的读写,所以除了第一个Data(n),后面的Data(n+1)…Data(n+x)可以不用理会,我们写完第一个数据等待应答完就发送Stop信号,结束写操作,这样就变成了EEPROM的写单个字节的操作了,操作流程如下:

发送起始信号–>发送器件地址(包含写入命令标志)–>收到应答–>发送寄存器地址–>收到应答–>发送需要写入的数据–>收到应答–>发送停止信号

Figure5类似于EEPROM的“顺序读”Sequential Read(由“读当前地址”开始),在DS1307中较少用到,不做讨论。
Figure6仍然是EEPROM的“顺序读”Sequential Read,但是由“任意读”开始(由“读当前地址”开始,则读取的地址是地址计数器里的地址+1,由“任意读”开始,则需要先发送一个地址),一般在读一个寄存器接收到数据后,主机不应答,直接发送STOP,这样就类似EEPROM的读单个字节(读任意地址),操作流程如下:

发送起始信号–>发送器件地址(包含写入命令标志)–>收到应答–>发送需要读取数据的寄存器地址–>收到应答–>发送起始信号–>发送器件地址(包含读取命令标志)–>收到应答–>读取数据–>不应答–>发送停止信号

#define WRITE_CMD				0x00
#define READ_CMD				0x01#define DEV_ADDR                0xD0//器件地址,0x68<<1
/******************************************************************************** 函数名:DS1307_WriteReg* 功  能:写寄存器* 参  数:addr:寄存器地址data:写入的数据* 返回值:无* 说  明:无
*******************************************************************************/
void DS1307_WriteReg(uint8_t addr, uint8_t data)
{IIC_Start();//起始信号IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+写IIC_WaitAck();//等待应答IIC_WriteByte(addr);//地址IIC_WaitAck();//等待应答IIC_WriteByte(data);IIC_WaitAck();//等待应答IIC_Stop();
}
/******************************************************************************** 函数名:DS1307_ReadReg* 功  能:读寄存器* 参  数:addr:寄存器地址* 返回值:data:读出的数据* 说  明:无
***************  ****************************************************************/
uint8_t DS1307_ReadReg(uint8_t addr)
{uint8_t data = 0;IIC_Start();//起始信号	IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+写IIC_WaitAck();//等待应答IIC_WriteByte(addr);//地址IIC_WaitAck();//等待应答IIC_Start();//起始信号IIC_WriteByte(DEV_ADDR | READ_CMD);//器件寻址+读IIC_WaitAck();//等待应答data = IIC_ReadByte();IIC_NoAck();IIC_Stop();return data;
}

2.2 寄存器读写

DS1307的寄存器如下图所示,除地址外,大部分与DS1302的相似:
在这里插入图片描述地址00H,是秒寄存器,存储方式也是8421格式的BCD码,最高位是CH位(Clock Halt),与DS1302一样,该位为1,时钟停止运行,所以必须将该位清零,器件才正常工作;
地址01H,是分钟寄存器,BCD格式存储;
地址02H,小时寄存器,BCD格式,其中12/24小时模式、AM/PM模式,与DS1302的功能一样,但有个重要区别是12/24小时模式位在bit6;当更改了12/24小时模式时,小时时间也必须重新设置;
地址03H,星期寄存器,BCD码,取值为01~07,对应的周几可由用户自定义,但必须按顺序,例如1为周一,则2为周二,而如果1为周日,则2为周一,以此类推;
地址04H,日期寄存器,BCD码;
地址05H,月份寄存器,BCD码;
地址06H,年份寄存器,BCD码;
地址07H,控制寄存器,用于控制SQW/OUT引脚的输出,该引脚可输出4种频率的方波;
其中,bit4为SQWE即输出使能(Square-Wave Enable),该位为1可在SQW/OUT引脚输出方波,方波的频率由bit1、bit0即RS1/RS0决定;当bit4为0时,不输出方波,但SQW/OUT引脚得有个确定的状态,这个高低电平的状态,与bit7位OUT一致,总结如下表:
在这里插入图片描述首次上电时,00H~07H寄存器的复位值为01/01/00 01 00:00:00(MM/DD/YY DOW HH:MM:SS);另外手册中还有如下说明:
在这里插入图片描述当读取或写入时间和日期寄存器时,辅助(用户)缓冲区用于防止内部寄存器更新产生错误。当读取时间和日期寄存器时,在IIC的START信号开始时,用户缓冲区将与内部寄存器同步。时间信息是从这些用户缓存中读取的,时钟同时在继续运行。这样可以不需要在内部寄存器更新时,重新读取。每当写入秒寄存器时,分频链(DS1307内部用于分频的硬件部分)就会重置。DS1307的应答后,写入操作开始传输。一旦分频链被重置,为避免翻转问题,剩余的时间和日期寄存器必须在一秒内写入。
以上各寄存器操作相关程序如下:

/******************************************************************************** 函数名:DS1307_GetYear* 功  能:获取年份* 参  数:无			* 返回值:年份,十进制* 说  明:将BCD码转为十进制
*******************************************************************************/
uint16_t DS1307_GetYear(void)
{uint16_t temp = 0;temp = DS1307_ReadReg(REG_YEAR);return BCDToDec(temp);
}
/******************************************************************************** 函数名:DS1307_GetDay* 功  能:获取星期几* 参  数:无			* 返回值:星期几,十进制,1~7* 说  明:无
*******************************************************************************/
uint8_t DS1307_GetDay(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_DAY);return BCDToDec(temp & 0x07);
}
/******************************************************************************** 函数名:DS1307_GetMonth* 功  能:获取月份* 参  数:无			* 返回值:月份,十进制,1~12* 说  明:无
*******************************************************************************/
uint8_t DS1307_GetMonth(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_MONTH);return BCDToDec(temp & 0x1F);
}
/******************************************************************************** 函数名:DS1307_GetDate* 功  能:获取日期* 参  数:无			* 返回值:日,十进制,1~31* 说  明:无
*******************************************************************************/
uint8_t DS1307_GetDate(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_DATE);return BCDToDec(temp & 0x3F);
}
/******************************************************************************** 函数名:DS1307_GetHour* 功  能:获取小时* 参  数:无			* 返回值:小时,十进制,1~12或0~23* 说  明:返回的值需要结合小时模式及AM/PM位区分具体时间
*******************************************************************************/
uint8_t DS1307_GetHour(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_HOUR);if ((temp & 0x40) == 0x40)//12小时模式{return BCDToDec(temp & 0x1F);}else//24小时模式{return BCDToDec(temp & 0x3F);}
}
/******************************************************************************** 函数名:DS1307_GetHourMode* 功  能:获取小时模式* 参  数:无			* 返回值:0,24小时模式,1,12小时模式* 说  明:bit6
*******************************************************************************/
uint8_t DS1307_GetHourMode(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_HOUR);temp &= 0x40;return (temp >> 6);
}
/******************************************************************************** 函数名:DS1307_SetHourMode* 功  能:设置小时模式* 参  数:mode,0,24小时模式,1,12小时模式			* 返回值:无* 说  明:bit6,datasheet要求,更改模式时,小时必须重新初始化,因此先读取原小时时间,再设置模式,再将小时写入寄存器
*******************************************************************************/
void DS1307_SetHourMode(uint8_t mode)
{uint8_t hour = 0;//原时间uint8_t temp = 0;//原模式uint8_t reg = 0;//写入寄存器的值temp = DS1307_GetHourMode();if (mode != temp)//修改模式{reg |= ((mode & 0x01) << 6);//模式在bit6hour = DS1307_ReadReg(REG_HOUR);;//读取原寄存器的值,保存原时间        if (mode == 0)//改为24小时模式,之前是12小时模式,先判断AM/PM{if ((hour & 0x20) == 0x20)//bit5,1=PM{hour &= 0x1F;//提取0~4位的时间hour = BCDToDec(hour);//BCD转为十进制hour += 12;reg |= DecToBCD(hour);//BCD}else//AM{hour &= 0x1F;//提取0~4位的时间reg |= hour;}}else//改为12小时模式,之前是24小时模式{hour &= 0x3F;hour = BCDToDec(hour);//BCD转为十进制if (hour > 12)//PM{hour -= 12;reg |= DecToBCD(hour);//BCDreg |= 0x20;//bit5置1}else//AM{reg |= DecToBCD(hour);//BCDreg &= 0xDF;//bit5置0}}}DS1307_WriteReg(REG_HOUR, reg);	
}
/******************************************************************************** 函数名:DS1307_SetAMPM* 功  能:设置AM/PM模式* 参  数:data,0为AM上午,1为PM下午		* 返回值:无* 说  明:小时寄存器bit5,须在12小时模式下使用
*******************************************************************************/
void DS1307_SetAMPM(uint8_t data)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_HOUR);//先把原数据读出(data == 0) ? (temp &= 0xDF) : (temp |= 0x20);DS1307_WriteReg(REG_HOUR, temp);
}
/******************************************************************************** 函数名:DS1307_GetAMPM* 功  能:读取AM/PM模式* 参  数:无		* 返回值:0为AM上午,1为PM下午* 说  明:小时寄存器bit5,须在12小时模式下使用
*******************************************************************************/
uint8_t DS1307_GetAMPM(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_HOUR);return ((temp & 0x20) >> 5);
}
/******************************************************************************** 函数名:DS1307_GetMinute* 功  能:获取分钟* 参  数:无			* 返回值:分钟,十进制,0~59* 说  明:无
*******************************************************************************/
uint8_t DS1307_GetMinute(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_MIN);return BCDToDec(temp & 0x7F);
}
/******************************************************************************** 函数名:DS1307_GetSecond* 功  能:获取秒* 参  数:无			* 返回值:秒,十进制,0~59* 说  明:无
*******************************************************************************/
uint8_t DS1307_GetSecond(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_SEC);return BCDToDec(temp & 0x7F);
}
/******************************************************************************** 函数名:DS1307_SetYear* 功  能:写入年份* 参  数:year:年份,十进制,2000~2099			* 返回值:无* 说  明:将十进制转为BCD码
*******************************************************************************/
void DS1307_SetYear(uint16_t year)
{uint8_t temp = DecToBCD(year);DS1307_WriteReg(REG_YEAR, temp);	
}
/******************************************************************************** 函数名:DS1307_SetDay* 功  能:写入星期几* 参  数:day:星期几,1~7			* 返回值:无* 说  明:无
*******************************************************************************/
void DS1307_SetDay(uint8_t day)
{DS1307_WriteReg(REG_DAY, day & 0x07);	
}
/******************************************************************************** 函数名:DS1307_SetMonth* 功  能:写入月份* 参  数:month:月份,1~12			* 返回值:无* 说  明:转为BCD码
*******************************************************************************/
void DS1307_SetMonth(uint8_t month)
{uint8_t temp = DecToBCD(month);DS1307_WriteReg(REG_MONTH, temp & 0x1F);
}
/******************************************************************************** 函数名:DS1307_SetDate* 功  能:写入日* 参  数:date:日,1~31			* 返回值:无* 说  明:无
*******************************************************************************/
void DS1307_SetDate(uint8_t date)
{uint8_t temp = DecToBCD(date);DS1307_WriteReg(REG_DATE, temp & 0x3F);
}
/******************************************************************************** 函数名:DS1307_SetHour* 功  能:写入小时* 参  数:hour:小时,1~12或0~23		* 返回值:无* 说  明:无
*******************************************************************************/
void DS1307_SetHour(uint8_t hour)
{uint8_t temp = DecToBCD(hour);DS1307_WriteReg(REG_HOUR, temp & 0x3F);
}
/******************************************************************************** 函数名:DS1307_SetMinute* 功  能:写入分钟* 参  数:min:分钟,0~59		* 返回值:无* 说  明:无
*******************************************************************************/
void DS1307_SetMinute(uint8_t min)
{uint8_t temp = DecToBCD(min);DS1307_WriteReg(REG_MIN, temp & 0x7F);
}
/******************************************************************************** 函数名:DS1307_SetSecond* 功  能:写入秒* 参  数:sec:秒,0~59		* 返回值:无* 说  明:无
*******************************************************************************/
void DS1307_SetSecond(uint8_t sec)
{uint8_t temp = DecToBCD(sec);DS1307_WriteReg(REG_SEC, temp & 0x7F);
}
/******************************************************************************** 函数名:DS1307_ReadHaltFlag* 功  能:读Halt标志* 参  数:无			* 返回值:无* 说  明:无
*******************************************************************************/
bool DS1307_ReadHaltFlag(void)
{bool temp = 0;temp = ((DS1307_ReadReg(REG_SEC) & 0x80) == 0x80) ? 1 : 0;return temp;
}
/******************************************************************************** 函数名:DS1307_SetHaltFlag* 功  能:Halt标志置1* 参  数:无			* 返回值:无* 说  明:先读80寄存器,再写入CH位
*******************************************************************************/
void DS1307_SetHaltFlag(void)
{uint8_t temp = 0;temp = DS1307_GetSecond();temp |= 0x80;DS1307_WriteReg(REG_SEC, temp);
}
/******************************************************************************** 函数名:DS1307_ClearHaltFlag* 功  能:Halt标志置0* 参  数:无			* 返回值:无* 说  明:先读80寄存器,再写入CH位,该位为0,时钟才开始工作
*******************************************************************************/
void DS1307_ClearHaltFlag(void)
{uint8_t temp = 0;temp = DS1307_GetSecond();temp &= 0x7F;DS1307_WriteReg(REG_SEC, temp);
}
/******************************************************************************** 函数名:DS1307_SQWEnable* 功  能:使能方波输出* 参  数:无			* 返回值:无* 说  明:bit4写1
*******************************************************************************/
void DS1307_SQWEnable(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_CTRL);temp |= 0x10;DS1307_WriteReg(REG_CTRL, temp);
}
/******************************************************************************** 函数名:DS1307_SQWDisable* 功  能:禁止方波输出* 参  数:无			* 返回值:无* 说  明:bit4写0
*******************************************************************************/
void DS1307_SQWDisable(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_CTRL);temp &= 0xEF;DS1307_WriteReg(REG_CTRL, temp);
}
/******************************************************************************** 函数名:DS1307_SetSqureWaveFreq* 功  能:设置方波频率* 参  数:rate:0,1Hz;1,4.096kHz;2,8.192kHz;3,32.768kHz			* 返回值:无* 说  明:已经使能方波输出的情况下使用,设置RS0/RS1即bit0/bit1位
*******************************************************************************/
void DS1307_SetSqureWaveFreq(uint8_t rate)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_CTRL);rate &= 0x03; switch (rate){case 0: temp &= 0xFC; break;//1Hzcase 1: temp &= 0xFD; temp |=0x01; break;//4.096kHzcase 2: temp |= 0x02; temp &=0xFE; break;//8.192kHzcase 3: temp |= 0x03; break;//32.768kHzdefault: break;}DS1307_WriteReg(REG_CTRL, temp);
}
/******************************************************************************** 函数名:DS1307_OutHigh* 功  能:Out引脚输出高电平* 参  数:无			* 返回值:无* 说  明:bit7写1,在禁止方波输出的情况下使用
*******************************************************************************/
void DS1307_OutHigh(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_CTRL);temp |= 0x80;DS1307_WriteReg(REG_CTRL, temp);
}
/******************************************************************************** 函数名:DS1307_OutLow* 功  能:Out引脚输出低电平* 参  数:无			* 返回值:无* 说  明:bit7写0,在禁止方波输出的情况下使用
*******************************************************************************/
void DS1307_OutLow(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(REG_CTRL);temp &= 0x7F;DS1307_WriteReg(REG_CTRL, temp);
}

2.3 时钟初始化

首次上电时,单片机开始工作,读取RAM寄存器的值,与预设的值比较,如果值不正确,则是首次配置,初始化时间,并在RAM中写入预设的值;如果值正确,则直接读取时间寄存器的值,将时间输出即可;如果有电池供电,在主电源断开时,会继续计时,RAM寄存器中的值也会保存下来;

void DS1307_Init(void)
{uint8_t temp = 0;temp = DS1307_ReadReg(0x08);//读RAM第一字节if (temp != 0x5A)//不正确,重新初始化{        DS1307_SetYear(24);//24年DS1307_SetDay(3);//星期3DS1307_SetMonth(1);//1月DS1307_SetDate(31);//31日DS1307_SetHour(23);DS1307_SetMinute(18);DS1307_SetSecond(0);DS1307_SetHourMode(0);//0,24小时模式,1,12小时模式DS1307_ClearHaltFlag();//清除Halt标志DS1307_WriteReg(0x08, 0x5A);//写入0x5A        }
}

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

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

相关文章

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目链接&#xff1a;309.最佳买卖股票时机含冷冻期I 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 *i* 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xf…

【Java程序设计】【C00209】基于SSM个人求职管理系统(论文+PPT)

基于SSM个人求职管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这个一个基于SSM的个人求职管理系统&#xff0c;本系统共分为三种权限&#xff1a;管理员、普通管理员、用户 管理员&#xff1a;首页、个人中心、用户管理、管理…

Day 31 | 贪心算法 理论基础 、455.分发饼干 、 376. 摆动序列 、 53. 最大子序和

理论基础 文章讲解 455.分发饼干 题目 文章讲解 视频讲解 思路&#xff1a;从小饼干开始喂小胃口 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int start 0;int count 0;for (int i 0; i < s.length &&a…

go并发编程-介绍与Goroutine使用

1. 并发介绍 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中的多个…

Go语言的100个错误使用场景(11-20)|项目组织和数据类型

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

DevSecOps 参考模型介绍

目录 一、参考模型概述 1.1 概述 二、参考模型分类 2.1 DevOps 组织型模型 2.1.1 DevOps 关键特性 2.1.1.1 模型特性图 2.1.1.2 特性讲解 2.1.1.2.1 自动化 2.1.1.2.2 多边协作 2.1.1.2.3 持续集成 2.1.1.2.4 配置管理 2.1.2 DevOps 生命周期 2.1.2.1 研发过程划分…

leetcode刷题(剑指offer)54.螺旋矩阵

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;ma…

npm 安装时卡在 sill idealTree buildDeps 不动

网上很多博客给出的解决方案是将镜像源修改为淘宝镜像源&#xff0c;如下&#xff1a; 1. 查看当前的镜像网址 npm config get registry 2. 把npm的镜像地址改成taobao的 npm config set registry https://registry.npm.taobao.org3. 检验是否设置成功 npm config get regi…

Android升级版本兼容问题

1、JDK的选择 AndroidJavaAPI and language features supported14 (API 34)17Core libraries13 (API 33)11Core libraries12 (API 32)11Java API11 and lowerAndroid versions https://developer.android.com/build/jdks The following table lists which version of Gradle…

Java基础-集合框架

集合框架&#xff1a; 内存层面可考虑的数据存储容器&#xff1a;数组&#xff0c;集合 数组的特点&#xff1a;长度&#xff0c;存储元素类型确定&#xff0c;既可以放基本数据类型&#xff0c;也可以放引用数据类型 缺点&#xff1a;长度不可变&#xff0c;存储元素特点单…

从零开始 Linux(一):基础介绍与常用指令总结

从零开始 Linux 01. 概念理解 1.1 什么是 Linux&#xff1f; Linux 是一个开源免费的 操作系统&#xff0c;具有很好的稳定性、安全性&#xff0c;且有很强的处理高并发的能力 Linux 的应用场景&#xff1a; 可以在 Linux 下开发项目&#xff0c;比如 JavaEE、大数据、Python…

Arduino 官网上下载和使用开发板

在 Arduino 官网上下载和使用开发板可以按照以下步骤进行&#xff1a; 打开浏览器&#xff0c;访问 Arduino 官网&#xff08;https://www.arduino.cc/&#xff09;。在官网首页&#xff0c;可以看到各种型号的 Arduino 开发板和相关产品。根据自己的需求选 择合适的开发板型号…

3D词云图

工具库 tagcanvas.min.js vue3&#xff08;框架其实无所谓&#xff0c;都可以&#xff09; 实现 <script setup> import { onMounted, ref } from vue; import ./tagcanvas.min.js;const updateFlag ref(false);// 词云图初始化 const initWordCloud () > {let …

RabbitMQ快速实战

目录 什么是消息队列&#xff1f; 消息队列的优势 应用解耦 异步提速 削峰填谷 总结 主流MQ产品特点比较 Rabbitmq快速上手 创建用户admin Exchange和Queue Connection和Channel RabbitMQ中的核心概念总结 什么是消息队列&#xff1f; MQ全称Message Queue&#xf…

Python 开发学习目录

Python 开发教程的概述&#xff1a; 安装 Python&#xff1a;首先&#xff0c;你需要在你的计算机上安装 Python。你可以从 Python 的官方网站上下载并安装 Python。 学习基础语法&#xff1a;学习 Python 的基础语法&#xff0c;包括变量、数据类型、控制结构、函数等。 学习…

关于mysql 条线添加 子查询 包含groupby 导致问题

直接简约明确说明一下这个问题&#xff0c;发生这个问题我也很懵逼。然后各种怀疑自己&#xff0c;最终我猜测了一下可能是这个问题&#xff0c;结果直接再子查询中有嵌套了一个括号解决此问题 之前写的sql 由于公司安全问题不展示&#xff0c;写个伪sql代表一下 selectid from…

Redis - 多集群数据源配置

目录 前言依赖yml配置redis多集群数据源配置类思考 redis工具类 前言 工作时有一个项目配置了多个redis数据源&#xff0c;使用时出现了指定了使用副数据源&#xff0c;数据却依然使用了主数据源的情况。经过排查&#xff0c;发现配置流程较为繁琐易错&#xff0c;此处做一个记…

Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)

Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入) 反转(转移)控制(IOC Inverse of Control) 控制&#xff1a;对于成员变量赋值的控制权 反转控制&#xff1a;把对于成员变量赋值的控制权&#xff0c;从代码中反转(转移)到Spring⼯⼚和配置⽂件中完成好处&#xff1a;…

七、并发工具(上)

一、自定义线程池 1&#xff09;背景&#xff1a; 在 QPS 量比较高的情况下&#xff0c;我们不可能说所有的访问都创建一个线程执行&#xff0c;这会导致内存占用过高&#xff0c;甚至有可能出现 out of memory另外也要考虑 cpu 核数&#xff0c;如果请求超过了cpu核数&#…

【bitonicSort学习】

bitonicSort学习 什么是Bitonic Sort核心 什么是Bitonic Sort https://zhuanlan.zhihu.com/p/53963918 这个是用来并行排序的一个操作 之前学过一些CPU排序&#xff0c;快排 冒泡 归并啥的&#xff0c;有一些能转成并行&#xff0c;有一些不适合 像快排这种二分策略就可以考虑…