📄 time_ds1302_51.lst
字号:
C51 COMPILER V7.06 TIME_DS1302_51 08/18/2008 11:08:39 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TIME_DS1302_51
OBJECT MODULE PLACED IN time_ds1302_51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE time_ds1302_51.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<reg51.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4 //**************************修改硬件时要修改的部分********************************
5
6 sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
7 sbit T_IO = P1^5; /*实时时钟数据线引脚 */
8 sbit T_RST = P1^4; /*实时时钟复位线引脚 */
9
10 sbit ACC0 = ACC^0;
11 sbit ACC7 = ACC^7;
12
13 void init_ds1302(void);
14 void RTInputByte(uchar); /* 输入 1Byte */
15 uchar RTOutputByte(void); /* 输出?1Byte */
16 void W1302(uchar, uchar);
17 uchar R1302(uchar);
18 void Set1302(uchar *); /* 设置时间 */
19 void Bcd2asc(uchar,uchar *);
20 void Get1302(uchar curtime[]); /* 读取1302当前时间 */
21
22 /********************************************************************
23 /*********************************************************************/
24 /* 实时时钟模块 时钟芯片型号:DS1302 */
25
26 void init_ds1302(void)//初始化ds1302
27 { //先写地址后写命令字或数据
28 1 W1302(0x8e, 0x00); //控制寄存器,关写保护位
29 1 W1302(0x90, 0xa4); //再充电寄存器,电池设置为不再充电
30 1 W1302(0x80, 0x00); //秒寄存器,CH位为0。秒的初值为00。
31 1 W1302(0x8e, 0x10);
32 1 }
33
34 /*********************************************************************/
35
36
37
38 //函 数 名:RTInputByte()
39 //功 能:实时时钟写入一字节
40 //说 明:往DS1302写入1Byte数据 (内部函数)
41 //入口参数:d 写入的数据
42 //返 回 值:无
43 //设 计:zhaojunjie
44 //***********************************************************************/
45 void RTInputByte(uchar d)
46 {
47 1 uchar i;
48 1 ACC = d;
49 1 for(i=8; i>0; i--)
50 1 {
51 2 T_IO = ACC0; /*相当于汇编中的 RRC */
52 2 T_CLK = 1;
53 2 T_CLK = 0;
54 2 ACC = ACC >> 1;
55 2 }
C51 COMPILER V7.06 TIME_DS1302_51 08/18/2008 11:08:39 PAGE 2
56 1 }
57 /********************************************************************
58
59 函 数 名:RTOutputByte()
60 功 能:实时时钟读取一字节
61 说 明:从DS1302读取1Byte数据 (内部函数)
62 入口参数:无
63 返 回 值:ACC
64 设 计:zhaojunjie
65
66 ***********************************************************************/
67 uchar RTOutputByte(void)
68 {
69 1 uchar i;
70 1 for(i=8; i>0; i--)
71 1 {
72 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
73 2 ACC7 = T_IO;
74 2 T_CLK = 1;
75 2 T_CLK = 0;
76 2 }
77 1 return(ACC);
78 1 }
79 /********************************************************************
80
81 函 数 名:W1302()
82 功 能:往DS1302写入数据
83 说 明:先写地址,后写命令/数据 (内部函数)
84 调 用:RTInputByte() , RTOutputByte()
85 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
86 返 回 值:无
87 设 计:zhaojunjie
88 ***********************************************************************/
89 void W1302(uchar ucAddr, uchar ucDa)
90 {
91 1 T_RST = 0;
92 1 T_CLK = 0;
93 1 T_RST = 1;
94 1 RTInputByte(ucAddr); /* 地址,命令 */
95 1 RTInputByte(ucDa); /* 写1Byte数据*/
96 1 T_CLK = 1;
97 1 T_RST = 0;
98 1 }
99 /********************************************************************
100
101 函 数 名:R1302()
102 功 能:读取DS1302某地址的数据
103 说 明:先写地址,后读命令/数据 (内部函数)
104 调 用:RTInputByte() , RTOutputByte()
105 入口参数:ucAddr: DS1302地址
106 返 回 值:ucData :读取的数据
107 设 计:zhaojunjie
108 ***********************************************************************/
109 uchar R1302(uchar ucAddr)
110 {
111 1 uchar ucData;
112 1 T_RST = 0;
113 1 T_CLK = 0;
114 1 T_RST = 1;
115 1 RTInputByte(ucAddr); /* 地址,命令 */
116 1 ucData = RTOutputByte(); /* 读1Byte数据 */
117 1 T_CLK = 1;
C51 COMPILER V7.06 TIME_DS1302_51 08/18/2008 11:08:39 PAGE 3
118 1 T_RST = 0;
119 1 return(ucData);
120 1 }
121 /********************************************************************
122
123 函 数 名:BurstW1302T()
124 功 能:往DS1302写入时钟数据(多字节方式)
125 说 明:先写地址,后写命令/数据
126 调 用:RTInputByte()
127 入口参数:pWClock: 时钟数据地址
128
129 格式为: 秒 分 时 日 月 星期 年 控制
130 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
131 返 回 值:无
132 设 计:zhaojunjie
133
134 ***********************************************************************/
135 void BurstW1302T(uchar *pWClock)
136 {
137 1 uchar i;
138 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
139 1 T_RST = 0;
140 1 T_CLK = 0;
141 1 T_RST = 1;
142 1 RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
143 1 for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
144 1 {
145 2 RTInputByte(*pWClock); /* 写1Byte数据*/
146 2 pWClock++;
147 2 }
148 1 T_CLK = 1;
149 1 T_RST = 0;
150 1 }
151 /********************************************************************
152
153 函 数 名:BurstR1302T()
154 功 能:读取DS1302时钟数据
155 说 明:先写地址/命令,后读数据(时钟多字节方式)
156 调 用:RTInputByte() , RTOutputByte()
157 入口参数:pRClock: 读取时钟数据地址
158
159 格式为: 秒 分 时 日 月 星期 年
160 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
161 返 回 值:无
162 设 计:zhaojunjie
163
164 ***********************************************************************/
165 void BurstR1302T(uchar *pRClock)
166 {
167 1 uchar i;
168 1 T_RST = 0;
169 1 T_CLK = 0;
170 1 T_RST = 1;
171 1 RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
172 1 for (i=8; i>0; i--)
173 1 {
174 2 *pRClock = RTOutputByte(); /* 读1Byte数据 */
175 2 pRClock++;
176 2 }
177 1 T_CLK = 1;
178 1 T_RST = 0;
179 1 }
C51 COMPILER V7.06 TIME_DS1302_51 08/18/2008 11:08:39 PAGE 4
180 /********************************************************************
181
182 函 数 名:BurstW1302R()
183 功 能:往DS1302寄存器数写入数据(多字节方式)
184 说 明:先写地址,后写数据(寄存器多字节方式)
185 调 用:RTInputByte()
186 入口参数:pWReg: 寄存器数据地址
187 返 回 值:无
188 设 计:zhaojunjie
189 ***********************************************************************/
190 void BurstW1302R(uchar *pWReg)
191 {
192 1 uchar i;
193 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
194 1 T_RST = 0;
195 1 T_CLK = 0;
196 1 T_RST = 1;
197 1 RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
198 1 for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
199 1 {
200 2 RTInputByte(*pWReg); /* 写1Byte数据*/
201 2 pWReg++;
202 2 }
203 1 T_CLK = 1;
204 1 T_RST = 0;
205 1 }
206 /********************************************************************
207
208 函 数 名:BurstR1302R()
209 功 能:读取DS1302寄存器数据
210 说 明:先写地址,后读命令/数据(寄存器多字节方式)
211 调 用:RTInputByte() , RTOutputByte()
212 入口参数:pRReg: 寄存器数据地址
213 返 回 值:无
214 设 计:zhaojunjie
215 ***********************************************************************/
216 void BurstR1302R(uchar *pRReg)
217 {
218 1 uchar i;
219 1 T_RST = 0;
220 1 T_CLK = 0;
221 1 T_RST = 1;
222 1 RTInputByte(0xff); /* 0xff:时钟多字节读命令 */
223 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
224 1 {
225 2 *pRReg = RTOutputByte(); /* 读1Byte数据 */
226 2 pRReg++;
227 2 }
228 1 T_CLK = 1;
229 1 T_RST = 0;
230 1 }
231 /********************************************************************
232
233 函 数 名:Set1302()
234 功 能:设置初始时间
235 说 明:先写地址,后读命令/数据(寄存器多字节方式)
236 调 用:W1302()
237 入口参数:pClock: 设置时钟数据
238
239 地址格式为: 秒 分 时 日 月 星期 年
240 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
241 返 回 值:无
C51 COMPILER V7.06 TIME_DS1302_51 08/18/2008 11:08:39 PAGE 5
242 设 计:zhaojunjie
243 ***********************************************************************/
244 void Set1302(uchar *pClock)
245 {
246 1 uchar i;
247 1 uchar ucAddr = 0x80;
248 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
249 1 for(i =7; i>0; i--)
250 1 {
251 2 W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
252 2 pClock++;
253 2 ucAddr +=2;
254 2 }
255 1 W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
256 1 }
257 /********************************************************************
258
259 函 数 名:Get1302()
260 功 能:读取DS1302当前时间
261 说 明:
262 调 用:R1302()
263 入口参数:ucCurtime: 保存当前时间地址。
264
265 当前时间格式为: 秒 分 时 日 月 星期 年
266 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
267 返 回 值:无
268 设 计:zhaojunjie
269 ***********************************************************************/
270 void Get1302(uchar ucCurtime[])
271 {
272 1 uchar i;
273 1 uchar ucAddr = 0x81;
274 1 for (i=0; i<7; i++)
275 1 {
276 2 ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
277 2 ucAddr += 2;
278 2 }
279 1 }
280
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 308 ----
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 + -