DS1302.H 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #ifndef __DS1302_H__
  2. #define __DS1302_H__
  3. #define HOU_MIN 0
  4. #define MIN_SECOND 1
  5. #define MON_DAY 2
  6. #define YEAR_S 3
  7. #define MON_DAY_HOU_MIN 4
  8. #define SET_HOU_MIN 5
  9. #define MAX_STATE 6
  10. #define AM(X) X
  11. #define PM(X) (X+12) //转成24小时制
  12. #define DS1302_SECOND 0x80 //秒寄存器
  13. #define DS1302_MINUTE 0x82 //分寄存器
  14. #define DS1302_HOUR 0x84 //时
  15. #define DS1302_WEEK 0x8A //周
  16. #define DS1302_DAY 0x86 //日
  17. #define DS1302_MONTH 0x88 //月
  18. #define DS1302_YEAR 0x8C //年
  19. #define DS1302_READ 0x01 //读操作,因为读的时候地址要加1,使最低位为1
  20. #define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
  21. sbit T_CLK=P1^2;
  22. sbit T_IO =P1^1;
  23. sbit T_RST=P1^0;
  24. sbit ACC0=ACC^0;
  25. sbit ACC7=ACC^7;
  26. typedef struct __SYSTEMTIME__
  27. {
  28. unsigned char Second;
  29. unsigned char Minute;
  30. unsigned char Hour;
  31. unsigned char Week;
  32. unsigned char Day;
  33. unsigned char Month;
  34. unsigned char Year;
  35. unsigned char DateString[9];
  36. unsigned char TimeString[9];
  37. }SYSTEMTIME; //定义的时间类型
  38. //********DS1302读写程序***************
  39. /********************************************************************
  40. 函 数 名:RTInputByte()
  41. 功 能:实时时钟写入一字节
  42. 说 明:往DS1302写入1Byte数据 (内部函数)
  43. 入口参数:d 写入的数据
  44. 返 回 值:无
  45. ***********************************************************************/
  46. void RTInputByte(unsigned char d)
  47. {
  48. unsigned char i;
  49. ACC = d;
  50. for(i=8; i>0; i--)
  51. {
  52. T_IO = ACC0; //相当于汇编中的 RRC
  53. T_CLK = 1;
  54. T_CLK = 0;
  55. ACC = ACC >> 1;
  56. }
  57. }
  58. /********************************************************************
  59. 函 数 名:RTOutputByte()
  60. 功 能:实时时钟读取一字节
  61. 说 明:从DS1302读取1Byte数据 (内部函数)
  62. 入口参数:无
  63. 返 回 值:ACC
  64. 设 计:zhaojunjie 日 期:2002-03-19
  65. 修 改: 日 期:
  66. ***********************************************************************/
  67. unsigned char RTOutputByte(void)
  68. {
  69. unsigned char i;
  70. for(i=8; i>0; i--)
  71. {
  72. ACC = ACC >>1; //相当于汇编中的 RRC
  73. ACC7 = T_IO;
  74. T_CLK = 1;
  75. T_CLK = 0;
  76. }
  77. return(ACC);
  78. }
  79. /********************************************************************
  80. 函 数 名:Write1302()
  81. 功 能:往DS1302写入数据
  82. 说 明:先写地址,后写命令/数据 (内部函数)
  83. 调 用:RTInputByte() , RTOutputByte()
  84. 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
  85. 返 回 值:无
  86. ***********************************************************************/
  87. void Write1302(unsigned char ucAddr, unsigned char ucDa)
  88. {
  89. T_RST = 0;
  90. T_CLK = 0;
  91. T_RST = 1;
  92. RTInputByte(ucAddr); // 地址,命令
  93. RTInputByte(ucDa); // 写1Byte数据
  94. T_CLK = 1;
  95. T_RST = 0;
  96. }
  97. /********************************************************************
  98. 函 数 名:Read1302()
  99. 功 能:读取DS1302某地址的数据
  100. 说 明:先写地址,后读命令/数据 (内部函数)
  101. 调 用:RTInputByte() , RTOutputByte()
  102. 入口参数:ucAddr: DS1302地址
  103. 返 回 值:ucData :读取的数据
  104. ***********************************************************************/
  105. unsigned char Read1302(unsigned char ucAddr)
  106. {
  107. unsigned char ucData;
  108. T_RST = 0;
  109. T_CLK = 0;
  110. T_RST = 1;
  111. RTInputByte(ucAddr); // 地址,命令
  112. ucData = RTOutputByte(); // 读1Byte数据
  113. T_CLK = 1;
  114. T_RST = 0;
  115. return(ucData);
  116. }
  117. /********************************************************************
  118. 函 数 名:Set1302()
  119. 功 能:设置初始时间
  120. 说 明:先写地址,后读命令/数据(寄存器多字节方式)
  121. 调 用:Write1302()
  122. 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
  123. 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
  124. 返 回 值:无
  125. ***********************************************************************/
  126. void Set1302(unsigned char *pClock)
  127. {
  128. unsigned char i;
  129. unsigned char ucAddr = 0x80;
  130. Write1302(0x8e,0x00); // 控制命令,WP=0,写操作
  131. for(i =7; i>0; i--)
  132. {
  133. Write1302(ucAddr,*pClock); // 秒 分 时 日 月 星期 年
  134. pClock++;
  135. ucAddr +=2;
  136. }
  137. Write1302(0x8e,0x80); // 控制命令,WP=1,写保护
  138. }
  139. /***************************************************************************/
  140. void DS1302_GetTime(SYSTEMTIME *Time)
  141. {
  142. #if 0
  143. unsigned char Address;
  144. Address = DS1302_SECOND|DS1302_READ;
  145. Time->Second = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16; //转换成10进制的秒
  146. Address = DS1302_MINUTE|DS1302_READ;
  147. Time->Minute = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
  148. Address = DS1302_HOUR|DS1302_READ;
  149. Time->Hour = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
  150. Address = DS1302_WEEK|DS1302_READ;
  151. Time->Week = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
  152. Address = DS1302_DAY|DS1302_READ;
  153. Time->Day = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
  154. Address = DS1302_MONTH|DS1302_READ;
  155. Time->Month = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
  156. Address = DS1302_YEAR|DS1302_READ;
  157. Time->Year = Read1302(Address)/16*10+Read1302(Address|DS1302_READ)%16;
  158. #else
  159. Time->Second = Read1302(DS1302_SECOND|DS1302_READ); //不转换成10进制的秒
  160. Time->Minute = Read1302(DS1302_MINUTE|DS1302_READ);
  161. Time->Hour = Read1302(DS1302_HOUR|DS1302_READ);
  162. Time->Week = Read1302(DS1302_WEEK|DS1302_READ);
  163. Time->Day = Read1302(DS1302_DAY|DS1302_READ);
  164. Time->Month = Read1302(DS1302_MONTH|DS1302_READ);
  165. Time->Year = Read1302(DS1302_YEAR|DS1302_READ);
  166. #endif
  167. }
  168. /*
  169. void DS1302_PutTime(SYSTEMTIME *Time)
  170. {
  171. unsigned char Address;
  172. Write1302(0x8e,0x00);//允许写操作
  173. Address = DS1302_SECOND;
  174. Write1302(Address,Time->Second/10*16+Time->Second%10); //转换成16进制的秒
  175. Address = DS1302_MINUTE;
  176. Write1302(Address,Time->Minute/10*16+Time->Minute%10);
  177. Address = DS1302_HOUR;
  178. Write1302(Address,Time->Hour/10*16+Time->Hour%10);
  179. Address = DS1302_WEEK;
  180. Write1302(Address,Time->Week/10*16+Time->Week%10);
  181. Address = DS1302_DAY;
  182. Write1302(Address,Time->Day/10*16+Time->Day%10);
  183. Address = DS1302_MONTH;
  184. Write1302(Address,Time->Month/10*16+Time->Month%10);
  185. Address = DS1302_YEAR;
  186. Write1302(Address,Time->Year/10*16+Time->Year%10);
  187. Write1302(0x8e,0x80);//写保护,禁止写操作
  188. }
  189. void DateToStr(SYSTEMTIME *Time)
  190. {
  191. Time->DateString[0] = Time->Year/10 + '0'; //数字类型转化为字符类型
  192. Time->DateString[1] = Time->Year%10 + '0';
  193. Time->DateString[2] = '-';
  194. Time->DateString[3] = Time->Month/10 + '0';
  195. Time->DateString[4] = Time->Month%10 + '0';
  196. Time->DateString[5] = '-';
  197. Time->DateString[6] = Time->Day/10 + '0';
  198. Time->DateString[7] = Time->Day%10 + '0';
  199. Time->DateString[8] = '\0';
  200. }
  201. void TimeToStr(SYSTEMTIME *Time)
  202. {
  203. Time->TimeString[0] = Time->Hour/10 + '0'; //数字类型转化为字符类型
  204. Time->TimeString[1] = Time->Hour%10 + '0';
  205. Time->TimeString[2] = ':';
  206. Time->TimeString[3] = Time->Minute/10 + '0';
  207. Time->TimeString[4] = Time->Minute%10 + '0';
  208. Time->TimeString[5] = ':';
  209. Time->TimeString[6] = Time->Second/10 + '0';
  210. Time->TimeString[7] = Time->Second%10 + '0';
  211. Time->DateString[8] = '\0';
  212. }
  213. */
  214. #endif