还烫手着呢!!!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);
}
} 祝贺楼主 呵呵!老乡的贴,顶顶! 呵呵,谢谢大虾的鼓励。 回复【2楼】shanyan
呵呵!老乡的贴,顶顶!
-----------------------------------------------------------------------
你也是湖南的??? 帮顶。。。
占位学习。。。 不来张PP? 不好意识~我还是新手。不知道PP是啥??
请大虾指教 void 上PP(void)
{
if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if(楼主==girl|boy)
{ $$£$£$%$£ }
} 回复【8楼】tianyuwei
void 上PP(void)
{
if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if(楼主==girl|boy)
{ $$£$£$%$£ }
}
-----------------------------------------------------------------------
void 上PP(void)
{
if(楼主==boy)
{ 即上原理或者仿真图 }
else if(楼主==girl){ 即上楼主本人清晰大PP }
else if((楼主==girl)&&(楼主==boy))
{ $$£$£$%$£ }
} 强,顶一下。 我衡阳各,呵呵 xiaoluo2009 罗斌;
无图无真相,来阿莫这个坛,你要懂规矩. 哦知道了,下次一定要改正。谢谢大虾的指点 呵呵,图来了。
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) 有闹钟和日期功能吗? 记号。 Mark,164很便宜? 能弄个闹钟吗,我调了一下午都没调出来,请指教 顶一个,谢谢分享。 没办法 为了早日升级 现在应该很少人用12887了吧,DATA BUS 线多又IC 体积大,太占空间了,虽然我也还有数百颗库存,吃灰了. 学习
页:
[1]