📄 ds1302.lst
字号:
C51 COMPILER V7.50 DS1302 07/19/2006 10:05:10 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "ds1302.h"
2
3 void wr_oneword_ds1302(uchar,uchar);
4 uchar rd_oneword_ds1302(uchar);
5 void delay1302(void);
6
7 uchar xdata rdtime[6] = {0};
8 uchar xdata inittime[6]={0};//初始时间(yy,mm,dd,hh,mm,ss)
9
10 sbit sck1302 =P1^5; //1302的clock
11 sbit sio1302 =P1^6; //1302的io口
12 sbit rst1302 =P1^7; //1302的rst
13
14
15 /************************************************************/
16 /*函数名:ds1302set
17 /*描述:设置1302的时间
18 /*输入:inittime:初始时间暂存区头指针
19 /*输出:无
20 /************************************************************/
21 void ds1302set(void)
22 {
23 1 uchar xdata *inittimeptr;
24 1 uchar ctrl1302; //存放1302控制码
25 1 uchar data1302; //存放1302数据
26 1 inittimeptr=inittime;
27 1
28 1 ctrl1302=0x8e;
29 1 data1302=0x00; //控制字(允许写)
30 1 wr_oneword_ds1302(ctrl1302,data1302);
31 1
32 1 ctrl1302=0x80; //禁止1302
33 1 data1302=0x80;
34 1 wr_oneword_ds1302(ctrl1302,data1302);
35 1
36 1
37 1 ctrl1302=0x8c; //写入年
38 1 data1302=*inittimeptr;
39 1 wr_oneword_ds1302(ctrl1302,data1302);
40 1 inittimeptr++;
41 1
42 1 ctrl1302=0x88; //写入月
43 1 data1302=*inittimeptr;
44 1 wr_oneword_ds1302(ctrl1302,data1302);
45 1 inittimeptr++;
46 1
47 1 ctrl1302=0x86; //写入日期
48 1 data1302=*inittimeptr;
49 1 wr_oneword_ds1302(ctrl1302,data1302);
50 1 inittimeptr++;
51 1
52 1 ctrl1302=0x84; //写入小时
53 1 data1302=*inittimeptr;
54 1 data1302&=0x7f;//24小时制
55 1 wr_oneword_ds1302(ctrl1302,data1302);
C51 COMPILER V7.50 DS1302 07/19/2006 10:05:10 PAGE 2
56 1 inittimeptr++;
57 1
58 1 ctrl1302=0x82; //写入分
59 1 data1302=*inittimeptr;
60 1 wr_oneword_ds1302(ctrl1302,data1302);
61 1 inittimeptr++;
62 1
63 1 ctrl1302=0x80;
64 1 data1302=*inittimeptr;
65 1 data1302|=0x80;
66 1 wr_oneword_ds1302(ctrl1302,data1302);
67 1
68 1 ctrl1302=0x80; //写入秒
69 1 data1302=*inittimeptr;
70 1 data1302&=0x7f;//开始计时
71 1 wr_oneword_ds1302(ctrl1302,data1302);
72 1
73 1 ctrl1302=0x90;
74 1 data1302=0xa5;
75 1 wr_oneword_ds1302(ctrl1302,data1302);//trikle charger
76 1
77 1
78 1 ctrl1302=0x8e; //结束(写保护)
79 1 data1302=0x80;
80 1 wr_oneword_ds1302(ctrl1302,data1302);
81 1
82 1 }
83 /***********************************************************/
84 /*函数名:ds1302read
85 /*描述:读出1302计数器中的当前值
86 /*输入:inittime:读出数据保存区的头指针
87 /*输出:无
88 /***********************************************************/
89 void ds1302read(void) //读1302内部数据
90 {
91 1 uchar ctrl1302;
92 1 uchar data1302;
93 1
94 1 uchar xdata *inittimep;
95 1 inittimep = rdtime;
96 1
97 1 ctrl1302=0x8e;
98 1 data1302=0x00; //控制字(允许写)
99 1 wr_oneword_ds1302(ctrl1302,data1302);
100 1
101 1 ctrl1302=0x8d; //读入年
102 1 data1302=rd_oneword_ds1302(ctrl1302);
103 1 *inittimep = data1302;
104 1 inittimep++;
105 1
106 1
107 1 ctrl1302=0x89; //读入月
108 1 data1302=rd_oneword_ds1302(ctrl1302);
109 1 *inittimep=data1302;
110 1 inittimep++;
111 1
112 1
113 1 ctrl1302=0x87; //读入日期
114 1 data1302=rd_oneword_ds1302(ctrl1302);
115 1 *inittimep=data1302;
116 1 inittimep++;
117 1
C51 COMPILER V7.50 DS1302 07/19/2006 10:05:10 PAGE 3
118 1 ctrl1302=0x85; //读入小时
119 1 data1302=rd_oneword_ds1302(ctrl1302);
120 1 *inittimep=data1302;
121 1 inittimep++;
122 1
123 1 ctrl1302=0x83; //读入分钟
124 1 data1302=rd_oneword_ds1302(ctrl1302);
125 1 *inittimep=data1302;
126 1 inittimep++;
127 1
128 1 ctrl1302=0x81; //读入秒
129 1 data1302=rd_oneword_ds1302(ctrl1302);
130 1 *inittimep=data1302;
131 1
132 1 ctrl1302=0x8e; //结束(写保护)
133 1 data1302=0x80;
134 1 wr_oneword_ds1302(ctrl1302,data1302);
135 1 inittimep = rdtime;
136 1 // return(inittimep);
137 1 }
138
139 /*************************************************************/
140 /*函数名:wr_oneword_ds1302
141 /*描述:向ds1302的某一指定单元写入一字节
142 /*输入:ctrl1302:命令字节
143 data1302:数据字节
144 /*输出:无
145 /************************************************************/
146 void wr_oneword_ds1302(uchar ctrl1302,uchar data1302)
147 {
148 1 uchar i;
149 1 uchar ds1302tmp;
150 1 ds1302tmp =ctrl1302;
151 1 ds1302tmp|=0x80;//控制码最高位必须位1
152 1 ds1302tmp&=0xfe;//写入时,最低位必须为0
153 1 sck1302 =0;//当把rst驱动为1时,sck必须为0
154 1 delay1302();
155 1 rst1302 =1;//只有rst为高时,才允许数据传送
156 1
157 1 for(i=0;i<8;i++)//写入控制码
158 1 {
159 2 sck1302 =0;
160 2 delay1302();
161 2 if(ds1302tmp&0x01)
162 2 sio1302 =1;
163 2 else
164 2 sio1302 =0;
165 2 _nop_();
166 2 _nop_();
167 2 sck1302 =1;//上升沿将数据写入
168 2 delay1302();
169 2 ds1302tmp>>=1;
170 2 }
171 1
172 1 ds1302tmp =data1302;//写入数据
173 1 for(i=0;i<8;i++)
174 1 {
175 2 sck1302 =0;
176 2 delay1302();
177 2 if(ds1302tmp&0x01)
178 2 sio1302 =1;
179 2 else
C51 COMPILER V7.50 DS1302 07/19/2006 10:05:10 PAGE 4
180 2 sio1302 =0;
181 2 _nop_();
182 2 _nop_();
183 2 sck1302 =1;
184 2 delay1302();
185 2 ds1302tmp>>=1;
186 2 }
187 1 _nop_();
188 1 _nop_();
189 1 rst1302 =0;//禁止芯片操作
190 1 sck1302 =0;//恢复原有状态
191 1
192 1 }
193 /************************************************************/
194 /*函数名:rd_oneword_ds1302
195 /*描述:从ds1302的指定单元读出一字节
196 /*输入:ctrl1302:指定要读取的单元
197 /*输出:读取的字节
198 /***********************************************************/
199 uchar rd_oneword_ds1302(uchar ctrl1302)
200 {
201 1
202 1 uchar i;
203 1 uchar ds1302tmp;
204 1 ds1302tmp =ctrl1302;
205 1 ds1302tmp|=0x80;//控制码最高位必须为1
206 1 ds1302tmp|=0x01;//读出时,最低位必须为1
207 1 sck1302 =0;//当把rst驱动为1时,sck必须为0
208 1 delay1302();
209 1 rst1302 =1;//只有rst为高时,才允许数据传送
210 1
211 1 for(i=0;i<8;i++)//输出控制码
212 1 {
213 2 sck1302 =0;
214 2 delay1302();
215 2 if(ds1302tmp&0x01)
216 2 sio1302 =1;
217 2 else
218 2 sio1302 =0;
219 2 _nop_();
220 2 _nop_();
221 2 sck1302 =1;
222 2 delay1302();
223 2 ds1302tmp>>=1;
224 2 }
225 1
226 1 for(i=0;i<8;i++)//读出控制码指定单元内容
227 1 {
228 2 ds1302tmp>>=1;
229 2 sck1302 =1;
230 2 delay1302();
231 2 sck1302 =0;
232 2 delay1302();
233 2 if(sio1302)
234 2 ds1302tmp|=0x80;//最高位为1
235 2 else
236 2 ds1302tmp&=0x7f;//最高位为0
237 2 delay1302();
238 2 }
239 1 rst1302 =0;//禁止芯片操作
240 1 sck1302 =0;//恢复原有状态
241 1 return(ds1302tmp);
C51 COMPILER V7.50 DS1302 07/19/2006 10:05:10 PAGE 5
242 1 }
243 /*****************************************/
244 /*函数名:delay1302
245 /*描述:延时,使程序时序符合芯片要求
246 /*输入:无
247 /*输出:无
248 /****************************************/
249 void delay1302(void)//对于11.0592Mhz,延时为1us
250 {
251 1 _nop_();
252 1 _nop_();
253 1 _nop_();
254 1 _nop_();
255 1 _nop_();
256 1 _nop_();
257 1 _nop_();
258 1 _nop_();
259 1 _nop_();
260 1 _nop_();
261 1 }
262
263
264
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 532 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 12 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 9
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 + -