📄 ds1302.c
字号:
//本程序算法部分可以用在其它部分,
//2007年6月8日调试已通过;
//文件名:DS1302.c
#define XF_MCU 0 //定义用哪一种单片机,1时,用于PIC; 0时,用于MSP430;
#if XF_MCU==0
//文件名:DS1302.c
#include<msp430x14x.h>
#include "ds1302.h"
#else
#include<PIC.h>
#include "ds1302.h"
uchar pa_out;
uchar pb_out;
uchar pc_out;
uchar pd_out;
uchar pe_out;
#endif
uchar ds_emp[7]; //时钟数组寄存器;
//========== 往DS1302写入1Byte数据 (内部函数) =============
void w_byte(uchar dat)
{
uchar i;
for(i=8; i>0; i--)
{
DS13_CLK_L;
if(!(dat&0x01))
DS13_IO_L;
else
DS13_IO_H;
DS13_CLK_H;
dat = dat >> 1;
}
}
//======== 从DS1302读取1Byte数据 (内部函数) ===================
uchar r_byte(void)
{
uchar i;
uchar rb_data;
DS13_IO_IN;
for(i=8; i>0; i--)
{
DS13_CLK_L;
rb_data =rb_data >> 1;
rb_data=rb_data&0x7f;
if(DS13_IO_DA)
rb_data=rb_data|0x80;
DS13_CLK_H;
}
DS13_IO_OUT;
return(rb_data);
}
//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============
void write_byte(uchar addr, uchar dat)
{ DS13_CLK_L;
DS_RST_L;
DS_RST_H;
w_byte(addr);
w_byte(dat);
DS_RST_L;
}
//========== 指定地址往DS1302读1Byte数据 (内部函数) =============
uchar read_byte(uchar addr)
{
uchar ucData;
DS13_CLK_L;
DS_RST_L;
DS_RST_H;
w_byte(addr);
ucData = r_byte();
DS_RST_L;
return(ucData);
}
//============ 设置ds1302日期和时间 =============
void write_ds1302(uchar *p)
{
uchar i;
uchar addr =0x80;
write_byte(0x8e,0x00); // 控制命令,WP=0,写操作
for(i =7; i>0; i--)
{
write_byte(addr,*p); // 秒 分 时 日 月 星期 年
p++;
addr +=2;
}
write_byte(0x8e,0x80); // 控制命令,WP=1,写保护
}
//============ 读ds1302当前日期和时间 =============
void read_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x81;
#if XF_MCU==0
DS13_DIR=DS13_CLK+DS13_IO+DS13_RST; //MSP430
#else
DS13_TRIS; //PIC
#endif
for (i=0; i<7; i++)
{
*p = read_byte(addr); //格式为: 秒 分 时 日 月 星期 年
addr += 2;
p++;
}
}
//################################################################################
void DS1302_INIT(void) //DS1302初始化
{
#if XF_MCU==0
DS13_DIR=DS13_CLK+DS13_IO+DS13_RST; //MSP430
#else
DS13_TRIS; //PIC
#endif
ds_emp[0]=0x30; //;秒寄存器
ds_emp[1]=0x30; //;分寄存器
ds_emp[2]=0x12; //;小时寄存器
ds_emp[3]=0x08; //;日期寄存器.
ds_emp[4]=0x03; //;月份寄存器
ds_emp[5]=0x04; //;星期寄存器
ds_emp[6]=0x07; //;年寄存器位
write_ds1302(ds_emp); //设置ds1302日期和时间
write_byte(0x8e,0x00); // 控制命令,WP=0,写操作
write_byte(0x90,0xAB); // 使能充电,用两个二极管,8K电阻
write_byte(0x8e,0x80); // 控制命令,WP=1,写保护
}
void DS1302_DATA(void) //设置1302日期;
{
#if XF_MCU==0
DS13_DIR=DS13_CLK+DS13_IO+DS13_RST; //MSP430
#else
DS13_TRIS; //PIC
#endif
ds_emp[0]=0x30; //;秒寄存器
ds_emp[1]=0x30; //;分寄存器
ds_emp[2]=0x12; //;小时寄存器
ds_emp[3]=0x08; //;日期寄存器.
ds_emp[4]=0x03; //;月份寄存器
ds_emp[5]=0x04; //;星期寄存器
ds_emp[6]=0x07; //;年寄存器位
write_ds1302(ds_emp); //设置ds1302日期和时间
}
main()
{
#if XF_MCU==0
WDTCTL = WDTPW + WDTHOLD; // 停止WDT
#endif
DS1302_DATA(); //设置1302日期;
DS1302_INIT(); //DS1302初始化
ds_emp[0]=0; //;秒寄存器
ds_emp[1]=0; //;分寄存器
ds_emp[2]=0; //;小时寄存器
ds_emp[3]=0; //;日期寄存器.
ds_emp[4]=0; //;月份寄存器
ds_emp[5]=0; //;星期寄存器
ds_emp[6]=0; //;年寄存器位
for(;;)
read_ds1302(ds_emp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -