找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4202|回復: 9
打印 上一主題 下一主題
收起左側(cè)

萬年歷顯示當前日期 找不到程序的初始值放在哪里的

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:115498 發(fā)表于 2016-4-25 16:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想請教一下大家,萬年歷一仿真顯示的就是2013年01月01日00點,怎樣才能顯示當前日期啊?一直找不到程序的初始值放在哪里的。。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2016-4-25 19:18 | 只看該作者
初始值肯定就在程序里面 要不是就沒有初始直接 讀取的ds1302芯片,你把程序發(fā)上來分析一下就知道了
回復

使用道具 舉報

板凳
ID:7485 發(fā)表于 2016-4-25 20:48 | 只看該作者
這個思路是這樣的:在第一次上電時,在主程序里面設(shè)置初始值,初始值設(shè)置完成后,在DS1302里的ram的某一個字節(jié)中設(shè)置一個標記(比如:0x55或0xAA)。以后重啟后,先檢測這個標記,如果是你設(shè)置的標記,就跳過初始設(shè)置。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:115498 發(fā)表于 2016-4-26 13:55 | 只看該作者
admin 發(fā)表于 2016-4-25 19:18
初始值肯定就在程序里面 要不是就沒有初始直接 讀取的ds1302芯片,你把程序發(fā)上來分析一下就知道了

#include <reg52.h>                 //調(diào)用單片機頭文件
#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;        //農(nóng)歷 陽歷顯示標志位


uchar menu_1,menu_2;



uchar key_time,flag_value;      //用做連加的中間變量
bit key_500ms  ;
uchar n_nian,n_yue,n_ri;                //農(nóng)歷顯示的函數(shù)



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



/******************把數(shù)據(jù)保存到單片機內(nèi)部eeprom中******************/
void write_eeprom()
{
        SectorErase(0x2000);
        byte_write(0x2000, fen1);
        byte_write(0x2001, shi1);
        byte_write(0x2002, open1);
        byte_write(0x2058, a_a);       
}

/******************把數(shù)據(jù)從單片機內(nèi)部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)                //新的單片機初始單片機內(nèi)問eeprom
        {
                fen1  = 3;
                shi1  = 8;
                open1  = 1;
                a_a = 1;
                write_eeprom();           //保存數(shù)據(jù)
        }       
}

/***********************18b20初始化函數(shù)*****************************/
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內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {                                         //寫數(shù)據(jù)是低位開始
                dq = 0;                         //把總線拿低寫時間隙開始
                dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
                delay_uint(5);         // 60us
                dq = 1;                         //釋放總線
                dat >>= 1;
        }       
}

/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar read_18b20()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                         //把總線拿低讀時間隙開始
                value >>= 1;         //讀數(shù)據(jù)是低位開始
                dq = 1;                         //釋放總線
                if(dq == 1)                 //開始讀寫數(shù)據(jù)
                        value |= 0x80;
                delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
        }
        return value;                 //返回數(shù)據(jù)
}

/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到18b20的時序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉(zhuǎn)換命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20
       
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發(fā)出讀取暫存器命令
       
        EA = 0;
        low = read_18b20();           //讀溫度低字節(jié)
        value = read_18b20();  //讀溫度高字節(jié)
        EA = 1;
        value <<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        value *= 0.625;               //轉(zhuǎn)換到溫度值 小數(shù)
        return value;                   //返回讀出的溫度 帶小數(shù)
}



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

