标题:
DS1302.H文件下载
[打印本页]
作者:
daniu
时间:
2014-12-25 20:41
标题:
DS1302.H文件下载
0.png
(41.6 KB, 下载次数: 95)
下载附件
2017-1-12 02:31 上传
时钟芯片驱动文件ds1302.h文件下载:
DS1302.rar
(1.82 KB, 下载次数: 225)
2017-1-12 02:31 上传
点击文件名下载附件
下载积分: 黑币 -5
部分内容预览:
/*
把我一直珍藏的程序全部拿出来,给大家共享,这也让我想起来,我刚学的时候,搜集资料是那么辛苦,而且找不到完整的资料,我将把我整理的和自己制作的H文件共享出来,只要修改定义端口,便可以随意的调用,以后我还会慢慢完善我的C资料,也希望大家给我指出程序的漏洞和缺点,已达到相互学习目地。
*/
#ifndef __DS1302_h__
#define __DS1302_h__
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//写指令宏定义地址
#define WRITE_SECOND 0x80//秒钟
#define WRITE_MINUTE 0x82//分钟
#define WRITE_HOUR 0x84//小时
#define WRITE_DATE 0x86//日
#define WRITE_MONTH 0x88//月
#define WRITE_WEEK 0x8a//星期
#define WRITE_YEAR 0x8c//年
//读指令宏定义地址
#define READ_SECOND 0x81//秒钟
#define READ_MINUTE 0x83//分钟
#define READ_HOUR 0x85//小时
#define READ_DATE 0x87//日
#define READ_MONTH 0x89//月
#define READ_WEEK 0x8b//星期
#define READ_YEAR 0x8d//年
//读写保护宏定义地址
#define WRITE_PROTECT 0x8E//写保护
uchar data tab[]={"0123456789"};
char *p;//定义一个指针处理星期字符串
//位寻址寄存器定义
sbit ACC_7 = ACC^7;
//管脚定义
sbit SCLK = P2^0; // DS1302时钟信号7脚
sbit DIO= P2^1; // DS1302数据信号6脚
sbit CE = P2^2; // DS1302片选5脚
uchar second,minute,hour;//时分秒
uint second_1,second_0,minute_1,miunte_0,hour_1,hour_0;
uchar week;//星期
uchar date,month,year;//年月日
uint date_1,date_0,month_1,month_0,year_1,year_0;
/**************************地址、数据发送子程序*************************/
void Write1302 ( unsigned char addr,dat )//写子程序
{
unsigned char i,temp;
CE=0; //CE引脚为低,数据传送中止
SCLK=0; //清零时钟总线
CE = 1; //CE引脚为高,逻辑控制有效
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0;
temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节
addr >>= 1; //右移一位
SCLK = 1;
}
//发送数据
for ( i=8; i>0; i-- )
{
SCLK = 0;
temp = dat;
DIO = (bit)(temp&0x01);
dat >>= 1;
SCLK = 1;
}
CE = 0;
}
/****************************数据读取子程序********************************/
unsigned char Read1302 ( unsigned char addr )//读子程序
{
unsigned char i,temp,dat1,dat2;
CE=0;
SCLK=0;
CE = 1;
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0;
temp = addr;
DIO = (bit)(temp&0x01); //每次传输低字节
addr >>= 1; //右移一位
SCLK = 1;
}
//读取数据
for ( i=8; i>0; i-- )
{
ACC_7=DIO;
SCLK = 1;
ACC>>=1;
SCLK = 0;
}
CE=0;
dat1=ACC;
dat2=dat1/16; //数据进制转换
dat1=dat1%16; //十六进制转十进制
dat1=dat1+dat2*10;
return (dat1);
}
/*******************************初始化DS1302***********************************/
void Initial(void)//上电初始化化模块2010年12月26号22点10分00秒星期日
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x30); //秒位初始化
Write1302 (WRITE_MINUTE,0x59); //分钟初始化
Write1302 (WRITE_HOUR,0x23); //小时初始化,默认24小时制
Write1302 (WRITE_DATE,0x26); //日期初始化
Write1302 (WRITE_MONTH,0x12); //月初始化
Write1302 (WRITE_WEEK,0x07); //星期初始化,01-07
Write1302 (WRITE_YEAR,0x10); //年初始化00-99
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
/*******************************校时初始化*************************************/
/*void correct()//校时模块
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x00); //秒位初始化
Write1302 (WRITE_MINUTE,0x30); //分钟初始化
Write1302 (WRITE_HOUR,0x21); //小时初始化,默认24小时制
Write1302 (WRITE_DATE,0x26); //日期初始化
Write1302 (WRITE_MONTH,0x12); //月初始化
Write1302 (WRITE_WEEK,0x07); //星期初始化,01-07
Write1302 (WRITE_YEAR,0x10); //年初始化00-99
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
/*******************************星期转化程序***********************************/
void week_c()//星期转化
{
char *pp;//定义一个局部指针
switch(week)
{
case 1:pp="Mon 1";break;
case 2:pp="Tue 2";break;
case 3:pp="Wed 3";break;
case 4:pp="Tur 4";break;
case 5:pp="Fri 5";break;
case 6:pp="Sat 6";break;
case 7:pp="Sun 7";break;
default:pp="error";break;
}
p=pp;//函数地址赋值
}
/*******************************数据刷新DS1302*********************************/
void freshtime()//读取时间
{
second=Read1302 (READ_SECOND);//读取十进制数
minute=Read1302 (READ_MINUTE);
hour=Read1302 (READ_HOUR);
date=Read1302 (READ_DATE);
month=Read1302 (READ_MONTH);
week=Read1302 (READ_WEEK);
year=Read1302 (READ_YEAR);
second_1=second/10;//高位赋值
second_0=second-second_1*10;//低位赋值
minute_1=minute/10;
miunte_0=minute-minute_1*10;
hour_1=hour/10;
hour_0=hour-hour_1*10;
date_1=date/10;
date_0=date-date_1*10;
month_1=month/10;
month_0=month-month_1*10;
year_1=year/10;
year_0=year-year_1*10;
}
#endif
复制代码
作者:
绿源学习者
时间:
2015-1-18 13:25
怎么调用呢,怎么才能显示出来呢
作者:
wmt1432
时间:
2015-5-13 22:30
先看看再说
作者:
JKwang
时间:
2015-5-18 11:32
感谢楼主分享
作者:
jjbboox
时间:
2015-5-18 19:19
这两个函数放在头文件里面有什么意义吗?
/*******************************初始化DS1302***********************************/
void Initial(void)//上电初始化化模块2010年12月26号22点10分00秒星期日
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x30); //秒位初始化
Write1302 (WRITE_MINUTE,0x59); //分钟初始化
Write1302 (WRITE_HOUR,0x23); //小时初始化,默认24小时制
Write1302 (WRITE_DATE,0x26); //日期初始化
Write1302 (WRITE_MONTH,0x12); //月初始化
Write1302 (WRITE_WEEK,0x07); //星期初始化,01-07
Write1302 (WRITE_YEAR,0x10); //年初始化00-99
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
/*******************************校时初始化*************************************/
/*void correct()//校时模块
{
Write1302 (WRITE_PROTECT,0X00); //禁止写保护
Write1302 (WRITE_SECOND,0x00); //秒位初始化
Write1302 (WRITE_MINUTE,0x30); //分钟初始化
Write1302 (WRITE_HOUR,0x21); //小时初始化,默认24小时制
Write1302 (WRITE_DATE,0x26); //日期初始化
Write1302 (WRITE_MONTH,0x12); //月初始化
Write1302 (WRITE_WEEK,0x07); //星期初始化,01-07
Write1302 (WRITE_YEAR,0x10); //年初始化00-99
Write1302 (WRITE_PROTECT,0x80); //允许写保护
}
作者:
jjbboox
时间:
2015-5-18 19:20
本帖最后由 jjbboox 于 2015-5-18 19:31 编辑
另外头文件里面出现函数的本体应该也不是一个好的编程风格吧。
可以写成下面这样,把函数体写到ds1302.c文件中,以后要用的时候把ds1302.c一起添加到工程里就可以了。
另外DS1302有一种突发读取模式,可以一次性将所有的时间寄存器的值都读进来。可以提高程序运行的效率。
当然可以直接在ds1302.h中定义一个数据结构来存放读进来的完整的时间信息。如下面代码中的
struct DS1302_REG结构
#ifndef __DS1302_H__
#define __DS1302_H__
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit SCLK =P2^0;
sbit SDA =P2^1;
sbit RST =P2^2;
//DS1302各时间寄存器读取地址
#define DS1302_ADDR_YEAR_W 0x8C
#define DS1302_ADDR_WEEK_W 0x8A
#define DS1302_ADDR_MONTH_W 0x88
#define DS1302_ADDR_DAY_W 0x86
#define DS1302_ADDR_HOUR_W 0x84
#define DS1302_ADDR_MIN_W 0x82
#define DS1302_ADDR_SEC_W 0x80
//DS1302各时间寄存器写入地址
#define DS1302_ADDR_YEAR_R 0x8D
#define DS1302_ADDR_WEEK_R 0x8B
#define DS1302_ADDR_MONTH_R 0x89
#define DS1302_ADDR_DAY_R 0x87
#define DS1302_ADDR_HOUR_R 0x85
#define DS1302_ADDR_MIN_R 0x83
#define DS1302_ADDR_SEC_R 0x81
//DS1302寄存器起始地址
#define DS1302_ADDR_REG0_W 0x80
#define DS1302_ADDR_REG0_R 0x81
//DS1302内存起始地址
#define DS1302_ADDR_RAM0_W 0xC0
#define DS1302_ADDR_RAM0_R 0xC1
//写保护控制寄存器
#define DS1302_ADDR_W_EN_W 0x8E
#define DS1302_ADDR_W_EN_R 0x8F
//突发模式地址
#define DS1302_ADDR_BURST_REG_R 0xBF
#define DS1302_ADDR_BURST_REG_W 0xBE
#define DS1302_BURST_LEN_REG 8
//读写模式
#define DS1302_READ 0
#define DS1302_WRITE 1
//时间显示字符串处理类型
#define DS1302_STR_DATE 0
#define DS1302_STR_TIME 1
#define DS1302_STR_WEEK 2
//DS1302启停命令
#define DS1302_ADDR_COMM_START 0x80
#define DS1302_COMM_START 0x00
#define DS1302_COMM_STOP 0x80
//DS1302寄存器结构
struct DS1302_REG{
uchar ucSec; //秒 0-59 BCD码
uchar ucMin; //分 0-59 BCD码
uchar ucHour; //小时 0-23 BCD码
uchar ucDay; //日 1-31 BCD码
uchar ucMonth; //月 1-12 BCD码
uchar ucWeek; //星期 1-7 BCD码
uchar ucYear; //年 0-99 BCD码
uchar ucWP; //写保护 最高位有效 0:可写入,1:写保护
};
//接口函数定义
//突发模式读取寄存器以及内存方法
extern void readDS1302BurstReg(struct DS1302_REG *);
extern void writeDS1302BurstReg(struct DS1302_REG *);
extern void DS1302Write(uchar cmd,uchar dat);
//时间出力函数
extern void getFormatDateStr(uchar, struct DS1302_REG *,uchar *);
#endif
复制代码
作者:
我来啦
时间:
2016-4-12 16:51
怎么点击下载不了呢??
作者:
lids
时间:
2016-9-26 15:49
很好的资料
作者:
caomai615
时间:
2016-12-4 21:50
谢谢分享
作者:
吹吹风
时间:
2017-1-16 19:53
谢谢楼主。。。
作者:
William330
时间:
2017-4-4 11:56
好东西
作者:
lqh226
时间:
2017-7-30 16:35
不错不错
作者:
zdmjjp
时间:
2017-10-28 14:55
感谢楼主分享
作者:
SunZm
时间:
2017-11-4 17:48
感谢分享
作者:
qq631946386
时间:
2018-5-20 12:44
查看一下
作者:
黑电
时间:
2018-7-5 18:04
是楼主自己写的,还是官方的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1