(基于江协科技)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;
}
相关推荐
云卓SKYDROID5 小时前
维护与保养小贴士:如何让你的云卓G16遥控器持久如新?
科技·无人机·遥控器·维护·高科技
CODECOLLECT6 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen6 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
是枚小菜鸡儿吖9 小时前
CANN 算子开发黑科技:AI 自动生成高性能 Kernel 代码
人工智能·科技
全栈游侠9 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_9 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
2501_933907219 小时前
深圳本凡科技专业企业APP开发,助力手机应用创新优化
科技·微信小程序·小程序
深圳市九鼎创展科技11 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计12 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报13 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机