/******************寫星期函數(shù)*******************/
void write_week(uchar hang,uchar add,uchar week)//寫星期函數(shù)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);          
        switch(week)
        {
                case 1:write_data('M');//星期數(shù)為1時,顯示
                           write_data('O');
                           write_data('N');
                           break;
          
                case 2:write_data('T');//星期數(shù)據(jù)為2時顯示
                           write_data('U');
                           write_data('E');
                           break;
               
                case 3:write_data('W');//星期數(shù)據(jù)為3時顯示
                           write_data('E');
                           write_data('D');
                           break;
               
                case 4:write_data('T');//星期數(shù)據(jù)為4是顯示
                           write_data('H');
                           write_data('U');
                           break;
               
                case 5:write_data('F');//星期數(shù)據(jù)為5時顯示
                           write_data('R');
                           write_data('I');
                           break;
               
                case 6:write_data('S');//星期數(shù)據(jù)為6時顯示
                           write_data('T');
                           write_data('A');
                           break;
               
                case 7:write_data('S');//星期數(shù)據(jù)為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                          //顯示農(nóng)歷
        {
                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定時
}

/*************鬧鐘報警函數(shù)***************/
void menu_dis()
{
        static uchar mm,value;
        if(flag_100ms == 1)                  //100ms執(zhí)行一次
        {
                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 分鐘后自動關(guān)閉鬧鐘
                                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;                     //對應(yīng)的按鍵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;       
}


/**********************設(shè)置函數(shù)************************/
void key_with()
{
        if(key_can == 1)        //設(shè)置鍵
        {
                menu_1++;
                if(menu_1 == 1)          //設(shè)置時間
                {
                        menu_2 = 1;
                        write_string(1,0,"    :  :    W:  ");                       
                        write_string(2,0," 20  -  -       ");       
                }
                if(menu_1 == 2)          //設(shè)置鬧鐘
                {
                        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);         //關(guān)閉光標
                        init_1602_dis_csf();      //初始化液晶顯示               
                }
        }
        if(key_can == 2)        //選擇鍵
        {
                flag_200ms = 1;
                if(menu_1 == 1)                  //設(shè)置時間
                {
                        menu_2 ++;
                        if(menu_2 > 7)
                                menu_2 = 1;
                }
                if(menu_1 == 2)                 //設(shè)置鬧鐘
                {
                        menu_2 ++;
                        if(menu_2 > 3)
                                menu_2 = 1;                               
                }
        }
        if(menu_1 == 1)
        {
                if(menu_2 == 1)                  //設(shè)置時
                {
                        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)                  //設(shè)置分
                {
                        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)                  //設(shè)置秒
                {
                        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)                  //設(shè)置星期
                {
                        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)                  //設(shè)置年
                {
                        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)                  //設(shè)置月
                {
                        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)                  //設(shè)置日
                {
                        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);           ///***第一行第二字節(jié)開始顯示時,從十位開始寫***///
                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();           //把時間寫進去
        }       
/***************設(shè)置鬧鐘*********************/
        if(menu_1 == 2)
        {
                if(menu_2 == 1)                  //設(shè)置鬧鐘開關(guān)
                {
                        if(key_can == 3)       
                        {
                                open1 = 1;          //鬧鐘開
                        }               
                        if(key_can == 4)       
                        {
                                open1 = 0;          //鬧鐘關(guān)
                        }                                         
                }
                if(menu_2 == 2)                  //設(shè)置鬧鐘時
                {
                        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)                  //設(shè)置秒
                {
                        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();     //保存鬧鐘時間
        }                       
}

/*****************主函數(shù)********************/
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();       //開始初始化保存的數(shù)據(jù)
        temperature = read_temp();        //先讀出溫度的值
        delay_1ms(650);
        temperature = read_temp();        //先讀出溫度的值
        while(1)
        {
                key();                         //按鍵程序
                if(key_can < 10)
                {
                        if(flag_beep_en == 0)  //只有鬧鐘關(guān)了的時候才能進入設(shè)置
                                key_with();       
                        else
                        {
                                flag_beep_en = 0;         //按下任意鍵可關(guān)閉鬧鐘
                                beep = 1;
                                clock_value = 0;
                                read_time();
                        }
                        if(menu_1 == 0)
                        {
                                if(key_can == 4)  //減鍵
                                {
                                        flag_nl = ~flag_nl;                  //切換農(nóng)歷和陽歷的顯示標志位       
                                        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();           //鬧鐘報警函數(shù)
                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;
        }
}

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:115498 發(fā)表于 2016-4-26 13:56 | 只看該作者
admin 發(fā)表于 2016-4-25 19:18
初始值肯定就在程序里面 要不是就沒有初始直接 讀取的ds1302芯片,你把程序發(fā)上來分析一下就知道了

#ifndef _DS1302_H_
#define _DS1302_H_


  1. /******************
  2.         ds1302 內(nèi)部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;          //數(shù)據(jù)線
  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. /*************寫一個數(shù)據(jù)到對應(yīng)的地址里***************/
  20. void write_ds1302(uchar add,uchar dat)
  21. {               
  22.         rst = 1;                         //把復位線拉高
  23.         for(i=0;i<8;i++)
  24.         {                                     //低位在前
  25.                 clk = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
  26.                 io = add & 0x01;            
  27.                 add >>= 1;                 //把地址右移一位
  28.                 clk = 1;                 //時鐘線拿高
  29.         }        
  30.         for(i=0;i<8;i++)
  31.         {
  32.                 clk = 0;                 //時鐘線拿低開始寫數(shù)據(jù)
  33.                 io = dat & 0x01;
  34.                 dat >>= 1;                 //把數(shù)據(jù)右移一位
  35.                 clk = 1;                 //時鐘線拿高
  36.         }
  37.         rst = 0;                         //復位線合低
  38.         clk = 0;
  39.         io = 0;
  40. }

  41. /*************從對應(yīng)的地址讀一個數(shù)據(jù)出來***************/
  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;                 //時鐘線拿低開始寫數(shù)據(jù)
  49.                 io = add & 0x01;            
  50.                 add >>= 1;                 //把地址右移一位
  51.                 clk = 1;                 //時鐘線拿高
  52.         }               
  53.         for(i=0;i<8;i++)
  54.         {
  55.                 clk = 0;                 //時鐘線拿低開始讀數(shù)據(jù)
  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;                 //返回讀出來的數(shù)據(jù)
  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);        //農(nóng)歷轉(zhuǎn)換                                    
  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);                        //關(guān)閉寫保護
  93. }

  94. /*************把數(shù)據(jù)保存到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. /*************把數(shù)據(jù)從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;        //第一次讀寫數(shù)據(jù)時要把IO口拿低
  117.         clk = 0;
  118.         io = 0;
  119.         i = read_ds1302ram(30);///***DS1302與RAM相關(guān)的寄存器,單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為COH~FDH***///
  120.                                                    ///***把數(shù)據(jù)從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);        //關(guān)寫保護
  129.         }
  130. }



  131. #endif
