DS1302读写

来源:互联网 发布:25岁学编程 编辑:程序博客网 时间:2024/05/18 18:47
#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;
}



相当详细的注释

0 0
原创粉丝点击