📄 ds1302.h
字号:
/********************************************************************
功 能:DS1302串行时钟读写程序
说 明:MCU:atmage48v 8M
设 计:
修 改:Joe Yuan QQ:16693799
日 期:2007.04.30
********************************************************************/
#ifndef _DS1302_H
#define _DS1302_H
/************端口定义**********/
#define DS1302_PORT PORTD
#define DS1302_INPORT PIND
#define DS1302_DDR DDRD
#define DS1302_RST PD1
#define DS1302_IO PD0
#define DS1302_SCLK PD2
#define Set_ds1302_rst_ddr() DS1302_DDR |=BIT(DS1302_RST)
#define Set_ds1302_rst() DS1302_PORT|=BIT(DS1302_RST)
#define Clr_ds1302_rst() DS1302_PORT &=~ BIT(DS1302_RST)
#define Set_ds1302_io_ddr() DS1302_DDR|=BIT(DS1302_IO)
#define Clr_ds1302_io_ddr() DS1302_DDR&=~ BIT(DS1302_IO)
#define Set_ds1302_io() DS1302_PORT|=BIT(DS1302_IO)
#define Clr_ds1302_io() DS1302_PORT&=~ BIT(DS1302_IO)
#define In_ds1302_io() DS1302_INPORT&=~ BIT(DS1302_IO)
#define Set_ds1302_sclk_ddr() DS1302_DDR |=BIT(DS1302_SCLK)
#define Set_ds1302_sclk() DS1302_PORT|=BIT(DS1302_SCLK)
#define Clr_ds1302_sclk() DS1302_PORT&=~ BIT(DS1302_SCLK)
#define ds1302_second_reg 0x80
#define ds1302_minute_reg 0x82
#define ds1302_hour_reg 0x84
#define ds1302_date_reg 0x86
#define ds1302_month_reg 0x88
#define ds1302_week_reg 0x8a
#define ds1302_year_reg 0x8c
#define ds1302_control_reg 0x8e
#define ds1302_charger_reg 0x90
#define ds1302_clkburst_reg 0xbe
void Ds1302_writebyte(Byte data); //DS1302数据的写字节
void Ds1302_write(Byte reg,Byte data);//DS1302数据的字节写
Byte Ds1302_read(Byte reg); //DS1302数据的字节读
void Ds1302_write_time(void); //DS1302时间的设置
void Ds1302_read_time(void); //DS1302时间的读取
Byte Check_ds1302(void); //DS1302设备的检查
void Delay1302(void); //scLk延时
void Ds1302_initral(void); //初始化1302
void Ds1302_writebyte(Byte data)//DS1302数据的写1字节
{
unsigned char i;
for(i=0; i<8;i++)
{
if(data&BIT(i))
Set_ds1302_io();
else
Clr_ds1302_io();
Set_ds1302_sclk();
Delay1302();
Clr_ds1302_sclk();
Delay1302();
}
}
void Ds1302_write(unsigned char ucAddr, unsigned char ucDa)
{
//willzhao modify:07/04/30
Clr_ds1302_rst(); // RST to L
Clr_ds1302_sclk(); // CLK to L
Delay1302();
Set_ds1302_rst(); // RST to H
Delay1302();
Ds1302_writebyte(ucAddr); // 地址,命令
Delay1302();
Ds1302_writebyte(ucDa); // 写1Byte数据
Delay1302();
Set_ds1302_sclk(); //CLK to H
Clr_ds1302_rst(); //RST to L
}
unsigned char Ds1302_readbyte(void)
{
unsigned char i,k,AA=0;
//willzhao modify:07/04/30
Clr_ds1302_io_ddr();
for(i=0; i<8; i++)
{
k = (DS1302_INPORT & BIT(DS1302_IO)); //读数据,从低位开始
if(k)
AA |= BIT(i);
else
AA &= ~ BIT(i);
Set_ds1302_sclk();
Delay1302();
Clr_ds1302_sclk();
Delay1302();
}
Set_ds1302_io_ddr();
return(AA);
}
unsigned char Ds1302_read(unsigned char ucAddr)
{
unsigned char ucData,AA;
ucAddr |= BIT(0);
//willzhao modify:07/04/30
Clr_ds1302_rst(); // RST to L
Clr_ds1302_sclk(); // CLK to L
Delay1302();
Set_ds1302_rst(); // RST to H // RST to H
Delay1302();
Ds1302_writebyte(ucAddr); // 地址,命令
Delay1302();
ucData = Ds1302_readbyte(); // 读1Byte数据
Delay1302();
Set_ds1302_sclk(); //CLK to H
Clr_ds1302_rst(); //RST to L
return(ucData);
}
Byte Check_ds1302(void)
{
Ds1302_write(ds1302_control_reg,0x80);
if(Ds1302_read(ds1302_control_reg)==0x80)
return 1;
else
return 0;
}
void Ds1302_initral(void)
{
Ds1302_write(ds1302_control_reg,0x00); //关闭写保护
Ds1302_write(ds1302_second_reg,0x80); //暂停
Ds1302_write(ds1302_charger_reg,0xa5); //涓流充电 1个2极管2k电阻
//判断1302数据和新设置的数据一样
//一样以设置数据为准
if(year>=Ds1302_read(ds1302_year_reg))
Ds1302_write(ds1302_year_reg,year); //年
else if(month>=Ds1302_read(ds1302_month_reg))
Ds1302_write(ds1302_month_reg,month); //月
else if(date>=Ds1302_read(ds1302_date_reg))
Ds1302_write(ds1302_date_reg,date); //日
else if(week>=Ds1302_read(ds1302_week_reg))
Ds1302_write(ds1302_date_reg,week); //周
else if(hour>=Ds1302_read(ds1302_hour_reg))
Ds1302_write(ds1302_hour_reg,hour); //时
else if(minute>=Ds1302_read(ds1302_minute_reg))
Ds1302_write(ds1302_minute_reg,minute); //分
else if(second>=Ds1302_read(ds1302_second_reg))
Ds1302_write(ds1302_second_reg,second); //秒
Ds1302_write(ds1302_second_reg,second&0x7f); //启动振荡
Ds1302_write(ds1302_control_reg,0x80); //打开写保护
}
void Delay1302(void)
{
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -