找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4109|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机ds1302时钟掉电保护源程序

[复制链接]
跳转到指定楼层
楼主
51单片机ds1302时钟掉电保护

单片机源程序如下:
  1. /*************************************************************
  2.         不借助24c02存储数据,利用DS1302内部RAM写入数据,如果数据掉电丢失
  3. 则初始化,如果数据不丢失,则不初始化。
  4. **************************************************************/

  5. #include<reg51.h>
  6. #include<intrins.h>
  7. #include"lcd1602.h"
  8. #include"ds1302.h"
  9. #define uchar unsigned char
  10. #define uint unsigned int

  11. unsigned char second,minute,hour,day,month,year,week,count=0;   
  12. unsigned char ReadValue,num,time;  
  13.   
  14. sbit menu=P3^2;              //菜单
  15. sbit add=P3^3;               //加一
  16. sbit dec=P3^4;               //减一
  17. sbit ok = P3^5;                                 //确认
  18. void delay(unsigned int z)
  19. {
  20.         uint x,y;
  21.         for(x=z;x>0;x--)
  22.                 for(y=110;y>0;y--);
  23. }

  24. void  read_date(void)
  25. {
  26.      ReadValue = ReadSet1302(0x81);   
  27.      second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  28.      ReadValue = ReadSet1302(0x83);  
  29.      minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  30.      ReadValue = ReadSet1302(0x85);  
  31.      hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  32.      ReadValue = ReadSet1302(0x87);  
  33.      day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  34.      ReadValue = ReadSet1302(0x89);  
  35.      month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  36.      ReadValue = ReadSet1302(0x8d);  
  37.      year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  38.          ReadValue=ReadSet1302(0x8b);                     //读星期
  39.      week=ReadValue&0x07;
  40.      DisplaySecond(second);           
  41.      DisplayMinute(minute);        
  42.      DisplayHour(hour);            
  43.      DisplayDay(day);               
  44.      DisplayMonth(month);            
  45.      DisplayYear(year);         
  46.          DisplayWeek(week);      
  47. }

  48. void turn_val(char newval,uchar flag,uchar  newaddr,uchar s1num)
  49. {
  50.         newval=ReadSet1302(newaddr);                     //读取当前时间
  51.         newval=((newval&0x70)>>4)*10+(newval&0x0f);    //将bcd码转换成十进制
  52.         if(flag)                  //判断是加一还是减一
  53.     {
  54.                 newval++;
  55.         switch(s1num)
  56.         {
  57.                         case 1: if(newval>99) newval=0;
  58.                                         DisplayYear(newval);      
  59.                                         break;
  60.                         case 2: if(newval>12) newval=1;
  61.                                         DisplayMonth(newval);
  62.                                         break;
  63.                         case 3: if(newval>31) newval=1;
  64.                                         DisplayDay(newval);  
  65.                                         break;
  66.                         case 4: if(newval>6) newval=0;
  67.                                         DisplayWeek(newval);
  68.                                         break;
  69.             case 5: if(newval>23) newval=0;
  70.                                         DisplayHour(newval);
  71.                                         break;
  72.             case 6: if(newval>59) newval=0;
  73.                                         DisplayMinute(newval);
  74.                                         break;
  75.             case 7: if(newval>59) newval=0;
  76.                                         DisplaySecond(newval);
  77.                                         break;
  78.             default:break;
  79.          }
  80.         }   
  81.         else
  82.     {
  83.                 newval--;
  84.                 switch(s1num)
  85.         {
  86.                         case 1: if(newval==0) newval=99;
  87.                                         DisplayYear(newval);
  88.                                          break;
  89.                         case 2: if(newval==0) newval=12;
  90.                                         DisplayMonth(newval);
  91.                                         break;
  92.                         case 3: if(newval==0) newval=31;
  93.                                         DisplayDay(newval);
  94.                                         break;
  95.                         case 4: if(newval<0) newval=6;
  96.                                         DisplayWeek(newval);
  97.                                         break;
  98.             case 5: if(newval<0) newval=23;
  99.                                         DisplayHour(newval);
  100.                                         break;
  101.             case 6: if(newval<0) newval=59;
  102.                                         DisplayMinute(newval);
  103.                                         break;
  104.             case 7: if(newval<0) newval=59;
  105.                                         DisplaySecond(newval);
  106.                                         break;
  107.                         default:break;
  108.                 }
  109.         }
  110.     WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));  //将新数据写入寄存器
  111. }   

  112. //键盘扫描程序
  113. //*******************************************
  114. void key_scan(void)
  115. {        uchar miao,s1num=0;
  116.        
  117.         if(menu==0)
  118.      {
  119.        delay(5);
  120.            if(menu==0)
  121.            {
  122.                            while(!menu);          
  123.                            s1num++;
  124.                         while(1)
  125.                     {
  126.                
  127.                             if(menu==0)
  128.                      {
  129.                         delay(5);
  130.                             if(menu==0)
  131.                               {
  132.                                              while(!menu);
  133.                                  s1num++;
  134.                                   }
  135.                         }
  136.                         rd=0;
  137.                                 miao=ReadSet1302(0x81);
  138.                                 second=miao;
  139.                                 WriteSet1302(0x80,miao|0x80);
  140.                             write_com(0x0f);//光标闪
  141.                        
  142.                                 //年
  143.                                 if(s1num==1)
  144.                                 {       
  145.                                         year=ReadSet1302(0x8d);                 
  146.                                         write_com(0x80+4);        //年光标

  147.                                     if(add==0)
  148.                                      {
  149.                                                delay(3);
  150.                                                if(add==0)
  151.                                          {        
  152.                                                         while(!add);
  153.                                                turn_val(year,1,0x8d,1);                       
  154.                                          }
  155.                                }
  156.                        if(dec==0)
  157.                            {
  158.                                         delay(3);
  159.                                         if(dec==0)
  160.                                          {       
  161.                                                         while(!dec);
  162.                                                    turn_val(year,0,0x8d,1);                                     
  163.                                          }
  164.                                }
  165.                                    if(ok == 0) //确认键
  166.                                    {
  167.                                                    delay(3);
  168.                                         if(ok==0)
  169.                                          {
  170.                                                         while(!ok);
  171.                                                         miao=ReadSet1302(0x81);
  172.                                                         second=miao;
  173.                                                         WriteSet1302(0x80,second&0x7f);
  174.                                                         s1num=0;//s1num清零//
  175.                                                         write_com(0x0c);//光标不闪烁//
  176.                                                         break;
  177.                                                 }       
  178.                                    }
  179.                          }//年
  180.                          //月
  181.                         if(s1num==2)
  182.                         {
  183.                                  month=ReadSet1302(0x89);
  184.                                 write_com(0x80+7);        //月光标
  185.                                 if(add==0)
  186.                                 {
  187.                                           delay(3);
  188.                                           if(add==0)
  189.                                            {  
  190.                                                 while(!add);
  191.                                               turn_val(month,1,0x89,2);
  192.                                     }
  193.                                 }
  194.                                 if(dec==0)
  195.                                 {
  196.                                            delay(3);
  197.                                            if(dec==0)
  198.                                            {  
  199.                                                 while(!dec);
  200.                                               turn_val(month,0,0x89,2);
  201.                                            }
  202.                                 }
  203.                                 if(ok == 0) //确认键
  204.                                 {
  205.                                            delay(3);
  206.                                 if(ok==0)
  207.                                 {
  208.                                                 while(!ok);
  209.                                                 miao=ReadSet1302(0x81);
  210.                                                 second=miao;
  211.                                                 WriteSet1302(0x80,second&0x7f);
  212.                                                 s1num=0;//s1num清零//
  213.                                                 write_com(0x0c);//光标不闪烁//
  214.                                                 break;
  215.                                         }       
  216.                                 }
  217.                         }//月

  218.                         //日
  219.                         if(s1num==3)
  220.                         {       
  221.                                 day=ReadSet1302(0x87);
  222.                                 write_com(0x80+10);//日光标
  223.                                 if(add==0)
  224.                                   {
  225.                                           delay(3);
  226.                                           if(add==0)
  227.                                            {
  228.                                                 while(!add);
  229.                                          turn_val(day,1,0x87,3);
  230.                                     }
  231.                                 }
  232.                                 if(dec==0)
  233.                                 {
  234.                                           delay(3);
  235.                                            if(dec==0)
  236.                                            {
  237.                                                 while(!dec);
  238.                                              turn_val(day,0,0x87,3);                                //写入日寄存器
  239.                                            }
  240.                                 }
  241.                                 if(ok == 0) //确认键
  242.                                 {
  243.                                            delay(3);
  244.                                 if(ok==0)
  245.                                 {
  246.                                                 while(!ok);
  247.                                                 miao=ReadSet1302(0x81);
  248.                                                 second=miao;
  249.                                                 WriteSet1302(0x80,second&0x7f);
  250.                                                 s1num=0;//s1num清零//
  251.                                                 write_com(0x0c);//光标不闪烁//
  252.                                                 break;
  253.                                         }       
  254.                                 }
  255.                         }//日

  256.                         //星期
  257.                         if(s1num==4)
  258.                         {  
  259.                                 week=ReadSet1302(0x8b);
  260.                                 write_com(0x80+14);        //星期光标
  261.                                 if(add==0)
  262.                              {
  263.                                           delay(3);
  264.                                           if(add==0)
  265.                                            {
  266.                                                 while(!add);
  267.                                              turn_val(week,1,0x8b,4);
  268.                                     }
  269.                                 }
  270.                                 if(dec==0)
  271.                                 {
  272.                                            delay(3);
  273.                                            if(dec==0)
  274.                                            {
  275.                                                 while(!dec);
  276.                                      turn_val(week,0,0x8b,4);
  277.                                            }
  278.                                 }
  279.                                 if(ok == 0) //确认键
  280.                                 {
  281.                                            delay(3);
  282.                                 if(ok==0)
  283.                                 {
  284.                                                 while(!ok);
  285.                                                 miao=ReadSet1302(0x81);
  286.                                                 second=miao;
  287.                                                 WriteSet1302(0x80,second&0x7f);
  288.                                                 s1num=0;//s1num清零//
  289.                                                 write_com(0x0c);//光标不闪烁//
  290.                                                 break;
  291.                                         }       
  292.                                 }       
  293.                         }//星期

  294.                         //时
  295.                         if(s1num==5)
  296.                         {       
  297.                                 hour=ReadSet1302(0x85);
  298.                                 write_com(0x80+0x40+3);        //时光标
  299.                                 if(add==0)
  300.                                 {
  301.                                           delay(3);
  302.                                           if(add==0)
  303.                                            {
  304.                                                 while(!add);
  305.                                  turn_val(hour,1,0x85,5);
  306.                                     }
  307.                                 }
  308.                                 if(dec==0)
  309.                                 {
  310.                                            delay(3);
  311.                                            if(dec==0)
  312.                                            {
  313.                                                 while(!dec);
  314.                                          turn_val(hour,0,0x85,5);
  315.                                            }
  316.                                 }
  317.                                 if(ok == 0) //确认键
  318.                                 {
  319.                                            delay(3);
  320.                                 if(ok==0)
  321.                                 {
  322.                                                 while(!ok);
  323.                                                 miao=ReadSet1302(0x81);
  324.                                                 second=miao;
  325.                                                 WriteSet1302(0x80,second&0x7f);
  326.                                                 s1num=0;//s1num清零//
  327.                                                 write_com(0x0c);//光标不闪烁//
  328.                                                 break;
  329.                                         }       
  330.                                 }
  331.                         }//时

  332.                         //分
  333.                         if(s1num==6)//调时间分
  334.                         {  
  335.                                 minute=ReadSet1302(0x83);
  336.                                 write_com(0x80+0x40+6);
  337.                                 if(add==0)
  338.                                 {
  339.                                           delay(5);
  340.                                           if(add==0)
  341.                                            {
  342.                                                 while(!add);
  343.                                          turn_val(minute,1,0x83,6);                                //写入分寄存器   
  344.                                     }
  345.                                 }
  346.                                 if(dec==0)
  347.                                 {
  348.                                            delay(3);
  349.                                            if(dec==0)
  350.                                            {
  351.                                                 while(!dec);
  352.                                          turn_val(minute,0,0x83,6);                                //写入分寄存器
  353.                                            }
  354.                                 }
  355.                                 if(ok == 0) //确认键
  356.                                 {
  357.                                            delay(3);
  358.                                 if(ok==0)
  359.                                 {
  360.                                                 while(!ok);
  361.                                                 miao=ReadSet1302(0x81);
  362.                                                 second=miao;
  363.                                                 WriteSet1302(0x80,second&0x7f);
  364.                                                 s1num=0;//s1num清零//
  365.                                                 write_com(0x0c);//光标不闪烁//
  366.                                                 break;
  367.                                         }       
  368.                                 }         
  369.                         }//分

  370.                         //秒
  371.                         if(s1num==7)//调时间秒
  372.                         {       
  373.                                 second=ReadSet1302(0x81);
  374.                                 write_com(0x80+0x40+9);//秒光标
  375.                                 if(add==0)
  376.                                 {
  377.                                           delay(3);
  378.                                           if(add==0)
  379.                                            {
  380.                                                 while(!add);
  381.                                  if(second==0x60)
  382.                                     second=0x00;
  383.                                          turn_val(second,1,0x81,7);       
  384.                                     }
  385.                                 }
  386.                                 if(dec==0)
  387.                                 {
  388.                                            delay(3);
  389.                                            if(dec==0)
  390.                                            {
  391.                                                 while(!dec);
  392.                                          turn_val(second,0,0x81,7);                               
  393.                                            }
  394.                                 }
  395.                                 if(ok == 0) //确认键
  396.                                 {
  397.                                            delay(3);
  398.                                 if(ok==0)
  399.                                 {
  400.                                                 while(!ok);
  401.                                                 miao=ReadSet1302(0x81);
  402.                                                 second=miao;
  403.                                                 WriteSet1302(0x80,second&0x7f);
  404.                                                 s1num=0;//s1num清零//
  405.                                                 write_com(0x0c);//光标不闪烁//
  406.                                                 break;
  407.                                         }       
  408.                                 }
  409.                         }//秒
  410.                         if(s1num==8)
  411.                         {        miao=ReadSet1302(0x81);
  412.                                 second=miao;
  413.                                 WriteSet1302(0x80,second&0x7f);
  414.                                 s1num=0;//s1num清零//
  415.                                 write_com(0x0c);//光标不闪烁//
  416.                                 break;
  417.                         }
  418.                 }
  419.           }
  420.         }
  421. }
  422. void main()
  423. {
  424.         init();
  425.         Init_DS1302();       //将1302初始化
  426.         while(1)
  427.         {
  428.          read_date();
  429.          key_scan();
  430.         }

  431. }
复制代码

所有资料51hei提供下载:
程序1-无24c02,掉电保护.zip (61.27 KB, 下载次数: 66)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2018-10-25 08:49 | 只看该作者
没有备用电池吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表