📄 ds1302.h
字号:
//=========================================
//-----
//----- DS1302驱动程序 ---------------
//----- 作者:聂金波 niejinbo999@163.com
//----- 完成日期:2008-07-28 ------
//=========================================
//----- 星期一 monday 星期二 tuesday 星期三 wednesday
//----- 星期四 thursday 星期五 friday 星期六 saturday
//----- 星期日 sunday
//-----
//-----
//==========================================
//--------------------------
#define uchar unsigned char
#define uint unsigned int
//--------------------------
//------ 定义端口 ---------
sbit rst=P3^0;
sbit sclk=P3^1;
sbit io=P3^2;
//---------------------------
uchar tab_1302[7]={0,10,19,30,7,3,8}; //初始化时时间日期设置
//秒 分 时 日月 星期 年
uchar tab1_1302[7]={0,10,19,30,7,3,8};
//--------------------------
//----- 函数声明 ------
//--------------------------
void ds1302(); //获取DS1302时间
void writeds_byte(uchar); //向DS1302写一字节
uchar readds_byte(); //从DS1302读一字节
void ds1302_init(); //DS1302初始化
void writeds_add(uchar,uchar); //指定地址向1302写一数据
uchar readds_add(uchar); //指定地址从1302读一数据
//=========================================
//------ 函数 ------
//=========================================
//-------------------------------
//---- 向DS1302写一字节 (上升沿有效) -------
//---- 数据输入从低位到高位 ------------
//-------------------------------
void writeds_byte(uchar dat)
{
uchar i,dat_w;
dat_w=dat; //数据送给变量dat_w
for(i=0;i<8;i++)
{
io=0; //数据线先拉低
if(dat_w&0x01) //如果是1
{io=1;}
else //如果是0
{io=0;}
dat_w=dat_w>>1; //右移一位
sclk=0; //先拉低时钟信号
sclk=1; //拉高时钟信号
}
sclk=0; //写一字节完毕,拉低时钟信号
}
//-------------------------------
//---- 从DS1302读一字节 (下降沿有效) --------
//---- 读出数据时从低位0位到高位7 -----------
//-------------------------------
uchar readds_byte()
{
uchar i,k;
k=0;
for(i=0;i<8;i++)
{
k=k>>1; //k右移一位,确保先读来的数据在低位
if(io)
{k=k|0x80;} //读取的值先送K最高位
sclk=1; //先拉低时钟信号
sclk=0;
}
sclk=0;
return (k);
}
//-------------------------------
//---- 指定地址写一数据 --------
//-------------------------------
void writeds_add(uchar add,uchar dat) //dat为十进制数
{
rst=0;
sclk=0;
rst=1; //拉高RST
writeds_byte(add); // 写地址
writeds_byte((dat/10<<4)|(dat%10)); // DS1302中的时间数据是BCD码形式
sclk=0;
rst=0;
}
//-------------------------------
//---- 指定地址读出一数据 ------
//-------------------------------
uchar readds_add(uchar add)
{
uchar temp,dat1,dat2;
rst=0;
sclk=0;
rst=1;
writeds_byte(add);
temp=readds_byte(); //读取的数据为16进制
sclk=0; //读取完毕,拉低SCLK
rst=0; //拉低SCLK
dat1=temp/16; //16进制转成BCD
dat2=temp%16;
temp=dat1*10+dat2; //转换成10进制数字
return (temp);
}
//-------------------------------
//---- DS1302初始化 --------
//---- 设置初始时间 --------
//-------------------------------
void ds1302_init()
{
uchar i,add;
add=0x80;
writeds_add(0x8e,0x00); //允许写入
for(i=0;i<7;i++)
{
writeds_add(add,tab1_1302[i]);
add+=2;
}
writeds_add(0x90,0xa6); //写充电控制寄存器.
writeds_add(0x8e,0x80); //禁止写入
}
//-------------------------------
//---- 获取DS1302时间 --------
//---- 在主函数中调用 --------
//-------------------------------
void ds1302()
{
uchar i,add=0x81;
// writeds_add(0x8e,0x00); //允许向DS1302写入数据
for(i=0;i<7;i++)
{
tab_1302[i]=readds_add(add); //获得的数据已转换为十进制
add+=2;
}
//writeds_add(0x8e,0x80); //获取完一次时间,禁止向DS1302写入数据,提高可靠
}
//-------------------------------
//-------------------------------
//========================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -