📄 ds1302.lst
字号:
C51 COMPILER V6.12 DS1302 01/07/2009 12:36:01 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN .\DS1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\DS1302.c DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************/
2 /* 实时时钟模块 时钟芯片型号:DS1302 */
3 /*/
4 /*********************************************************************/
5 #include<reg51.h> //该头文件在此已包含,只要在main.c中包含DS1302.c文件即可,main中无需再包含reg51.h。自加
6 #define uchar unsigned char
7 sbit T_RST = P0^1; /*实时时钟复位线引脚 */
8 sbit T_CLK = P0^2; /*实时时钟时钟线引脚 */
9 sbit T_IO = P0^3; /*实时时钟数据线引脚 */
10 sbit ACC7=ACC^7; //ACC是单片机里面的累加器,在51.h头文件里已定义。
11 sbit ACC0=ACC^0;
12 unsigned char ucCurtime[8]; //记录所有的读取值
13 /********************************************************************
14 *
15 * 名称: v_RTInputByte
16 * 说明:
17 * 功能: 往DS1302写入1Byte数据
18 * 调用:
19 * 输入: ucDa 写入的数据
20 * 返回值: 无
21 ***********************************************************************/
22 void v_RTInputByte(uchar ucDa)
23 {
24 1 uchar i;
25 1 ACC = ucDa; //ACC包含ACC0~ACC7.自加
26 1 for(i=8; i>0; i--)
27 1 {
28 2 T_IO = ACC0; /*相当于汇编中的 RRC */
29 2 T_CLK = 1;
30 2 T_CLK = 0;
31 2 ACC = ACC >> 1;
32 2 }
33 1 }
34 /********************************************************************
35 *
36 * 名称: uchar uc_RTOutputByte
37 * 说明:
38 * 功能: 从DS1302读取1Byte数据
39 * 调用:
40 * 输入:
41 * 返回值: ACC
42 ***********************************************************************/
43 uchar uc_RTOutputByte(void)
44 {
45 1 uchar i;
46 1 uchar temp_temp;
47 1 uchar temp;
48 1 for(i=8; i>0; i--)
49 1 {
50 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
51 2 ACC7 = T_IO; //把ACC中的高位移走后把IO数据的一位送到ACC的高位,随后高位继续右移,即先读的是低位,自加
52 2 T_CLK = 1;
53 2 T_CLK = 0;
54 2 }
55 1 //.......以下为把十六进制转为十进制数后再返回十进制数,也可直接返回十六进制数,自加
C51 COMPILER V6.12 DS1302 01/07/2009 12:36:01 PAGE 2
56 1 temp=ACC;
57 1 temp_temp=temp/16;
58 1 temp=temp%16;
59 1 temp=temp+temp_temp*10; //十六进制转为十进制,自加
60 1 return (temp);
61 1
62 1 }
63 /********************************************************************
64 *
65 * 名称: v_W1302
66 * 说明: 先写地址,后写命令/数据
67 * 功能: 往DS1302写入数据
68 * 调用: v_RTInputByte()
69 * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
70 * 返回值: 无
71 ***********************************************************************/
72 void v_W1302(uchar ucAddr, uchar ucDa)
73 {
74 1 T_RST = 0;
75 1 T_CLK = 0;
76 1 T_RST = 1;
77 1 v_RTInputByte(ucAddr); /* 地址,命令 */
78 1 v_RTInputByte(ucDa); /* 写1Byte数据*/
79 1 T_CLK = 1;
80 1 T_RST =0;
81 1 }
82 /********************************************************************
83 *
84 * 名称: uc_R1302
85 * 说明: 先写地址,后读命令/数据
86 * 功能: 读取DS1302某地址的数据
87 * 调用: v_RTInputByte() , uc_RTOutputByte()
88 * 输入: ucAddr: DS1302地址
89 * 返回值: ucDa :读取的数据
90 ***********************************************************************/
91 uchar uc_R1302(uchar ucAddr)
92 {
93 1 uchar ucDa;
94 1 T_RST = 0;
95 1 T_CLK = 0;
96 1 T_RST = 1;
97 1 v_RTInputByte(ucAddr); /* 地址,命令 */
98 1 ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
99 1 T_CLK = 1;
100 1 T_RST =0;
101 1 return(ucDa);
102 1 }
103 /********************************************************************
104 *
105 * 名称: v_BurstW1302T
106 * 说明: 先写地址,后写数据(时钟多字节方式)
107 * 功能: 往DS1302写入时钟数据(多字节方式)
108 * 调用: v_RTInputByte()
109 * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
110 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
111 * 返回值: 无
112 ***********************************************************************/
113 void v_BurstW1302T(uchar *pSecDa)
114 {
115 1 uchar i;
116 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ //是否是向控制寄存器的数据寄存器写内容0x00?自加
117 1 T_RST = 0;
C51 COMPILER V6.12 DS1302 01/07/2009 12:36:01 PAGE 3
118 1 T_CLK = 0;
119 1 T_RST = 1;
120 1 v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
121 1 for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
122 1 {
123 2 v_RTInputByte(*pSecDa);/* 写1Byte数据*/ //顺序写入,不用再写时钟地址,自加
124 2 pSecDa++;
125 2 }
126 1 T_CLK = 1;
127 1 T_RST =0;
128 1 }
129 /********************************************************************
130 *
131 * 名称: v_BurstR1302T
132 * 说明: 先写地址,后读命令/数据(时钟多字节方式)
133 * 功能: 读取DS1302时钟数据
134 * 调用: v_RTInputByte() , uc_RTOutputByte()
135 * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
136 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
137 * 返回值: ucDa :读取的数据
138 ***********************************************************************/
139 void v_BurstR1302T(uchar *pSecDa)
140 {
141 1 uchar i;
142 1 T_RST = 0;
143 1 T_CLK = 0;
144 1 T_RST = 1;
145 1 v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
146 1 for (i=8; i>0; i--)
147 1 {
148 2 *pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */ //顺序读出,不用再写时钟地址,自加
149 2 pSecDa++;
150 2 }
151 1 T_CLK = 1;
152 1 T_RST =0;
153 1 }
154 /********************************************************************
155 *
156 * 名称: v_BurstW1302R
157 * 说明: 先写地址,后写数据(寄存器多字节方式)
158 * 功能: 往DS1302寄存器数写入数据(多字节方式)
159 * 调用: v_RTInputByte()
160 * 输入: pReDa: 寄存器数据地址 //注意:pReDa是寄存器数据地址,是要写入的数据的地址,可以是数组,自
-加
161 * 返回值: 无
162 ***********************************************************************/
163 void v_BurstW1302R(uchar *pReDa)
164 {
165 1 uchar i;
166 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
167 1 T_RST = 0;
168 1 T_CLK = 0;
169 1 T_RST = 1;
170 1 v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
171 1 for (i=31;i>0;i--) /*31Byte 寄存器数据 */
172 1 {
173 2 v_RTInputByte(*pReDa); /* 写1Byte数据*/
174 2 pReDa++;
175 2 }
176 1 T_CLK = 1;
177 1 T_RST =0;
178 1 }
C51 COMPILER V6.12 DS1302 01/07/2009 12:36:01 PAGE 4
179 /********************************************************************
180 *
181 * 名称: uc_BurstR1302R
182 * 说明: 先写地址,后读命令/数据(寄存器多字节方式)
183 * 功能: 读取DS1302寄存器数据
184 * 调用: v_RTInputByte() , uc_RTOutputByte()
185 * 输入: pReDa: 寄存器数据地址
186 * 返回值: 无
187 ***********************************************************************/
188 void v_BurstR1302R(uchar *pReDa)
189 {
190 1 uchar i;
191 1 T_RST = 0;
192 1 T_CLK = 0;
193 1 T_RST = 1;
194 1 v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
195 1 for (i=31; i>0; i--) /*31Byte 寄存器数据 */
196 1 {
197 2 *pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
198 2 pReDa++;
199 2 }
200 1 T_CLK = 1;
201 1 T_RST =0;
202 1 }
203 /********************************************************************
204 *
205 * 名称: v_Set1302
206 * 说明:
207 * 功能: 设置初始时间
208 * 调用: v_W1302()
209 * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
210 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
211 * 返回值: 无
212 ***********************************************************************/
213 void v_Set1302(uchar *pSecDa)
214 {
215 1 uchar i;
216 1 uchar ucAddr = 0x80;
217 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
218 1 for(i =7;i>0;i--)
219 1 {
220 2 v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
221 2
222 2 pSecDa++;
223 2 ucAddr +=2; //用多字节写函数也行吧?自加
224 2 }
225 1 v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
226 1 }
227 /********************************************************************
228 *
229 * 名称: v_Get1302
230 * 说明:
231 * 功能: 读取DS1302当前时间
232 * 调用: uc_R1302()
233 * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
234 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
235 * 返回值: 无
236 ***********************************************************************/
237 void v_Get1302(void)
238 {
239 1 uchar i;
240 1 uchar ucAddr = 0x81;
C51 COMPILER V6.12 DS1302 01/07/2009 12:36:01 PAGE 5
241 1 for (i=0;i<7;i++)
242 1 {
243 2 ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
244 2 ucAddr += 2; //用多字节读命令也行吧?自加
245 2 }
246 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 356 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 15
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 + -