#include "AT89X52.H" #include "SysFunction.h"
#define uchar unsigned char sbit T_CLK=P1^4; sbit T_IO=P1^5; sbit T_RST=P1^6;
sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; /******************************************************************** 说 明:从DS1302读取1Byte数据 (内部函数) ***********************************************************************/ uchar RTInputByte(void) { uchar i; for(i=8; i>0; i--) {
ACC = ACC >>1; /*相当于汇编中的 RRC */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0;
} return(ACC);
} /******************************************************************** 说 明: 往DS1302写入1Byte数据 (内部函数) ***********************************************************************/ void RTOutputByte(uchar d) { uchar i; ACC = d; for(i=8; i>0; i--) { T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } /********************************************************************
函 数 名:W1302() 功 能:往DS1302写入数据 说 明:先写地址,后写命令/数据 (内部函数) 调 用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址, ucData: 要写的数据 ***********************************************************************/ void W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; sysnop();sysnop(); sysnop(); T_CLK = 0; sysnop(); sysnop();sysnop(); T_RST = 1; sysnop(); sysnop();sysnop(); RTOutputByte(ucAddr); /* 地址,命令 */ RTOutputByte(ucDa); /* 写1Byte数据*/ T_RST = 0; } /********************************************************************
函 数 名:R1302() 功 能:读取DS1302某地址的数据 说 明:先写地址,后读命令/数据 (内部函数) 调 用:RTInputByte() , RTOutputByte() 入口参数:ucAddr: DS1302地址 ***********************************************************************/ uchar R1302(uchar ucAddr) { T_RST = 0; sysnop(); sysnop();sysnop(); T_CLK = 0; sysnop(); sysnop();sysnop(); T_RST = 1; sysnop(); sysnop();sysnop(); RTOutputByte(ucAddr); /* 地址,命令 */ ucAddr = RTInputByte(); /* 读1Byte数据 */
T_CLK = 0; T_RST = 0; return(ucAddr); } /********************************************************************
函 数 名:BurstW1302T() 功 能:往DS1302写入时钟数据(多字节方式) 说 明:先写地址,后写命令/数据 调 用:RTInputByte() 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B ***********************************************************************/ /* void BurstW1302T(uchar *pWClock) { uchar i; W1302(0x8e,0x00); // 控制命令,WP=0,写操作? T_RST = 0; T_CLK = 0; T_RST = 1; RTOutputByte(0xbe); // 0xbe:时钟多字节写命令 for (i = 8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制 { RTOutputByte(*pWClock); // 写1Byte数据 pWClock++; } T_RST = 0; } */ /******************************************************************** 功 能:读取DS1302时钟数据 说 明:先写地址/命令,后读数据(时钟多字节方式) 调 用:RTInputByte() , RTOutputByte() 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年 6Byte (BCD码)1B 1B 1B 1B 1B 1B 1B ***********************************************************************/ /* void readtimedate(uchar *pRClock) { uchar i; T_RST = 0; sysnop(); sysnop();sysnop(); T_CLK = 0; sysnop(); sysnop();sysnop();
T_RST = 1; sysnop(); sysnop();sysnop();
RTOutputByte(0xbf); // 0xbf:时钟多字节读命令 for (i=6; i>0; i--) { *pRClock = RTInputByte(); // 读1Byte数据 pRClock++; } i=RTInputByte(); pRClock++; *pRClock = RTInputByte();
T_RST = 0; } */
//读时分秒 void readtime(uchar *timebuff) { timebuff[0]= R1302(0x85); timebuff[1]= R1302(0x83); timebuff[2]= R1302(0x81); }
//读年月日 void readdate(uchar *datebuff) { datebuff[0]= R1302(0x8d); datebuff[1]= R1302(0x89); datebuff[2]= R1302(0x87); }
//写时分秒 void settime(uchar *timebuff) { W1302(0x8e,0); W1302(0x84,timebuff[0]); W1302(0x82,timebuff[1]); timebuff[2]&=0x7f; W1302(0x80,timebuff[2]); //启动时钟 W1302(0x8e,0x80); }
//写年月日 void setdate(uchar *datebuff) { W1302(0x8e,0); W1302(0x8c,datebuff[0]); W1302(0x88,datebuff[1]); W1302(0x86,datebuff[2]); W1302(0x8e,0); W1302(0x8e,0x80); //yy=yy&0x7f; //W1302(0x80,yy); //启动时钟
}
/*写年月日 void setdate(uchar yy,uchar mm,uchar dd) {
W1302(0x8c,yy); W1302(0x88,mm); W1302(0x86,dd);
yy=yy&0x7f; W1302(0x80,yy); //启动时钟
} //写时分秒 void settime(uchar hh,uchar mm,uchar ss) {
W1302(0x84,hh); W1302(0x82,mm); ss=ss&0x7f; W1302(0x80,ss); //启动时钟
}
*/ //1302 初始化 void init_ds1302() { unsigned char x; W1302(0x8e,0); W1302(0x90,0xa6); x=R1302(0x81); if((x & 0x80)!=0) W1302(0x80,0); W1302(0x8e,0x80); }
//读取指定地址RAM unsigned char byteget(unsigned char dsaddr) { W1302(0x8e,0); dsaddr=dsaddr<<1; dsaddr|=0xc1; W1302(0x8e,0x80); return R1302(dsaddr); } //写指定地址RAM void byteset(unsigned char dsaddr,unsigned char dadata) { W1302(0x8e,0); dsaddr=dsaddr<<1; dsaddr|=0xc0; W1302(dsaddr,dadata); W1302(0x8e,0x80); } |