51单片机DS1302有问题 ,求大神解答

2019-07-15 20:24发布

只显示时间,时间不动,而且不是初始化的时间。
求解救。

#include<reg52.h>
#include<intrins.h>
#define  uchar unsigned char
#define  uint unsigned int

//lcd1602
void delay10ms(uint c);   
void lcdwritecom(uchar com);
void lcdwritedata(uchar dat);
void lcdinit(void);
#define LCD P0
sbit RS=P2^6;
sbit RW=P2^5;
sbit LCDE=P2^7;       
////////////////////////
//ds1302
sbit SCLK=P3^6;
sbit DSIO=P3^4;
sbit RST=P3^5;
uchar ds1302read(uchar addr);
void ds1302write(uchar addr,uchar dat);
void ds1302init(void);
void ds1302readtime(void);
void lcddisplay(void);
uchar readaddr[7]={0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar writeaddr[7]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar time[7]={0, 0, 0x12, 0x30, 0x03, 0x07, 0x14};
////////////////////////////////////////////////////

void main()
{
        lcdinit();
        ds1302init();
        while(1)
        {
                ds1302readtime();
                lcddisplay();
        }
}





void lcddisplay(void)
{
        lcdwritecom(0x80+0x40);
        lcdwritedata('0'+time[2]/16);
        lcdwritedata('0'+(time[2]&0x0f));
        lcdwritedata('-');
        lcdwritedata('0'+time[1]/16);
        lcdwritedata('0'+(time[1]&0x0f));
        lcdwritedata('-');
        lcdwritedata('0'+time[0]/16);
        lcdwritedata('0'+(time[0]&0x0f));
        lcdwritecom(0x80);
        lcdwritedata('2');
        lcdwritedata('0');
        lcdwritedata('0'+time[6]/16);
        lcdwritedata('0'+(time[6]&0x0f));
        lcdwritedata('-');
        lcdwritedata('0'+time[4]/16);
        lcdwritedata('0'+(time[4]&0x0f));
        lcdwritedata('-');
        lcdwritedata('0'+time[3]/16);
        lcdwritedata('0'+(time[3]&0x0f));
        lcdwritecom(0x8D);
        lcdwritedata('0'+(time[5]&0x07));       
}


/*******************************************************************************
* 函 数 名         : ds1302readtime
* 函数功能                   : 读取ds1032时间
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds1302readtime(void)
{
        uchar n;
        for(n=0;n<7;n++)
        {
                time[n]= ds1302read(readaddr[n]);
        }
}
/*******************************************************************************
* 函 数 名         : ds1302init
* 函数功能                   :  ds1032初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds1302init(void)
{
        uchar n,tmp;
        for (n=0; n<7; n++)  
        {
                tmp = time[n] / 10;
                time[n] = time[n] % 10;
                time[n] = time[n] + tmp*16;
        }
        ds1302write(0x8E,0x00);
        for(n=0;n<7;n++)
        {
                 ds1302write(writeaddr[n],time[n]);
        }
        ds1302write(0x8E,0x80);
}
/*******************************************************************************
* 函 数 名         : ds1302read
* 函数功能                   :  ds1032读操作
* 输    入         : uchar addr
* 输    出         : 无
*******************************************************************************/
uchar ds1302read(uchar addr)
{
        uchar n,dat,dat1;
        RST=0;
        _nop_();
        SCLK=0;
        _nop_();_nop_();_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;
                dat=dat>>1;
                dat1=dat1<<7;
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        RST=0;
        _nop_();
        SCLK=1;
        _nop_();
        DSIO=0;
        _nop_();
        DSIO=1;
        _nop_();
        return dat;
}
/*******************************************************************************
* 函 数 名         : ds1302write
* 函数功能                   :  ds1032写操作
* 输    入         : uchar addr ,dat
* 输    出         : 无
*******************************************************************************/
void ds1302write(uchar addr,uchar dat)
{
        uchar n;
        RST=0;
        _nop_();
        SCLK=0;
        _nop_();_nop_();_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;
                dat>>=1;
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        RST=0;
        _nop_();
}


/*******************************************************************************
* 函 数 名         : lcdwritecom
* 函数功能                   :   LCD写指令
* 输    入         : uchar com
* 输    出         : 无
*******************************************************************************/
void lcdwritecom(uchar com)
{
        LCDE=0;
        RS=0;
        RW=0;
        LCD=com;
        delay10ms(1);
        LCDE=1;
        delay10ms(1);
        LCDE=0;
}
/*******************************************************************************
* 函 数 名         : lcdwritedata
* 函数功能                   : LCD写数据
* 输    入         : uchar dat
* 输    出         : 无
*******************************************************************************/

void lcdwritedata(uchar dat)
{
        LCDE=0;
        RS=1;
        RW=0;
        LCD=dat;
        delay10ms(1);
        LCDE=1;
        delay10ms(1);
        LCDE=0;
}

/*******************************************************************************
* 函 数 名         : delay10ms
* 函数功能                   : 延时 10ms
* 输    入         : uint c
* 输    出         : 无
*******************************************************************************/
void delay10ms(unsigned int c)   
{
    unsigned char a, b;
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--) ;
                }         
        }      
}

/*******************************************************************************
* 函 数 名         : lcdinit
* 函数功能                   : 初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void lcdinit(void)
{
        lcdwritecom(0x38);
        lcdwritecom(0x0c);
        lcdwritecom(0x01);
        lcdwritecom(0x06);
        lcdwritecom(0x80);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。