📄 ds1302.h
字号:
#include <string.h>
#include <intrins.h>
//*********** DS1302 时间显示定义部分
sbit T_CLK=P3^5;
sbit T_IO =P3^6;
sbit T_RST=P3^7; //以上是实验板的接口定义
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//void Set(uchar,uchar); //根据选择调整相应项目
//void RTInputByte(uchar); /* 输入 1Byte */
//uchar RTOutputByte(void); /* 输出 1Byte */
//void W1302(uchar, uchar); // 向DS1302写入一个字节
//uchar R1302(uchar); // 从DS1302读出一个字节
//void Set1302(unsigned char * ); // 设置时间
//bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:05年12月31日星期6 0点0分0秒
unsigned char inittime[7]={0x00,0x00,0x00,0x31,0x12,0x05,0x06};
// 秒 分钟 小时 日 月 年 星期
unsigned char read_rtc_code[7];
unsigned char read_rtc_address[7]={0x8d,0x89,0x87,0x8b,0x85,0x83,0x81};
unsigned char sec_l , sec_h , min_l , min_h , hour_l , hour_h , day_l , day_h , week , month_l , month_h , year_l , year_h ;
//********DS1302读写程序***************
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
***********************************************************************/
void RTInputByte(unsigned char d)
{
unsigned char i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
unsigned char RTOutputByte(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
unsigned char ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Set1302(unsigned char *pClock)
{
unsigned char i;
unsigned char ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
//根据选择调整相应项目并写入DS1302
void Set(unsigned char sel,unsigned char sel_1)
{
signed char address,item;
signed char max,mini;
if(sel==7) {address=0x80; max=59; mini=0;} //秒
if(sel==6) {address=0x82; max=59;mini=0;} //分钟
if(sel==5) {address=0x84; max=23;mini=0;} //小时
if(sel==3) {address=0x86; max=31;mini=1;} //日
if(sel==2) {address=0x88; max=12;mini=1;} //月
if(sel==1) {address=0x8c; max=99;mini=0;} //年
if(sel==4) {address=0x8a; max=7; mini=1;} //星期
item=R1302(address+1)/16*10+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=mini;
if(item<mini) item=max;
W1302(0x8e,0x00);//允许写操作
W1302(address,item/10*16+item%10);
W1302(0x8e,0x80);//写保护,禁止写操作
}
void Read_RTC(void) //读出DS1302里的相关信息,存放在read_rtd_code[]数组中
{
unsigned char i,*p;
p=read_rtc_address;
for(i=0;i<7;i++)
{
read_rtc_code[i]=R1302(*p);
p++;
}
}
//时间显示程序
void RTC_display(void)
{
Read_RTC();
year_h=(read_rtc_code[0]/16); //年十位
year_l=(read_rtc_code[0]%16); //年个位
month_h=(read_rtc_code[1]/16); //月十位
month_l=(read_rtc_code[1]%16); //月个位
day_h=(read_rtc_code[2]/16); //日十位
day_l=(read_rtc_code[2]%16); //日个位
week=(read_rtc_code[3]%16); //星期
hour_h=(read_rtc_code[4]/16); //时十位
hour_l=(read_rtc_code[4]%16); //时个位
min_h=(read_rtc_code[5]/16); //分十位
min_l=(read_rtc_code[5]%16); //分个位
sec_h=(read_rtc_code[6]/16); //秒十位
sec_l=(read_rtc_code[6]%16); //秒个位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -