📄 ds1302.c
字号:
/***********************************************
程序名称:实时时钟芯片DS1302控制函数
晶振大小:11.0592MHz
作 者: 周徐良
创建日期: 2005年1月31日
修改日期:
***********************************************/
#include <stdio.h>
#include <intrins.h>
#include <reg52.h>
//定义宏
#define uchar unsigned char
#define uint unsigned int
//系统位端口定义
sbit DS1302_CLK=P1^0;
sbit DS1302_IO=P1^1;
sbit DS1302_RST=P1^2;
void DS1302_writebyte(uchar byte_data);
uchar DS1302_readbyte(void);
void DS1302_writedata(uchar addr,uchar byte_data);
uchar DS1302_readdata(uchar addr);
void DS1302_settime(uchar *p);
void DS1302_readtime(uchar *p);
void DS1302_initialize(void);
/*****************************************
函 数 名:void DS1302_initialize(void)
功 能:初始化DS1302
入口参数:无
出口参数:无
返 回 值:无
***********************************************************/
void DS1302_initialize(void)
{
uchar sec;
uchar hour;
//DS1302_RST=0;
//DS1302_CLK=0;
DS1302_writedata(0x90,0x00);//初始化慢速充电寄存器(Trickle charge)
sec=DS1302_readdata(0x81); //读取秒寄存器数据
//if(sec&0x80) //判断秒寄存器时钟暂停位CH是否位1
// {
sec=sec&0x7F; //为1则改为0,启动时钟
DS1302_writedata(0x80,sec);//写入数据启动时钟
// }
hour=DS1302_readdata(0x85); //读取时寄存器数据
//if(hour&0x80) //时寄存器位7为1(12小时方式),改成24小时方式
// {
hour=hour&0x7F; //改成24小时方式
DS1302_writedata(0x84,hour);
// }
}
/***********************************************************
函 数 名:void DS1302_settime(uchar idata *p)
功 能:设置初始时间
入口参数:p:存放时间数据地址,初始时间格式为: 秒 分 时 日 月 星期 年
出口参数:无
返 回 值:无
***********************************************************/
void DS1302_settime(uchar *p)
{
uchar i;
uchar addr;
// uchar buf;
addr=0x8C; //DS1302中写年的值的寄存器地址
for(i=7;i>0;i--)
{
if(i==1||i==3)
*p=*p&0x7F;
//if(i==3)
//*p=*p&0x7F;
DS1302_writedata(addr,*p);
addr=addr-0x02;
//当i=6时,地址是设置星期,不用设置星期跳出本次循环
if(i==6)
continue;
p++;
}
}
/***********************************************************
函 数 名:void DS1302_readtime(uchar idata *p)
功 能:读取当前时间
入口参数:无
出口参数:p:存放时间数据地址,时间格式为: 秒 分 时 日 月 星期 年
返 回 值:无
***********************************************************/
void DS1302_readtime(uchar *p)
{
uchar i;
uchar addr;
addr=0x8D; //DS1302中寄存器地址
for(i=7;i>0;i--)
{
//i=6时是星期,不需要星期跳出本次循环
if(i==6)
{
addr-=2;
continue;
}
*p=DS1302_readdata(addr);
addr-=2;
p++;
}
}
/***********************************************************
函 数 名:DS1302_writedata(uchar idata addr,uchar idata byte_data)
功 能:往DS1302中某一地址写入1个数据,需先取消保护位
入口参数:addr:地址,byte_data:数据/命令
出口参数:无
返 回 值:无
***********************************************************/
void DS1302_writedata(uchar addr,uchar byte_data)
{
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302_writebyte(0x8E);
DS1302_writebyte(0x00);//WP=0,写操作
DS1302_CLK=1;
//DS1302_RST=0;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302_writebyte(addr);//先写地址
DS1302_writebyte(byte_data);//后写数据/命令
DS1302_CLK=1;
DS1302_RST=0;
//去除DS1302的写保护功能
//DS1302_RST=0;
//DS1302_CLK=0;
//DS1302_RST=1;
//DS1302_writebyte(0x8E);
//DS1302_writebyte(0x80);//WP=1,写保护
//DS1302_CLK=1;
//DS1302_RST=0;
}
/***********************************************************
函 数 名:uchar DS1302_readdata(uchar idata addr)
功 能:从DS1302中某一地址读取1个数据
入口参数:addr:地址
出口参数:无
返 回 值:byte_data
***********************************************************/
uchar DS1302_readdata(uchar addr)
{
uchar byte_data;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302_writebyte(addr); //先发送命令
byte_data=DS1302_readbyte();//读取1个字节数据并存放在DS1302_readbyte中
DS1302_CLK=1;
DS1302_RST=0;
return(byte_data);
}
/**********************************************************
函 数 名:DS1302_writebyte(uchar idata byte_data)
功 能:写1个字节数据到DS1302中
入口参数:byte_data:需要写入的数据
出口参数:无
返 回 值:无
**********************************************************/
void DS1302_writebyte(uchar byte_data) //上升沿写入数据
{
uchar i;
for(i=8;i>0;i--)
{
DS1302_IO=(bit)(byte_data&0x01); //先传低位即位0
DS1302_CLK=1;
DS1302_CLK=0;
byte_data>>=1;
}
}
/***********************************************************
函 数 名:DS1302_readbyte(void)
功 能:从DS1302中读1个字节数据
入口参数:无
出口参数:无
返 回 值:byte_data
***********************************************************/
uchar DS1302_readbyte(void) //下降沿输出数据
{
uchar byte_data;
uchar i;
byte_data=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;//置单片机I/O口为输入方式
byte_data>>=1;
if(DS1302_IO)
byte_data|=0x80;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(byte_data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -