找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4545|回复: 9
收起左侧

ds1302时钟怎样实现断电继续走?

[复制链接]
ID:263129 发表于 2018-1-8 13:31 | 显示全部楼层 |阅读模式
这是我的程序,怎样实现断电继续走?ds1302的时钟芯片,有备用电源。

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P2^5;          //定义1602液晶rs端
  5. sbit rw=P2^6;          //定义1602液晶rw端
  6. sbit lcden=P2^7;      //定义1602液晶lcden端
  7. sbit s2=P3^2;          //定义功能键
  8. sbit s3=P3^3;          //定义增大键
  9. sbit s4=P3^4;          //定义减小键
  10. uchar count,s1num;
  11. char miao,shi,fen;
  12. uchar code table[]="  2018-1-7MON ";       //定义初始上电时液晶默认显示状态
  13. uchar code table1[]="    00:00:00 ";
  14. //Read_BursRam(&Read_Flag,1);
  15. //if(Read_Flag!= 1)
  16. //{
  17. // Write_Data(0x90,0xaa);
  18. // Write_BurstClock(Cur_Time);
  19. // Write_BurstRam(&Clock_Flag,1);
  20. // Write_Data(0x8e,0x80);
  21. //}
  22. void delay(uint z)                        //延时函数
  23. {
  24.     uint x,y;
  25.     for(x=z;x>0;x--);
  26.         for(y=110;y>0;y--);
  27. }

  28. void write_com(uchar com)        //液晶写命令函数
  29. {
  30.     rs=0;
  31.     lcden=0;
  32.     P0=com;
  33.     delay(20);
  34.     lcden=1;
  35.     delay(20);
  36.     lcden=0;   
  37. }

  38. void write_date(uchar date)           //液晶写数据函数
  39. {
  40.     rs=1;
  41.     lcden=0;
  42.     P0=date;
  43.     delay(20);
  44.     lcden=1;
  45.     delay(20);
  46.     lcden=0;   
  47. }

  48. void init()                   //初始化函数
  49. {

  50.     uchar num;
  51.     lcden=0;      
  52.     rw=0;
  53.     write_com(0x38);             //初始化1602液晶
  54.     write_com(0x0c);
  55.     write_com(0x06);
  56.     write_com(0x01);
  57.     write_com(0x80);             //设置显示初始坐标
  58.     for(num=0;num<15;num++)         
  59.         {
  60.             write_date(table[num]);
  61.             delay(20);
  62.         }
  63.     write_com(0x80+0x40);
  64.     for(num=0;num<12;num++)
  65.         {
  66.             write_date(table1[num]);
  67.             delay(20);
  68.         }
  69.     TMOD=0x01;            //设置定时器0工作模式1
  70.     TH0=(65536-50000)/256;         //定时器装初值
  71.     TL0=(65536-50000)%256;
  72.     EA=1;                         //开总中断
  73.     ET0=1;                        //开定时器0中断
  74.     TR0=1;                        //启动定时器0
  75. }

  76. void write_sfm(uchar add,uchar date)
  77. {
  78.     uchar shi,ge;
  79.     shi=date/10;
  80.     ge=date%10;
  81.     write_com(0x80+0x40+add);
  82.     write_date(0x30+shi);
  83.     write_date(0x30+ge);
  84. }

  85. void keyscan()          //按键扫描函数
  86. {
  87.     if(s2==0)   
  88.     {
  89.         delay(20);
  90.         if(s2==0)            //确认功能键被按下
  91.         {   
  92.            s1num++;        //功能键按下次数记录
  93.             while(!s2);        //确认释放
  94.             if(s1num==1)    //第一次被按下时
  95.             {
  96.                 TR0=0;        //关闭定时器
  97.                 write_com(0x80+0x40+10);      //功能键作用在秒
  98.                 write_com(0x0f);              //光标闪烁
  99.             }
  100.     }
  101.             if(s1num==2)             //第二次被按下时在分
  102.             {
  103.                 write_com(0x80+0x40+7);
  104.             }
  105.             if(s1num==3)              //第三次被按下时在时
  106.             {
  107.                 write_com(0x80+0x40+4);
  108.             }
  109.             if(s1num==4)              //第四次被按下,清零
  110.             {
  111.                 s1num=0;
  112.                 write_com(0x0c);
  113.                 TR0=1;                 //启动定时器时钟开始走
  114.             }

  115.                
  116.         }
  117.         if(s1num!=0)                  //当功能键被按下后增大键减小键才可以发挥作用
  118.         {
  119.             if(s3==0)
  120.             {
  121.                 delay(20);
  122.                 if(s3==0)              //增大键被按下
  123.                 {
  124.                     while(!s2);          //按键释放
  125.                     if(s1num==1)      //若功能键第一次被按下
  126.                     {
  127.                         miao++;           //秒加一
  128.                         if(miao==60)   //秒满60后清零
  129.                             miao=0;
  130.                         write_sfm(10,miao);      //每调节一次液晶显示一次
  131.                         write_com(0x80+0x40+10);       //显示位置重新回到调节处
  132.                         
  133.                         
  134.                     }
  135.                     if(s1num==2)         
  136.                     {
  137.                         fen++;
  138.                         if(fen==60)
  139.                             fen=0;
  140.                         write_sfm(7,fen);
  141.                         write_com(0x80+0x40+7);
  142.                     }
  143.                     if(s1num==3)
  144.                     {
  145.                         shi++;
  146.                         if(shi==24)
  147.                             shi=0;
  148.                         write_sfm(4,shi);
  149.                         write_com(0x80+0x40+4);
  150.                     }
  151.                 }
  152.             }
  153.             if(s4==0)
  154.             {
  155.                 delay(20);
  156.                 if(s4==0)
  157.                 {
  158.                     while(!s3);
  159.                     if(s1num==1)
  160.                     {
  161.                         miao--;              //调整秒减一
  162.                         if(miao==-1)      //减到负数则重新设置为59
  163.                             miao=59;
  164.                         write_sfm(10,miao);
  165.                         write_com(0x80+0x40+10);
  166.                     }
  167.                     if(s1num==2)
  168.                     {
  169.                         fen--;
  170.                         if(fen==-1)
  171.                             fen=59;
  172.                         write_sfm(7,fen);
  173.                         write_com(0x80+0x40+7);
  174.                     }
  175.                     if(s1num==3)
  176.                     {
  177.                         shi--;
  178.                         if(shi==-1)
  179.                             shi=23;
  180.                         write_sfm(4,shi);
  181.                         write_com(0x80+0x40+4);
  182.                     }
  183.                 }
  184.             }
  185.         }
  186. }
  187. void main()
  188. {
  189. //    Ds1302Init();
  190.     init();
  191.     while(1)
  192.     {
  193.         keyscan();
  194.         
  195.     }
  196.    }

  197. void timer0() interrupt 1        //定时器0中断服务程序
  198. {
  199.     TH0=(65536-50000)/256;        //再次装定时器初值
  200.     TL0=(65536-50000)%256;
  201.     count++;                   //中断次数累加
  202. if(count==18)
  203.         {
  204.             count=0;
  205.             miao++;
  206.             if(miao==60)
  207.             {
  208.                 miao=0;
  209.                 fen++;
  210.                 if(fen==60)
  211.                 {
  212.                     fen=0;
  213.                     shi++;
  214.                     if(shi==24)
  215.                     {
  216.                         shi=0;
  217.                     }
  218.                     write_sfm(4,shi);
  219.                 }
  220.                 write_sfm(7,fen);
  221.             }
  222.             write_sfm(10,miao);
  223.             
  224.         }   
  225. }
