找回密码
 立即注册

QQ登录

只需一步,快速开始

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

万年历显示当前日期 找不到程序的初始值放在哪里的

[复制链接]
跳转到指定楼层
楼主
ID:115498 发表于 2016-4-25 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想请教一下大家,万年历一仿真显示的就是2013年01月01日00点,怎样才能显示当前日期啊?一直找不到程序的初始值放在哪里的。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-4-25 19:18 | 只看该作者
初始值肯定就在程序里面 要不是就没有初始直接 读取的ds1302芯片,你把程序发上来分析一下就知道了
回复

使用道具 举报

板凳
ID:7485 发表于 2016-4-25 20:48 | 只看该作者
这个思路是这样的:在第一次上电时,在主程序里面设置初始值,初始值设置完成后,在DS1302里的ram的某一个字节中设置一个标记(比如:0x55或0xAA)。以后重启后,先检测这个标记,如果是你设置的标记,就跳过初始设置。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:115498 发表于 2016-4-26 13:55 | 只看该作者
admin 发表于 2016-4-25 19:18
初始值肯定就在程序里面 要不是就没有初始直接 读取的ds1302芯片,你把程序发上来分析一下就知道了

#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
#include "eeprom52.h"
#include "nongli.h"
#include "intrins.h"

bit flag_200ms ;
bit flag_100ms ;
sbit beep = P3^7;          //蜂鸣器定义
bit flag_beep_en;
uint clock_value;     //用作闹钟用的

sbit dq   = P3^1;          //18b20 IO口的定义


uint temperature ;    //温度变量
uchar flag_nl;        //农历 阳历显示标志位


uchar menu_1,menu_2;



uchar key_time,flag_value;      //用做连加的中间变量
bit key_500ms  ;
uchar n_nian,n_yue,n_ri;                //农历显示的函数



#include "ds1302.h"
#include "lcd1602.h"



/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
        SectorErase(0x2000);
        byte_write(0x2000, fen1);
        byte_write(0x2001, shi1);
        byte_write(0x2002, open1);
        byte_write(0x2058, a_a);       
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
        fen1  = byte_read(0x2000);
        shi1  = byte_read(0x2001);
        open1  = byte_read(0x2002);
        a_a      = byte_read(0x2058);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
        read_eeprom();                //先读
        if(a_a != 1)                //新的单片机初始单片机内问eeprom
        {
                fen1  = 3;
                shi1  = 8;
                open1  = 1;
                a_a = 1;
                write_eeprom();           //保存数据
        }       
}

/***********************18b20初始化函数*****************************/
void init_18b20()
{
        bit q;
        dq = 1;                                //把总线拿高
        delay_uint(1);            //15us
        dq = 0;                                //给复位脉冲
        delay_uint(80);                //750us
        dq = 1;                                //把总线拿高 等待
        delay_uint(10);                //110us
        q = dq;                                //读取18b20初始化信号
        delay_uint(20);                //200us
        dq = 1;                                //把总线拿高 释放总线
}

/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {                                         //写数据是低位开始
                dq = 0;                         //把总线拿低写时间隙开始
                dq = dat & 0x01; //向18b20总线写数据了
                delay_uint(5);         // 60us
                dq = 1;                         //释放总线
                dat >>= 1;
        }       
}

/*************读取18b20内的数据***************/
uchar read_18b20()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                         //把总线拿低读时间隙开始
                value >>= 1;         //读数据是低位开始
                dq = 1;                         //释放总线
                if(dq == 1)                 //开始读写数据
                        value |= 0x80;
                delay_uint(5);         //60us        读一个时间隙最少要保持60us的时间
        }
        return value;                 //返回数据
}

/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳过64位ROM
        write_18b20(0x44);           //启动一次温度转换命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20
       
        write_18b20(0xcc);           //跳过64位ROM
        write_18b20(0xbe);           //发出读取暂存器命令
       
        EA = 0;
        low = read_18b20();           //读温度低字节
        value = read_18b20();  //读温度高字节
        EA = 1;
        value <<= 8;                   //把温度的高位左移8位
        value |= low;                   //把读出的温度低位放到value的低八位中
        value *= 0.625;               //转换到温度值 小数
        return value;                   //返回读出的温度 带小数
}



/******************1ms 延时函数*******************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

/******************写星期函数*******************/
void write_week(uchar hang,uchar add,uchar week)//写星期函数
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);          
        switch(week)
        {
                case 1:write_data('M');//星期数为1时,显示
                           write_data('O');
                           write_data('N');
                           break;
          
                case 2:write_data('T');//星期数据为2时显示
                           write_data('U');
                           write_data('E');
                           break;
               
                case 3:write_data('W');//星期数据为3时显示
                           write_data('E');
                           write_data('D');
                           break;
               
                case 4:write_data('T');//星期数据为4是显示
                           write_data('H');
                           write_data('U');
                           break;
               
                case 5:write_data('F');//星期数据为5时显示
                           write_data('R');
                           write_data('I');
                           break;
               
                case 6:write_data('S');//星期数据为6时显示
                           write_data('T');
                           write_data('A');
                           break;
               
                case 7:write_data('S');//星期数据为7时显示
                           write_data('U');
                           write_data('N');
                           break;
        }
}

/*************时钟显示***************/
void init_1602_ds1302()
{
        write_sfm2_ds1302(1,1,shi);                   //显示时
        write_sfm2_ds1302(1,4,fen);                   //显示分
        write_sfm2_ds1302(1,7,miao);           //显示秒
        write_week(2,12,week);
  //write_sfm1(1,14,week);                           //显示星期
        write_sfm3_18B20(1,11,temperature);           //显示温度
        if(flag_nl == 0)  //显示阳历
        {
                write_sfm2_ds1302(2,2,nian);   //显示年
                write_sfm2_ds1302(2,5,yue);           //显示月       
                write_sfm2_ds1302(2,8,ri);           //显示日        
        }
        else                          //显示农历
        {
                write_sfm2_ds1302(2,2,n_nian);        //显示年
                write_sfm2_ds1302(2,5,n_yue);        //显示月       
                write_sfm2_ds1302(2,8,n_ri);        //显示日
               
        }
       

       
               
}                                                                          

/*************定时器0初始化程序***************/
void init_time0()          
{
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、工作方式1
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时
}

/*************闹钟报警函数***************/
void menu_dis()
{
        static uchar mm,value;
        if(flag_100ms == 1)                  //100ms执行一次
        {
                flag_100ms = 0;
                if(open1 == 1)        //如果闹钟打开
                {
                        if((miao == 0) && (fen == fen1) && (shi == shi1))
                        {               
                                flag_beep_en = 1;        //有报警 打开蜂鸣器响的标志位                               
                        }               
                        if(flag_beep_en == 1)        //闹钟以被打开
                        {
                                clock_value++;
                                if(clock_value <= 30)         
                                        beep = ~beep;           //蜂鸣器叫3秒
                                else if(clock_value > 30)
                                {
                                        beep = 1;                    //蜂鸣器停1秒
                                        if(clock_value > 40)
                                        {
                                                clock_value = 0;

                                        }
                                }
                                //  1 分钟后自动关闭闹钟
                                value ++;
                                if(value >= 10)
                                {
                                        value = 0;
                                        mm++;
                                        if(mm >= 60)
                                        {
                                                mm = 0;
                                                flag_beep_en = 0;
                                                beep = 1;       
                                        }
                                }                                       
                        }
                }       
        }
}


