📄 ds1302.lst
字号:
276 2 Time->TimeString[1] = Time->Hour%10 + '0';
277 2 }
278 1 else
279 1 {
280 2 Time->TimeString[0] = ' ';
281 2 Time->TimeString[1] = ' ';
282 2 }
283 1 Time->TimeString[2] = ':';
284 1 if(hide_min<2)
285 1 {
286 2 Time->TimeString[3] = Time->Minute/10 + '0';
287 2 Time->TimeString[4] = Time->Minute%10 + '0';
288 2 }
289 1 else
290 1 {
291 2 Time->TimeString[3] = ' ';
292 2 Time->TimeString[4] = ' ';
293 2 }
294 1 Time->TimeString[5] = ':';
295 1 if(hide_sec<2)
296 1 {
297 2 Time->TimeString[6] = Time->Second/10 + '0';
298 2 Time->TimeString[7] = Time->Second%10 + '0';
299 2 }
300 1 else
301 1 {
C51 COMPILER V6.12 DS1302 03/12/2009 00:31:59 PAGE 6
302 2 Time->TimeString[6] = ' ';
303 2 Time->TimeString[7] = ' ';
304 2 }
305 1 Time->DateString[8] = '\0';
306 1 }
307
308
309 void Initial_DS1302(void) //时钟芯片初始化
310 {
311 1 unsigned char Second=Read1302(DS1302_SECOND);
312 1 // if(Second&0x80) //判断时钟芯片是否关闭
313 1 {
314 2 Write1302(0x8e,0x00); //写入允许
315 2 Write1302(0x8c,0x09); //以下写入初始化时间 日期:09/01/01.星期: 4. 时间: 00:00:00
316 2 Write1302(0x88,0x01);
317 2 Write1302(0x86,0x01);
318 2 Write1302(0x8a,0x04);
319 2 Write1302(0x84,0x00);
320 2 Write1302(0x82,0x00);
321 2 Write1302(0x80,0x00);
322 2 Write1302(0x8e,0x80); //禁止写入
323 2 }
324 1
325 1 }
326
327 /***********ds18b20子程序*************************/
328
329 /***********ds18b20延迟子函数(晶振12MHz )*******/
330
331 void delay_18B20(unsigned int i)
332 {
333 1 while(i--);
334 1 }
335
336 /**********ds18b20初始化函数**********************/
337
338 void Init_DS18B20(void)
339 {
340 1 unsigned char x=0;
341 1 DQ = 1; //DQ复位
342 1 delay_18B20(8); //稍做延时
343 1 DQ = 0; //单片机将DQ拉低
344 1 delay_18B20(80); //精确延时 大于 480us
345 1 DQ = 1; //拉高总线
346 1 delay_18B20(14);
347 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
348 1 delay_18B20(20);
349 1 }
350
351 /***********ds18b20读一个字节**************/
352
353 unsigned char ReadOneChar(void)
354 {
355 1 uchar i=0;
356 1 uchar dat = 0;
357 1 for (i=8;i>0;i--)
358 1 {
359 2 DQ = 0; // 给脉冲信号
360 2 dat>>=1;
361 2 DQ = 1; // 给脉冲信号
362 2 if(DQ)
363 2 dat|=0x80;
C51 COMPILER V6.12 DS1302 03/12/2009 00:31:59 PAGE 7
364 2 delay_18B20(4);
365 2 }
366 1 return(dat);
367 1 }
368
369 /*************ds18b20写一个字节****************/
370
371 void WriteOneChar(uchar dat)
372 {
373 1 unsigned char i=0;
374 1 for (i=8; i>0; i--)
375 1 {
376 2 DQ = 0;
377 2 DQ = dat&0x01;
378 2 delay_18B20(5);
379 2 DQ = 1;
380 2 dat>>=1;
381 2 }
382 1 }
383
384 /**************读取ds18b20当前温度************/
385
386 void ReadTemp(void)
387 {
388 1 unsigned char a=0;
389 1 unsigned char b=0;
390 1 unsigned char t=0;
391 1
392 1 Init_DS18B20();
393 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
394 1 WriteOneChar(0x44); // 启动温度转换
395 1
396 1 delay_18B20(100); // this message is wery important
397 1
398 1 Init_DS18B20();
399 1 WriteOneChar(0xCC); //跳过读序号列号的操作
400 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
401 1
402 1 delay_18B20(100);
403 1
404 1 a=ReadOneChar(); //读取温度值低位
405 1 b=ReadOneChar(); //读取温度值高位
406 1 temp_value=b<<4;
407 1 temp_value+=(a&0xf0)>>4;
408 1 }
409 void temp_to_str() //温度数据转换成液晶字符显示
410 {
411 1 TempBuffer[0]=temp_value/10+'0'; //十位
412 1 TempBuffer[1]=temp_value%10+'0'; //个位
413 1 TempBuffer[2]=0xdf; //温度符号
414 1 TempBuffer[3]='C';
415 1 TempBuffer[4]='\0';
416 1 }
417 void Delay1ms(unsigned int count)
418 {
419 1 unsigned int i,j;
420 1 for(i=0;i<count;i++)
421 1 for(j=0;j<120;j++);
422 1 }
423
424 /*延时子程序*/
425 void mdelay(uint delay)
C51 COMPILER V6.12 DS1302 03/12/2009 00:31:59 PAGE 8
426 { uint i;
427 1 for(;delay>0;delay--)
428 1 {for(i=0;i<62;i++) //1ms延时.
429 2 {;}
430 2 }
431 1 }
432
433
434 void outkey() //跳出调整模式,返回默认显示
435 { uchar Second;
436 1 if(out==0) //||wireless_1==1
437 1 { mdelay(8);
438 2 count=0;
439 2 hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
440 2 Second=Read1302(DS1302_SECOND);
441 2 Write1302(0x8e,0x00); //写入允许
442 2 Write1302(0x80,Second&0x7f);
443 2 Write1302(0x8E,0x80); //禁止写入
444 2 done=0;
445 2 while(out==0);
446 2 // while(wireless_1==1);
447 2 }
448 1 }
449 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
450 void Upkey()//升序按键
451 {
452 1 Up=1;
453 1 if(Up==0)//||wireless_2==1
454 1 {
455 2 mdelay(8);
456 2 switch(count)
457 2 {case 1:
458 3 temp=Read1302(DS1302_SECOND); //读取秒数
459 3 temp=temp+1; //秒数加1
460 3 up_flag=1; //数据调整后更新标志
461 3 if((temp&0x7f)>0x59) //超过59秒,清零
462 3 temp=0;
463 3 break;
464 3 case 2:
465 3 temp=Read1302(DS1302_MINUTE); //读取分数
466 3 temp=temp+1; //分数加1
467 3 up_flag=1;
468 3 if(temp>0x59) //超过59分,清零
469 3 temp=0;
470 3 break;
471 3 case 3:
472 3 temp=Read1302(DS1302_HOUR); //读取小时数
473 3 temp=temp+1; //小时数加1
474 3 up_flag=1;
475 3 if(temp>0x23) //超过23小时,清零
476 3 temp=0;
477 3 break;
478 3 case 4:
479 3 temp=Read1302(DS1302_WEEK); //读取星期数
480 3 temp=temp+1; //星期数加1
481 3 up_flag=1;
482 3 if(temp>0x7)
483 3 temp=1;
484 3 break;
485 3 case 5:
486 3 temp=Read1302(DS1302_DAY); //读取日数
C51 COMPILER V6.12 DS1302 03/12/2009 00:31:59 PAGE 9
487 3 temp=temp+1; //日数加1
488 3 up_flag=1;
489 3 if(temp>0x31)
490 3 temp=1;
491 3 break;
492 3 case 6:
493 3 temp=Read1302(DS1302_MONTH); //读取月数
494 3 temp=temp+1; //月数加1
495 3 up_flag=1;
496 3 if(temp>0x12)
497 3 temp=1;
498 3 break;
499 3 case 7:
500 3 temp=Read1302(DS1302_YEAR); //读取年数
501 3 temp=temp+1; //年数加1
502 3 up_flag=1;
503 3 if(temp>0x85)
504 3 temp=0;
505 3 break;
506 3 default:break;
507 3 }
508 2
509 2 while(Up==0);
510 2 //while(wireless_2==1);
511 2 }
512 1 }
513
514 //////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
515 void Downkey()//降序按键
516 {
517 1 Down=1;
518 1 if(Down==0) //||wireless_3==1
519 1 {
520 2 mdelay(8);
521 2 switch(count)
522 2 {case 1:
523 3 temp=Read1302(DS1302_SECOND); //读取秒数
524 3 temp=temp-1; //秒数减1
525 3 down_flag=1; //数据调整后更新标志
526 3 if(temp==0x7f) //小于0秒,返回59秒
527 3 temp=0x59;
528 3 break;
529 3 case 2:
530 3 temp=Read1302(DS1302_MINUTE); //读取分数
531 3 temp=temp-1; //分数减1
532 3 down_flag=1;
533 3 if(temp==-1)
534 3 temp=0x59; //小于0秒,返回59秒
535 3 break;
536 3 case 3:
537 3 temp=Read1302(DS1302_HOUR); //读取小时数
538 3 temp=temp-1; //小时数减1
539 3 down_flag=1;
540 3 if(temp==-1)
541 3 temp=0x23;
542 3 break;
543 3 case 4:
544 3 temp=Read1302(DS1302_WEEK); //读取星期数
545 3 temp=temp-1; //星期数减1
546 3 down_flag=1;
547 3 if(temp==0)
C51 COMPILER V6.12 DS1302 03/12/2009 00:31:59 PAGE 10
548 3 temp=0x7;;
549 3 break;
550 3 case 5:
551 3 temp=Read1302(DS1302_DAY); //读取日数
552 3 temp=temp-1; //日数减1
553 3 down_flag=1;
554 3 if(temp==0)
555 3 temp=31;
556 3 break;
557 3 case 6:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -