首页 > 编程知识 正文

c51单片机与ds3231万年历,usb找不到驱动程序

时间:2023-05-04 02:52:59 阅读:45611 作者:1849

DS3231是低成本、高精度的I2C实时时钟(RTC ),具有集成的温补晶体振动(TCXO )和晶体。 该设备包含电池的输入端子,是切断主电源也能保持的时机。 集成石英晶体振动提高了器件的长期性,减少了生产线的零部件数量。 DS3231提供商用和工业温度范围,采用16针300mil的SO封装。 RTC保存秒、分、时、周、日、月、年的信息。 小于31天的月份将自动调整月末日期,包括修改闰年。 时钟的工作格式可以是24小时或/AM/PM所示的12小时格式。 提供两个可配置的日历警报和一个可配置的方波输出。 地址和数据通过I2C双向总线串行传输。 精密、温度补偿的电压基准和比较器电路监测VCC状态,检测电源故障,提供复位输出,必要时自动切换到备用电源。 另外,/RST监视端子可以作为发生P复位的手动输入使用。

说白了,还是数据手册是真的。 手册提供了芯片的典型电路,便于该芯片原理图的绘制。 在这里剪一下吧。

下面是供应电压和端电压。 如果把这个搞错了,那真的很悲伤。 可知是支持常用3.3V和5V的控制设备。

最重要的是寄存器地址。

有寄存器的话就等着敲什么吧

//文件名:DS3231.h//创建日期: 2020/01/03//文件说明: //创建者:骑猪上街i//联系人:QQ937286798//当前版本: ------------------------------------------.---------------------------------------------- ----------------------------------- -将ifdefined(use_dev )包含dev _ confined u8 Minute; u8 Hour; u 8天; u8日期; u8 Month; u8年; }DS3231_Data_Typedef; //数据结构typedef struct { # if defined (use _ dev ) devsoftiic _ typedefdevsoftiic _ ds 3231; # endif ds 3231 _ data _ typedef ds 3231 _ regdata; //寄存器数据ds 3231 _ data _ typedef ds 3231 _ hex data;//十六进制数据ds 3231 _ data _ typedef ds 3231 _ BCD data; //BCD数据u8 HOUR_12OR24_Flag; //12小时或24小时//临时语音(Init ) )语音); //ds3231void初始化(*readhexdata ) void ); //hex数据void (读取设置数据) ds 3231 _ data _ typedef * hex数据); //寄存器数据的设定}DS3231_Typedef; /*BCD数据四个位表示一个数,例如,十进制28 (二进制是:001110016进制:0x1C ),在BCD码二进制中为00101000 (十进制: 4016进制:28 ) definedc 3231 _ BCD _ to _ hex (BCD _ to _ hex ) BCD ) BC d65 BCD (0x0f (# definedc 3231 _ hex _ to _ BCD ) hex ) 10 )4) ) defineds 32312 defineds 3231 _ seconds _ reg0x 00 # defineds 3231 _ minutes _ reg0x 01 # defineds 3231 _ hour _ reg001 defineds 3231 _ da数据定义3231 _ month _ century _ reg0x 05 # defineds 3231 _ year _ reg0x 06 # defineds 3231 _ alarm1se defineds 3231 _ alarm1se nonds _ reg0x 07 # define defineds 3231 _ alarm1hours _ reg0x 09 # defineds 3231 _ alarm1day _ reg0x 0a define defineds 3231 _ alarm2hours _ reg0x 0c # defineds 3231 _ alarm 2day _ reg0x 0d # defineds 3231 _ alarm2date _ reg0x 0d #

