📄 ds1032.c
字号:
#pragma small
#include <reg51.h>
#define uchar unsigned char
sbit ds1032_clk=P1^0;
sbit ds1032_dat=P1^1;
sbit ds1032_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 write(void) //写ds1032操作
{
ds1032_dat=ACC_0;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_1;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_2;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_3;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_4;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_5;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_6;
ds1032_clk=1;ds1032_clk=0;
ds1032_dat=ACC_7;
ds1032_clk=1;ds1032_clk=0;
}
void read(void) //读ds1032操作
{ACC_0=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_1=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_2=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_3=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_4=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_5=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_6=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
ACC_7=ds1032_dat;
ds1032_clk=1;
ds1032_clk=0;
}
uchar readram_b(uchar address) //从ram中读出一个字节
{ds1032_rst=0;
ds1032_clk=0;
ds1032_rst=1;
ACC=address;
write();
ds1032_dat=1;
read();
return ACC;
}
uchar readrtc_b(uchar address) //从ds1032中读出一个字节
{
ds1032_rst=0;
ds1032_clk=0; //清时钟总线
ds1032_rst=1;
ACC=address;
write();
ds1032_dat=1;
read();
return ACC;
}
void writeram_b(uchar address,uchar number) //向RAM中写入一字节
{ds1032_clk=0;
ds1032_rst=0;
ds1032_rst=1;
ACC=address;
write();
ACC=number;
write();
ds1032_rst=0;
ds1032_clk=1;
}
void writertc_b(uchar address,uchar number) //向DS1032中写入一字节
{ds1032_clk=0;
ds1032_rst=0;
ds1032_rst=1;
ACC=address;
write();
ACC=number;
write();
ds1032_rst=0;
ds1032_clk=1;
}
void readram(uchar data *buffer,uchar size) //从RAM中读出多字节
{register uchar a,b;
ds1032_clk=0;
ds1032_rst=0;
ds1032_rst=1;
ACC=0XFF;
write();
ds1032_dat=1;
for(a=0;a<size;a++)
{ACC_0=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_1=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_2=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_3=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_4=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_5=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_6=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_7=ds1032_dat;
b=ACC;
*(buffer+a)=b;
ds1032_clk=1;ds1032_clk=0;
}
ds1032_rst=0;ds1032_clk=1;
}
void readrtc(uchar data *buffer,uchar size) //从DS1032中读出多字节
{register uchar a;
uchar b;
ds1032_clk=0;
ds1032_rst=0;
ds1032_rst=1;
ACC=0Xbf;
write();
ds1032_dat=1;
for(a=0;a<size;a++) //读出DS1032数据
{ACC_0=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_1=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_2=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_3=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_4=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_5=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_6=ds1032_dat;
ds1032_clk=1;ds1032_clk=0;ACC_7=ds1032_dat;
b=ACC;
*(buffer+a)=b;
ds1032_clk=1;ds1032_clk=0;
}
ds1032_rst=0;ds1032_clk=1;
}
void writeram(uchar data *buffer,uchar size) //向RAM中写入多字节
{register uchar a;
ds1032_clk=0;
ds1032_rst=0;
ds1032_rst=1;
ACC=0XFE;
write();
for(a=0;a<size;a++)
{ACC=*(buffer+a);
write();
}
ds1032_rst=0;
ds1032_clk=1;
}
void writertc(uchar data *buffer,uchar size) //向DS1032中写入多字节
{register uchar a;
ds1032_clk=0;
ds1032_rst=0;
ds1032_rst=1;
ACC=0Xbe;
write();
for(a=0;a<size;a++)
{ACC=*(buffer+a);
write();
}
ds1032_rst=0;
ds1032_clk=1;
}
uchar readsec(void) //从DS1032中读出秒字节
{return readrtc_b(0x81);}
uchar readmin(void)//从DS1032中读出分字节
{return readrtc_b(0x83);}
uchar readhr(void) //从DS1032中读出时字节
{return readrtc_b(0x85);}
uchar readday(void) //从DS1032中读出日字节
{return readrtc_b(0x87);}
uchar readmonth(void) //从DS1032中读出月字节
{return readrtc_b(0x89);}
uchar readweek(void) //从DS1032中读星秒字节
{return readrtc_b(0x8b);}
uchar readyear(void) //从DS1032中读出年字节
{return readrtc_b(0x8d);}
uchar writesec(uchar number) //向DS1032中写入秒字节
{writertc_b(0x80,number);}
uchar writemin(uchar number) //向DS1032中写入秒字节
{writertc_b(0x82,number);}
uchar writehr(uchar number) //向DS1032中写入秒字节
{writertc_b(0x84,number);}
uchar writeday(uchar number) //向DS1032中写入秒字节
{writertc_b(0x86,number);}
uchar writemonth(uchar number) //向DS1032中写入秒字节
{writertc_b(0x88,number);}
uchar writeweek(uchar number) //向DS1032中写入秒字节
{writertc_b(0x8a,number);}
uchar writeyear(uchar number) //向DS1032中写入秒字节
{writertc_b(0x8c,number);}
uchar writecontrol(uchar number) //向慢速充电控制寄存器写入控制字
{writertc_b(0x90,number);}
void disablewp(void) //禁止写保护
{writertc_b(0x80,0);}
void enablewp(void) //允许写保护
{writertc_b(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};
//读DS1032
disablewp(); //禁止写保护
writecontrol(0xaa); //向慢充电控制寄存器写入控制字节
writeram(buffer1,31); //读DS1032RAM
writertc(buffer2,8); //向DS1032写时钟
enablewp(); //允许写保护
readram(buffer1,31); //读DS1032RAM
readrtc(buffer2,8); //读DS1032时钟
writesec(11);
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 + -