还烫手着呢!!!AT89s52+DS12887调试成功,不信大家看看,请大家多多指教~~~

2020-01-22 12:11发布

#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int
xdata uchar seconds _at_ 0x0000; //秒寄存器地址
xdata uchar minutes _at_ 0x0002; //分寄存器地址
xdata uchar hours   _at_ 0x0004; //时寄存器地址
xdata uchar day     _at_ 0x0006; //星期寄存器地址
xdata uchar date    _at_ 0x0007; //日期寄存器地址
xdata uchar month   _at_ 0x0008; //月寄存器地址
xdata uchar year    _at_ 0x0009; //年寄存器地址
xdata uchar com_a   _at_ 0x000A; //A寄存器地址
xdata uchar com_b   _at_ 0x000B; //B寄存器地址
xdata uchar com_c   _at_ 0x000C; //C寄存器地址
xdata uchar com_d   _at_ 0x000D; //D寄存器地址

sbit dat=P1^0; //74HC164数据脚
sbit clk=P1^1; //74HC164时钟脚
sbit clr=P1^5; //DS12887请RAM引脚
sbit a=P1^2;   //a.b,c为74HC138的输入引脚,输出为DS12887的片选引脚
sbit b=P1^3;
sbit c=P1^4;

uchar sec,min,hour;
uchar b_d[6]={0};
uchar table[11]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x09,0xff};
                //0,    1,   2,   3,   4,   5,   6,   7,   8,   9,  灭.
/**************************/
void delay_ms(uint x)   //1ms延时函数
{
    uchar i;
        while(x--)
        {
            for(i=0;i<250;i++);
        }
}

/**************************/
void init(void)           //初始化函数
{
    dat=0;
        clk=0;
        clr=0;
        delay_ms(1);
        clr=1;
}

/***********************/
void cs_ds12887(void)       //片选,选择DS12887。
{
    a=0;
        b=1;
        c=0;   
}
                                                                                                       
/*********************/
void set_time(uchar s_sec,uchar s_min,uchar s_hour) //写时间秒,分,时.
{
    //cs_ds12887();  //片选,对DS12887芯片而言,可以放在DS12887初始化函数中,片选一次就也行.
        com_b |= 0x80;   //芯片更新禁止.
        seconds=s_sec;
        minutes=s_min;
        hours=s_hour;
        com_b &= 0x7f;   //芯片更新允许.  
}

/***********************/
uchar get_sec(void)  //读秒的时间.
{   
    uchar i;
        //cs_ds12887();       
        i=com_a;   
        while( ( i&0x80 )==0x80 );
        return(seconds);
}

uchar get_min(void)  //读分钟的时间.
{   
    uchar i;
        //cs_ds12887();       
        i=com_a;   
        while( ( i&0x80 )==0x80 );
        return(minutes);
}

uchar get_hour(void)  //读小时的时间.
{   
    uchar i;
        //cs_ds12887();       
        i=com_a;   
        while( ( i&0x80 )==0x80 );
        return(hours);
}

/*************************/
void ds12887_init(void)
{   
    cs_ds12887();  //在DS12887初始化函数中选择DS12887。一次也行。                    
    com_a=0x20;                //A寄存器,晶体振荡器开启而且时钟保持运行。       
        com_b=0x02;                       //B寄存器,芯片更新正常进行,BCD码格式,24小时制。
    //com_b |= 0x80;                           //芯片更新禁止.
        set_time(0x12,0x39,0x08);  //设置秒,分,时的初始时间.
        //com_b &= 0x7f;                       //芯片更新正常进行
}

/************************/
void read_time(void)     
{
    hour=get_hour();
        hour &= 0x3f;

        min=get_min();
        min &= 0x7f;

        sec=get_sec();
        sec &= 0x7f;   
}

/***********************/
void b_d_data(void)          //数据处理函数
{
    b_d[0]=sec&0x0f; //秒的个位
        b_d[1]=sec&0xf0; //秒的十位
        b_d[1]>>=4;

        b_d[2]=min&0x0f; //分的个位
        b_d[3]=min&0xf0; //分的十位
        b_d[3]>>=4;

        b_d[4]=hour&0x0f; //时的个位
        b_d[5]=hour&0xf0; //时的十位
        b_d[5]>>=4;
}

/****** 数码管显示************/
void disp_data(uchar x)
{
    uchar i,num;
        num=table[x];
        for(i=0;i<8;i++)
        {
            clk=0;
                if( (num&0x01)==0x01 ) dat=1;
                else dat=0;
                clk=1;
                num>>=1;
        }   
}

/*************************/
void disp(void)                  //显示函数
{
    disp_data(b_d[0]);    //显示秒的个位
        disp_data(b_d[1]);    //显示秒的十位
        disp_data(b_d[2]);    //显示分的个位
        disp_data(b_d[3]);    //显示分的十位
        disp_data(b_d[4]);    //显示时的个位
        disp_data(b_d[5]);    //显示时的十位
}

/***********************/
void main(void)
{
    init();
        ds12887_init();
        while(1)
        {
            read_time();
                b_d_data();
            disp();
                delay_ms(10);
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。