/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new;
        key_can = 20;                   //按键值还原
        P3 |= 0x78;                     //对应的按键IO口输出为1
        if((P3 & 0x78) != 0x78)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if(((P3 & 0x78) != 0x78) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        switch(P3 & 0x78)
                        {
                                case 0x70:  key_can = 4;  break;         //得到按键值
                                case 0x68:  key_can = 3;  break;         //得到按键值
                                case 0x58:  key_can = 2;  break;         //得到按键值
                                case 0x38:  key_can = 1;  break;         //得到按键值
                        }
//                        write_sfm2(1,0,key_can);                                 //显示按键值
                }                       
        }
        else
                key_new = 1;       
}


/**********************设置函数************************/
void key_with()
{
        if(key_can == 1)        //设置键
        {
                menu_1++;
                if(menu_1 == 1)          //设置时间
                {
                        menu_2 = 1;
                        write_string(1,0,"    :  :    W:  ");                       
                        write_string(2,0," 20  -  -       ");       
                }
                if(menu_1 == 2)          //设置闹钟
                {
                        menu_2 = 1;
                        write_string(1,0,"   set clock    ");                       
                        write_string(2,0,"    Y  00:00      ");       
                }
                if(menu_1 > 2)    //回到正常显示
                {
                        menu_1 = 0;
                        write_guanbiao(1,2,0);         //关闭光标
                        init_1602_dis_csf();      //初始化液晶显示               
                }
        }
        if(key_can == 2)        //选择键
        {
                flag_200ms = 1;
                if(menu_1 == 1)                  //设置时间
                {
                        menu_2 ++;
                        if(menu_2 > 7)
                                menu_2 = 1;
                }
                if(menu_1 == 2)                 //设置闹钟
                {
                        menu_2 ++;
                        if(menu_2 > 3)
                                menu_2 = 1;                               
                }
        }
        if(menu_1 == 1)
        {
                if(menu_2 == 1)                  //设置时
                {
                        if(key_can == 3)        //加
                        {
                                shi+=0x01;
                                if((shi & 0x0f) >= 0x0a)
                                        shi = (shi & 0xf0) + 0x10;           ///***shi & 0xf0低四位清零,(shi & 0xf0) + 0x10向高位进1(高四位加1)***///                                if(shi >= 0x24)
                                        shi = 0;
                        }               
                        if(key_can == 4)        //减
                        {
                                if(shi == 0x00)          
                                        shi = 0x24;
                                if((shi & 0x0f) == 0x00)  
                                        shi = (shi | 0x0a) - 0x10;         ///***如果个位为0,高四位减1***///
                                shi -- ;
                        }                                         
                }
                if(menu_2 == 2)                  //设置分
                {
                        if(key_can == 3)        //加
                        {
                                fen+=0x01;
                                if((fen & 0x0f) >= 0x0a)
                                        fen = (fen & 0xf0) + 0x10;
                                if(fen >= 0x60)
                                        fen = 0;
                        }               
                        if(key_can == 4)        //减          
                        {
                                if(fen == 0x00)
                                        fen = 0x5a;
                                if((fen & 0x0f) == 0x00)
                                        fen = (fen | 0x0a) - 0x10;
                                fen -- ;
                        }       
                }
                if(menu_2 == 3)                  //设置秒
                {
                        if(key_can == 3)        //加
                        {
                                miao+=0x01;
                                if((miao & 0x0f) >= 0x0a)
                                        miao = (miao & 0xf0) + 0x10;
                                if(miao >= 0x60)
                                        miao = 0;
                        }       
                        if(key_can == 4)        //减          
                        {
                                if(miao == 0x00)
                                        miao = 0x5a;
                                if((miao & 0x0f) == 0x00)
                                        miao = (miao | 0x0a) - 0x10;
                                miao -- ;                       
                        }
                }
                if(menu_2 == 4)                  //设置星期
                {
                        if(key_can == 3)        //加
                        {
                            week+=0x01;
                                if((week & 0x0f) >= 0x0a)
                                        week = (week & 0xf0) + 0x10;
                                if(week >= 0x08)
                                        week = 1;
                        }               
                        if(key_can == 4)        //减          
                        {
                                if(week == 0x01)
                                        week = 0x08;
                                if((week & 0x0f) == 0x00)
                                        week = (week | 0x0a) - 0x10;
                                week -- ;
                        }       
                }
                if(menu_2 == 5)                  //设置年
                {
                        if(key_can == 3)        //加
                        {
                            nian+=0x01;
                                if((nian & 0x0f) >= 0x0a)
                                        nian = (nian & 0xf0) + 0x10;
                                if(nian >= 0x9a)
                                        nian = 1;
                        }               
                        if(key_can == 4)        //减          
                        {
                                if(nian == 0x01)
                                        nian = 0x9a;
                                if((nian & 0x0f) == 0x00)
                                        nian = (nian | 0x0a) - 0x10;
                                nian -- ;               
                        }       
                }
                if(menu_2 == 6)                  //设置月
                {
                        if(key_can == 3)        //加
                        {
                            yue+=0x01;
                                if((yue & 0x0f) >= 0x0a)
                                        yue = (yue & 0xf0) + 0x10;
                                if(yue >= 0x13)
                                        yue = 1;
                        }               
                        if(key_can == 4)        //减          
                        {
                                if(yue == 0x01)
                                        yue = 0x13;
                                if((yue & 0x0f) == 0x00)
                                        yue = (yue | 0x0a) - 0x10;
                                yue -- ;                                       
                        }       
                }
                if(menu_2 == 7)                  //设置日
                {
                        if(key_can == 3)        //加
                        {
                    ri+=0x01;
                        if((ri & 0x0f) >= 0x0a)
                                ri = (ri & 0xf0) + 0x10;
                        if(ri >= 0x32)
                                ri = 0;                       
                        }               
                        if(key_can == 4)        //减          
                        {
                                if(ri == 0x01)
                                        ri = 0x32;
                                if((ri & 0x0f) == 0x00)
                                        ri = (ri | 0x0a) - 0x10;
                                ri -- ;                       
                        }       
                }
                write_sfm2_ds1302(1,2,shi);           ///***第一行第二字节开始显示时,从十位开始写***///
                write_sfm2_ds1302(1,5,fen);           //显示分
                write_sfm2_ds1302(1,8,miao);           //显示秒
                write_sfm1(1,14,week);           //显示星期                                       
                write_sfm2_ds1302(2,3,nian);           //显示年
                write_sfm2_ds1302(2,6,yue);           //显示月
                write_sfm2_ds1302(2,9,ri);           //显示日
  ///***write_sfm3_18B20(2,12,temperature);           //显示温度        ***///       
                switch(menu_2)           // 光标显示
                {
                        case 1:  write_guanbiao(1,2,1);  break;
                        case 2:  write_guanbiao(1,5,1);  break;
                        case 3:  write_guanbiao(1,8,1);  break;
                        case 4:  write_guanbiao(1,14,1);  break;
                        case 5:  write_guanbiao(2,3,1);  break;
                        case 6:  write_guanbiao(2,6,1);  break;
                        case 7:  write_guanbiao(2,9,1);  break;
                }
                write_time();           //把时间写进去
        }       
/***************设置闹钟*********************/
        if(menu_1 == 2)
        {
                if(menu_2 == 1)                  //设置闹钟开关
                {
                        if(key_can == 3)       
                        {
                                open1 = 1;          //闹钟开
                        }               
                        if(key_can == 4)       
                        {
                                open1 = 0;          //闹钟关
                        }                                         
                }
                if(menu_2 == 2)                  //设置闹钟时
                {
                        if(key_can == 3)        //加
                        {
                            shi1+=0x01;
                                if((shi1 & 0x0f) >= 0x0a)
                                        shi1 = (shi1 & 0xf0) + 0x10;
                                if(shi1 >= 0x24)
                                        shi1 = 0;
                        }               
                        if(key_can == 4)        //减          
                        {
                                if(shi1 == 0x00)
                                        shi1 = 0x5a;
                                if((shi1 & 0x0f) == 0x00)
                                        shi1 = (shi1 | 0x0a) - 0x10;
                                shi1 -- ;
                        }       
                }
                if(menu_2 == 3)                  //设置秒
                {
                        if(key_can == 3)        //加
                        {
                            fen1+=0x01;
                                if((fen1 & 0x0f) >= 0x0a)
                                        fen1 = (fen1 & 0xf0) + 0x10;
                                if(fen1 >= 0x60)
                                        fen1 = 0;
                        }       
                        if(key_can == 4)        //减          
                        {
                                if(fen1 == 0x00)
                                        fen1 = 0x5a;
                                if((fen1 & 0x0f) == 0x00)
                                        fen1 = (fen1 | 0x0a) - 0x10;
                                fen1 -- ;                       
                        }
                }
                if(open1 == 1)
                        write_string(2,4,"Y");       
                else
                        write_string(2,4,"N");       
                write_sfm2_ds1302(2,7,shi1);           //显示闹钟时
                write_sfm2_ds1302(2,10,fen1);           //显示闹钟分
                switch(menu_2)           // 光标显示
                {
                        case 1:  write_guanbiao(2,4,1);  break;
                        case 2:  write_guanbiao(2,7,1);  break;
                        case 3:  write_guanbiao(2,10,1);  break;
                }       
                write_eeprom();     //保存闹钟时间
        }                       
}

/*****************主函数********************/
void main()
{       
        beep = 0;                                //开机叫一声   
        delay_1ms(150);
        P0 = P1 = P2 = P3 = 0xff;                //单片机IO口初始化为1
        init_time0();                 //初始化定时器
        init_ds1302();                 //ds1302初始化
        init_1602();                 //lcd1602初始化
        init_1602_dis_csf(); //lcd1602初始化显示
        init_eeprom();       //开始初始化保存的数据
        temperature = read_temp();        //先读出温度的值
        delay_1ms(650);
        temperature = read_temp();        //先读出温度的值
        while(1)
        {
                key();                         //按键程序
                if(key_can < 10)
                {
                        if(flag_beep_en == 0)  //只有闹钟关了的时候才能进入设置
                                key_with();       
                        else
                        {
                                flag_beep_en = 0;         //按下任意键可关闭闹钟
                                beep = 1;
                                clock_value = 0;
                                read_time();
                        }
                        if(menu_1 == 0)
                        {
                                if(key_can == 4)  //减键
                                {
                                        flag_nl = ~flag_nl;                  //切换农历和阳历的显示标志位       
                                        if(flag_nl == 0)
                                                write_string(2,0,"2016");
                                        else        
                                                write_string(2,0,"N ");
                                }
                        }
                }
               
                if(flag_200ms == 1)
                {       
                        flag_200ms = 0;
                        if(menu_1 == 0)
                        {
                                read_time();                  //读时间
                                temperature = read_temp();        //先读出温度的值
                                init_1602_ds1302();   //显示时钟
                        }
                }
                menu_dis();           //闹钟报警函数
                delay_1ms(1);
        }
}

/**************定时器0中断程序*****************/
void time0() interrupt 1
{                         
        static uchar value;
        TH0 = 0X3C;
        TL0 = 0XB0;           //50ms
        value ++;          
        if((value % 2) == 0)         //100ms  
                flag_100ms = 1;         
        if(value >= 6)                         //200ms
        {
                value = 0;
                flag_200ms = 1;
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:115498 发表于 2016-4-26 13:56 | 只看该作者
admin 发表于 2016-4-25 19:18
初始值肯定就在程序里面 要不是就没有初始直接 读取的ds1302芯片,你把程序发上来分析一下就知道了

#ifndef _DS1302_H_
#define _DS1302_H_


  1. /******************
  2.         ds1302 内部RAM   RAM0  1100 000R/W   1读 0写
  3.                                          RAM1  1100 001R/W  
  4.                                                .......
  5.                                          RAM30 1111 110R/W   
  6. ********************/

  7. sbit clk = P1^3;          //ds1302时钟线定义
  8. sbit io =  P1^4;          //数据线
  9. sbit rst = P1^5;          //复位线
  10.                                                 //秒  分   时   日   月  年   星期         
  11. uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};   //写地址
  12. uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};   //读地址
  13. uchar code init_ds[]  ={0x58,0x00,0x00,0x01,0x01,0x13,0x01};

  14. //uchar miao,fen,shi,ri,yue,week,nian;
  15. uchar  miao,fen,shi,ri,yue,week,nian;        
  16. uchar i;
  17. uchar fen1=0x11,shi1=0;          //两个闹钟变量的定义
  18. bit open1;

  19. /*************写一个数据到对应的地址里***************/
  20. void write_ds1302(uchar add,uchar dat)
  21. {               
  22.         rst = 1;                         //把复位线拉高
  23.         for(i=0;i<8;i++)
  24.         {                                     //低位在前
  25.                 clk = 0;                 //时钟线拿低开始写数据
  26.                 io = add & 0x01;            
  27.                 add >>= 1;                 //把地址右移一位
  28.                 clk = 1;                 //时钟线拿高
  29.         }        
  30.         for(i=0;i<8;i++)
  31.         {
  32.                 clk = 0;                 //时钟线拿低开始写数据
  33.                 io = dat & 0x01;
  34.                 dat >>= 1;                 //把数据右移一位
  35.                 clk = 1;                 //时钟线拿高
  36.         }
  37.         rst = 0;                         //复位线合低
  38.         clk = 0;
  39.         io = 0;
  40. }

  41. /*************从对应的地址读一个数据出来***************/
  42. uchar read_ds1302(uchar add)
  43. {
  44.         uchar value,i;
  45.         rst = 1;                         //把复位线拿高
  46.         for(i=0;i<8;i++)
  47.         {                                     //低位在前
  48.                 clk = 0;                 //时钟线拿低开始写数据
  49.                 io = add & 0x01;            
  50.                 add >>= 1;                 //把地址右移一位
  51.                 clk = 1;                 //时钟线拿高
  52.         }               
  53.         for(i=0;i<8;i++)
  54.         {
  55.                 clk = 0;                 //时钟线拿低开始读数据
  56.                 value >>= 1;
  57.                 if(io == 1)
  58.                         value |= 0x80;
  59.                 clk = 1;                 //时钟线拿高
  60.         }
  61.         rst = 0;                         //复位线合低
  62.         clk = 0;
  63.         io = 0;
  64.         return value;                 //返回读出来的数据
  65. }



  66. /*************把要的时间 年月日 都读出来***************/
  67. void read_time()
  68. {
  69.         miao = read_ds1302(read_add[0]);        //读秒
  70.         fen  = read_ds1302(read_add[1]);        //读分
  71.         shi  = read_ds1302(read_add[2]);        //读时
  72.         ri   = read_ds1302(read_add[3]);        //读日
  73.         yue  = read_ds1302(read_add[4]);        //读月
  74.         nian = read_ds1302(read_add[5]);        //读年
  75.         week = read_ds1302(read_add[6]);        //读星期
  76.         Conversion(0,nian,yue,ri);        //农历转换                                    
  77.         n_nian = year_moon ;
  78.         n_yue  = month_moon ;
  79.         n_ri   = day_moon ;

  80. }

  81. /*************把要写的时间 年月日 都写入ds1302里***************/
  82. void write_time()
  83. {
  84.         write_ds1302(0x8e,0x00);                        //打开写保护
  85.         write_ds1302(write_add[0],miao);        //写秒
  86.         write_ds1302(write_add[1],fen);                //写分
  87.         write_ds1302(write_add[2],shi);                //写时
  88.         write_ds1302(write_add[3],ri);                //写日
  89.         write_ds1302(write_add[4],yue);                //写月
  90.         write_ds1302(write_add[5],nian);        //写年
  91.         write_ds1302(write_add[6],week);        //写星期
  92.         write_ds1302(0x8e,0x80);                        //关闭写保护
  93. }

  94. /*************把数据保存到ds1302 RAM中**0-31*************/
  95. void write_ds1302ram(uchar add,uchar dat)
  96. {
  97.         add <<= 1;     //地址是从第二位开始的
  98.         add &= 0xfe;   //把最低位清零  是写的命令
  99.         add |= 0xc0;   //地址最高两位为 1  
  100.         write_ds1302(0x8e,0x00);
  101.         write_ds1302(add,dat);        
  102.         write_ds1302(0x8e,0x80);
  103. }

  104. /*************把数据从ds1302 RAM读出来**0-31*************/
  105. uchar read_ds1302ram(uchar add)
  106. {
  107.         add <<= 1;     //地址是从第二位开始的
  108.         add |= 0x01;   //把最高位置1  是读命令
  109.         add |= 0xc0;   //地址最高两位为 1  
  110.         return(read_ds1302(add));        
  111. }


  112. /*************初始化ds1302时间***************/
  113. void init_ds1302()
  114. {
  115.         uchar i;
  116.         rst = 0;        //第一次读写数据时要把IO口拿低
  117.         clk = 0;
  118.         io = 0;
  119.         i = read_ds1302ram(30);///***DS1302与RAM相关的寄存器,单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH~FDH***///
  120.                                                    ///***把数据从30地址中毒出来***///
  121.         if(i != 3)
  122.         {        
  123.                 i = 3;
  124.                 write_ds1302ram(30,i);                         //4050   4100                 3080

  125.                 write_ds1302(0x8e,0x00);                    //打开写保护
  126.                 for(i=0;i<7;i++)
  127.                         write_ds1302(write_add[i],init_ds[i]);        //把最高位值0 允许ds1302工作
  128.                 write_ds1302(0x8e,0x80);        //关写保护
  129.         }
  130. }



  131. #endif
复制代码
回复

使用道具 举报

6#
ID:115498 发表于 2016-4-26 13:59 | 只看该作者
ahshmj 发表于 2016-4-25 20:48
这个思路是这样的:在第一次上电时,在主程序里面设置初始值,初始值设置完成后,在DS1302里的ram的某一个 ...

谢谢,我还是找不到,程序附上来了,麻烦帮忙分析一下。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:7485 发表于 2016-4-26 21:12 | 只看该作者
初始设置就是“void init_ds1302()”
这段程序是先判断DS1302的“///***把数据从30地址中毒出来***///”(这是你的原文),如果内容不等于3则进行设置初试日期和时间,“write_ds1302(write_add,init_ds);”
2013年1月1日0时0分58秒、星期一,如果已设置过(=3)则跳过初始化设置。

这个里面有一个错误,就是上面所说的这个日期不是星期一。你设置的时候可以不用关心或设置星期,DS1302他自己和算。

还有“秒”应最后写。同时启动DS1302

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:115498 发表于 2016-4-26 22:07 | 只看该作者
ahshmj 发表于 2016-4-26 21:12
初始设置就是“void init_ds1302()”
这段程序是先判断DS1302的“///***把数据从30地址中毒出来***///”( ...

再请问一下,哪里设置(=3)啊?
回复

使用道具 举报

9#
ID:115498 发表于 2016-4-26 22:09 | 只看该作者
ahshmj 发表于 2016-4-26 21:12
初始设置就是“void init_ds1302()”
这段程序是先判断DS1302的“///***把数据从30地址中毒出来***///”( ...

我想显示它不要初始值,只要它自动获取
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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