文件结构
"ds1302.h"
#ifndef __DS1302_H__
#define __DS1302_H__
#include "reg52.h"
sbit ce = P2^5;
sbit sclk = P2^6; // SCL
sbit io = P2^7; // SDA
/*read 数据 |0x01 即可
例如Seconds_read = Seconds_Write | 0x01*/
#define Seconds_Write 0x80
#define Minutes_Write 0x82
#define Hour_Write 0x84
#define Data_Write 0x86
#define Month_Write 0x88
#define Day_Write 0x8a
#define Year_Write 0x8c
#define Seconds_Read 0x81
#define Minutes_Read 0x83
#define Hour_Read 0x85
#define Data_Read 0x87
#define Month_Read 0x89
#define Day_Read 0x8b
#define Year_Read 0x8d
unsigned char read_reg(unsigned char addr);
void write_reg(unsigned char addr, unsigned char dat);
#endif
"ds1302.c"
#include "ds1302.h"
/* 一定要注意,每次需要发送两个字节,在此期间,ce必须全程为1*/
// function: 向寄存器中写入数据
void write_reg(unsigned char addr, unsigned char dat)
{
unsigned char i;
ce = 0;
ce = 1;
for(i = 0; i < 8; i ++)
{
sclk = 0;
io = addr & 0x01;
sclk = 1;
addr >>= 1;
}
for(i = 0; i < 8; i ++)
{
sclk = 0;
io = dat & 0x01;
sclk = 1;
dat >>= 1;
}
}
// function: 向寄存器中写入数据
// return: 寄存器中的值,即时间、日期等
unsigned char read_reg(unsigned char addr)
{
unsigned char rec = 0x00;
unsigned char i;
ce = 0;
ce = 1;
// 一定要注意,每次需要传送(发送和读取)两个字节,在此期间,ce必须全程为1
for(i = 0; i < 8; i ++)
{
sclk = 0;
io = addr & 0x01;
sclk = 1;
addr >>= 1;
} // 发送命令(地址)字节,即第一个字节
for(i = 0; i < 8; i ++)
{
sclk = 1;
sclk = 0;
rec >>= 1;
if(io) rec |= 0x80;
} // 发送数据字节
return rec;
}
proteus仿真