ine DS3231_MSB_OF_TEMP_REG0x11#define DS3231_LSB_OF_TEMP_REG 0x12//定义IIC的硬件引脚#define DS3231_SCL_PROTDEV_GPIOA//使用标准库那就是GPIOA#define DS3231_SCL_PIN 1//使用标准库就是GPIO_Pin_1#define DS3231_SDA_PROT DEV_GPIOA#define DS3231_SDA_PIN 0extern DS3231_Typedef DS3231;//DS3231句柄/*使用方式简单举例#include "ds3231.h"int main(void){DS3231.Init();//初始化后会自动读取一次数据DS3231.DS3231_HexData.Year = 0;DS3231.DS3231_HexData.Month = 1;DS3231.DS3231_HexData.Date = 17;DS3231.DS3231_HexData.Day = 5;DS3231.DS3231_HexData.Hour = 5;DS3231.DS3231_HexData.Minute = 20;DS3231.DS3231_HexData.Second = 10;DS3231.SetRegData(&DS3231.DS3213_HexData);while(1){DS3231.ReadHexData()//获取DS3231数据Printf("Hour:%d ", DS3231.DS3231_HexData.Hour);Printf("min:%d ", DS3231.DS3231_HexData.Minute);Printf("sec:%d rn", DS3231.DS3231_HexData.Second);Printf("Year:%d ", DS3231.DS3231_HexData.Year );Printf("Month:%d ", DS3231.DS3231_HexData.Month );Printf("Date:%d ", DS3231.DS3231_HexData.Date);Printf("Day:%d rn", DS3231.DS3231_HexData.Day );}}*/#endif

下面是.c

/*////文 件 名:DS3231.c//创建日期: 2020/01/03//文件说明: // 作 者 :骑着猪逛街i//联系方式:QQ937286798//当前版本: v1.0//历史修改://----------------------------------------------//------------------------------------2020/01/03*/#include "ds3231.h"void DS3231_Init_Handler(void);void DS3231_ReadRegData(void);void DS3231_ReadBcdData(void);void DS3231_ReadHexData(void);void DS3213_SetRegData(DS3231_Data_Typedef *HexData);DS3231_Typedef DS3231 = //DS3213句柄{.HOUR_12OR24_Flag = 0,//默认24小时制 12小时暂未实现.Init = DS3231_Init_Handler,//指向初始化函数.ReadHexData = DS3231_ReadHexData,.SetRegData = DS3213_SetRegData,};/*初始化DS3231 IIC不使用DEV库,需要自行实现IIC引脚的初始化等内容*/__weak void DS3231_Init_Handler(void){#if defined(USE_DEV)DS3231.DEVSoftIIC_DS3231.SCL.GPIOx = DEV_GPIOA;DS3231.DEVSoftIIC_DS3231.SCL.Pin = 0;DS3231.DEVSoftIIC_DS3231.SDA.GPIOx = DEV_GPIOA;DS3231.DEVSoftIIC_DS3231.SCL.Pin = 1;DEV_SoftIIC_Init(&DS3231.DEVSoftIIC_DS3231);//初始化IIC#else //自行实现IIC初始化;#endifDS3231_ReadHexData();//读取一次Hex数据}/*通过IIC连续读取1个Byte数据不使用DEV库,需要自行实现*/__weak u8 DS3231_iicDevReadByte_Handler(u8 devaddr,u8 addr){#if defined(USE_DEV)return iicDevReadByte(&DS3231.DEVSoftIIC_DS3231,devaddr,addr);#else //自行实现IIC读取一个数据;#endif}/*通过IIC连续写入len个数据不使用DEV库,需要自行实现*/__weak void DS3231_iicDevWrite_Handler(u8 devaddr,u8 addr,u8 len,u8 *wbuf){#if defined(USE_DEV)iicDevWrite(&DS3231.DEVSoftIIC_DS3231,devaddr,addr,len,wbuf);#else //自行实现IIC连续写入len个数据;#endif}/*获取DS3213的寄存器数据*/void DS3231_ReadRegData(void){DS3231.DS3231_RegData.Second = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_SECONDS_REG);//获取秒数据DS3231.DS3231_RegData.Minute = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_MINUTES_REG);//获取秒数据DS3231.DS3231_RegData.Hour = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_HOUR_REG);//获取时数据DS3231.DS3231_RegData.Day = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_DAY_REG);//获取星期DS3231.DS3231_RegData.Date = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_DATE_REG);//获取日期DS3231.DS3231_RegData.Month = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_MONTH_CENTURY_REG);//获取月份DS3231.DS3231_RegData.Year = DS3231_iicDevReadByte_Handler(DS3231_ADDRESS,DS3231_YEAR_REG);//获取年份 此年份为 0 - 99年 若超过99 则century 置1 代表一个世纪}/*获取DS3213的BCD数据*/void DS3231_ReadBcdData(void){DS3231_ReadRegData();//获取寄存器数据DS3231.DS3231_BcdData.Second = DS3231.DS3231_RegData.Second & 0x7F;//获取秒数据DS3231.DS3231_BcdData.Minute = DS3231.DS3231_RegData.Minute & 0x7F;//获取秒数据if(DS3231.HOUR_12OR24_Flag == 0)//24小时制{DS3231.DS3231_BcdData.Hour = DS3231.DS3231_RegData.Hour & 0x3F;//获取时数据}else//12小时制{;}DS3231.DS3231_BcdData.Day = DS3231.DS3231_RegData.Day & 0x07;//获取星期DS3231.DS3231_BcdData.Date = DS3231.DS3231_RegData.Date;//获取日期DS3231.DS3231_BcdData.Month = DS3231.DS3231_RegData.Month & 0x1F;//获取月份DS3231.DS3231_BcdData.Year = DS3231.DS3231_RegData.Year;//获取年份 此年份为 0 - 99年 若超过99 则century 置1 代表一个世纪}/*获取DS3213的HEX数据*/void DS3231_ReadHexData(void){DS3231_ReadBcdData();//获取BDC数据DS3231.DS3231_HexData.Second = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Second);//获取秒数据DS3231.DS3231_HexData.Minute = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Minute);//获取秒数据if(DS3231.HOUR_12OR24_Flag == 0)//24小时制{DS3231.DS3231_HexData.Hour = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Hour);//获取时数据}else//12小时制{;}DS3231.DS3231_HexData.Day = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Day);//获取星期DS3231.DS3231_HexData.Date = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Date);//获取日期DS3231.DS3231_HexData.Month = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Month);//获取月份DS3231.DS3231_HexData.Year = DC3231_BCD_TO_HEX(DS3231.DS3231_BcdData.Year);//获取年份 此年份为 0 - 99年 若超过99 则century 置1 代表一个世纪}/*校年月日等数据*/void DS3213_SetRegData(DS3231_Data_Typedef *HexData){DS3231.DS3231_RegData.Second = DC3231_HEX_TO_BCD(HexData->Second);//转换秒数据DS3231.DS3231_RegData.Minute = DC3231_HEX_TO_BCD(HexData->Minute);//转换分数据DS3231.DS3231_RegData.Hour = ((DS3231.DS3231_RegData.Hour & 0xC0) | (DC3231_HEX_TO_BCD(HexData->Hour)));//转换小时数据DS3231.DS3231_RegData.Day = DC3231_HEX_TO_BCD(HexData->Day);//转换星期DS3231.DS3231_RegData.Date = DC3231_HEX_TO_BCD(HexData->Date);//转换日期DS3231.DS3231_RegData.Month = DC3231_HEX_TO_BCD(HexData->Month) | (DS3231.DS3231_RegData.Month & 0x80);//转换月份DS3231.DS3231_RegData.Year = DC3231_HEX_TO_BCD(HexData->Year);//转换年数据DS3231_iicDevWrite_Handler(DS3231_ADDRESS,DS3231_SECONDS_REG,7,(u8 *)&DS3231.DS3231_RegData.Second);//写入DS3213}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。