📄 ds1302.lst
字号:
C51 COMPILER V7.50 DS1302 09/20/2008 15:21:11 PAGE 1
C51 COMPILER V7.50, 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 /* 实时时钟模块 时钟芯片型号:DS1302 */
3 /* */
4 /* 外部接口有两个,分别为v_Set1302()和v_Get1302(), */
5 /* 其参数的返回值为10进制数据,而非BCD码,可直接使用 */
6 /* LiuWei 2008-1-15*/
7 /*********************************************************************/
8
9 #include "DS1302.h"
10
11
12 void rtcDelay(unsigned int num)
13 {
14 1 while(num--);
15 1 }
16 /********************************************************************
17 *
18 * 名称: v_RTInputByte
19 * 说明:
20 * 功能: 往DS1302写入1Byte数据
21 * 调用:
22 * 输入: ucDa 写入的数据
23 * 返回值: 无
24 ***********************************************************************/
25 void v_RTInputByte(uchar ucDa)
26 {
27 1 uchar i,Data;
28 1 Data=ucDa;
29 1 for(i=8; i>0; i--)
30 1 {
31 2 if(Data&0x01)
32 2 T_IO=1;
33 2 else
34 2 T_IO=0;
35 2 Data>>=1;
36 2 T_CLK = 1;
37 2 rtcDelay(100);
38 2 T_CLK = 0;
39 2 rtcDelay(100);
40 2
41 2 }
42 1 }
43 /********************************************************************
44 *
45 * 名称: uchar uc_RTOutputByte
46 * 说明:
47 * 功能: 从DS1302读取1Byte数据
48 * 调用:
49 * 输入:
50 * 返回值: ACC
51 ***********************************************************************/
52 uchar uc_RTOutputByte(void)
53 {
54 1 uchar i,tem;
55 1 tem=0;
C51 COMPILER V7.50 DS1302 09/20/2008 15:21:11 PAGE 2
56 1 P2MDOUT=0xfd;
57 1 T_IO=1;
58 1 for(i=8; i>0; i--)
59 1 {
60 2 tem>>=1;
61 2 if(T_IO)
62 2 tem|=0X80;
63 2 T_CLK = 1;
64 2 rtcDelay(100);
65 2 T_CLK = 0;
66 2 rtcDelay(100);
67 2 }
68 1 P2MDOUT=0xff;
69 1 return(tem);
70 1 }
71 /********************************************************************
72 *
73 * 名称: v_W1302
74 * 说明: 先写地址,后写命令/数据
75 * 功能: 往DS1302写入数据
76 * 调用: v_RTInputByte()
77 * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
78 * 返回值: 无
79 ***********************************************************************/
80 void v_W1302(uchar ucAddr, uchar ucDa)
81 {
82 1 T_RST = 0;
83 1 T_CLK = 0;
84 1 rtcDelay(50);
85 1 T_RST = 1;
86 1
87 1 v_RTInputByte(ucAddr); /* 地址,命令 */
88 1 v_RTInputByte(ucDa); /* 写1Byte数据*/
89 1 T_CLK = 1;
90 1 T_RST =0;
91 1 }
92 /********************************************************************
93 *
94 * 名称: uc_R1302
95 * 说明: 先写地址,后读命令/数据
96 * 功能: 读取DS1302某地址的数据
97 * 调用: v_RTInputByte() , uc_RTOutputByte()
98 * 输入: ucAddr: DS1302地址
99 * 返回值: ucDa :读取的数据
100 ***********************************************************************/
101 uchar uc_R1302(uchar ucAddr)
102 {
103 1 uchar ucDa;
104 1 P2MDOUT=0xfd;
105 1 T_RST = 0;
106 1 T_CLK = 0;
107 1 rtcDelay(50);
108 1 T_RST = 1;
109 1
110 1 v_RTInputByte(ucAddr); /* 地址,命令 */
111 1 ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
112 1 T_CLK = 1;
113 1 T_RST =0;
114 1 return(ucDa);
115 1 }
116
117 /********************************************************************
C51 COMPILER V7.50 DS1302 09/20/2008 15:21:11 PAGE 3
118 *
119 * 名称: v_Set1302
120 * 说明:
121 * 功能: 设置初始时间
122 * 调用: v_W1302()
123 * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
124 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
125 * 返回值: 无
126 ***********************************************************************/
127 void v_Set1302(uchar *pSecDa)
128 {
129 1 uchar i;
130 1 uchar ucAddr = 0x80;
131 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
132 1 for(i =7;i>0;i--)
133 1 {
134 2 v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
135 2
136 2 pSecDa++;
137 2 ucAddr +=2;
138 2 }
139 1 v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
140 1 }
141 /********************************************************************
142 *
143 * 名称: v_Get1302
144 * 说明:
145 * 功能: 读取DS1302当前时间
146 * 调用: uc_R1302()
147 * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
148 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
149 * 返回值: 无
150 ***********************************************************************/
151 void v_Get1302(uchar ucCurtime[])
152 {
153 1 uchar m;
154 1 uchar ucAddr = 0x81;
155 1 for (m=0;m<7;m++)
156 1 {
157 2 ucCurtime[m] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
158 2 星期 年 */
159 2 ucAddr += 2;
160 2 }
161 1
162 1 }
163
164
165 void start1302()
166 {
167 1
168 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
169 1 v_W1302(0x80,0);
170 1 v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
171 1
172 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 261 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
C51 COMPILER V7.50 DS1302 09/20/2008 15:21:11 PAGE 4
DATA SIZE = ---- 10
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 + -