DS1302+数码管 读取数据问题

2019-07-18 10:42发布

本帖最后由 studyzfr 于 2014-1-8 15:37 编辑

#include <Reg52.h>
#include <stdio.h>
#include <OwnDef.h>

uchar DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
uchar LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar DisplayData[8];
uchar datCODE[3]={0X30,0X45,0X11};
uchar datCODEConv[6];
uchar Read_CmdCODE[3]={0x81,0x83,0x85};         //sec min hour//
uchar Write_CmdCODE[3]={0x80,0x82,0x84};        //sec min hour//



void main()
{        uchar i,Read_Cmd,Write_Cmd;
                DS1302_Init()  ;
                       
        while(1)
        {                  
                        for(i=0;i<3;i++)
                        {       
                                Read_Cmd=Read_CmdCODE;        //读控制字
                                //datCODE=DS1302_Read(Read_Cmd);//返回读取值,秒分时
                                 Split_Display(i,datCODE);                       
                        }
                       
                                   Split_Display(3,0x00);  //显示横线
                                delayus(2);
                                          
                }
}

void DS1302_Init(void)
{
DS1302_Write(0x8e,0x00);//写保护关
DS1302_Write(0x80,0x11); //初始秒值为0       
DS1302_Write(0x82,0x11);//初始分钟值为0
DS1302_Write(0x84,0x11); //初始为24小时模式初始时间为0点
DS1302_Write(0x90,0x01); //充电
DS1302_Write(0xc0,0xf0); //初始化一次标示
DS1302_Write(0x8e,0x80);  //写保护开
}

uchar DS1302_Read(uchar cmd)
{
uchar dat;
RST=0;//初始CE线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始CE置为1,传输开始
DS1302_WriteByte(cmd);//传输命令字,要读取的时间/日历地址
dat=DS1302_ReadByte();//读取要得到的时间/日期
SCLK=1;//时钟线拉高
RST=0;//读取结束,CE置为0,结束数据的传输
return dat;//返回得到的时间/日期
}

uchar DS1302_ReadByte()
{
        uchar i,dat;
        //delayus(2);
        ;
        for(i=0;i<8;i++)
        {
                dat>>=1;//要返回的数据左移一位
                if(IOWR==1)//当数据线为高时,证明该位数据为1
                dat|=0x80;//要传输数据的当前值置为1,若不是,则为0
                SCLK=1;//拉高时钟线
                delayus(2);
                SCLK=0;//制造下降沿
                delayus(2);

        }
        return dat;//返回读取出的数据
}

void DS1302_Write(uchar cmd, uchar dat)
{
RST=0; //初始CE线置为0
SCLK=0; //初始时钟线置为0
RST=1; //初始CE置为1,传输开始
DS1302_WriteByte(cmd); //传输命令字,要写入的时间/日历地址
DS1302_WriteByte(dat); //写入要修改的时间/日期
SCLK=1; //时钟线拉高
RST=0; //读取结束,CE置为0,结束数据的传输
}


void DS1302_WriteByte(uchar dat)
{
        uchar i;
        SCLK=0;//初始时钟线置为0
        delayus(2);
        for(i=0;i<8;i++)//开始传输8个字节的数据
                {
                        IOWR=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的
                        delayus(2);
                        SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输
                        delayus(2);
                        SCLK=0;//时钟线拉低,为下一个上升沿做准备
                        dat>>=1;//数据右移一位,准备传输下一位数据
                }
}


void Split_Display(uchar wei,uchar dat)
{        uchar i,j,conv1,conv2,x=10;//显示位置

        conv1= dat/16 ;
        conv2= dat%16 ;

        switch(wei)
                {       
                        case 0:         i=6;j=7;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //秒
                        case 1:         i=3;j=4;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //分
                        case 2:         i=0;j=1;DS1302_Display(i,conv1);delayus(5);DS1302_Display(j,conv2);break; //时
                        default:        i=2;j=5;DS1302_Display(i,x);        delayus(5);DS1302_Display(j,x);break;
                }
                       
}

void DS1302_Display(uchar i,uchar conv)
        {                               
                                        LED=0x00;
                                        switch(i)                                           //依次选通各位动态显示
                                        {
                                        case 0: a=0;b=0;c=0;break;
                                        case 1: a=1;b=0;c=0;break;
                                        case 2: a=0;b=1;c=0;break;
                                        case 3: a=1;b=1;c=0;break;
                                        case 4: a=0;b=0;c=1;break;
                                        case 5: a=1;b=0;c=1;break;
                                        case 6: a=0;b=1;c=1;break;
                                        case 7: a=1;b=1;c=1;break;
                                        default :break;
                                        }
                                        LED=LEDCODE[conv];                
                                                                                                                          
        }                                 
                                
          
void  delayus(uchar c )
        {         
        for(;c>0;c--) ;
        }

------------------------------------------------------------------------------
其中OwnDef.h内容
sbit RST=P0^5        ;sbit SCLK=P0^6        ;
sbit IOWR=P0^7        ;
sbit a=P3^0;
sbit b=P3^1;
sbit c=P3^2;
sbit CS=P2^7;-
--------------------------------------------------------------------
为什么读取出来的DS1302数据一直不对,如果在主函数中不读取数据而直接用我给定的数据,显示正常。
而采用读取出来的就一直为0和1.求助大神们。。想了好几天了没搞懂。。。。
图片如下

采用读取出来的就不正常 采用读取出来的就不正常
采用测试数据显示正常的 采用测试数据显示正常的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。