1302.c
#include"ds1302.h"
/*--------------------------------------------------------------*/
//引脚定义声明
***it SCK=P3^2; //时钟
***it SDA=P3^3; //数据
***it RST = P2^4;// DS1302复位
bit ReadRTC_Flag;//定义读DS1302标志
unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00
//unsigned char l_tmpdisplay[8];
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
void reset_Ds1302(void) //复位
{
RST = 0;
SCK = 0;
RST = 1;
}
/* 写一个字节 */
/******************************************************************/
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCK=0;
SDA=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
SCK=1;
}
}
/*--------------------------------------------------------------*/
/* 写入DS1302 在指定地址写入指定的数据 */
/******************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
reset_Ds1302(); //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
SDA = 0;
RST=0; //恢复
}
/******************************************************************/
/* 读出DS1302数据 */
/******************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
reset_Ds1302();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCK=0;
temp>>=1; //右移一位
_nop_();
_nop_();
_nop_();
SCK=1;
}
RST=0;
_nop_(); //以下为DS1302复位的稳定时间
_nop_();
RST=0;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
return (temp); //返回
}
/*--------------------------------------------------------------*/
//是否写入保护
void DS1302_SetProtect(bit Flag)
{
if(Flag)
Write_Ds1302(0x8E,0x80); //0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302
else
Write_Ds1302(0x8E,0x00); //WP=0 允许数据写入DS1302
}
/******************************************************************/
/* 设定时钟数据 */
/******************************************************************/
void Set_RTC(void) //设定 日历
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++)
{ //BCD处理
tmp=l_tmpdate/10;
l_tmpdate=l_tmpdate%10;
l_tmpdate=l_tmpdate+tmp*16;
}
DS1302_SetProtect(0);//Write_Ds1302(0x8E,0X00);
p=write_rtc_address; //传地址
for(i=0;i<7;i++) //7次写入 秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate);
p++;
}
DS1302_SetProtect(1); //Write_Ds1302(0x8E,0x80); // 0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302
}
/******************************************************************/
/* 读时钟数据 */
/******************************************************************/
void Read_RTC(void) //读取 日历
{
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 秒分时日月周年
{
l_tmpdate=Read_Ds1302(*p);
p++;
}
}
/*--------------------------------------------------------------*/
//初始化DS1302
//void DS1302_Initial (void)
//{
// unsigned char Second=Read1302(DS1302_SECOND);
// if(Second&0x80)//bit7=CH CH=0 振荡器允许工作,CH=1振荡器停止工作
// DS1302_SetTime(DS1302_SECOND,0);
//}
/*--------------------------------------------------------------*/
|