新手求帮助!DS12887数据读出不正确!

2020-01-30 13:58发布

前段时间学习12887后来有事耽搁了,现在重新学习,程序和电路都焊好了,可是一开机分钟就一直在2和4之间跳,秒就没变化,硬件接线我都跟网上的对了没什么问题,程序看了好久也找不出问题。希望搞过个这个的前辈指点一下兄弟谢谢了!
/*
                       DS12887时钟            

*/
#include <reg52.h>   
#define uchar unsigned char  
#define uint unsigned int   
uint shi_jian;   

sbit CS=P2^3;  // 片选
sbit DS=P2^6;  // 读允许
sbit AS=P2^4;  // 地址锁存
sbit RW=P2^5;  // 写允许
sbit h_gao=P3^1;  // 数码管小时位-1
sbit h_di=P3^2;   // 数码管小时位-2
sbit m_gao=P3^4;  // 数码分钟位-1
sbit m_di=P3^5;   // 数码分钟位-2

/* 子函数 */
void init();        //初始化函数
void write_887(uchar add,uchar date);  //写12887函数
uchar read_887(uchar add);  // 读12887函数
void delay(uchar k);    //延时函数
void display();         //数码管显示函数

unsigned char table[]=   //数组
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};            //0~~9段码   共阳极




void main()
{
        init();  //开机初始化
        while(1)
        {
       
         display();  //数码管循环显示时间
        }


}

/*  写入函数 */
void write_887(uchar add,uchar date)
{
        CS=0;      
        DS=1;      
        RW=1;            
           AS=1;      
        P1=add;   
        AS=0;      
        RW=0;      
        P1=date;   
        RW=1;      
        AS=1;      
        CS=1;      
}

/*  读取函数 */
uchar read_887(uchar add)
{
        CS=0;  
        DS=1;  
        RW=1;  
        AS=1;   
        P1=add;
        AS=0;   
        DS=0;  
       
        shi_jian=P1;
        DS=1;   
        AS=1;   
        CS=1;   
        return shi_jian;  


}

/*  延时函数  */
void delay(uchar k)
{
        uchar x,y;   
        for(x=k;x>0;--x)  
        {
                for(y=110;y>0;--y)  
                {}
        }

}

void init()
{
    write_887(0x0A,0x20);    //开启震荡器
    write_887(0x0B,0x86);    //10000110 禁止更新数据,二进制,24小时制,
       
     write_887(0x02,0x0c);     //初始时间 分=12
     write_887(0x04,0x0c);     //初始时间 时=12

    write_887(0x0B,0x06);          // 00000110 二进制数据;24小时格式;无中断输出  ;

}

//***********        显示函数    ************
void display()
{
        uchar shi_gao,shi_di,fen_gao,fen_di;  
        uint time_date;

        time_date=read_887(0x02);     //读取12887的时间
            shi_gao=time_date/10;     //分离高位
        shi_di=time_date%10;          //分离低位
            
            P0=table[shi_gao ];    // 高位段码数据
                   h_gao=1;          //位选
                   delay(2);
                   h_gao=0;                       // 显示小时
                P0=table[shi_di];   // 低位段码数据
            h_di=1;             //位选
                   delay(2);
                   h_di=0;
    /********************/
        time_date=read_887(0x00);           //读取12887的时间
        fen_gao=time_date/10;          //分离高位
        fen_di=time_date%10;                //分离低位
            P0=table[fen_gao ];     // 高位段码数据
                   m_gao=1;           //位选
                   delay(2);
                   m_gao=0;                         //  显示分钟
                P0=table[fen_di];   // 低位段码数据
            m_di=1;
                   delay(2);
                   m_di=0;
}

很简单的程序,没什么调时功能,我只是想把它正确的读出来,有过的朋友麻烦帮帮忙!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。