复制代码


回复

使用道具 举报

ID:97438 发表于 2018-1-8 14:09 | 显示全部楼层
你这个程序根本就没看到DS1302的影子额~DS1302有电池供电的话,本来就是会断电走时的。你单片机只读它别写它,你试试。
回复

使用道具 举报

ID:7485 发表于 2018-1-8 15:31 | 显示全部楼层
如果有时钟芯片,有后备电池,接法正确,断电以后是可以正常走时的。只是一般不让单片机工作不让它显示,上电以后单片机工作才正常显示。除非你有很大的后备电池。
回复

使用道具 举报

ID:273264 发表于 2018-1-8 15:54 | 显示全部楼层
代码是不是有误?
回复

使用道具 举报

ID:273285 发表于 2018-1-8 16:01 | 显示全部楼层
时钟芯片本身如果配有电池的话是一直继续走的哦,跟单片机本身与他的操作没有关系。
如果没有后备电池的话,那么断电了就没法走了。
回复

使用道具 举报

ID:263129 发表于 2018-1-8 17:03 | 显示全部楼层
ahshmj 发表于 2018-1-8 15:31
如果有时钟芯片,有后备电池,接法正确,断电以后是可以正常走时的。只是一般不让单片机工作不让它显示,上 ...

我有后备电池
回复

使用道具 举报

ID:263129 发表于 2018-1-8 17:04 | 显示全部楼层
6457321321 发表于 2018-1-8 15:54
代码是不是有误?

我也想知道有没有错
回复

使用道具 举报

ID:263129 发表于 2018-1-8 17:06 | 显示全部楼层
luoluoluo136 发表于 2018-1-8 14:09
你这个程序根本就没看到DS1302的影子额~DS1302有电池供电的话,本来就是会断电走时的。你单片机只读它别写 ...

我不懂什么意思,我就是不知道怎么吧ds1302加进去
回复

使用道具 举报

ID:263129 发表于 2018-1-9 14:16 | 显示全部楼层
麻烦哪位大神帮我写一下这个程序
回复

使用道具 举报

ID:280151 发表于 2018-2-4 20:52 | 显示全部楼层
厉害 膜拜大神  感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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