DS1302读写

#ifndef __DS1302_H__
#define __DS1302_H__


sbit SCK = P1^4; //时钟线
sbit SDA = P1^5; //数据线
sbit CE  = P1^6; //片选控制线




#define CE_CLR CE=0 //片选控制信号置低
#define CE_SET CE=1 //片选控制信号置高






#define IO_CLR SDA=0 //数据信号置低
#define IO_SET SDA=1 //数据信号置高
#define IO_R SDA   //数据信号的状态






#define SCK_CLR SCK=0 //时钟信号置低
#define SCK_SET SCK=1 //时钟信号线置高


//读寄存器在写寄存器的基础上加1
#define DS1302_SEC_REG_W 0X80 //秒写寄存器(0~59)
#define DS1302_MIN_REG_W 0X82 //分写寄存器(0~59)
#define DS1302_HOU_REG_W 0X84 //时写寄存器(1~12/0~23)
#define DS1302_DAT_REG_W 0X86 //日写寄存器(1~31)
#define DS1302_MON_REG_W 0X88 //月写寄存器(1~12)
#define DS1302_DAY_REG_W 0X8A //周日写寄存器(1~7)
#define DS1302_YEA_REG_W 0X8C //年写寄存器(00~99)
#define DS1302_CON_REG_W 0X8E //控制使能寄存器








void Write_Ds1302(unsigned char addr, unsigned char val);
unsigned char Read_Ds1302(unsigned char addr);






#endif




#include "ds1302.h"


/*
*********************************************************************************************************
*                                        地址数据发送函数
*********************************************************************************************************
*/
void Write_Ds1302(unsigned char addr, unsigned char val)
{
unsigned char i, temp;
//拉低片选数据传送终止
CE_CLR;
//拉低时钟线清零设置
SCK_CLR;
//拉高片选逻辑控制有效
CE_SET;
//地址时序操作
for (i = 0; i < 8; i++)
{
//时钟线 开始下一个数据存储
SCK_CLR;
temp = addr;
IO_R = (bit)(temp&0x1);
addr >>= 1;
//时钟线拉高  这个数据存储完毕
SCK_SET;
}
//数据时序操作
for (i = 0; i < 8; i++)
{
//时钟线拉低开始下一个数据存储
SCK_CLR;
temp = val;
IO_R = (bit)(temp&0x1);
addr >>= 1;
//时钟线拉高这个数据存储完毕
SCK_SET;
}
//拉低片选操作完成
CE_CLR;
}




/*
*********************************************************************************************************
*                                        地址数据读取函数
*********************************************************************************************************
*/
unsigned char Read_Ds1302(unsigned char addr)
{
unsigned char i, temp;
//拉低片选数据传送终止
CE_CLR;
//拉低时钟线清零设置
SCK_CLR;
//拉高片选逻辑控制有效
CE_SET;
addr |= 0x1;

//地址时序操作
for (i = 0; i < 8; i++)
{
//时钟线拉低开始下一个数据存取
SCK_CLR;
temp = addr;
IO_R = (bit)(temp&0x1);
addr >>= 1;
//时钟线拉高这个数据存储完毕
SCK_SET;
}
//读取数据时序操作
for (i = 0; i < 8; i++)
{
SCK_CLR;
temp = temp >> 1;
if (IO_R) 
{
temp |= 0x80;
}
else 
{
temp &= 0x7F;
}
SCK_SET;
}
//拉低片选  数据传送终止
CE_CLR;

return temp;
}



相当详细的注释

你可能感兴趣的:(单片机)