復制代碼
回復

使用道具 舉報

6#
ID:115498 發(fā)表于 2016-4-26 13:59 | 只看該作者
ahshmj 發(fā)表于 2016-4-25 20:48
這個思路是這樣的:在第一次上電時,在主程序里面設(shè)置初始值,初始值設(shè)置完成后,在DS1302里的ram的某一個 ...

謝謝,我還是找不到,程序附上來了,麻煩幫忙分析一下。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:7485 發(fā)表于 2016-4-26 21:12 | 只看該作者
初始設(shè)置就是“void init_ds1302()”
這段程序是先判斷DS1302的“///***把數(shù)據(jù)從30地址中毒出來***///”(這是你的原文),如果內(nèi)容不等于3則進行設(shè)置初試日期和時間,“write_ds1302(write_add,init_ds);”
2013年1月1日0時0分58秒、星期一,如果已設(shè)置過(=3)則跳過初始化設(shè)置。

這個里面有一個錯誤,就是上面所說的這個日期不是星期一。你設(shè)置的時候可以不用關(guān)心或設(shè)置星期,DS1302他自己和算。

還有“秒”應(yīng)最后寫。同時啟動DS1302

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:115498 發(fā)表于 2016-4-26 22:07 | 只看該作者
ahshmj 發(fā)表于 2016-4-26 21:12
初始設(shè)置就是“void init_ds1302()”
這段程序是先判斷DS1302的“///***把數(shù)據(jù)從30地址中毒出來***///”( ...

再請問一下,哪里設(shè)置(=3)啊?
回復

使用道具 舉報

9#
ID:115498 發(fā)表于 2016-4-26 22:09 | 只看該作者
ahshmj 發(fā)表于 2016-4-26 21:12
初始設(shè)置就是“void init_ds1302()”
這段程序是先判斷DS1302的“///***把數(shù)據(jù)從30地址中毒出來***///”( ...

我想顯示它不要初始值,只要它自動獲取
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表