实时时钟芯片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,一经查实,立即删除!

相关文章

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

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

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…

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…

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…

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;有一些不适合 像快排这种二分策略就可以考虑…

Vue3的自定义指令怎么迁移到nuxt3

一、找到Vue3中指令的源码 const DISTANCE 100; // 距离 const ANIMATIONTIME 500; // 500毫秒 let distance: number | null null,animationtime: number | null null; const map new WeakMap(); const ob new IntersectionObserver((entries) > {for (const entrie…

草图导入3d后模型贴材质的步骤?---模大狮模型网

3D模型在导入草图大师后出现混乱可能有多种原因&#xff0c;以下是一些可能的原因和解决方法&#xff1a; 模型尺寸问题&#xff1a;如果3D模型的尺寸在导入草图大师时与画布尺寸不匹配&#xff0c;可能导致模型混乱。解决方法是在3D建模软件中调整模型的尺寸&#xff0c;使其适…

FreeRTOS使用计数信号量进行任务同步与资源管理

FreeRTOS使用计数信号量进行任务同步与资源管理 介绍 在多任务系统中&#xff0c;任务之间的同步和对共享资源的管理是非常重要的。FreeRTOS 提供了丰富的同步机制&#xff0c;其中计数信号量是一种强大的工具&#xff0c;用于实现任务之间的同步和对资源的访问控制。 什么是…

figure方法详解之清除图形内容

figure方法详解之清除图形内容 一 clf():二 clear():三 clear()方法和clf()方法的区别&#xff1a; 前言 Hello 大家好&#xff01;我是甜美的江。 在数据可视化中&#xff0c;Matplotlib 是一个功能强大且广泛使用的库&#xff0c;它提供了各种方法来创建高质量的图形。在 Mat…

unity 拖入文件 窗口大小

目录 unity 拖入文件插件 设置窗口大小 unity 拖入文件插件 GitHub - Bunny83/UnityWindowsFileDrag-Drop: Adds file drag and drop support for Unity standalong builds on windows. 设置窗口大小 file build

Iceberg从入门到精通系列之二十一:Spark集成Iceberg

Iceberg从入门到精通系列之二十一&#xff1a;Spark集成Iceberg 一、在 Spark 3 中使用 Iceberg二、添加目录三、创建表四、写五、读六、Catalogs七、目录配置八、使用目录九、替换会话目录十、使用目录特定的 Hadoop 配置值十一、加载自定义目录十二、SQL 扩展十三、运行时配置…

电子电器架构——车载网关转发buffer心得汇总

电子电器架构——车载网关转发buffer心得汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力…

vue2父组件向子组件传值时,子组件同时接收多个数据类型,控制台报警的问题

最近项目遇到一个问题,就是我的父组件向子组件(公共组件)传值时,子组件同时接收多个数据类型,控制台报警的问题,如下图,子组件明明写了可同时接收字符串,整型和布尔值,但控制台依旧报警: 仔细检查父组件,发现父组件是这样写的: <common-tabletooltip :content=…