📄 ds1302.lst
字号:
C51 COMPILER V7.20 DS1302 06/03/2005 17:25:52 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************************************************************
2 YB-51-B 时钟演示程序(函数模块)
3 来源: 郑州远博科技 王兴民
4 0371-66949037 0371-67256036 13949105551
5 需要参看DS1302的相关原理和时序,见配套光盘
6 ***************************************************************************/
7 #include <config.h>
8
9 #define T_CLK P1_6 /*实时时钟时钟线引脚 */
10 #define T_IO P1_7 /*实时时钟数据线引脚 */
11 #define T_RST P3_3 /*实时时钟复位线引脚 */
12
13 /*********************************************************************
14 实时时钟模块 时钟芯片型号:DS1302
15 *********************************************************************/
16
17 /********************************************************************
18 *
19 * 名称: v_RTInputByte
20 * 说明:
21 * 功能: 往DS1302写入1Byte数据
22 * 调用:
23 * 输入: ucDa 写入的数据
24 * 返回值: 无
25 ***********************************************************************/
26 void v_RTInputByte(Uchar ucDa)
27 {
28 1 Uchar i,xbyte;
29 1 xbyte = ucDa;
30 1 for(i=8; i>0; i--)
31 1 {
32 2 T_IO = xbyte&0x01;
33 2 T_CLK = 1;
34 2 T_CLK = 0;
35 2 xbyte = xbyte >> 1;
36 2 }
37 1 }
38 /********************************************************************
39 *
40 * 名称: Uchar uc_RTOutputByte
41 * 说明:
42 * 功能: 从DS1302读取1Byte数据
43 * 调用:
44 * 输入:
45 * 返回值: xbyte
46 ***********************************************************************/
47 Uchar uc_RTOutputByte(void)
48 {
49 1 Uchar i,xbyte,xbyte1=0;
50 1 for(i=8; i>0; i--)
51 1 {
52 2 xbyte = xbyte >>1;
53 2 xbyte1 =(xbyte1|((Uchar)(T_IO)))<<7;
54 2 xbyte=xbyte|xbyte1;
55 2 T_CLK = 1;
C51 COMPILER V7.20 DS1302 06/03/2005 17:25:52 PAGE 2
56 2 T_CLK = 0;
57 2 }
58 1 return(xbyte);
59 1 }
60 /********************************************************************
61 *
62 * 名称: v_W1302
63 * 说明: 先写地址,后写命令/数据
64 * 功能: 往DS1302写入数据
65 * 调用: v_RTInputByte()
66 * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
67 * 返回值: 无
68 ***********************************************************************/
69 void v_W1302(Uchar ucAddr, Uchar ucDa)
70 {
71 1 T_RST = 0;
72 1 T_CLK = 0;
73 1 T_RST = 1;
74 1 v_RTInputByte(ucAddr); /* 地址,命令 */
75 1 v_RTInputByte(ucDa); /* 写1Byte数据*/
76 1 T_CLK = 1;
77 1 T_RST =0;
78 1 }
79 /********************************************************************
80 *
81 * 名称: uc_R1302
82 * 说明: 先写地址,后读命令/数据
83 * 功能: 读取DS1302某地址的数据
84 * 调用: v_RTInputByte() , uc_RTOutputByte()
85 * 输入: ucAddr: DS1302地址
86 * 返回值: ucDa :读取的数据
87 ***********************************************************************/
88 Uchar uc_R1302(Uchar ucAddr)
89 {
90 1 Uchar ucDa;
91 1 T_RST = 0;
92 1 T_CLK = 0;
93 1 T_RST = 1;
94 1 v_RTInputByte(ucAddr); /* 地址,命令 */
95 1 ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
96 1 T_CLK = 1;
97 1 T_RST =0;
98 1 return(ucDa);
99 1 }
100 /********************************************************************
101 *
102 * 名称: v_BurstW1302T
103 * 说明: 先写地址,后写数据(时钟多字节方式)
104 * 功能: 往DS1302写入时钟数据(多字节方式)
105 * 调用: v_RTInputByte()
106 * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
107 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
108 * 返回值: 无
109 ***********************************************************************/
110 void v_BurstW1302T(Uchar *pSecDa)
111 {
112 1 Uchar i;
113 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
114 1 T_RST = 0;
115 1 T_CLK = 0;
116 1 T_RST = 1;
117 1 v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
C51 COMPILER V7.20 DS1302 06/03/2005 17:25:52 PAGE 3
118 1 for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
119 1 {
120 2 v_RTInputByte(*pSecDa);/* 写1Byte数据*/
121 2 pSecDa++;
122 2 }
123 1 T_CLK = 1;
124 1 T_RST =0;
125 1 }
126 /********************************************************************
127 *
128 * 名称: v_BurstR1302T
129 * 说明: 先写地址,后读命令/数据(时钟多字节方式)
130 * 功能: 读取DS1302时钟数据
131 * 调用: v_RTInputByte() , uc_RTOutputByte()
132 * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
133 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
134 * 返回值: ucDa :读取的数据
135 ***********************************************************************/
136 void v_BurstR1302T(Uchar *pSecDa)
137 {
138 1 Uchar i;
139 1 T_RST = 0;
140 1 T_CLK = 0;
141 1 T_RST = 1;
142 1 v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
143 1 for (i=8; i>0; i--)
144 1 {
145 2 *pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
146 2 pSecDa++;
147 2 }
148 1 //T_CLK = 1;
149 1 T_RST =0;
150 1 }
151 /********************************************************************
152 *
153 * 名称: v_BurstW1302R
154 * 说明: 先写地址,后写数据(寄存器多字节方式)
155 * 功能: 往DS1302寄存器数写入数据(多字节方式)
156 * 调用: v_RTInputByte()
157 * 输入: pReDa: 寄存器数据地址
158 * 返回值: 无
159 ***********************************************************************/
160 void v_BurstW1302R(Uchar *pReDa)
161 {
162 1 Uchar i;
163 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
164 1 T_RST = 0;
165 1 T_CLK = 0;
166 1 T_RST = 1;
167 1 v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
168 1 for (i=31;i>0;i--) /*31Byte 寄存器数据 */
169 1 {
170 2 v_RTInputByte(*pReDa); /* 写1Byte数据*/
171 2 pReDa++;
172 2 }
173 1 T_CLK = 1;
174 1 T_RST =0;
175 1 }
176 /********************************************************************
177 *
178 * 名称: uc_BurstR1302R
179 * 说明: 先写地址,后读命令/数据(寄存器多字节方式)
C51 COMPILER V7.20 DS1302 06/03/2005 17:25:52 PAGE 4
180 * 功能: 读取DS1302寄存器数据
181 * 调用: v_RTInputByte() , uc_RTOutputByte()
182 * 输入: pReDa: 寄存器数据地址
183 * 返回值: 无
184 ***********************************************************************/
185 void v_BurstR1302R(Uchar *pReDa)
186 {
187 1 Uchar i;
188 1 T_RST = 0;
189 1 T_CLK = 0;
190 1 T_RST = 1;
191 1 v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
192 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
193 1 {
194 2 *pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
195 2 pReDa++;
196 2 }
197 1 T_CLK = 1;
198 1 T_RST =0;
199 1 }
200 /********************************************************************
201 *
202 * 名称: v_Set1302
203 * 说明:
204 * 功能: 设置初始时间
205 * 调用: v_W1302()
206 * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
207 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
208 * 返回值: 无
209 ***********************************************************************/
210 void v_Set1302(Uchar *pSecDa)
211 {
212 1 Uchar i;
213 1 Uchar ucAddr = 0x80;
214 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
215 1 for(i =7;i>0;i--)
216 1 {
217 2 v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
218 2
219 2 pSecDa++;
220 2 ucAddr +=2;
221 2 }
222 1 v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
223 1 }
224 /********************************************************************
225 *
226 * 名称: v_Get1302
227 * 说明:
228 * 功能: 读取DS1302当前时间
229 * 调用: uc_R1302()
230 * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
231 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
232 * 返回值: 无
233 ***********************************************************************/
234 void v_Get1302(Uchar ucCurtime[])
235 {
236 1 Uchar i;
237 1 Uchar ucAddr = 0x81;
238 1 for (i=0;i<7;i++)
239 1 {
240 2 ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
241 2 星期 年 */
C51 COMPILER V7.20 DS1302 06/03/2005 17:25:52 PAGE 5
242 2 ucAddr += 2;
243 2 }
244 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 297 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 5
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 + -