单片机学习小组
直播中

洪欣意

8年用户 213经验值
私信 关注

为什么DS1302时间初始化是从00:00:00开始的?

#include "ds1302.h"
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar tiM[7]={0,0,0x12,0x05,0x07,0x06,0x16};//存入时间,存储格式是用BCD码  注意这个地方不能用code
        void ds13write(uchar addr,uchar dat)           //写入1302,先写地址,再写数据
        {
                uchar n;
                RST=0; //低电平有效是RST位
                _nop_();
                SCLK=0;
                _nop_();
                RST=1;
                _nop_();
                for(n=0;n<8;n++)
                {
                        DSIO=addr&0x01;        //从首地址开始写起,此处是写地址  并且是先写再移位,和读数据进行区别,读和写都是以单片机为主角呢
                        addr>>=1;//移位,将最低位变为次低位
                        SCLK=1;
                        _nop_();//延时一个机器周期
                        SCLK=0;
                        _nop_();//因为是循环操作
                }
               
                                for(n=0;n<8;n++)
                        {
                                DSIO=dat&0x01;        //从首地址开始写起,此处是写数据
                                addr>>=1;//移位,右移就将数据从低到高排列了
                                SCLK=1;
                                _nop_();//延时一个机器周期
                                SCLK=0;
                                _nop_();//因为是循环操作
        
                        }
                          RST=0;
                           _nop_();//结束数据的传送
        }
                                uchar ds1302read(uchar addr)   //读函数的初始化,先移位,再读数据
                                {
                                        uchar n,dat,dat1;
                                        RST=0;
                                        _nop_();
                                        SCLK=0;
                                        _nop_();
                                        RST=1;
                                        _nop_();
                                        for(n=0;n<8;n++)        //传送地址
                                        {
                                                DSIO=addr&0x01;         //从低位开始传送
                                                addr>>=1;//右移一位将次低位变为最低位
                                                SCLK=1;          //上升沿的时候读取数据
                                                _nop_();
                                                SCLK=0;        //下降沿的时候放置数据
                                                _nop_();        
                                        }
                                        _nop_();
                                                                                                                                                                                          
                                                for(n=0;n<8;n++)        //传送数据
                                        {
                                                dat1=DSIO;  //将写进IO口的数据读出
                                                dat=(dat>>1)|(dat1<<7);        //通过 8次dat = (dat>>1) | (dat1<<7)可以将dat1中接收的最低位移到dat中的最低位,
                                                                  //以此类推,能够完整的将dat1从最低位开始接收的数放在dat中从高位到低位不变的存储。 实现的是循环移位的功能
                                                SCLK=1;                                         //从最低位开始接收数据
                                                _nop_();
                                                SCLK=0;        //下降沿接收数据,注意和写数据对时钟的操作一样,不过是数据传送的时刻不同罢了
                                                _nop_();        
                                        }
                                        RST=0;         //复位稳定时间,这是必须的!
                                        _nop_();
                                        SCLK=1;
                                        _nop_();
                                        DSIO=0;
                                        _nop_();
                                        DSIO=1;
                                        _nop_();
                                        return dat;
                                }
                         void ds1302_init()           //初始化函数
                                 {
                                           uchar n;
                                           ds13write(0x8e,0x00);//取消写保护
                                          for(n=0;n<7;n++)
                                          {
                                                  ds13write(WRITE_RTC_ADDR[n],TIM[n]);        
                                          }
                                          ds13write(0x8e,0x80);//开启写保护
                                 }
                                 
                                  void DsReadTime()
                                  {
                                          uchar n;
                                        for(n=0;n<7;n++)
                                        {
                                                TIM[n]=ds1302read(READ_RTC_ADDR[n]);
                                        }
                                  }
#ifndef __DS_H_
#define __DS_H_
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
***it DSIO=P3^4;
***it RST=P3^5;
***it SCLK=P3^6;
void ds13write(uchar addr,uchar dat);
uchar ds1302read(uchar addr);
void ds1302_init();
void DsReadTime();
extern uchar TIM[7];//数组的全局化
#endif
#include "ds1302.h"
#include "reg52.h"
***it A=P2^2;
***it D=P2^3;
***it C=P2^4;
         
char num=0;
uchar DisplayData[8];
uchar code Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //数码管显示0——9
//uchar TIM[7];
void delayms(uint x)
        {
                uint i,j;
                for(i=x;i>0;i--)
                         for(j=110;j>0;j--);//此处表示延时了1mS
        }
void datapros()         
{
           DsReadTime();
        DisplayData[0] = Table[TIM[2]/16];                                //时
        DisplayData[1] = Table[TIM[2]&0x0f];                                 
        DisplayData[2] = 0x40;                                                                 //中间时间的连接:
        DisplayData[3] = Table[TIM[1]/16];                                //分
        DisplayData[4] = Table[TIM[1]&0x0f];        
        DisplayData[5] = 0x40;
        DisplayData[6] = Table[TIM[0]/16];                                //秒
        DisplayData[7] = Table[TIM[0]&0x0f];
}
void Display()         //数码管的显示函数
{
        uchar i;
        for(i=0;i<8;i++)
        {
                switch(i)
                {
                        case(0):
                        A=0;D=0;C=0;break;        //最后一个数码管
                        case(1):
                        A=1;D=0;C=0;break;
                        case(2):
                        A=0;D=1;C=0;break;
                        case(3):
                        A=1;D=1;C=0;break;
                        case(4):
                        A=0;D=0;C=1;break;        
                        case(5):
                        A=1;D=0;C=1;break;
                        case(6):
                        A=0;D=1;C=1;break;
                        case(7):
                        A=1;D=1;C=1;break;        //第一个数码管
                        
                }
                 P0=DisplayData[7-i];
                 delayms(1);
                 P0=0x00;//消隐        
        }
                  
}
void main()
{        
        ds1302_init();//初始化DS1302
        while(1)
        {         
                 datapros();//数据处理函数
                 Display();//数据显示函数
                 }
}
为什么我下载程序显示的是从00:00:00开始的,不是从我设置的初始值开始的呢

更多回帖

发帖
×
20
完善资料,
赚取积分