
他们读取和写入的桥梁是连接在一起的IO引脚,在通过定义一个字节的缓存空间把数据放入缓存空间中
从第0位(最低位)开始读取
注意:SCLK的低位一般是放置数据的

一、先大致写出一个框架
#include <reg51.h>
sbit SCLK=P0^0;
sbit CE =P0^1;
sbit IO =P0^2;
//向DS1302内部寄存器addr(地址)写入一个value(值)
void ds1302_write_reg(unsigned char addr,unsigned char value)
{
//第一部分:时序起始
//第二部分:写入第一字节,先给前八位地址
//第三部分:写入第二字节,再给后八位数据
//第四部分:时序结束
}
为啥要写两次字节?
因为在DS1302中写入数据,需要先写入地址/命令,然后才能写数据
对于1302的操作分两部分,一部分是控制字,也就是地址及命令字节,另一部分是数据。
例:
二、添加单片机写入和DS1302读取的内容
开始的时候SCLK(时钟信号)和CE(RST(复位功能))都为低电平0
CE设置高电平开始写入数据
写入第一个字节,单片机把addr的最低bit位发出(写入)去给IO引脚,在DS1302的SCLK(同步时钟)产生一个上升沿时,读取IO引脚的bit位
把addr右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
循环8次,单片机向DS1302发出8个位(1字节)结束循环
写入第二个字节的时候同理
时序结束
#include <reg51.h>
sbit SCLK=P0^0;
sbit CE =P0^1;
sbit IO =P0^2;
//向DS1302内部寄存器addr(地址)写入一个value(值)
void ds1302_write_reg(unsigned char addr,unsigned char value)
{
unsigned char i=0;
unsigned char dat=0;
//第一部分:时序起始
SCLK= 0;
CE = 0; //RST为低电平读写操作无效
CE = 1; //RST为高电平开始读写
//SCLK为低时,RST由低变高,意味着一个大周期的开始
//第二部分:写入第1字节,addr,先给前八位地址
for(i=0;i<8;i++)
{
dat = addr & 0x01; //SPI从最低bit位开始传输
IO = dat; //把要发送的数据丢到IO引脚上准备好
SCLK = 1; //制造一个上升沿,让DS1302把IO上的数值读走
//读走之后一个小周期就完啦
SCLK = 0; //把SCLK拉低为下一个小周期做准备
addr>>=1; //把addr右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
}
//第三部分:写入第2字节,value,再给后八位数据
for(i=0;i<8;i++)
{
dat = value & 0x01; //SPI从最低bit位开始传输
IO = dat; //把要发送的数据丢到IO引脚上准备好
SCLK = 1; //制造一个上升沿,让DS1302把IO上的数值读走
//读走之后一个小周期就完啦
SCLK = 0; //把SCLK拉低为下一个小周期做准备
value= value >> 1; //把value右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
}
//第四部分:时序结束
SCLK= 0;
CE = 0; //结束一个大周期
}
二、因为单片机的时钟频率比DS1302快很多,所以要在在每个时钟信号后加delay这种延时代码,拉慢单片机的时钟频率,让单片机和DS1302尽量同频率,不加延时的话DS1302很难捕捉到单片机的时钟信号,所以,以下代码添加了一个延时函数
#include <reg51.h>
sbit SCLK=P0^0;
sbit CE =P0^1;
sbit IO =P0^2;
//函数声明
void delay(void);//延时三个时钟周期
//向DS1302内部寄存器addr(地址)写入一个value(值)
void ds1302_write_reg(unsigned char addr,unsigned char value)
{
unsigned char i=0;
unsigned char dat=0;
//第一部分:时序起始
SCLK= 0;
delay();
CE = 0; //RST为低电平读写操作无效
delay();
CE = 1; //RST为高电平开始读写
delay(); //SCLK为低时,RST由低变高,意味着一个大周期的开始
//第二部分:写入第1字节,addr,先给前八位地址
for(i=0;i<8;i++)
{
dat = addr & 0x01; //SPI从最低bit位开始传输
IO = dat; //把要发送的数据丢到IO引脚上准备好
SCLK = 1; //制造一个上升沿,让DS1302把IO上的数值读走
//读走之后一个小周期就完啦
delay();
SCLK = 0; //把SCLK拉低为下一个小周期做准备
delay();
addr>>=1; //把addr右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
}
//第三部分:写入第2字节,value&#