一、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.是否声明