📄 part.c
字号:
#include<reg52.h>
/********************************************************************
时间:2009年3月22日22:36:10
********************************************************************/
#ifndef _DS1302_H_
#define _DS1302_H_
sbit DS1302_CLK = P3^0; //实时时钟时钟线引脚
sbit DS1302_IO = P3^1; //实时时钟数据线引脚
sbit DS1302_RST = P3^2; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
#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 DS1302InputByte(unsigned char d)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}
//实时时钟读取一字节(内部函数)
unsigned char DS1302OutputByte(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}
//写DS1302,ucAddr: DS1302地址, ucData: 要写的数据
void Write1302(unsigned char ucAddr, unsigned char ucDa)
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}
//读取DS1302某地址的数据
unsigned char Read1302(unsigned char ucAddr)
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}
//读取时间函数
void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = BCD2DEC(ReadValue&0x7F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = BCD2DEC(ReadValue&0x7F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = BCD2DEC(ReadValue);
ReadValue = Read1302(DS1302_YEAR);
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)
{
Write1302(DS1302_WRITE,0x00); //关闭写保护
Write1302(DS1302_SECOND,Time_Stop);//停止计时
Write1302(DS1302_HOUR,Time_24_Hour);//24时制
Write1302(DS1302_POWER,0xA6); //单二极管,4K电阻充电
// Write1302(DS1302_SECOND,DEC2BCD(Time_Start));
Write1302(DS1302_WRITE,0x80); //打开写保护
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -