(基于江协科技)51单片机入门:8.DS1302

DS1302

DS1302是具有眷细电流充电能力的低功耗实时时钟芯片

DS1302可自带一块电池,以保证掉电计时

RTC(real time clock):实时时钟,是一种集成电路,通常称为时钟芯片

CE 为芯片使能:作用为控制从DS1302中获取数据,给以0获取不了,给1有可能获取

IO:数据输入和输出

SCLK:串行时钟

命令字

第 7 位固定为1

第 6 位选择是 RAM 还是 CK

第 0 为选择是 读 还是 写

字母上加一横表示为 0有效 或低电频有效

写入

RTC

读出

根据写入和读出去写DS1302函数

源文件

cpp 复制代码
#include <REGX52.H>

sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;

void DS1302_Init()
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
}

void DS1302_Wr(unsigned char c,d)
{
	unsigned char i = 0; 
	DS1302_CE = 1;
	// 命令字
	for(i = 0 ; i < 8; i++){
	DS1302_IO = c&(0x01<<i);
	DS1302_SCLK = 1;
	DS1302_SCLK = 0;
	}
	// 写入数据
	for(i = 0 ; i < 8; i++){
	DS1302_IO = d&(0x01<<i);
	DS1302_SCLK = 1;
	DS1302_SCLK = 0;
	}
	DS1302_CE = 0;
	
}

unsigned char DS1302_Rd(unsigned char c)
{
	unsigned char ret = 0;
	unsigned char i = 0; 
	DS1302_CE = 1;
	// 命令字
	for(i = 0 ; i < 8; i++){
	DS1302_IO = c&(0x01<<i);
	DS1302_SCLK = 0;
	DS1302_SCLK = 1;
	}
    // 读取数据 这里的写法和上面不同
	for(i = 0; i < 8; i++){
	DS1302_SCLK = 1;   
	DS1302_SCLK = 0;	            // 命令字结束后的第一个下降沿要先进行,将io赋值
	if(DS1302_IO){ret|=(0x01<<i);}  // 表示读出值为1 就在相对应的位赋1
	}								// 为0,ret初始化就是0,所以相对应的位也为0
 	return ret;
}

头文件

cpp 复制代码
#ifndef __DS1302_H_
#define __DS1302_H_

void DS1302_Init();

void DS1302_Wr(unsigned char c,d);

unsigned char DS1302_Rd(unsigned char c);
#endif

注意在主函数里利用函数时,DS1302初始化后

要跟哥DS1302_Wr(0x8e,0x00)关闭写入保护

BCD码

用4位二进制来表示1位十进制

BCD码转十进制:BCD/16*10 + BCD%16;(2位BCD)

十进制转BCD码:BCD = DEC/10*16 + DEC%10;(2位BCD)

DS1302内部已经限制了相对应内容的最大值

例如:秒 60 分钟 60 小时 24(会自动从新计数)、

后加2函数的思路是:利用数组将DS1302内部初始化(DS1302_SetTime),利用数组将DS1302内部数据读出存入数组中(DS1302_ReadTime),在主函数中调用一次DS1302_SerTime,在循环中调用DS1302_ReadTime(实现数据更新)

DS1302函数:

源文件

cpp 复制代码
#include <REGX52.H>

sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;

unsigned char arr[] = {19,11,16,12,59,55,6};

// 写入地址
#define DS1302_S 		  0x80
#define DS1302_M      0x82
#define DS1302_H      0x84
#define DS1302_Date   0x86
#define DS1302_Month  0x88
#define DS1302_Day    0x8a
#define DS1302_Year   0x8c
#define DS1302_WP     0x8e

void DS1302_Init()
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
}

void DS1302_Wr(unsigned char c,d)
{
	unsigned char i = 0; 
	DS1302_CE = 1;
	// 命令字
	for(i = 0 ; i < 8; i++){
	DS1302_IO = c&(0x01<<i);
	DS1302_SCLK = 1;
	DS1302_SCLK = 0;
	}
	// 数据
	for(i = 0 ; i < 8; i++){
	DS1302_IO = d&(0x01<<i);
	DS1302_SCLK = 1;
	DS1302_SCLK = 0;
	}
	DS1302_CE = 0;
}

unsigned char DS1302_Rd(unsigned char c)
{
	unsigned char ret = 0;
	unsigned char i = 0; 
	c |=0x01;
	DS1302_CE = 1;
	// 命令字
	for(i = 0 ; i < 8; i++){
	DS1302_IO = c&(0x01<<i);
	DS1302_SCLK = 0;
	DS1302_SCLK = 1;
	}
	for(i = 0; i < 8; i++){
	DS1302_SCLK = 1;   
	DS1302_SCLK = 0;	            
	if(DS1302_IO){ret|=(0x01<<i);}  
	}								
 	DS1302_CE = 0;
	return ret;
}

void DS1302_SetTime(void)
{
 	DS1302_Wr(DS1302_WP,0X00);                      // 关闭写保护
	DS1302_Wr(DS1302_Year,arr[0]/10*16+arr[0]%10);  // DS1302数据是以BCD码存入
                                                    // 所以要10进制转化
	DS1302_Wr(DS1302_Month,arr[1]/10*16+arr[1]%10);
	DS1302_Wr(DS1302_Date,arr[2]/10*16+arr[2]%10);
	DS1302_Wr(DS1302_H,arr[3]/10*16+arr[3]%10);
	DS1302_Wr(DS1302_M,arr[4]/10*16+arr[4]%10);
	DS1302_Wr(DS1302_S,arr[5]/10*16+arr[5]%10);
	DS1302_Wr(DS1302_Day,arr[6]/10*16+arr[6]%10);
	DS1302_Wr(DS1302_WP,0X80);                      // 打开写保护
}
void DS1302_ReadTime(void)
{
	unsigned char tmp = 0;
	tmp = DS1302_Rd(DS1302_Year);
	arr[0]=tmp/16*10 + tmp%16;
	tmp = DS1302_Rd(DS1302_Month);
	arr[1]=tmp/16*10 + tmp%16;
	tmp = DS1302_Rd(DS1302_Date);
	arr[2]=tmp/16*10 + tmp%16;
	tmp = DS1302_Rd(DS1302_H);
	arr[3]=tmp/16*10 + tmp%16;
	tmp = DS1302_Rd(DS1302_M);
	arr[4]=tmp/16*10 + tmp%16;
	tmp = DS1302_Rd(DS1302_S);
	arr[5]=tmp/16*10 + tmp%16;
	tmp = DS1302_Rd(DS1302_Day);
	arr[6]=tmp/16*10 + tmp%16;
	
}

头文件

cpp 复制代码
#ifndef __DS1302_H_
#define __DS1302_H_

extern unsigned char arr[];

void DS1302_Init();

void DS1302_Wr(unsigned char c,d);

unsigned char DS1302_Rd(unsigned char c);

void DS1302_SetTime(void);

void DS1302_ReadTime(void);
#endif

1.时钟主函数文件

cpp 复制代码
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"

int main()
{
	DS1302_Init();
	LCD_Init();
	DS1302_SetTime();
	while(1)
	{

		DS1302_ReadTime();
		LCD_ShowString(1,1,"  _  _");
		LCD_ShowNum(1,1,arr[0],2);
		LCD_ShowNum(1,4,arr[1],2);
		LCD_ShowNum(1,7,arr[2],2);
		LCD_ShowString(2,1,"  :  :");
		LCD_ShowNum(2,1,arr[3],2);
		LCD_ShowNum(2,4,arr[4],2);
		LCD_ShowNum(2,7,arr[5],2);
	}
	return 0;
}
相关推荐
国科安芯21 分钟前
长期在轨的计算底座:商业空间站与在轨服务飞行器健康管理中的抗辐射MCU—— 面向可维护空间平台的分层容错与安全通信综述
人工智能·单片机·嵌入式硬件·安全·低轨卫星·抗辐射
不昀3 小时前
RMII切到10Mbps,50MHz参考时钟也要降到5MHz吗?
单片机·嵌入式硬件·硬件设计·以太网接口
财税数字化3 小时前
资源回收五流合一合规管理怎么选?开灵科技、用友BIP与通联支付按现场留证、票款关联和库存去向对比
科技·财税数字化系统·软件选型·数电发票·反向开票·发票系统
路上有只喵3 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇6
单片机·嵌入式硬件
国科安芯4 小时前
核电站蒸汽发生器传热管在役无损检测模拟前端的低噪声供电研究
嵌入式硬件·ldo·低压差线性稳压器·无损检测·核电站·蒸汽发生器·传热管
集芯微电科技有限公司5 小时前
40V/24A高频率增强型GaN HEMT功率开关管/高频DC转换/电动工具/GaN充电器 方案首选
人工智能·科技·单片机·嵌入式硬件·深度学习·神经网络·生成对抗网络
十八岁牛爷爷5 小时前
STM32H7 长时间运行后 HTTP 断连:从“串口还活着”到 TX 描述符错账
stm32·单片机·嵌入式硬件
Lxx_Zw5 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·stm32·单片机·嵌入式硬件
财迅通Ai5 小时前
MLCC业务爆发式增长,带动昀冢科技三季度扭亏为盈
大数据·人工智能·科技·昀冢科技
义嘉泰5 小时前
心率能测出来不难,难的是低功耗、稳定、还能量产
人工智能·科技