写入时间:DS1302时钟---时序---发送接收

这篇博客介绍了如何修改DS1302时钟的代码,实现从串口以二进制方式输出时间,并将读取时钟信息的函数改为了写入时钟信息。在简化写入函数的过程中遇到秒针不更新的问题,同时提供了读取时序和信息的代码。尽管主函数中已能写入并显示初始时间,但读取时存在小瑕疵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于读取时间代码更改的

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成长中的单片小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值