OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4472|回复: 2

求助DS1302时间初始化问题

[复制链接]

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-2-13
在线时间
23 小时
发表于 2017-3-14 10:07:48 | 显示全部楼层 |阅读模式
#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 <reg52.h>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;

sbit DSIO=P3^4;
sbit RST=P3^5;
sbit 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"
sbit A=P2^2;
sbit D=P2^3;
sbit 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开始的,不是从我设置的初始值开始的呢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-2-13
在线时间
23 小时
 楼主| 发表于 2017-3-14 10:08:36 | 显示全部楼层
有没有大神给个回答,一直调不出来,好气哦
回复 支持 反对

使用道具 举报

16

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-2-13
在线时间
23 小时
 楼主| 发表于 2017-3-14 10:31:30 | 显示全部楼层
有人之前遇到过这种问题吗?是怎么解决的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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