当前位置: 首页 > news >正文

C51:用DS1302时钟读取和设置时间

因为在ds1302.c文件中包含了写ds1302(51向ds1302写数据)和读ds1302(51从ds1302读数据)的两个函数,我们根据文件中提供的函数来写读取时间和设置时间的函数即可

ds1302.c文件源码如下,需要的同学可以参考一下:

#include <reg52.h>
#include <intrins.h>
#define DecToBCD(dec) (dec/10*16)+(dec%10)
#define BCDToDec(bcd) (bcd/16*10)+(bcd%16)
sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   										void Write_Ds1302(unsigned  char temp) 
{unsigned char i;for (i=0;i<8;i++)     	{ SCK=0;SDA=temp&0x01;temp>>=1; SCK=1;}
}   void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{RST=0;	_nop_();SCK=0;	_nop_();RST=1; 	_nop_();  Write_Ds1302(address);	Write_Ds1302(dat);		RST=0; 
}unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0;	_nop_();SCK=0;	_nop_();RST=1;	_nop_();Write_Ds1302(address);for (i=0;i<8;i++) 	{		SCK=0;temp>>=1;	if(SDA)temp|=0x80;	SCK=1;} RST=0;	_nop_();SCK=0;	_nop_();SCK=1;	_nop_();SDA=0;	_nop_();SDA=1;	_nop_();return (temp);			
}

程序解释:

1.ds1302的写保护操作:当WP位(寄存器的第七位)为1时,写保护功能开启,禁止对任何寄存器进行写操作,防止误改寄存器中的时间,日期或者其他数据。如果要对时钟进行写操作,需要将WP位设置为0,关闭写保护功能

2.BCD码:用4位二进制数来表示1位十进制数中的0~9的这10个数码

十进制转换为BCD码宏定义: 

#define DecToBCD(dec)   (dec/10 *16) +(dec%10)

BCD码转换为十进制宏定义: 

#define BCDToDec(bcd)   (bcd/16* 10)+(bcd % 16)

用处:1.我们在读取时间的时候,因为Read_DS1302_Byte()函数返回的是BCD码,所以在读取时需要转换为十进制

2.同样的,在设置时间时,我们也需要将十进制转换为BCD码


读取时间的流程:

直接调用读取ds1302的函数

ds1302读取函数如下:

可以看到,读到时间数据后,需要用BCDToDec宏定义转换为十进制

unsigned char hour,minute,second;
void DS1302_process()
{second=BCDToDec(Read_Ds1302_Byte(0x81));minute=BCDToDec(Read_Ds1302_Byte(0x83));hour=BCDToDec(Read_Ds1302_Byte(0x85));
}

设置时间的流程:

1.关闭写保护

2.写入时钟数据

3.打开写保护

时钟设置函数如下:

注意:函数需要使用的话,初始化一次就可以了,不需要一直执行。同样将时间数据传给Write_Ds1302_Byte()函数需要使用宏定义进行转换,否则程序不能正常运行

void Clock_Set(unsigned char hour,	unsigned char minute,unsigned char second)
{Write_Ds1302_Byte(0x8e,0x00);  //关闭写保护Write_Ds1302_Byte(0x80,DecToBCD(second));Write_Ds1302_Byte(0x82,DecToBCD(minute));Write_Ds1302_Byte(0x84,DecToBCD(hour));Write_Ds1302_Byte(0x8e,0x80);  //打开写保护
}

程序示例:(如将初始时间设置为23时59分55秒)

void Clock_Set(unsigned char hour,	unsigned char minute,unsigned char second)
{Write_Ds1302_Byte(0x8e,0x00);  //关闭写保护Write_Ds1302_Byte(0x80,DecToBCD(second));Write_Ds1302_Byte(0x82,DecToBCD(minute));Write_Ds1302_Byte(0x84,DecToBCD(hour));Write_Ds1302_Byte(0x8e,0x80);  //打开写保护
}
int main()
{Clock_Set(23,59,55);
}

直接将函数放到main()函数即可,非常简单。

http://www.dtcms.com/a/298813.html

相关文章:

  • 静电释放检测误报率↓79%:陌讯多模态融合算法实战解析
  • 算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地
  • 2025年ASOC SCI2区TOP,无人机集群路径规划与任务分配的组合优化在多障碍战场环境中的应用,深度解析+性能实测
  • 汽车功能安全 -- TC3xx Error Pin监控机制
  • Post-Training on PAI (5): PAI-EasyDistill, PAI 自研大模型蒸馏框架
  • JAVA知识点(二):数据库
  • rk3588跑通速腾雷达RS16的ros点云读取
  • 装修进度管理系统功能对比:主流工具9选
  • Apipost:离线可用+AI全栈覆盖,国产API开发协作工具新标杆
  • HTTP响应状态码详解
  • 通过Deepseek找工作
  • java-方法的综合练习
  • 屏幕适配--像素篇
  • 100条常用SQL语句大全
  • Linux系统编程——进程
  • 两个MCU互联采集数据
  • kubesphere安装使用
  • 手写数组洗牌算法
  • Vue2 element cascader级联选择器懒加载编辑时回显数据
  • 【VLAs篇】06:从动作词元化视角谈VLA模型的综述
  • 异常(全)
  • which soffice soffice not found
  • Wordpress主题配置
  • 2025年7月24日·AI今日头条
  • KNN算法:从原理到实战全解析
  • Execel文档批量替换标签实现方案
  • day33:零基础学嵌入式之网络——TCP并发服务器
  • 基于javaweb的医院挂号系统
  • 动态规划解析:以最小花费爬楼梯为例
  • 纸板留声机:用ESP32和NFC打造会唱歌的复古装置