原创 51读写ds1302

2008-6-14 13:57 3879 4 4 分类: MCU/ 嵌入式

/************************************************************************************/
/*     程序名:实时时钟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 
}


 



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /4 下一条