📄 ds1302.c
字号:
//#include <at89x51.h>
#define uchar unsigned char
sbit SCLK = P0^1;
sbit IO = P0^2;
sbit RSTB = P0^3;
/**************************** 函数原型说明 ****************************/
void clkwritebyte(); // 时钟字节写入函数
uchar rbyte_3w(); // 字节读取函数
void reset_3w(); // 复位函数
void wbyte_3w(uchar); // 字节写入函数
void initialize_DS1302(uchar sec,uchar min,uchar hr,uchar date,uchar mn,uchar dy,uchar yr); // DS1302初始化函数
void disp_clk_regs(uchar); // 显示时钟寄存器内容函数
/***************************** 复位函数 ******************************/
void reset_3w() {
SCLK = 0;
RSTB = 0;
RSTB = 1;
}
/****************************** 字节写入函数 ***************************/
void wbyte_3w(uchar W_Byte) {
uchar i;
for(i = 0; i < 8; ++i) {
IO = 0;
if(W_Byte & 0x01) IO = 1;
SCLK = 0;
SCLK = 1; //一次上升沿写一位,zwj注
W_Byte >>= 1;
}
}
/****************************** 字节读取函数 ****************************/
uchar rbyte_3w()
{
uchar i;
uchar R_Byte;
uchar TmpByte;
R_Byte = 0x00;
IO = 1;
for(i=0; i<8; ++i) {
SCLK = 1;
SCLK = 0;
TmpByte = (uchar)IO;//读IO口。zwj注
TmpByte <<= 7;
R_Byte >>= 1;
R_Byte |= TmpByte;
}
return R_Byte;
}
/**************************** 时钟字节写入函数 *************************/
void clkwritebyte()
{
uchar ClkAdd;
uchar ClkData;
ClkAdd = ((ClkAdd * 2) | 0x80); // 时钟数据写入命令
reset_3w();
wbyte_3w(ClkAdd);
wbyte_3w(ClkData);
reset_3w();
}
/**************************** DS1302初始化函数 **************************/
void initialize_DS1302(uchar sec,uchar min,uchar hr,uchar date,uchar mn,uchar dy,uchar yr)
{
reset_3w();
wbyte_3w(0x8e); // 写保护控制寄存器
wbyte_3w(0); // 允许写入
reset_3w();
wbyte_3w(0x90); // 涓流充电控制寄存器
wbyte_3w(0xab); // 允许充电, 双二极管, 8K 电阻
reset_3w();
wbyte_3w(0xbe); // 以多字节突发方式写入时钟数据(8个字节)
wbyte_3w(sec);
wbyte_3w(min);
wbyte_3w(hr);
wbyte_3w(date);
wbyte_3w(mn);
wbyte_3w(dy);
wbyte_3w(yr);
wbyte_3w(0); // 以多字节突发方式写入时钟数据时
reset_3w();
}
void initialize_DS1302a()//(uchar sec,uchar min,uchar hr,uchar date,uchar mn,uchar dy,uchar yr)
{
reset_3w();
wbyte_3w(0x8e); // 写保护控制寄存器
wbyte_3w(0); // 允许写入
reset_3w();
wbyte_3w(0x90); // 涓流充电控制寄存器
wbyte_3w(0xab); // 允许充电, 双二极管, 8K 电阻
reset_3w();
wbyte_3w(0xbe); // 以多字节突发方式写入时钟数据(8个字节)
/*wbyte_3w(sec);
wbyte_3w(min);
wbyte_3w(hr);
wbyte_3w(date);
wbyte_3w(mn);
wbyte_3w(dy);
wbyte_3w(yr);*/
wbyte_3w(0); // 以多字节突发方式写入时钟数据时
reset_3w();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -