📄 ds1302.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 + -