/************************************************************************************/
/* 程序名:实时时钟DS1302代码 */
/* */
/* 晶振:12.0 M CPU型号:AT89S52 */
/************************************************************************************/
#include "user.h"
sbit clock_clk = P1 ^ 0;//ds1302_clk
sbit clock_dat = P1 ^ 1;//ds1302_dat
sbit clock_rst = P1 ^ 2;//ds1302_rst
//为了编程方便定义的位变量
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
/*****************************************************************
*发送字符
************************1 3 0 2 *****************************/
void clock_out(unsigned char dd)
{
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************
*接收字符
************************1 3 0 2 *****************************/
unsigned char clock_in(void)
{
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************
*读取时间
************************1 3 0 2 *****************************/
unsigned char read_clock(unsigned char ord)
{
unsigned char dd="0";
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_out(ord);
dd=clock_in();
clock_rst=0;
clock_clk=1;
return(dd);
}
/*****************************************************************
*写入时间
************************1 3 0 2 *****************************/
void write_clock(unsigned char ord, unsigned char dd)
{
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_out(ord);
clock_out(dd);
clock_rst=0;
clock_clk=1;
}
/*****************************************************************
*提取时间bcd码
************************1 3 0 2 *****************************/
void ReadClock(void)//read clock
{
unsigned char d, e;
d=read_clock(0x81);//读秒
e=d;
d=d>>4;
e=e&0x0f;
SecBCD[1] =d;
SecBCD[0] =e;
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
MinBCD[1] =d;
MinBCD[0] =e;
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
HourBCD[1] =d;
HourBCD[0] =e;
}
/*****************************************************************
*时钟的初始化
************************ *****************************/
void Init_1302(void)
{
write_clock(0x8e,0x00);//close_protect
write_clock(0x8c,0x05);//year
write_clock(0x8a,0x04);//week_day
write_clock(0x88,0x10);//month
write_clock(0x86,0x20);//date
write_clock(0x84,0x08);//hour 08;20;30
write_clock(0x82,0x20);//minute
write_clock(0x80,0x30);//second
write_clock(0x90,0xa5);//supply_power
write_clock(0x8e,0x80);//open_protect
}
文章评论(0条评论)
登录后参与讨论