📄 ds1302.lst
字号:
void DS1302_RAM_Burst_RD(uint8 *pReDa)
{
uint8 i;
RSTB = 0;
SCLK = 0;
RSTB = 1;
DS1302_InputByte(0xff); // 0xbf:时钟多字节读命令
for (i=31; i>0; i--) //31Byte 寄存器数据
{
*pReDa = DS1302_OutputByte(); // 读1Byte数据
pReDa++;
}
SCLK = 1;
RSTB =0;
}
#endif
222
223 /***********************************************************************
224 *
225 * 名称: Write_TimeToDS1302
226 * 说明:
227 * 功能: 设置初始时间
228 * 调用: v_W1302()
229 * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
230 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
231 * 返回值: 无
232 ***********************************************************************/
233 void Write_TimeToDS1302(uint8 *pSecDa,uint8 change_flag)
234 {
235 1 uint8 i;
236 1 uint8 ucAddr = 0x80;
237 1
238 1 W_ByteToDS1302(0x8E,0x00); // 控制命令,WP=0,写操作?
239 1
240 1 for(i =0;i<7;i++)
241 1 {
C51 COMPILER V7.50 DS1302 06/10/2006 08:26:02 PAGE 5
242 2 if((change_flag&0x01)==0x01)//只写入已改变的值
243 2 W_ByteToDS1302(ucAddr,pSecDa[i]); // 秒 分 时 日 月 星期 年
244 2 change_flag=change_flag>>1;
245 2 ucAddr +=2;
246 2 }
247 1
248 1 W_ByteToDS1302(0x80,pSecDa[0]&0x7F); //打开时钟振荡
249 1 W_ByteToDS1302(0x8E,0x80); // 控制命令,WP=1,写保护?
250 1 }
251
252 /***********************************************************************
253 *
254 * 名称: Get_TimeFromDS1302
255 * 说明:
256 * 功能: 读取DS1302当前时间
257 * 调用: RD_ByteFromDS1302()
258 * 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
259 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
260 * 返回值: 无
261 ***********************************************************************/
262 void Get_TimeFromDS1302(uint8 ucCurtime[])
263 {
264 1 uint8 i;
265 1 uint8 ucAddr = 0x81;
266 1 for (i=0;i<7;i++)
267 1 {
268 2 ucCurtime[i] = RD_ByteFromDS1302(ucAddr);//格式为: 秒 分 时 日 月 星期 年
269 2 ucAddr += 2;
270 2 }
271 1 }
272
273 /********************************************************************
274 *
275 * 名称: W_ByteToDS1302_RAM
276 * 说明: 先写地址,后写数据
277 * 功能: 往DS1302的RAM中写入数据
278 * 调用: W_ByteToDS1302()
279 * 输入: ucAddr: DS1302地址, ucDa: 要写的数据
280 * 返回值: 无
281 ***********************************************************************/
282 void W_ByteToDS1302_RAM(uint8 ucAddr, uint8 ucDa)
283 {
284 1 W_ByteToDS1302(0x8E,0x00); // 控制命令,WP=0,写操作?
285 1 W_ByteToDS1302(ucAddr,ucDa); // 秒 分 时 日 月 星期 年
286 1 W_ByteToDS1302(0x8E,0x80); // 控制命令,WP=1,写保护?
287 1 }
288
289 /********************************************************************
290 *
291 * 名称: RD_ByteFromDS1302_RAM
292 * 说明: 先写地址,后读数据
293 * 功能: 读取DS1302某地址的数据
294 * 调用: RD_ByteFromDS1302()
295 * 输入: ucAddr: DS1302地址
296 * 返回值: ucDa :读取的数据
297 ***********************************************************************/
298 uint8 RD_ByteFromDS1302_RAM(uint8 ucAddr)
299 {
300 1 uint8 ucDa;
301 1 ucDa = RD_ByteFromDS1302(ucAddr);
302 1 return(ucDa);
303 1 }
C51 COMPILER V7.50 DS1302 06/10/2006 08:26:02 PAGE 6
304
305 /***********************************************************************
306 *
307 * 名称: Initial_DS1302
308 * 说明:
309 * 功能: 初始化DS1302,
310 * 调用: W_ByteToDS1302()
311 * 输入: 无
312 * 返回值: 无
313 ***********************************************************************/
314 void Initial_DS1302(void)
315 {
316 1 uint8 tempvv0,tempvv1;
317 1
318 1 tempvv0 = RD_ByteFromDS1302(0x81);//读秒值
319 1 tempvv1 = RD_ByteFromDS1302(0x85);//读小时值
320 1
321 1 W_ByteToDS1302(0x8e,0x00); // 控制命令,WP=0,写操作?
322 1
323 1 W_ByteToDS1302(0x90,0xAA); //设置充电模式
324 1 W_ByteToDS1302(0x84,tempvv1&0x7F); //设置为24小时制
325 1 W_ByteToDS1302(0x80,tempvv0&0x7F); //打开时钟振荡
326 1
327 1 W_ByteToDS1302(0x8e,0x80); // 控制命令,WP=1,写保护?
328 1 }
329
330
331 /***********************************************************************
332 * 名称: Calc_Week
333 * 说明: 只计算2000年至2099年的星期
334 * 功能: 通过日期算星期
335 * 调用: month_n_day()
336 * 输入: y,m,d(年,月,日)
337 * 返回值: 星期几
338 ***********************************************************************/
339 uint8 Calc_Week(uint8 y,uint8 m,uint8 d)
340 {
341 1 uint32 nday=0;
342 1 uint16 i;
343 1 uint16 yy;
344 1 uint8 zz;
345 1
346 1 y=((y>>4)&0x0F)*10+(y&0x0F);
347 1 m=((m>>4)&0x0F)*10+(m&0x0F);
348 1 d=((d>>4)&0x0F)*10+(d&0x0F);
349 1
350 1 yy=y+2000;
351 1
352 1 for (i=2000;i<yy;i++)
353 1 {
354 2 if(((i%4 == 0) && (i%100 != 0)) || (i%400 == 0))
355 2 zz=1;
356 2 else
357 2 zz=0;
358 2 nday =nday+zz+365;
359 2 }
360 1
361 1 for (i=1;i<m;i++)
362 1 {
363 2 zz=month_n_day(yy,i);
364 2 nday=nday+zz;
365 2 }
C51 COMPILER V7.50 DS1302 06/10/2006 08:26:02 PAGE 7
366 1
367 1 nday=nday+d+5;
368 1 zz=(uint8)(nday%7);
369 1 return(zz);
370 1
371 1 }
372
373 /********************************************************************
374 *
375 * 名称: month_n_day
376 * 说明: 计算某年的某月有几天
377 * 功能: 计算某年的某月有几天
378 * 调用: 无
379 * 输入: y,m(年,月)
380 * 返回值: 这个月的天数
381 ***********************************************************************/
382 uint8 month_n_day(uint16 y,uint8 m) //算出某年某月有多少天
383 {
384 1 if(m==2)
385 1 {
386 2 if(((y%4 == 0) && (y%100 != 0)) || (y%400 == 0))
387 2 return 0x29;
388 2 else
389 2 return 0x28;
390 2 }
391 1 else
392 1 return(monthday[m-1]);
393 1 }
394 /*********************************************************************************************************
-***
395 ***************************************** END OF FILE ****************************************************
-***
396 **********************************************************************************************************
-**/
397
398
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 668 ----
CONSTANT SIZE = 12 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 20
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 + -