基于读取时间代码更改的
1、更改了:通过串口将7个时间以二进制的方式输出在串口助手上 里的部分函数
2、更改了:读取时钟信息函数改为 写入时钟信息
3、主函数调用读取函数改为 调用写入函数
#include <reg51.h> //写入时间代码
#include <intrins.h>
sbit SCLK=P0^0;
sbit CE =P0^1;
sbit IO =P0^2;
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //读寄存器(READ):地址
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//写寄存器(WRITE):地址
//因为51单片机的设计本身的RAM比较少而flash稍微多一些,像这里定义的数组内部的内容是不会变的(常量数组),我们就可以使用
//code关键字,让编译器帮我们把数组放在flash中而不是RAM中,这样可以节省一些RAM。
unsigned char timi[7];//用来存储读取的时间,格式是:秒分时日月周年
//函数声明
void delay2(void); //延时900ms,晶振为11.0592MHZ
void delay1(void); //延时1秒,晶振为11.0592MHZ
void delay(void); //延时三个时钟周期
void uart_init(void); //初始化串口函数
void uart_seng_byte(unsigned char c);//通过串口发送1个字节出去
void debug_print_time(void);//通过串口将7个时间以二进制的方式输出在串口助手上
void ds1302_write_time(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,读入数据
for(i=0;i<8;i++)
{
dat = value & 0x01; //SPI从最低bit位开始传输
IO = dat; //把要发送的数据丢到IO引脚上准备好
SCLK = 1; //制造一个上升沿,让DS1302把IO上的数值读走
//读走之后一个小周期就完啦
delay();
SCLK = 0; //把SCLK拉低为下一个小周期做准备
delay();
value= value >> 1; //把value右移一位,丢掉bit0的数据,把bit1的数据移动到bit0,为下次循环取最低位的值做准备
}
//第四部分:时序结束
SCLK= 0;
delay();
CE = 0; //结束一个大周期
delay();
}
//从DS1302内部寄存器addr(地址)读出一个值,作为返回值
unsigned char ds1302_read_reg(unsigned char addr)
{
unsigned char dat1= 0; //IO类型不是整型就会出现这个错误:1S2.C(86): error C193: '<<': bad operand type
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,为下次循环取最低位的值做准备
}
//第三部分:读取一字节DS1302返回给我们的值 ,读取DS1302的时间数据
for(i=0;i<8;i++)
{
dat1=IO; //用于暂时存储IO的变量;为什么不直接定义IO?因为sbit IO =P0^2;已经被定义了。而且单片机的C语言sbit IO =P0^2;不允许IO直接移位运算,而标准的C语言允许移位运算直接用IO位移运算
dat|=(dat1<<i); //单片机读取IO的值 //读出的值是低位在前的(左边的)//放入dat里存储
//在向前面DS1302写入addr的最后一个bit后,DS1302就会将读取到的寄存器值
//的第一个bit放入到IO引脚上,所以我们应该先读取IO在制造下降沿然后继续读取下一个bit
SCLK = 1; //因为上面的SCLK为低电平,所以要先拉高
delay();
SCLK = 0; //在将SCLK拉低,制造一个下降沿
delay(); //因为DS1302为下降沿的时候写入,所以单片机要读取DS1302也要在下降沿读取
}
//第四部分:时序结束
SCLK= 0;
delay();
CE = 0; //结束一个大周期
delay();