




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/* File name - ds1302.c* Author - By Sam Chan* Version - V1.0* Date - 08 - 23 - 2012* Brief - 时钟芯片DS1302驱动* Copyright (C) 20* All rights reserved* File Update* Version - V1.0.1* Author - By Sam Chan* Date - 10 - 20 - 2013 * Revise - A、增加对STM32控制的移植支持* - B、增加对内置的RAM操作相关函数* - C、增加检测DS1302是否存在,是否第一次上电检
2、测函数* - D、增加对DS1302内置的锂电池充电寄存器参数设置函数和结构体*/#include ds1302.h/*定义变量*/#define Date TimeValue.date#define Min TimeValue.minute#define Sec TimeValue.second#define Hour TimeValue.hour#define Week TimeValue.week#define Month TimeValue.month#define Year TimeValue.yearTime_Typedef TimeValue; /定义时间数据指针void Tim
3、e_Init()TimeValue.date=24;TimeValue.hour=6;TimeValue.minute=12;TimeValue.month=5;TimeValue.second=0;TimeValue.week=2;TimeValue.year=16;Charge_Typedef ChargeValue; /定义充电寄存器/* Function Name - GPIO初始化* Description - none* Input - none* Output - none* Reaturn - none */void DS1302_GPIOInit(void)GPIO_Init
4、TypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /开启GPIOC外设时钟/* 初始化GPIOC */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_
5、InitStructure);/* Function Name - DS1302写入一个字节数据* Description - none* Input - dat:要写入的数据* Output - none* Reaturn - none */void DS1302_Write_Byte(u8 dat)u8 i;DS1302_SDA_OUT(); /设置为输出口for(i=0;i= 1; /数据右移一位DS1302_SCL = 1; /发送数据,上升沿有效/* Function Name - DS1302读出一个字节数据* Description - none* Input - none* O
6、utput - none* Reaturn - 读到的数据 */unsigned DS1302_Read_Byte()u8 ReData=0x00;u8 i;DS1302_SDA_IN(); /设置为输入口for(i=0;i= 1; /数据右移一位,先读取低位,数据补“0”DS1302_SCL = 1; /上升沿读取数据return(ReData); /返回读取到的数据/* Function Name - 向DS1302某地址写入数据* Description - none* Input - add:要操作的地址* dat:要写入的数据* Output - none* Reaturn - no
7、ne*/void DS1302_Write_Data(u8 add,u8 dat)DS1302_RST = 0; /复位脚拉低DS1302_SCL = 0; /时钟线拉低DS1302_RST = 1; /复位脚拉高DS1302_Write_Byte(add); /写入要操作地址DS1302_Write_Byte(dat); /写入数据 /delay_us(5);DS1302_RST = 0;DS1302_SCL = 0;/* Function Name - 从DS1302某地址读取数据* Description - none* Input - add:要操作的地址* Output - none
8、* Reaturn - 要读取的寄存器的数值*/unsigned DS1302_Read_Data(u8 add)u8 Temp;DS1302_RST = 1;DS1302_Write_Byte(add); /写入要操作地址Temp = DS1302_Read_Byte(); /开始读取数据DS1302_RST = 0;return(Temp); /返回读取到的数据/* Function Name - 主电源对备用电池充电设置* Description - 如果备用电池接的是可充电的锂电池或者其他可充电电池的时候,* 可以打开DS1302的充电电路,利用主供电对电池进行充电,免的换电池的麻烦*
9、 Input - *CHG_dat:寄存器控制指针* Output - none* Reaturn - none*/void DS1302_Charge_Manage(Charge_Typedef* CHG_dat)u8 CHG_Value;CHG_Value = (CHG_dat-TCSx DSx RSx; DS1302_WP_Disable(); /取消写保护DS1302_Write_Data(Trickle_Charger_Address,CHG_Value);DS1302_WP_Enable(); /打开写保护/* Function Name - DS1302内置的RAM读写操作* D
10、escription - none* Input - *pBuff:读写数据存放区* WRadd:读写起始地址,范围在RAM_Address0 RAM_Address28之间,最后一位地址有其他用途* num:读写字节数据的数量,范围在1 28之间* RW:读写判断位。0x00为写操作,0x01为读操作* Output - none* Reaturn - none*/void DS1302_RAM_WriteRead_Data(u8* pBuff,u8 WRadd,u8 num,u8 RW) u8 i; if(WRadd = RAM_Address29) return; /要写入数据的RAM地
11、址是最后一个,直接退出/因为最后一个字节是用来检测DS1302的if(RW = 0x00) /写数据操作for(i = 0;i num;i+)DS1302_WP_Disable(); /取消写保护DS1302_Write_Data(WRadd+(i1),pBuffi);DS1302_WP_Enable(); /打开写保护elsefor(i = 0;i num;i+)DS1302_WP_Disable(); /取消写保护pBuffi = DS1302_Read_Data(WRadd+1+(i 测试设备好坏* Description - 在DS1302芯片的RAM的最后一个地址写入一个数据并读出来
12、判断* 与上次写入的值相等,不是第一次上电,否则则初始化时间* Input - none* Output - none* Reaturn - 0:设备正常并不是第一次上电* 1:设备错误或者已损坏*/u8 DS1302_Check(void)u8 test_value;DS1302_WP_Disable(); /取消写保护test_value = DS1302_Read_Data(RAM_Address29 + 1); /读出最后一个RAM地址里的数据DS1302_WP_Enable(); /打开写保护if(test_value = test_data) /判断数据是否对return 0; /
13、设备正常,不是第一次上电elsereturn 1; /不是第一次上电或者设备异常 / DS1302_WP_Disable(); /取消写保护/ DS1302_Write_Data(RAM_Address29,0x55); /向RAM最后一个地址里写入数据/ DS1302_WP_Enable(); /打开写保护/ / _nop_();_nop_();/ / DS1302_WP_Disable(); /取消写保护/ test_value = DS1302_Read_Data(RAM_Address29 + 1); /读出最后一个RAM地址里的数据/ DS1302_WP_Enable(); /打开写
14、保护/ / if(test_value = test_data) return 0; /设备正常,不是第一次上电/ return 1; /设备不在线或者已损坏/* Function Name - DS1302初始化* Description - none* Input - *Time: 时间结构体指针* Output - none* Reaturn - none*/void DS1302_Init(Time_Typedef* Time) DS1302_RST = 0;DS1302_SCL = 0;DS1302_WP_Disable(); /取消写保护DS1302_Write_Data(Addr
15、ess_year,(Time-year)/10)year)%10); /写年数据delay_us(3);DS1302_Write_Data(Address_week,(Time-week)/10)week)%10); /写星期数据delay_us(3);DS1302_Write_Data(Address_month,(Time-month)/10)month)%10);/写月数据delay_us(3);DS1302_Write_Data(Address_date,(Time-date)/10)date)%10); /写日数据delay_us(3);DS1302_Write_Data(Addre
16、ss_hour,(Time-hour)/10)hour)%10); /写小时数据delay_us(3);DS1302_Write_Data(Address_minute,(Time-minute)/10)minute)%10); /写分钟数据delay_us(3);DS1302_Write_Data(Address_second ,(Time-second)/10)second)%10); /写秒数据并使时钟运行delay_us(3);DS1302_WP_Enable(); /打开写保护DS1302_WP_Disable(); /取消写保护DS1302_Write_Data(RAM_Addre
17、ss29,test_data); /向RAM最后一个地址里写入数据DS1302_WP_Enable(); /打开写保护 mw_shl_code=c,true#include led.h#include delay.h#include sys.h#include ds1302.h#include usart.h#define Date TimeValue.date#define Min TimeValue.minute#define Sec TimeValue.second#define Hour TimeValue.hour#define Week TimeValue.week#define
18、Month TimeValue.month#define Year TimeValue.yearint main()Time_Typedef TimeValue;delay_init();LED_Init();uart_init(115200);DS1302_GPIOInit();DS1302_Init(&TimeValue);while(1)Sec=(DS1302_Read_Data(Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10);delay_us(3);Min=(DS1302_Read_Data(
19、Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10);delay_us(3);Hour=(DS1302_Read_Data(Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10);delay_us(3);Date=(DS1302_Read_Data(Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10);delay_us(3);Month
20、=(DS1302_Read_Data(Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10);delay_us(3);Week=(DS1302_Read_Data(Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10);delay_us(3);Year=(DS1302_Read_Data(Address_second|0x01)&0x0f+(DS1302_Read_Data(Address_second|0x01)4)*10
21、);delay_us(3);printf(%d年%d月%d日%d:%d:%d 星期%drn,Year,Month,Date,Hour,Min,Sec,Week);delay_ms(300);C 纯文本查看 复制代码?001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064
22、065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
23、165166167168169170171172173174175176177178179180181182183184185186187188189190191192193/* File name - ds1302.h* Author - By Sam Chan* Version - V1.0* Date - 08 - 23 - 2012* Brief - 时钟芯片DS1302驱动* Copyright (C) 20* All rights reserved* File Update* Version - V1.0.1* Author - By Sam Chan* Date - 10 - 2
24、0 - 2013 * Revise - A、增加对STM32控制的移植支持* - B、增加对内置的RAM操作相关函数* - C、增加检测DS1302是否存在,是否第一次上电检测函数* - D、增加对DS1302内置的锂电池充电寄存器参数设置函数和结构体*/#ifndef _ds1302_h_ #define _ds1302_h_/*外部函数头文件 */#include sys.h#include delay.h/*定义接口所接的IO不一样请修改这里设置IO的方向请修改这里,对于不是具有准双向IO的MCU*/#define DS1302_SDA_IN() GPIOC-CRL &= 0xfffff
25、0ff;GPIOC-CRL |= 8CRL &= 0xfffff0ff;GPIOC-CRL |= 0xa8;#define DS1302_RST PCout(0) /RST#define DS1302_SCL PCout(1) /SCL#define DS1302_SDA PCout(2) /SDA#define DS1302_IN_SDA PCin(2) /读取SDA上数据用到/*定义时间结构*/typedef structu8 year; /年u8 month; /月u8 date; /日u8 week; /星期u8 hour; /小时u8 minute; /分钟u8 second; /秒
26、钟 Time_Typedef;extern Time_Typedef TimeValue; /定义时间数据缓存#define test_data 0x55 /此数据用来检测DS1302是否存在于总线上用,可以改用其他值/*定义相关命令宏*/#define Clock_Address_Bass 0x80 /基地址#define Address_year (Clock_Address_Bass | 0x0c) /年#define Address_month (Clock_Address_Bass | 0x08) /月#define Address_date (Clock_Address_Bass
27、| 0x06) /日#define Address_week (Clock_Address_Bass | 0x0a) /星期#define Address_hour (Clock_Address_Bass | 0x04) /小时#define Address_minute (Clock_Address_Bass | 0x02) /分钟#define Address_second (Clock_Address_Bass | 0x00) /秒#define Clock_Burst (Clock_Address_Bass | 0x3e) /时钟软复位/写保护寄存器#define Address_WP
28、 (Clock_Address_Bass | 0x0e) /写保护#define WP_Enable 0x80 /打开写保护#define WP_Disable 0x00 /关闭写保护/*电源管理寄存器位描述bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0TCS3 TCS2 TCS1 TCS0 DS1 DS0 RS1 RS0TCSx:充电电流大小选择,值为0xa0时打开充电,其他值时关闭,DS1302默认是关闭的DSx:设置VCC1和VCC2之间的二极管串联数量,0x01时为串联一只二极管,0x10时为串联两只二极管,0x00或0x11时关闭充电功能RSx:设置限
29、流电阻大小,0x00为开路并关闭充电功能,0x01为2K,0x10为4K,0x11为8K*/充电管理寄存器结构typedef structu8 TCSx; /充电开关u8 DSx; /串联二极管u8 RSx; /限流电阻 Charge_Typedef;extern Charge_Typedef ChargeValue; /定义充电寄存器/电源管理#define Trickle_Charger_Address (Clock_Address_Bass | 0x10) /管理电源,主电源供电时可以设置给备用电池充电#define Open_Trickle_Charge 0x0a#define Clo
30、se_Trickle_Charge 0x00 /设置为其他值也可以#define One_Diode 0x01#define Two_Diode 0x10#define None_Diode 0x00 /or 0x11,断开串联并关闭充电功能#define Resistor_For2K 0x01#define Resistor_For4K 0x10#define Resistor_For8K 0x11#define None_Resistor 0x00 /断开串联限流电阻并关闭充电功能/RAM地址#define RAM_Address_Bass 0xc0 /基地址#define RAM_Address0 (RAM_Address_Bass | 0x00) /RAM地址 = 基地址 + 地址偏移量#define RAM_Address1 (RAM_Address_Bass | 0x02)#define RAM_Address2 (RAM_Address_Bass | 0x04)#define RAM_Address3 (RAM_Address_Bass | 0x06)#define RAM_Address4 (RAM_Address_Bass | 0x08)#define RAM_Address5 (RAM_Address_Bass | 0x0a)#defi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 投资设计咨询合同
- 人工智能在计算机视觉领域的应用试题
- 高效农事操作管理系统开发
- 电商行业智能库存管理方案
- 文化创意产业数字展示与体验系统方案
- 浙江国企招聘2024嘉兴南湖新丰镇下属国资公司招聘3人笔试参考题库附带答案详解
- 潍坊2025年山东潍坊科技学院高层次人才招聘50人笔试历年参考题库附带答案详解
- 山西省临汾新华中学2024-2025学年高一下学期开学收心考试英语试题(原卷版)
- 风险管理公司合并合同(2篇)
- 药店培训内容
- DB37-T 5026-2022《居住建筑节能设计标准》
- 眼内炎教学讲解课件
- 体育教学论-课件
- 拼音aoe 完整版教学课件
- 中医基础理论教学-课件
- 叉车使用申请表
- 注塑机日常保养点检表
- 《影视鉴赏(第二版)》课件2-4故事片表演
- 模具首试前检验标准
- 小学教育学详细讲义(黄济)
- 格宾网施工规程水利
评论
0/150
提交评论