📄 ds1302.c
字号:
#pragma small
#include <reg52.h>
#define uchar unsigned char
/************************************引脚连接图*****************************************/
sbit ds1302_clk=P1^0;
sbit ds1302_dat=P1^1;
sbit ds1302_rst=P1^2;
sbit ACC_0 = ACC^0;
sbit ACC_1 = ACC^1;
sbit ACC_2 = ACC^2;
sbit ACC_3 = ACC^3;
sbit ACC_4 = ACC^4;
sbit ACC_5 = ACC^5;
sbit ACC_6 = ACC^6;
sbit ACC_7 = ACC^7;
/*************************************函数说明******************************************/
void Read(void); //写DS1302操作
void Write(void); //读DS1302操作
uchar ReadRam_Byte(uchar address); //从Ram中读出一个字节
uchar ReadRTC_Byte(uchar address); //从DS1302中读出一个字节
uchar WriteRam_Byte(uchar address,uchar number); //向Ram中写入一个字节
uchar WriteRTC_Byte(uchar address,uchar number); //向DS1302中写入一个字节
void ReadRam(uchar data * buffer,uchar size); //从Ram中读出多个字节
void ReadRTC(uchar data * buffer,uchar size); //从DS1302中读出多个字节
void WriteRam(uchar data * buffer,uchar size); //向Ram中写入多个字节
void WriteRTC(uchar data * buffer,uchar size); //向DS1302中写入多个字节
uchar ReadSec(void); //从DS1302中读出秒字节
uchar ReadMin(void); //从DS1302中读出分字节
uchar ReadHr(void); //从DS1302中读出时字节
uchar ReadDay(void); //从DS1302中读出日字节
uchar ReadMonth(void); //从DS1302中读出月字节
uchar ReadWeek(void); //从DS1302中读出星期字节
uchar ReadYear(void); //从DS1302中读出年字节
void WriteSec(uchar number); //向DS1302中写入秒字节
void WriteMin(uchar number); //向DS1302中写入分字节
void WriteHr(uchar number); //向DS1302中写入时字节
void WriteDay(uchar number); //向DS1302中写入日字节
void WriteMonth(uchar number); //向DS1302中写入月字节
void WriteWeek(uchar number); //向DS1302中写入星期字节
void WriteYear(uchar number); //向DS1302中写入年字节
void WriteControl(uchar number); //向慢速充电控制寄存器写入控制字节
void EnableWP(void); //禁止写保护
void DisableWP(void); //允许写保护
void Write(void) //写DS1302操作
{
ds1302_dat = ACC_0; //写DS1302
ds1302_clk = 1; //时钟上升沿,发送数据有效
ds1302_clk = 0; //清零时钟总线
ds1302_dat = ACC_1;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_2;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_3;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_4;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_5;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_6;
ds1302_clk = 1; ds1302_clk = 0;
ds1302_dat = ACC_7;
ds1302_clk = 1; ds1302_clk = 0;
}
void Read(void) //读DS1302操作
{
ACC_0 = ds1302_dat; //读取DS1302数据
ds1302_clk = 1; //时钟上升沿,发送数据有效
ds1302_clk = 0; //清零时钟总线
ACC_1 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_2 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_3 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_4 = ds1302_dat;
ds1302_clk = 1;ds1302_clk = 0;
ACC_5 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_6 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0;
ACC_7 = ds1302_dat;
ds1302_rst = 0; ds1302_clk = 1;
}
uchar ReadRam_Byte(uchar address) //从RAM中读出一个字节
{
ds1302_rst = 0; //复位引脚为低电平,所有数据传送中止
ds1302_clk = 0; //清零时钟总线
ds1302_rst = 1; //复位引脚为高电平,逻辑控制有效
ACC = address;
Write(); //写DS1302操作
ds1302_dat = 1;
Read(); //读DS1302操作
return ACC;
}
uchar ReadRTC_Byte(uchar address) //从DS1302中读出一个字节
{
ds1302_rst = 0; //复位引脚为低电平,所有数据传送中止
ds1302_clk = 0; //清零时钟总线
ds1302_rst = 1; //复位引脚为高电平,逻辑控制有效
ACC = address;
Write(); //对DS1302写命令字和地址
ds1302_dat = 1;
Read(); //读DS1302操作
return ACC; //返回读取的数据
}
uchar WriteRam_Byte(uchar address,uchar number) //向RAM中写入一个字节
{
ds1302_clk = 0; ds1302_rst = 0;ds1302_rst = 1;
ACC = address;
Write(); //对DS1302写命令字和地址
ACC = number;
Write(); //对DS1302写命令字和数据
ds1302_rst = 0;
ds1302_clk = 1;
return ACC;
}
uchar WriteRTC_Byte(uchar address,uchar number) //向DS1302中写入一个字节
{
ds1302_clk = 0;
ds1302_rst = 0;ds1302_rst = 1;
ACC = address;
ACC |= 0x80;
Write(); //对DS1302写命令字和地址
ACC = number;
Write(); //对DS1302写命令字和数据
ds1302_rst = 0; ds1302_clk = 1;
return ACC;
}
void ReadRam(uchar data * buffer,uchar size) //从RAM中读出多个字节
{
register uchar a,b;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xff; //命令字为FFH
Write(); //对DS1302写命令字和地址
ds1302_dat = 1;
for(a=0;a<size;a++)
{
ACC_0 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
b = ACC;
*(buffer+a)=b;
ds1302_clk = 1; ds1302_clk = 0;
}
ds1302_rst = 0; ds1302_clk = 1;
}
void ReadRTC(uchar data * buffer,uchar size) //从DS1302中读出多个字节
{
register uchar a,b;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xbf; //命令字为BFH
Write(); //对DS1302写命令字和地址
ds1302_dat = 1;
for(a=0;a<size;a++) //读出DS1302数据
{
ACC_0 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_1 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_2 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_3 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_4 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_5 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_6 = ds1302_dat;
ds1302_clk = 1; ds1302_clk = 0; ACC_7 = ds1302_dat;
b = ACC;
*(buffer+a)=b;
ds1302_clk = 1; ds1302_clk = 0;
}
ds1302_rst = 0;
ds1302_clk = 1;
}
void WriteRam(uchar data * buffer,uchar size) //向RAM中写入多个字节
{
register uchar a;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xfe; //命令字为FE
Write(); //对DS1302写命令字和地址
for(a=0;a<size;a++)
{
ACC = *(buffer+a);
Write(); //对DS1302写数据
}
ds1302_rst = 0;
ds1302_clk = 1;
}
void WriteRTC(uchar data * buffer,uchar size) //向DS1302中写入多个字节
{//注意:连续写DS1302只能是8个字节一起写
register uchar a;
ds1302_clk = 0;
ds1302_rst = 0;
ds1302_rst = 1;
ACC = 0xbe; //命令字为BEH
Write(); //对DS1302写命令字和地址
for(a=0;a<size;a++)
{
ACC = *(buffer+a);
Write(); //对DS1302写数据
}
ds1302_rst = 0;
ds1302_clk = 1;
}
uchar ReadSec(void) //从DS1302中读出秒字节
{
return ReadRTC_Byte(0x81);
}
uchar ReadMin(void) //从DS1302中读出分字节
{
return ReadRTC_Byte(0x83);
}
uchar ReadHr(void) //从DS1302中读出时字节
{
return ReadRTC_Byte(0x85);
}
uchar ReadDay(void) //从DS1302中读出日字节
{
return ReadRTC_Byte(0x87);
}
uchar ReadMonth(void) //从DS1302中读出月字节
{
return ReadRTC_Byte(0x89);
}
uchar ReadWeek(void) //从DS1302中读出星期字节
{
return ReadRTC_Byte(0x8B);
}
uchar ReadYear(void) //从DS1302中读出年字节
{
return ReadRTC_Byte(0x8D);
}
void WriteSec(uchar number) //向DS1302中写入秒字节
{
WriteRTC_Byte(0x80,number);
}
void WriteMin(uchar number) //向DS1302中写入分字节
{
WriteRTC_Byte(0x82,number);
}
void WriteHr(uchar number) //向DS1302中写入时字节
{
WriteRTC_Byte(0x84,number);
}
void WriteDay(uchar number) //向DS1302中写入日字节
{
WriteRTC_Byte(0x86,number);
}
void WriteMonth(uchar number) //向DS1302中写入月字节
{
WriteRTC_Byte(0x88,number);
}
void WriteWeek(uchar number) //向DS1302中写入星期字节
{
WriteRTC_Byte(0x8A,number);
}
void WriteYear(uchar number) //向DS1302中写入年字节
{
WriteRTC_Byte(0x8C,number);
}
void WriteControl(uchar number) //向慢速充电控制寄存器写入控制字节
{
WriteRTC_Byte(0x90,number);
}
void DisableWP(void) //禁止写保护
{
WriteRTC_Byte(0x8E,0);
}
void EnableWP(void) //允许写保护
{
WriteRTC_Byte(0x8E,0x80);
}
void main(void) //主程序
{
uchar sec,min,hr,day,month,week,year;
uchar data buffer1[32] =
{32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
uchar data buffer2[8] = {45,45,15,13,3,2,01,0};
ReadRTC(buffer2,8);
DisableWP(); //禁止写保护
WriteControl(0xaa); //向慢速充电控制寄存器写入控制字节
WriteRam(buffer1,31); //写DS1302RAM
WriteRTC(buffer2,8); //写DS1302时钟
EnableWP(); //允许写保护
ReadRam(buffer1,31); //读DS1302RAM
ReadRTC(buffer2,8); //读DS1302时钟
sec = ReadSec(); //读秒
min = ReadMin(); //读分
hr = ReadHr(); //读小时
day = ReadDay(); //读日
month = ReadMonth(); //读月
week = ReadWeek(); //读星期
year = ReadYear(); //读年
ACC = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -