搜索
bottom↓
回复: 22

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

[复制链接]

出0入0汤圆

发表于 2009-12-28 22:56:53 | 显示全部楼层 |阅读模式
#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);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-12-28 23:11:01 | 显示全部楼层
祝贺楼主

出0入0汤圆

发表于 2009-12-28 23:15:17 | 显示全部楼层
呵呵!老乡的贴,顶顶!

出0入0汤圆

 楼主| 发表于 2009-12-28 23:16:14 | 显示全部楼层
呵呵,谢谢大虾的鼓励。

出0入0汤圆

 楼主| 发表于 2009-12-28 23:16:53 | 显示全部楼层
回复【2楼】shanyan
呵呵!老乡的贴,顶顶!
-----------------------------------------------------------------------

你也是湖南的???

出0入0汤圆

发表于 2009-12-28 23:20:38 | 显示全部楼层
帮顶。。。

占位学习。。。

出0入0汤圆

发表于 2009-12-28 23:38:51 | 显示全部楼层
不来张PP?

出0入0汤圆

 楼主| 发表于 2009-12-29 10:07:50 | 显示全部楼层
不好意识~我还是新手。不知道PP是啥??
请大虾指教

出0入0汤圆

发表于 2009-12-29 10:48:15 | 显示全部楼层
void 上PP(void)
{
   if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if(楼主==girl|boy)
{ $$&pound;$&pound;$%$&pound; }
}

出0入0汤圆

发表于 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; }
}

出0入0汤圆

发表于 2009-12-29 18:02:59 | 显示全部楼层
强,顶一下。

出0入0汤圆

发表于 2009-12-29 19:15:38 | 显示全部楼层
我衡阳各,呵呵

出0入0汤圆

发表于 2009-12-29 21:05:07 | 显示全部楼层
xiaoluo2009 罗斌;
无图无真相,来阿莫这个坛,你要懂规矩.

出0入0汤圆

 楼主| 发表于 2009-12-30 09:24:29 | 显示全部楼层
哦知道了,下次一定要改正。谢谢大虾的指点

出0入0汤圆

 楼主| 发表于 2009-12-30 10:05:36 | 显示全部楼层
呵呵,图来了。

(原文件名:未命名.jpg)


(原文件名:未命名1.jpg)


(原文件名:未命名2.jpg)

出0入0汤圆

发表于 2010-1-10 16:13:48 | 显示全部楼层
有闹钟和日期功能吗?

出0入0汤圆

发表于 2010-4-11 11:48:33 | 显示全部楼层
记号。

出0入0汤圆

发表于 2010-4-21 23:49:51 | 显示全部楼层
Mark,164很便宜?

出0入0汤圆

发表于 2010-9-27 23:36:39 | 显示全部楼层
能弄个闹钟吗,我调了一下午都没调出来,请指教

出0入0汤圆

发表于 2014-9-18 17:28:47 | 显示全部楼层
顶一个,谢谢分享。

出0入0汤圆

发表于 2014-9-18 17:34:59 | 显示全部楼层
没办法 为了早日升级

出0入0汤圆

发表于 2014-9-18 17:46:09 | 显示全部楼层
现在应该很少人用12887了吧,DATA BUS 线多又IC 体积大,太占空间了,虽然我也还有数百颗库存,吃灰了.

出50入0汤圆

发表于 2014-9-18 19:55:04 | 显示全部楼层
学习         
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表