📄 ds1302_init.h
字号:
//------------------------------------------------------------------------------
//程序名称:DS1302_INIT.h
//designed by lvshichao
//2008.10.2
//------------------------------------------------------------------------------
//#include "io430.h"
#define BIT0_1302 0
#define BIT1_1302 1
#define BIT2_1302 2
#define BIT3_1302 3
#define BIT4_1302 4
#define BIT5_1302 5
#define BIT6_1302 6
#define BIT7_1302 7
//复位引脚
#define RST_CLR P2OUT&=~(1<<BIT0_1302)
#define RST_SET P2OUT|=(1<<BIT0_1302)
#define RST_IN P2DIR&=~(1<<BIT0_1302)
#define RST_OUT P2DIR|=(1<<BIT0_1302)
//双向数据
#define IO_CLR P2OUT&=~(1<<BIT1_1302)
#define IO_SET P2OUT|=(1<<BIT1_1302)
#define IO_R P2IN&(1<<BIT1_1302)
#define IO_IN P2DIR&=~(1<<BIT1_1302)
#define IO_OUT P2DIR|=(1<<BIT1_1302)
//时钟信号
#define SCK_CLR P2OUT&=~(1<<BIT2_1302)
#define SCK_SET P2OUT|=(1<<BIT2_1302)
#define SCK_IN P2DIR&=~(1<<BIT2_1302)
#define SCK_OUT P2DIR|=(1<<BIT2_1302)
//1302芯片信号定义
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //控制数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
unsigned char time_buf[8] = {0x20,0x08,0x10,0x4,0x8,0x51,0x0,0x2}; //初始时间
unsigned char time_real_buf[8];
//-------------------------------------------------------------------
//函数名称:1302_delay()
//功能:函数延时
//-------------------------------------------------------------------
void delay_1302(unsigned int i)
{
while(i--);
}
//-------------------------------------------------------------------
//函数名称:ds1302_write_byte()
//功能:向DS1302写入一字节数据
//-------------------------------------------------------------------
void ds1302_write_byte(unsigned char addr, unsigned char d)
{
unsigned char i;
RST_SET; //启动DS1302总线
//写入目标地址:addr
IO_OUT;
addr=addr&0XFE; //最低位置零
for(i=0;i<8;i++)
{
if(addr&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr=addr>>1;
}
//写入数据:addr
IO_OUT;
for(i=0;i<8;i++)
{
if(d&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
d=d>>1;
}
RST_CLR;//停止DS1302总线
}
//------------------------------------------
//文件名称:ds1302_read_byte()
//功能:从DS1302读出一字节数据
//------------------------------------------
unsigned char ds1302_read_byte(unsigned char addr)
{
unsigned char i;
unsigned char temp;
RST_SET; //启动DS1302总线
//写入目标地址:addr
IO_OUT;
addr=addr|0x01; //最低位置高
for(i=0;i<8;i++)
{
if(addr&0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
addr=addr>>1;
}
//输出数据:temp
IO_IN;
for(i=0;i<8;i++)
{
temp=temp>>1;
if(IO_R)
{
temp|=0x80;
}
else
{
temp&=0x7f;
}
SCK_SET;
SCK_CLR;
}
RST_CLR; //停止DS1302总线
return temp;
}
//-----------------------------------------------------------
//文件名称:ds1302_write_time()
//功能:向DS1302写入时钟数据
//-----------------------------------------------------------
void ds1302_write_time(void) {
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80); //暂停
ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时
ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
}
//------------------------------------------------------------------
//文件名称:ds1302_read_time()
//功能:从DS1302读出时钟数据
//------------------------------------------------------------------
void ds1302_read_time(void) {
time_real_buf[1]=ds1302_read_byte(ds1302_year_add); //年
time_real_buf[2]=ds1302_read_byte(ds1302_month_add); //月
time_real_buf[3]=ds1302_read_byte(ds1302_date_add); //日
time_real_buf[4]=ds1302_read_byte(ds1302_hr_add); //时
time_real_buf[5]=ds1302_read_byte(ds1302_min_add); //分
time_real_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
time_real_buf[7]=ds1302_read_byte(ds1302_day_add); //周
}
//------------------------------------------------------------------
//文件名称:ds1302_init()
//功能:DS1302初始化函数
//------------------------------------------------------------------
void ds1302_init(void) {
RST_CLR; /*RST脚置低*/
SCK_CLR; /*SCK脚置低*/
RST_OUT; /*RST脚设置为输出*/
SCK_OUT; /*SCK脚设置为输出*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -