📄 ds1302.lst
字号:
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /********************************************************************
2 模块名称:DS1302.c
3 功 能:实时时钟模块 时钟芯片型号:DS1302
4 designer:yinyuanjun
5 *********************************************************************/
6 #include <stc89c54rd+.h>
7
8 sbit T_CLK = P1^2; /*实时时钟时钟线引脚 */
9 sbit T_IO = P1^3; /*实时时钟数据线引脚 */
10 sbit T_RST = P1^4; /*实时时钟复位线引脚 */
11
12 sbit ACC0 = ACC^0;
13 sbit ACC7 = ACC^7;
14
15 void RTInputByte(unsigned char); /* 输入 1Byte */
16 unsigned char RTOutputByte(void); /* 输出?1Byte */
17 void W1302(unsigned char, unsigned char);
18 unsigned char R1302(unsigned char);
19 void Set1302(unsigned char *); /* 设置时间 */
20 void Bcd2asc(unsigned char,unsigned char *);
21 void Get1302(unsigned char curtime[]); /* 读取1302当前时间 */
22 /********************************************************************
23 函 数 名:RTInputByte()
24 功 能:实时时钟写入一字节
25 说 明:往DS1302写入1Byte数据 (内部函数)
26 入口参数:d 写入的数据
27 designer:yinyuanjun
28 ***********************************************************************/
29 void RTInputByte(unsigned char d)
30 {
31 1 unsigned char i;
32 1 ACC = d;
33 1 for(i=8; i>0; i--)
34 1 {
35 2 T_IO = ACC0; /*相当于汇编中的 RRC */
36 2 T_CLK = 1;
37 2 T_CLK = 0;
38 2 ACC = ACC >> 1;
39 2 }
40 1 }
41 /********************************************************************
42 函 数 名:RTOutputByte()
43 功 能:实时时钟读取一字节
44 说 明:从DS1302读取1Byte数据 (内部函数)
45 入口参数:无
46 返 回 值:ACC
47 designer:yinyuanjun
48 ***********************************************************************/
49 unsigned char RTOutputByte(void)
50 {
51 1 unsigned char i;
52 1 for(i=8; i>0; i--)
53 1 {
54 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
55 2 ACC7 = T_IO;
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 2
56 2 T_CLK = 1;
57 2 T_CLK = 0;
58 2 }
59 1 return(ACC);
60 1 }
61 /********************************************************************
62 函 数 名:W1302()
63 功 能:往DS1302写入数据
64 说 明:先写地址,后写命令/数据 (内部函数)
65 调 用:RTInputByte() , RTOutputByte()
66 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
67 返 回 值:无
68 designer:yinyuanjun
69 ***********************************************************************/
70 void W1302(unsigned char ucAddr, unsigned char ucDa)
71 {
72 1 T_RST = 0;
73 1 T_CLK = 0;
74 1 T_RST = 1;
75 1 RTInputByte(ucAddr); /* 地址,命令 */
76 1 RTInputByte(ucDa); /* 写1Byte数据*/
77 1 T_CLK = 1;
78 1 T_RST = 0;
79 1 }
80 /********************************************************************
81 函 数 名:R1302()
82 功 能:读取DS1302某地址的数据
83 说 明:先写地址,后读命令/数据 (内部函数)
84 调 用:RTInputByte() , RTOutputByte()
85 入口参数:ucAddr: DS1302地址
86 返 回 值:ucData :读取的数据
87 designer:yinyuanjun
88 ***********************************************************************/
89 unsigned char R1302(unsigned char ucAddr)
90 {
91 1 unsigned char ucData;
92 1 T_RST = 0;
93 1 T_CLK = 0;
94 1 T_RST = 1;
95 1 RTInputByte(ucAddr); /* 地址,命令 */
96 1 ucData = RTOutputByte(); /* 读1Byte数据 */
97 1 T_CLK = 1;
98 1 T_RST = 0;
99 1 return(ucData);
100 1 }
101 /********************************************************************
102 函 数 名:BurstW1302T()
103 功 能:往DS1302写入时钟数据(多字节方式)
104 说 明:先写地址,后写命令/数据
105 调 用:RTInputByte()
106 入口参数:pWClock: 时钟数据地址
107 格式为: 秒 分 时 日 月 星期 年 控制
108 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
109 返 回 值:无
110 designer:yinyuanjun
111 ***********************************************************************/
112 void BurstW1302T(unsigned char *pWClock)
113 {
114 1 unsigned char i;
115 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
116 1 T_RST = 0;
117 1 T_CLK = 0;
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 3
118 1 T_RST = 1;
119 1 RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
120 1 for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
121 1 {
122 2 RTInputByte(*pWClock); /* 写1Byte数据*/
123 2 pWClock++;
124 2 }
125 1 T_CLK = 1;
126 1 T_RST = 0;
127 1 }
128 /********************************************************************
129 函 数 名:BurstR1302T()
130 功 能:读取DS1302时钟数据
131 说 明:先写地址/命令,后读数据(时钟多字节方式)
132 调 用:RTInputByte() , RTOutputByte()
133 入口参数:pRClock: 读取时钟数据地址
134 格式为: 秒 分 时 日 月 星期 年
135 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
136 返 回 值:无
137 designer:yinyuanjun
138 ***********************************************************************/
139 void BurstR1302T(unsigned char *pRClock)
140 {
141 1 unsigned char i;
142 1 T_RST = 0;
143 1 T_CLK = 0;
144 1 T_RST = 1;
145 1 RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
146 1 for (i=8; i>0; i--)
147 1 {
148 2 *pRClock = RTOutputByte(); /* 读1Byte数据 */
149 2 pRClock++;
150 2 }
151 1 T_CLK = 1;
152 1 T_RST = 0;
153 1 }
154 /********************************************************************
155 函 数 名:BurstW1302R()
156 功 能:往DS1302寄存器数写入数据(多字节方式)
157 说 明:先写地址,后写数据(寄存器多字节方式)
158 调 用:RTInputByte()
159 入口参数:pWReg: 寄存器数据地址
160 返 回 值:无
161 designer:yinyuanjun
162 ***********************************************************************/
163 void BurstW1302R(unsigned char *pWReg)
164 {
165 1 unsigned char i;
166 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
167 1 T_RST = 0;
168 1 T_CLK = 0;
169 1 T_RST = 1;
170 1 RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
171 1 for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
172 1 {
173 2 RTInputByte(*pWReg); /* 写1Byte数据*/
174 2 pWReg++;
175 2 }
176 1 T_CLK = 1;
177 1 T_RST = 0;
178 1 }
179 /********************************************************************
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 4
180 函 数 名:BurstR1302R()
181 功 能:读取DS1302寄存器数据
182 说 明:先写地址,后读命令/数据(寄存器多字节方式)
183 调 用:RTInputByte() , RTOutputByte()
184 入口参数:pRReg: 寄存器数据地址
185 designer:yinyuanjun
186 ***********************************************************************/
187 void BurstR1302R(unsigned char *pRReg)
188 {
189 1 unsigned char i;
190 1 T_RST = 0;
191 1 T_CLK = 0;
192 1 T_RST = 1;
193 1 RTInputByte(0xff); /* 0xff:时钟多字节读命令 */
194 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
195 1 {
196 2 *pRReg = RTOutputByte(); /* 读1Byte数据 */
197 2 pRReg++;
198 2 }
199 1 T_CLK = 1;
200 1 T_RST = 0;
201 1 }
202 /********************************************************************
203 函 数 名:Set1302()
204 功 能:设置初始时间
205 说 明:先写地址,后读命令/数据(寄存器多字节方式)
206 调 用:W1302()
207 入口参数:pClock: 设置时钟数据
208 地址格式为: 秒 分 时 日 月 星期 年
209 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
210 designer:yinyuanjun
211 ***********************************************************************/
212 void Set1302(unsigned char *pClock)
213 {
214 1 unsigned char i;
215 1 unsigned char ucAddr = 0x80;
216 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
217 1 for(i =7; i>0; i--)
218 1 {
219 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
220 2 pClock++;
221 2 ucAddr +=2;
222 2 }
223 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
224 1 }
225 /********************************************************************
226 函 数 名:Get1302()
227 功 能:读取DS1302当前时间
228 调 用:R1302()
229 入口参数:ucCurtime: 保存当前时间地址。
230 当前时间格式为: 秒 分 时 日 月 星期 年
231 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
232 designer:yinyuanjun
233 ***********************************************************************/
234 void Get1302(unsigned char ucCurtime[])
235 {
236 1 unsigned char i;
237 1 unsigned char ucAddr = 0x81;
238 1 for (i=0; i<7; i++)
239 1 {
240 2 ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
241 2 ucAddr += 2;
C51 COMPILER V7.06 DS1302 07/24/2006 09:31:56 PAGE 5
242 2 }
243 1 }
244
245
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 4
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -