#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);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
占位学习。。。
一周热门 更多>