📄 ds1302.h
字号:
#ifndef _DS1302_H_
#define _DS1302_H_
#include <avr/io.h>
#include "delayzz.h"
/*********************************************************************/
/* 实时时钟模块 时钟芯片型号:DS1302 */
/*********************************************************************/
#define DS1302_PORT PORTC
#define DS1302_DDR DDRC
#define DS1302_PIN PINC
#define T_CLK PC5
#define T_IO PC4
#define T_RST PC3
/******************************************************************** */
#define SETBIT(x,y) (x|=(1<<y))
#define CLRBIT(x,y) (x&=(~(1<<y)))
#define CHKBIT(x,y) (x&(1<<y))
void initialize_1302(void); //1302管脚初始化
void ds1302_write_a_byte(unsigned char ucDa); //1302写一bit数据函数
unsigned char ds1302_read_a_byte(void); //1302读一bit数据
void write_1302(unsigned char ucAddr, unsigned char ucDa); //往DS1302写入数据
unsigned char read_1302(unsigned char ucAddr); //读取DS1302某地址的数据
void v_Get1302(unsigned char ucCurtime[]); // 读取DS1302当前时间
void v_Setdd1302(unsigned char ucAddr,unsigned char pSecDa); //写某一位的时钟
/*************************************************************************************************
进制转换
************************************************************************************************/
unsigned char BcdToBin(unsigned char val)
{
val = (val >> 4) * 10 + (val & 0x0f); //将BCD码转换为10进制数
return val; //返回10进制数
}
unsigned char BinToBcd(unsigned char val)
{
return((val/10)*16+val%10);
}
/******************************************************************** */
/************************************************************************/
/* 初始化 */
/************************************************************************/
//1302管脚初始化
void initialize_1302(void)
{
SETBIT(DS1302_PORT,T_CLK);
SETBIT(DS1302_PORT,T_IO);
SETBIT(DS1302_PORT,T_RST);
SETBIT(DS1302_DDR,T_CLK);
SETBIT(DS1302_DDR,T_IO);
SETBIT(DS1302_DDR,T_RST);
delay_nus(1);
write_1302(0x8e,0x00);
write_1302(0x90,0xA5);
write_1302(0x80,0x00);
}
//1302写一bit数据函数
void ds1302_write_a_byte(unsigned char ucDa)
{
unsigned char i;
for(i=8; i>0; i--)
{
CLRBIT(DS1302_PORT,T_CLK);
if (ucDa&1) SETBIT(DS1302_PORT,T_IO);
else CLRBIT(DS1302_PORT,T_IO);
SETBIT(DS1302_PORT,T_CLK);
ucDa>>=1;
}
}
//1302读一bit数据
unsigned char ds1302_read_a_byte(void)
{
unsigned char i,t=0;
CLRBIT(DS1302_DDR,T_IO);
CLRBIT(DS1302_PORT,T_IO);
for(i=8; i>0; i--)
{
t>>=1;
SETBIT(DS1302_PORT,T_CLK);
delay_nus(1);
CLRBIT(DS1302_PORT,T_CLK);
delay_nus(1);
if(CHKBIT(DS1302_PIN,T_IO))t|=0x80;
}
SETBIT(DS1302_DDR,T_IO);
return(t);
}
//往DS1302写入数据
void write_1302(unsigned char ucAddr, unsigned char ucDa)
{
CLRBIT(DS1302_PORT,T_RST); //T_RST=0
CLRBIT(DS1302_PORT,T_CLK); //T_CLK=0;
SETBIT(DS1302_PORT,T_RST); //T_RST=1
ds1302_write_a_byte(ucAddr); // 地址,命令
CLRBIT(DS1302_PORT,T_CLK);
ds1302_write_a_byte(ucDa); // 写1Byte数据
CLRBIT(DS1302_PORT,T_CLK); //T_CLK=1
CLRBIT(DS1302_PORT,T_RST); //T_RST=0
}
//读取DS1302某地址的数据
unsigned char read_1302(unsigned char ucAddr)
{
unsigned char ucDa;
CLRBIT(DS1302_PORT,T_RST);
CLRBIT(DS1302_PORT,T_CLK);
SETBIT(DS1302_PORT,T_RST);
ds1302_write_a_byte(ucAddr); // 地址,命令
ucDa = ds1302_read_a_byte(); // 读1Byte数据
CLRBIT(DS1302_PORT,T_CLK);
CLRBIT(DS1302_PORT,T_RST);
return(ucDa);
}
///写某一位的时钟/////////////////////////////////////////////
void v_Setdd1302(unsigned char ucAddr,unsigned char pSecDa) //写某一位的时钟
{
write_1302(0x8e,0x00); //控制命令,WP=0,写操作?
write_1302(ucAddr,pSecDa); //
write_1302(0x8e,0x80); // 控制命令,WP=1,写保护?
}
// 读取DS1302当前时间
void v_Get1302(unsigned char ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = read_1302(ucAddr); //格式为: 秒 分 时 日 月星期 年
ucAddr += 2;
}
CLRBIT(DS1302_PORT,T_CLK);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -