ds1302

2019-07-16 03:25发布

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

uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//后边加的又重新加的0-9是为了搞清楚到底显示什么数。。
sbit sck=P1^7;
sbit io=P2^3;
sbit rst=P1^3;
sbit wr=P3^6;
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
uchar time_data[7]={12,12,01,01,01,01,01};//年周月日时分秒
uchar write_data[7]={0x8c,0x8a,0x88,0x86,0xd84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar disp[8]={0};

void write_ds1302_byte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {       
        dat=dat>>1;
                sck=0;
//                io=dat&0x01;
                io=CY;               
                sck=1;       
        }                       
}
/*uchar read_byte()
{
        uchar i,k;
        scl=0;
        for(i=0;i<8;i++)
        {
                k=k>>1;
                if(io)
                k=k|0x80;
                scl=1;
                scl=0;
        }
        return k;       
}*/
void write_ds1302(uchar add,uchar byte)
{
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        rst=1;
        _nop_();
        write_ds1302_byte(add);
        write_ds1302_byte(byte);
        rst=0;
        _nop_();
//        io=1;
//        _nop_();       
        sck=1;
        _nop_();

}
uchar read_ds1302(uchar add)
{
        uchar i,value;
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        rst=1;
        _nop_();
        write_ds1302_byte(add);
        for(i=0;i<8;i++)
        {
                value=value>>1;       
                if(io)
                        value=value|0x80;
                sck=1;
                 sck=0;
        }
        sck=1;
        _nop_();
        rst=0;
        _nop_();
        return value;
}

void time_pros()
{
        disp[0]=time_data[6]&0x0f;
                time_data[6]=time_data[6]&0x70;
        time_data[6]=time_data[6]>>4;
        disp[1]=time_data[6]&0x0f;
       
        disp[2]=time_data[5]&0x0f;
                time_data[5]=time_data[5]&0x70;
        time_data[5]=time_data[5]>>4;
        disp[3]=time_data[5]&0x0f;
       
        disp[4]=time_data[4]&0x0f;
                time_data[4]=time_data[4]&0x70;
        time_data[4]=time_data[4]>>4;
        disp[5]=time_data[4]&0x0f;                       
}
void set_rtc()
{
        uchar i,j;
        for(i=0;i<7;i++)
        {
                j=time_data[i]/10;
                time_data[i]=time_data[i]%10;
                time_data[i]=time_data[i]+j*16;               
        }       
        write_ds1302(0x8e,0x00);//去除写保护
        for(i=0;i<7;i++)
        {
                write_ds1302(write_data[i],time_data[i]);
        }
        write_ds1302(0x8e,0x80);//家写保护
}

void read_rtc()
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_data[i]=read_ds1302(read_add[i]);
        }
        time_pros();
}

void dellay(uchar x)
{
        uchar i,j;
                for(i=x;i>0;i--)
                        for(j=110;j>0;j--);
}
                          
void display()
{

//        wr=0;

/*        P0=0xff;
        p25=0;
        p26=1;
        p27=1;
        P0=0x80;
        p25=1;
        p26=1;
        p27=1;                 
        P0=table[disp[0]];
        dellay(12);        */         

        P0=0xff;
        p25=0;
        p26=1;
        p27=1;
        P0=0x40;
        p25=1;
        p26=1;
        p27=1;
        P0=table[disp[1]];
        dellay(12);                  

/*        P0=0xff;
        p25=0;
        p26=1;
        p27=1;
        P0=0x20;
        p25=1;
        p26=1;
        p27=1;
        P0=table[disp[2]];
        dellay(12);

        P0=0xff;
        p25=0;
        p26=1;
        p27=1;
        P0=0x10;
        p25=1;
        p26=1;
        p27=1;
        P0=table[disp[3]];
        dellay(12);          

        P0=0xff;
        p25=0;
        p26=1;
        p27=1;
        P0=0x01;
        p25=1;
        p26=1;
        p27=1;
        P0=table[disp[4]];
        dellay(12);

        P0=0xff;
        p25=0;
        p26=1;
        p27=1;
        P0=0x02;
        p25=1;
        p26=1;
        p27=1;
        P0=table[disp[5]];
//         dellay(1);           */
}



void main()
{
        uchar x=0;
        set_rtc();
        while(1)
        {
                read_rtc();
                dellay(200);
                        dellay(200);
//                time_pros();
                 display();
/*                 disp[0]++;
                 if(disp[0]>9)
                 disp[0]=0;        */
        }
}

为什么秒的个位总是在每显示显示正常数后回立刻显示5呢??秒的十位回在正常显示后立刻显示7?





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lstcspring
1楼-- · 2019-07-16 06:19
 精彩回答 2  元偷偷看……
二百五
2楼-- · 2019-07-16 08:10
lstcspring 发表于 2012-12-2 10:28
把串口程序调通,直接把DS1302的时间通过串口送出,看是否有问题,排除到底是时钟芯片的问题,还是显示问题 ...

不是现实的问题 我把那个disp[0]=0;  然后的就是零  肯定不是显示的问题,确实是从时钟芯片里读出的数理有5  我开始是按天狼星的程序写的 一模一样 可是我这里就出问题了


3htech
3楼-- · 2019-07-16 10:17
既然你确定不是显示的问题,那肯定就是读写时序的问题。自己对照着时序图看看。
二百五
4楼-- · 2019-07-16 10:28
3htech 发表于 2012-12-2 12:16
既然你确定不是显示的问题,那肯定就是读写时序的问题。自己对照着时序图看看。 ...

嗯 找到了 sck的时序有些问题 谢谢指点  问题终于解决
sirius08
5楼-- · 2019-07-16 10:32
解决的就好
hbk356bgk
6楼-- · 2019-07-16 12:24
 精彩回答 2  元偷偷看……

一周热门 更多>