蓝桥杯之单片机学习(十七)——DS1302的基本应用

本文详细介绍了DS1302实时时钟的工作原理,包括其日历时钟寄存器、控制字格式和SPI接口时序。通过代码展示了如何设置时间参数、读取实时时间和显示在七段数码管上。提供了DS1302的初始化配置、读写操作及中断服务例程。
摘要由CSDN通过智能技术生成

一、DS1302概述

  • DALLAS公司推出的高性能、低功耗的实时时钟。
  • 采用SPI三线接口MCU进行同步通信,并可采用突发方式一次传送多个字节的时钟参数和RAM数据。
  • 附加31字节的静态RAM
  • 简单来说,DS1302可以理解为-一个电子手表,里面带有一个31字节的RAM内存。
  • DS1302中有两块存储器:日历时钟寄存器静态RAM存储器。前者用于记录实时时间,后者用于记录其他数据。
  • 关注重点:
  • 日历时钟寄存器
    在这里插入图片描述

二、日历时钟寄存器

在这里插入图片描述
1、秒寄存器(80H和81H)的位7 (CH)为时钟暂停标志。
CH为0时,时钟振荡停止;
CH为1时,时钟开始运行。
2、控制寄存器(8EH 和8FH)的位7 (WP)为写保护位。
WP为0时,可对任何的时钟或RAM寄存器进行写操作;
WP为1时,禁止对任一寄存器进行写操作。

三、控制字格式与数据定义

在这里插入图片描述

  • BIT7: 必须为1,若为0,则不能把数据写入DS1302中。
  • BIT6: 0表示存取日历时钟数据,1表示存取RAM数据。
  • BIT5~BIT1:表示操作单元的地址。
  • BIT0: 0表示写操作,1表示读操作。
    在这里插入图片描述

四、SPI接口时序

在控制字指令输入后的下一个SCLK时钟信号的上升沿,数据被写入DS1302,在控制字指令输入后的下一个SCLK时钟信号的下降沿,数据从DS1302读出
在这里插入图片描述

五、DS1302的基本操作

基本操作:其一是设定时间参数,其二是读取实时时间
在这里插入图片描述

六、代码展示

main.c

#include "reg52.h"
#include "ds1302.h"

typedef unsigned int uint;
typedef unsigned char uchar;

uchar Write_DS1302_adrr[7] = {0X80, 0X82, 0X84, 0X86, 0X88, 0X8A, 0X8C};
uchar Read_DS1302_adrr[7] = {0X81, 0X83, 0X85, 0X87, 0X89, 0X8B, 0X8D};
uchar Timer[7] = {0X24, 0X59, 0X23, 0X18, 0X04, 0X06, 0X20};

uchar code SMG_duanma[18] = 
	{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
	 0x88,0x80,0xc6,0xc0,0x86,0x8e,
	 0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.”

void DS1302_Config()
{
	char i;
	
	Write_Ds1302(0X81, 0X00);  //打开保护
	for(i = 0; i < 7; i++)
	{
		Write_Ds1302(Write_DS1302_adrr[i], Timer[i]);
	}
	
}

void Read_DS1302_Timer()
{
	uchar i;
	for(i = 0; i < 7; i++)
	{
		Timer[i] = Read_Ds1302(Read_DS1302_adrr[i]);
	}
}

//配置HC138
void SelectHC138(uchar channel)
{
	switch(channel)
	{
		case 4:    //LED
			P2 = (P2 & 0X1F) | 0X80;
		break;
		case 5:    //蜂鸣器和继电器
			P2 = (P2 & 0X1F) | 0Xa0;
		break;
		case 6:    //位码
			P2 = (P2 & 0X1F) | 0Xc0;
		break;
		case 7:    //段码
			P2 = (P2 & 0X1F) | 0Xe0;
		break;
		case 0:    //锁住所有寄存器
			P2 = (P2 & 0X1F) | 0X00;
		break;
	}
}

void Initsys()
{
	SelectHC138(5);
	P0 = 0X00;//关闭蜂鸣器和继电器
	SelectHC138(4);
	P0 = 0XFF;//关闭LED
}

//在pos位码上,显示value段码
void DisplaySMG_Bit(uchar pos, uchar value)
{
	SelectHC138(6);
	P0 = 0X01 << pos;
	SelectHC138(7);
	P0 = value;
}

void Delay_SMG(uint t)
{
	while(t--);
}


void Display_DS1302()
{
	DisplaySMG_Bit(0, SMG_duanma[Timer[2]/16]);
	Delay_SMG(100);
	DisplaySMG_Bit(1, SMG_duanma[Timer[2]%16]);
	Delay_SMG(100);
	DisplaySMG_Bit(2, SMG_duanma[16]);
	Delay_SMG(100);
	
	DisplaySMG_Bit(3, SMG_duanma[Timer[1]/16]);
	Delay_SMG(100);
	DisplaySMG_Bit(4, SMG_duanma[Timer[1]%16]);
	Delay_SMG(100);
	DisplaySMG_Bit(5, SMG_duanma[16]);
	Delay_SMG(100);
	
	DisplaySMG_Bit(6, SMG_duanma[Timer[0]/16]);
	Delay_SMG(100);
	DisplaySMG_Bit(7, SMG_duanma[Timer[0]%16]);
	Delay_SMG(100);
}

void main()
{
	Initsys();
	DS1302_Config();
	while(1)
	{
		Read_DS1302_Timer();
		Display_DS1302();
	}
}

ds1302.h

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

#pragma SAVE

#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int           abs       (int);
extern void          _illop_   (void);
#endif
#if !defined (__CX2__)
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
#endif

#pragma RESTORE

#endif


ds1302.c

/*
  程序说明: DS1302驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include <reg52.h>
#include <intrins.h>

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位												

void Write_Ds1302_Byte(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302( unsigned char address,unsigned char dat )     
{
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;	
   	_nop_();  
 	Write_Ds1302_Byte(address);	
 	Write_Ds1302_Byte(dat);		
 	RST=0; 
}

unsigned char Read_Ds1302 ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;
	_nop_();
 	Write_Ds1302_Byte(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;
	_nop_();
 	RST=0;
	SCK=0;
	_nop_();
	SCK=1;
	_nop_();
	SDA=0;
	_nop_();
	SDA=1;
	_nop_();
	return (temp);			
}

七、检查ds1302头文件

  1. 检查引脚是否正确
  2. 是否声明
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

周末不下雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值