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