时钟芯片DS1302驱动代码


文件结构

"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仿真