打印
[51单片机]

求助 DS1302初始化之后读出任何东西都是0

[复制链接]
2005|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Nivans|  楼主 | 2015-9-1 20:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TI, TE, tmp, ui, AD
本帖最后由 Nivans 于 2015-9-1 20:19 编辑

各位大神帮帮忙,目前已经调试了2天,程序完全按照时序图来做的。其他的地方都正常,但是上电初始化读取秒寄存器来判断是否断过电,之后就无法读出数据了,读出的数据都是零,数码管显示的都是0。无法查找原因。代码如下。
**************************************Main.c
#include "system.h"
#include "ds1302.h"

sbit LS138A=P2^2;  
sbit LS138B=P2^3;
sbit LS138C=P2^4;

bit ReadRTC_Flag = 0;

uint8 l_tmpdisplay[8];

code uint8 table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
                                 //共阴数码管 0-9  '-' '熄灭‘表

cTime RealTime;

void InitTIMER0(void)
{
TMOD|=0x01;//定时器设置 16位
TH0=0xef;//初始化值
TL0=0xf0;
ET0=1;
TR0=1;
EA=1;
}

void main(void)
{

        ds1302_Init();
        
        InitTIMER0();          //初始化定时器0
         
        while(1)
        {
                if(ReadRTC_Flag)
                {
                  GetTime(&RealTime);        
                        l_tmpdisplay[0]=RealTime.hour/16;                        //数据的转换,因我们采用数码管0~9的显示,将数据分开
                        l_tmpdisplay[1]=RealTime.hour&0x0f;
                        l_tmpdisplay[2]=10;                                                    //加入"-"
                        l_tmpdisplay[3]=RealTime.min/16;
                        l_tmpdisplay[4]=RealTime.min&0x0f;
                        l_tmpdisplay[5]=10;
                        l_tmpdisplay[6]=RealTime.sec/16;
                        l_tmpdisplay[7]=RealTime.sec&0x0f;
                }
        
        }
        
        return;
}

void tim(void) interrupt 1 using 1
                            //中断,用于数码管扫描
{

    static uint8 i,num;
    TH0=0xf5;
    TL0=0xe0;

         P0=table[l_tmpdisplay[i]];                //查表法得到要显示数字的数码段

    switch(i)                                          
             {            
                                        case 0:LS138A=0; LS138B=0; LS138C=0; break;         
                case 1:LS138A=1; LS138B=0; LS138C=0; break;                     
                case 2:LS138A=0; LS138B=1; LS138C=0; break;
                case 3:LS138A=1; LS138B=1; LS138C=0; break;
                                        case 4:LS138A=0; LS138B=0; LS138C=1; break;
                                        case 5:LS138A=1; LS138B=0; LS138C=1; break;
                                        case 6:LS138A=0; LS138B=1; LS138C=1; break;
                                        case 7:LS138A=1; LS138B=1; LS138C=1; break;
                        
             }
        i++;
        if(i==8)
          {
           i=0;
           num++;
           if(10==num)       //隔段时间读取1302的数据。时间间隔可以调整
             {
                 ReadRTC_Flag=1; //使用标志位判断
                 num=0;
                 }
          }
}
[code]***************************ds1302.c
#include "system.h"
#include "ds1302.h"

/*---------------------------------------------
/* DS1302 Read Byte
/*-------------------------------------------*/
uint8 ReadByte()
{
        uint8 i,tmp = 0x00;
        
        io = 1; //IO 置1
        
        for(i = 0; i < 8 ; i ++)
         {         
                  if(io) tmp|=0x80;
                  sclk = 1 ;
                  sclk = 0;
                  tmp >>= 1;
         }
         
         return tmp;
}

/*---------------------------------------------
  DS1302 WriteByte()
--------------------------------------------*/
void WriteByte(uint8 dat)
{
        uint8 i;
        
                 for(i = 0; i < 8 ; i ++)
          {
                        io = (bit)(dat & 0x01);
                  sclk = 0;
                        sclk = 1;
                        dat >>= 1;
          }
                 
}
/*---------------------------------------------
/* DS1302 SingleRead 单字节读
/*-------------------------------------------*/
uint8 SingleRead(uint8 addr)
{
          uint8 dat;
          cs = 0;
          sclk = 0;
                cs = 1;
        
          WriteByte(addr);
          dat = ReadByte();
        
          sclk = 0;
          cs = 0;
        
        return(dat);
}

/*----------------------------------------------
/* DS1302 SingleWrite 单字节写
/---------------------------------------------*/
void SingleWrite(uint8 addr,uint8 dat)
{
                cs = 0;
          sclk = 0;
                cs = 1;
          WriteByte(addr);
          WriteByte(dat);
          sclk = 0;
          cs = 0;
}


/*---------------------------------------------
/* DS1302 MultiRead 多字节读
/*-------------------------------------------*/
void MultiRead(uint8 *ptr)
{
        uint8 i;
        cs = 0;
        sclk = 0;
        cs = 1;
        
        WriteByte(0xbf);
        
        for(i = 0; i < 8 ; i ++)
        {
                ptr[i] = ReadByte();
        }
        
        sclk = 0;
        cs = 0;
        
}


/*---------------------------------------------
/* DS1302 MultiWrite 多字节读
/*-------------------------------------------*/
void MultiWrite(uint8 *ptr)
{
        uint8 i;
        cs = 0;
        sclk = 0;
        cs = 1;
        
        WriteByte(0xbe);
        
        for(i = 0; i < 8 ; i ++)
        {
                WriteByte(ptr[i]);
        }
        
        sclk = 0;
        cs = 0;
        
}

/*-----------------------------------------------
/* DS1302 GetTime
/*---------------------------------------------*/
void GetTime(cTime *p)
{
        uint8 tmp[8];
        
  MultiRead(tmp);        //多字节读,传地址方式返回时间、日期
        
        (*p).sec  =  tmp[0];
        (*p).min  =  tmp[1];
        (*p).hour =  tmp[2];
        (*p).date =  tmp[3];
        (*p).month = tmp[4];
        (*p).week =  tmp[5];
        (*p).year =  tmp[6];
        
}

/*-----------------------------------------------
/* DS1302 SetTime
/*---------------------------------------------*/
void SetTime(cTime *p)
{
        uint8 tmp[8];
               
        tmp[0]  =  (*p).sec;
        tmp[1]  =  (*p).min;
  tmp[2]  =  (*p).hour;
        tmp[3]  =  (*p).date ;
        tmp[4]  =  (*p).month;
  tmp[5]        =  (*p).week ;
  tmp[6]        =  (*p).year ;
        tmp[7]  =  0x00;
        
        MultiWrite(tmp);        //多字节写,传地址方式返回时间、日期
        
}

/*-----------------------------------------------
/* DS1302 INIT
/*---------------------------------------------*/
void ds1302_Init(void)
{
          cTime code DefaultTime [] = {0x06,0x10,0x09,0x31,0x08,0x01,0x15};
               
                  
                  
                if(SingleRead(0x81)&0x80)
                {
                        
                                SingleWrite(0x8e,0x00);        //解除读写保护
                                SetTime(DefaultTime);               
                                
                }                        
}
[/code]
*********************************DS1302.H
#ifndef _DS1302_H
#define _DS1302_H

typedef struct Timelist
{
                uint8 sec;    //秒
                uint8 min;    //分
                uint8 hour;   //时
                uint8 date;   //日
                uint8 month;  //月
                uint8 week;    //星期
                uint8 year;          //年
        
}cTime;         //定义一个时间数据结构

/*      函数声明        */

void ds1302_Init(void);
void GetTime(cTime *);

/*      端口定义        */
sbit cs = P3^5;  //片选使能
sbit sclk = P3^6; //时钟线
sbit io = P3^7;   //串行数据端口

#endif

*****************************SYSTEM.H
#ifndef _STSTEM_H
#define _SYSTEM_H

#include <reg52.h>                 //8052头文件
#include <intrins.h>

/*-------------------------------------------------*/
/*             自定义类型                          */
/*-------------------------------------------------*/
typedef signed   char   int8;
typedef signed   int    int16;
typedef signed   long   int32;
typedef unsigned char   uint8;
typedef unsigned int    uint16;
typedef unsigned long   uint32;


#endif

相关帖子

沙发
cjseng| | 2015-9-1 23:57 | 只看该作者
用proteus试试吧,直接单步仿真,看看问题出在哪里

使用特权

评论回复
板凳
ningling_21| | 2015-9-2 08:52 | 只看该作者
时序弄错了,百度一下有很多程序可以参考

使用特权

评论回复
地板
ningling_21| | 2015-9-2 08:52 | 只看该作者
时序弄错了,百度一下有很多程序可以参考

使用特权

评论回复
5
forget345| | 2015-9-2 09:03 | 只看该作者
本帖最后由 forget345 于 2015-9-2 09:06 编辑

时钟线拉高拉低时加 延时程序
这个程序给你参考 http://wenku.baidu.com/link?url= ... gbQLVyiA0mOz7rpIGFi

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

117

主题

692

帖子

5

粉丝