| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- #ifndef __DS1302_H__
- #define __DS1302_H__
- #define HOU_MIN 0
- #define MIN_SECOND 1
- #define MON_DAY 2
- #define YEAR_S 3
- #define MON_DAY_HOU_MIN 4
- #define SET_HOU_MIN 5
- #define MAX_STATE 6
- #define AM(X) X
- #define PM(X) (X+12) //转成24小时制
- #define DS1302_SECOND 0x80 //秒寄存器
- #define DS1302_MINUTE 0x82 //分寄存器
- #define DS1302_HOUR 0x84 //时
- #define DS1302_WEEK 0x8A //周
- #define DS1302_DAY 0x86 //日
- #define DS1302_MONTH 0x88 //月
- #define DS1302_YEAR 0x8C //年
- #define DS1302_READ 0x01 //读操作,因为读的时候地址要加1,使最低位为1
- #define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
- sbit T_CLK=P1^2;
- sbit T_IO =P1^1;
- sbit T_RST=P1^0;
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- typedef struct __SYSTEMTIME__
- {
- unsigned char Second;
- unsigned char Minute;
- unsigned char Hour;
- unsigned char Week;
- unsigned char Day;
- unsigned char Month;
- unsigned char Year;
- unsigned char DateString[9];
- unsigned char TimeString[9];
- }SYSTEMTIME; //定义的时间类型
- //********DS1302读写程序***************
- /********************************************************************
- 函 数 名:RTInputByte()
- 功 能:实时时钟写入一字节
- 说 明:往DS1302写入1Byte数据 (内部函数)
- 入口参数:d 写入的数据
- 返 回 值:无
- ***********************************************************************/
- void RTInputByte(unsigned char d)
- {
- unsigned char i;
- ACC = d;
- for(i=8; i>0; i--)
- {
- T_IO = ACC0; //相当于汇编中的 RRC
- T_CLK = 1;
- T_CLK = 0;
- ACC = ACC >> 1;
- }
- }
- /********************************************************************
- 函 数 名:RTOutputByte()
- 功 能:实时时钟读取一字节
- 说 明:从DS1302读取1Byte数据 (内部函数)
- 入口参数:无
- 返 回 值:ACC
- 设 计:zhaojunjie 日 期:2002-03-19
- 修 改: 日 期:
- ***********************************************************************/
- unsigned char RTOutputByte(void)
- {
- unsigned char i;
- for(i=8; i>0; i--)
- {
- ACC = ACC >>1; //相当于汇编中的 RRC
- ACC7 = T_IO;
- T_CLK = 1;
- T_CLK = 0;
- }
- return(ACC);
- }
- /********************************************************************
- 函 数 名:Write1302()
- 功 能:往DS1302写入数据
- 说 明:先写地址,后写命令/数据 (内部函数)
- 调 用:RTInputByte() , RTOutputByte()
- 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
- 返 回 值:无
- ***********************************************************************/
- void Write1302(unsigned char ucAddr, unsigned char ucDa)
- {
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); // 地址,命令
- RTInputByte(ucDa); // 写1Byte数据
- T_CLK = 1;
- T_RST = 0;
- }
- /********************************************************************
- 函 数 名:Read1302()
- 功 能:读取DS1302某地址的数据
- 说 明:先写地址,后读命令/数据 (内部函数)
- 调 用:RTInputByte() , RTOutputByte()
- 入口参数:ucAddr: DS1302地址
- 返 回 值:ucData :读取的数据
- ***********************************************************************/
- unsigned char Read1302(unsigned char ucAddr)
- {
- unsigned char ucData;
- T_RST = 0;
- T_CLK = 0;
- T_RST = 1;
- RTInputByte(ucAddr); // 地址,命令
- ucData = RTOutputByte(); // 读1Byte数据
- T_CLK = 1;
- T_RST = 0;
- return(ucData);
- }
- /********************************************************************
- 函 数 名:Set1302()
- 功 能:设置初始时间
- 说 明:先写地址,后读命令/数据(寄存器多字节方式)
- 调 用:Write1302()
- 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
- 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
- 返 回 值:无
- ***********************************************************************/
- void Set1302(unsigned char *pClock)
- {
- unsigned char i;
- unsigned char ucAddr = 0x80;
- Write1302(0x8e,0x00); // 控制命令,WP=0,写操作
- for(i =7; i>0; i--)
- {
- Write1302(ucAddr,*pClock); // 秒 分 时 日 月 星期 年
- pClock++;
- ucAddr +=2;
- }
- Write1302(0x8e,0x80); // 控制命令,WP=1,写保护
- }
- /***************************************************************************/
- void DS1302_GetTime(SYSTEMTIME *Time)
- {
- #if 0
- unsigned char Address;
- Address = DS1302_SECOND|DS1302_READ;
- Time->Second = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16; //转换成10进制的秒
- Address = DS1302_MINUTE|DS1302_READ;
- Time->Minute = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
- Address = DS1302_HOUR|DS1302_READ;
- Time->Hour = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
- Address = DS1302_WEEK|DS1302_READ;
- Time->Week = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
- Address = DS1302_DAY|DS1302_READ;
- Time->Day = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
- Address = DS1302_MONTH|DS1302_READ;
- Time->Month = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
- Address = DS1302_YEAR|DS1302_READ;
- Time->Year = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
- #else
- Time->Second = Read1302(DS1302_SECOND|DS1302_READ); //不转换成10进制的秒
- Time->Minute = Read1302(DS1302_MINUTE|DS1302_READ);
- Time->Hour = Read1302(DS1302_HOUR|DS1302_READ);
- Time->Week = Read1302(DS1302_WEEK|DS1302_READ);
- Time->Day = Read1302(DS1302_DAY|DS1302_READ);
- Time->Month = Read1302(DS1302_MONTH|DS1302_READ);
- Time->Year = Read1302(DS1302_YEAR|DS1302_READ);
- #endif
- }
- /*
- void DS1302_PutTime(SYSTEMTIME *Time)
- {
- unsigned char Address;
- Write1302(0x8e,0x00);//允许写操作
- Address = DS1302_SECOND;
- Write1302(Address,Time->Second/10*16+Time->Second%10); //转换成16进制的秒
- Address = DS1302_MINUTE;
- Write1302(Address,Time->Minute/10*16+Time->Minute%10);
- Address = DS1302_HOUR;
- Write1302(Address,Time->Hour/10*16+Time->Hour%10);
- Address = DS1302_WEEK;
- Write1302(Address,Time->Week/10*16+Time->Week%10);
- Address = DS1302_DAY;
- Write1302(Address,Time->Day/10*16+Time->Day%10);
- Address = DS1302_MONTH;
- Write1302(Address,Time->Month/10*16+Time->Month%10);
- Address = DS1302_YEAR;
- Write1302(Address,Time->Year/10*16+Time->Year%10);
- Write1302(0x8e,0x80);//写保护,禁止写操作
- }
- void DateToStr(SYSTEMTIME *Time)
- {
- Time->DateString[0] = Time->Year/10 + '0'; //数字类型转化为字符类型
- Time->DateString[1] = Time->Year%10 + '0';
- Time->DateString[2] = '-';
- Time->DateString[3] = Time->Month/10 + '0';
- Time->DateString[4] = Time->Month%10 + '0';
- Time->DateString[5] = '-';
- Time->DateString[6] = Time->Day/10 + '0';
- Time->DateString[7] = Time->Day%10 + '0';
- Time->DateString[8] = '\0';
- }
- void TimeToStr(SYSTEMTIME *Time)
- {
- Time->TimeString[0] = Time->Hour/10 + '0'; //数字类型转化为字符类型
- Time->TimeString[1] = Time->Hour%10 + '0';
- Time->TimeString[2] = ':';
- Time->TimeString[3] = Time->Minute/10 + '0';
- Time->TimeString[4] = Time->Minute%10 + '0';
- Time->TimeString[5] = ':';
- Time->TimeString[6] = Time->Second/10 + '0';
- Time->TimeString[7] = Time->Second%10 + '0';
- Time->DateString[8] = '\0';
- }
- */
- #endif
|