⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.h

📁 DS1302用于430的头文件
💻 H
字号:
/********************************************************************
				THE REAL TIMER DS1302 DRIVER LIB

  File Name:   DS1302.h
  Created:	Jiang Jian Jun     Date:	2003/7/21
  Modified:	Zhang Yu Xiang     Date:	2008/10/10
  Revision: 	1.1
  
********************************************************************/
#ifndef _DS1302_H_
#define _DS1302_H_
/*
sbit  DS1302_CLK = P3^0;	//实时时钟时钟线引脚
sbit  DS1302_IO  = P3^1;	//实时时钟数据线引脚
sbit  DS1302_RST = P3^2;	//实时时钟复位线引脚
*/
#define DS1302_DIR  P6DIR
#define DS1302_IN    P6IN
#define DS1302_OUT  P6OUT

#define DS1302_RST  BIT2
#define DS1302_SCLK  BIT0
#define DS1302_SDI  BIT1  //定义端口

#define DS1302_RST_LO  DS1302_OUT &= ~DS1302_RST
#define DS1302_RST_HI  DS1302_OUT |= DS1302_RST
#define DS1302_SCLK_LO  DS1302_OUT &= ~DS1302_SCLK
#define DS1302_SCLK_HI  DS1302_OUT |= DS1302_SCLK
#define DS1302_SDI_LO  DS1302_OUT &= ~DS1302_SDI
#define DS1302_SDI_HI  DS1302_OUT |= DS1302_SDI

#define Time_24_Hour	0x00	//24时制控制	
#define Time_Start	0x00	//开始走时
#define Time_Stop	0x80	//停止走时

#define DS1302_SECOND	0x80	//DS1302各寄存器操作命令定义(写的时候可以直接用,但是读的时候要加一)
#define DS1302_MINUTE	0x82
#define DS1302_HOUR	0x84
#define DS1302_WEEK	0x8A
#define DS1302_DAY	0x86
#define DS1302_MONTH	0x88
#define DS1302_YEAR	0x8C
#define DS1302_WRITE	0x8E
#define DS1302_POWER	0x90

#define BCD2DEC(X)	(((X&0x70)>>4)*10 + (X&0x0F))	//用于将BCD码转成十进制的宏
#define DEC2BCD(X)	((X/10)<<4 | (X%10))			//用于将十进制转成BCD码的宏

typedef struct __SYSTEMTIME__		//定义的时间类型结构体,全部数为十进制
{
	unsigned char Second;
	unsigned char Minute;
	unsigned char Hour;
	unsigned char Week;
	unsigned char Day;
	unsigned char Month;
	unsigned char Year;
}SYSTEMTIME;

//延时函数
void DS1302_Delay(unsigned int dtime) {
 unsigned int temp;
 for(temp=0;temp<dtime;temp++);
}
//向DS1302写入一个字节
void DS1302InputByte(unsigned char w_dat) {
 unsigned char temp;
 
 DS1302_RST_HI;
 DS1302_DIR |= DS1302_SDI;
 
 for(temp=8;temp>0;temp--) {
  DS1302_SDI_LO;
  if(w_dat&BIT0) DS1302_SDI_HI;
  DS1302_SCLK_LO;
  DS1302_Delay(10);
  DS1302_SCLK_HI;
  DS1302_Delay(10);
  w_dat >>=1;
 } 
}

//从DS1302中读取一个字节
unsigned char DS1302OutputByte(void) { 
 unsigned char temp,rdata;
 rdata = 0x00;
 
 DS1302_RST_HI;
 DS1302_DIR &= ~DS1302_SDI;
 
 for(temp=0;temp<8;temp++){rdata >>= 1;//将移位放到前面,否则读不到最高一位
  DS1302_SCLK_HI;
  DS1302_Delay(10);
  DS1302_SCLK_LO;
  DS1302_Delay(10);
  if((DS1302_IN&DS1302_SDI)==DS1302_SDI)
   rdata |= BIT7;
  //rdata >>= 1;
 }
 
 return(rdata); 
}

//向DS1302中写入地址后写入数据
void Write1302(unsigned char addr,unsigned char w_dat) {
 DS1302_RST_LO;
 DS1302_SCLK_LO;
 DS1302_RST_HI;
 
 DS1302InputByte(addr);  //写入地址
 DS1302InputByte(w_dat);  //写入数据
 
 DS1302_SCLK_HI;
 DS1302_RST_LO;
}

//向DS1302写入地址后,从DS1302中读取数据
unsigned char Read1302(unsigned char addr) {
 unsigned char r_dat;
 DS1302_RST_LO;
 DS1302_SCLK_LO;
 DS1302_RST_HI;
 
 DS1302InputByte(addr);  //写入地址
 r_dat = DS1302OutputByte();  //读出数据
 
 DS1302_SCLK_LO;
 DS1302_RST_LO;
 
 return(r_dat);
}

//读取时间函数
void DS1302_GetTime(SYSTEMTIME *Time)
{
  unsigned char ReadValue;
  ReadValue = Read1302(DS1302_SECOND+1);
  Time->Second = BCD2DEC(ReadValue&0x7F);

  ReadValue = Read1302(DS1302_MINUTE+1);
  Time->Minute = BCD2DEC(ReadValue);

  ReadValue = Read1302(DS1302_HOUR+1);
  Time->Hour = BCD2DEC(ReadValue&0x7F);

  ReadValue = Read1302(DS1302_DAY+1);
  Time->Day = BCD2DEC(ReadValue);	

  ReadValue = Read1302(DS1302_WEEK+1);
  Time->Week = BCD2DEC(ReadValue);

  ReadValue = Read1302(DS1302_MONTH+1);
  Time->Month = BCD2DEC(ReadValue);

  ReadValue = Read1302(DS1302_YEAR+1);
  Time->Year = BCD2DEC(ReadValue);	
}

//设置时间函数
void DS1302_SetTime(SYSTEMTIME *Time)
{
  Write1302(DS1302_WRITE,0x00);		//关闭写保护
  
  Write1302(DS1302_YEAR,DEC2BCD(Time->Year));
  Write1302(DS1302_MONTH,DEC2BCD(Time->Month));
  Write1302(DS1302_WEEK,DEC2BCD(Time->Week));
  Write1302(DS1302_DAY,DEC2BCD(Time->Day));
  Write1302(DS1302_HOUR,DEC2BCD(Time->Hour)|Time_24_Hour);
  Write1302(DS1302_MINUTE,DEC2BCD(Time->Minute));
  Write1302(DS1302_SECOND,DEC2BCD(Time->Second)|Time_Start);
  
  Write1302(DS1302_WRITE,0x80);		//打开写保护	
}

//初始化DS1302
void DS1302_Initial(void)
{
  P6DIR |= BIT0+BIT1+BIT2;
  Write1302(DS1302_WRITE,0x00);		//关闭写保护
  Write1302(DS1302_SECOND,Time_Stop);//停止计时
  Write1302(DS1302_HOUR,Time_24_Hour);//24时制
  Write1302(DS1302_POWER,0xA6);		//单二极管,4K电阻充电
  Write1302(DS1302_WRITE,0x80);		//打开写保护
}

//DS1302复位
void DS1302_Reset(void) {
 DS1302_DIR |= (DS1302_RST + DS1302_SCLK);
 DS1302_SCLK_LO;
 DS1302_RST_LO;
 DS1302_Delay(10);
 DS1302_SCLK_HI;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -