xiaoluo2009 发表于 2009-12-28 22:56:53

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

#include<reg51.h>
#define uchar unsigned char
#define uintunsigned 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={0};
uchar table={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=sec&0x0f; //秒的个位
        b_d=sec&0xf0; //秒的十位
        b_d>>=4;

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

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

/****** 数码管显示************/
void disp_data(uchar x)
{
    uchar i,num;
        num=table;
        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);    //显示秒的个位
        disp_data(b_d);    //显示秒的十位
        disp_data(b_d);    //显示分的个位
        disp_data(b_d);    //显示分的十位
        disp_data(b_d);    //显示时的个位
        disp_data(b_d);    //显示时的十位
}

/***********************/
void main(void)
{
    init();
        ds12887_init();
        while(1)
        {
          read_time();
                b_d_data();
          disp();
                delay_ms(10);
        }
}

bluerain 发表于 2009-12-28 23:11:01

祝贺楼主

shanyan 发表于 2009-12-28 23:15:17

呵呵!老乡的贴,顶顶!

xiaoluo2009 发表于 2009-12-28 23:16:14

呵呵,谢谢大虾的鼓励。

xiaoluo2009 发表于 2009-12-28 23:16:53

回复【2楼】shanyan
呵呵!老乡的贴,顶顶!
-----------------------------------------------------------------------

你也是湖南的???

ciky 发表于 2009-12-28 23:20:38

帮顶。。。

占位学习。。。

touch_mcu 发表于 2009-12-28 23:38:51

不来张PP?

xiaoluo2009 发表于 2009-12-29 10:07:50

不好意识~我还是新手。不知道PP是啥??
请大虾指教

tianyuwei 发表于 2009-12-29 10:48:15

void 上PP(void)
{
   if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if(楼主==girl|boy)
{ $$&pound;$&pound;$%$&pound; }
}

fjh120 发表于 2009-12-29 11:00:10

回复【8楼】tianyuwei
void 上PP(void)
{
   if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if(楼主==girl|boy)
{ $$&pound;$&pound;$%$&pound; }
}
   

-----------------------------------------------------------------------

void 上PP(void)
{
   if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if((楼主==girl)&&(楼主==boy))
{ $$&pound;$&pound;$%$&pound; }
}

wl3910 发表于 2009-12-29 18:02:59

强,顶一下。

shanyan 发表于 2009-12-29 19:15:38

我衡阳各,呵呵

chqing1361 发表于 2009-12-29 21:05:07

xiaoluo2009 罗斌;
无图无真相,来阿莫这个坛,你要懂规矩.

xiaoluo2009 发表于 2009-12-30 09:24:29

哦知道了,下次一定要改正。谢谢大虾的指点

xiaoluo2009 发表于 2009-12-30 10:05:36

呵呵,图来了。
http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_520533.jpg
(原文件名:未命名.jpg)

http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_520534.jpg
(原文件名:未命名1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_520535.jpg
(原文件名:未命名2.jpg)

yqldt 发表于 2010-1-10 16:13:48

有闹钟和日期功能吗?

yanxinboy 发表于 2010-4-11 11:48:33

记号。

qufo 发表于 2010-4-21 23:49:51

Mark,164很便宜?

perofhap 发表于 2010-9-27 23:36:39

能弄个闹钟吗,我调了一下午都没调出来,请指教

zjsdlt2013 发表于 2014-9-18 17:28:47

顶一个,谢谢分享。

TZQ95865 发表于 2014-9-18 17:34:59

没办法 为了早日升级

WOSDAIZ 发表于 2014-9-18 17:46:09

现在应该很少人用12887了吧,DATA BUS 线多又IC 体积大,太占空间了,虽然我也还有数百颗库存,吃灰了.

zhq0571 发表于 2014-9-18 19:55:04

学习         
页: [1]
查看完整版本: 还烫手着呢!!!AT89s52+DS12887调试成功,不信大家看看,请大家多多指教~~~