📄 12c887.c
字号:
/*************************************************************
文件名称:ds12c887.c
适用范围:时钟芯片ds12c887的驱动程序
*************************************************************/
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_4=P1^4;
sbit P1_3=P1^3;
sbit P1_2=P1^2;
sbit RD12887=P3^7;
sbit WR12887=P3^6;
/* 命令常量定义 */
#define CMD_START_DS12C887 0x20 /* 开启时钟芯片*/
#define CMD_START_OSCILLATOR 0x70 /* 开启振荡器,处于抑制状态 */
#define CMD_CLOSE_DS12C887 0x30 /* 关掉时钟芯片*/
/* 所有的置位使用或操作,清除使用与操作 */
#define MASK_SETB_SET 0x80 /* 禁止刷新 */
#define MASK_CLR_SET 0x7f /* 使能刷新 */
#define MASK_SETB_DM 0x04 /* 使用HEX格式*/
#define MASK_CLR_DM 0xfb /* 使用BCD码格式 */
#define MASK_SETB_2412 0x02 /* 使用24小时模式 */
#define MASK_CLR_2412 0xfd /* 使用12小时模式 */
#define MASK_SETB_DSE 0x01 /* 使用夏令时 */
#define MASK_CLR_DSE 0xfe /* 不使用夏令时 */
void Delay(uchar no);
uchar Year,Mon,Date,Hours,Min,Sec;
uchar ucYear; uchar ucMon; uchar ucData;
uchar ucHours;uchar ucMin; uchar ucSec;
/* 寄存器地址通道定义 */
xdata uchar ucSecondsChannel _at_ 0x7F00;
xdata uchar ucMinutesChannel _at_ 0x7F02;
xdata uchar ucHoursChannel _at_ 0x7F04;
xdata uchar ucDofWChannel _at_ 0x7F06;
xdata uchar ucDateChannel _at_ 0x7F07;
xdata uchar ucMonthChannel _at_ 0x7F08;
xdata uchar ucYearChannel _at_ 0x7F09;
xdata uchar ucCenturyChannel _at_ 0x7F32;
xdata uchar ucRegA _at_ 0x7F0a;
xdata uchar ucRegB _at_ 0x7F0b;
xdata uchar ucRegC _at_ 0x7F0c;
xdata uchar ucRegD _at_ 0x7F0d;
/* 函数声明部分 */
void StartDs12c887(void);
void CloseDs12c887(void);
void InitDs12c887(void);
uchar GetSeconds(void);
uchar GetMinutes(void);
uchar GetHours(void);
uchar GetDate(void);
uchar GetMonth(void);
uchar GetYear(void);
uchar GetCentury(void);
void SetTime(uchar chSeconds,uchar chMinutes,uchar chHours);
void SetDate(uchar chDate,uchar chMonth,uchar chYear);
void Display(uchar *ucPt);
uchar code tab[]={0x88,0xEB,0x4C,0x49,0x2B,0x19,0x18,0xCB,0x08,
0x09,0x0A,0x38,0x9C,0x68,0x1C,0x1E,0xFF};//0123456789abcdef//
/*************************************************************
函数功能:该函数用来启动时钟芯片工作
应用范围:仅在时钟芯片首次使用时用到一次
入口参数:
出口参数:
*************************************************************/
void StartDs12c887(void)
{
ucRegA = CMD_START_DS12C887;
}
void InitDs12c887()
{
volatile uchar i;
StartDs12c887();
ucRegB = ucRegB | MASK_SETB_SET; /* 1 = 禁止刷新 */
ucRegB = ucRegB & MASK_CLR_DM|MASK_SETB_2412&MASK_CLR_DSE;
/* 使用BCD码格式、24小时模式、不使用夏令时 */
ucCenturyChannel = 0x21; /* 设置为21世纪 */
// StartDs12c887();
i = ucRegC;
i = ucRegD;
ucRegB = ucRegB & MASK_CLR_SET; /* 使能刷新 */
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取秒字节
应用范围:
入口参数:
出口参数:
*************************************************************/
uchar GetSeconds(void)
{
uchar uip;
do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
return(ucSecondsChannel);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取分字节
应用范围:
入口参数:
出口参数:
*************************************************************/
uchar GetMinutes(void)
{
uchar uip;
do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
return(ucMinutesChannel);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取小时字节
应用范围:
入口参数:
出口参数:
*************************************************************/
uchar GetHours(void)
{
uchar uip;
do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
return(ucHoursChannel);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取日字节
应用范围:
入口参数:
出口参数:
*************************************************************/
uchar GetDate(void)
{
uchar uip;
do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
return(ucDateChannel);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取月字节
应用范围:
入口参数:
出口参数:
*************************************************************/
uchar GetMonth(void)
{
uchar uip;
do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
return(ucMonthChannel);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取年字节
应用范围:
入口参数:
出口参数:
*************************************************************/
uchar GetYear(void)
{
uchar uip;
do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
return(ucYearChannel);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取世纪字节
应用范围:
入口参数:
出口参数:
*************************************************************/
//uchar GetCentury(void)
//{
// uchar uip;
// do{ uip = ucRegA; } while(( uip&0x80 ) == 0x80);
// ucRegB = ucRegB | MASK_SETB_SET; /* 1 = 禁止刷新 */
// ucRegB = ucRegB & MASK_CLR_SET; /* 使能刷新 */
// return(ucCenturyChannel);
//}
/*************************************************************
函数功能:该函数用来设置时钟芯片的时间
应用范围:
入口参数:chSeconds、chMinutes、chHours是设定时间的压缩BCD码
出口参数:
*************************************************************/
void SetTime(uchar chSeconds,uchar chMinutes,uchar chHours)
{
ucRegB = ucRegB | MASK_SETB_SET; /* 1 = 禁止刷新 */
ucSecondsChannel = chSeconds;
ucMinutesChannel = chMinutes;
ucHoursChannel = chHours;
ucRegB = ucRegB & MASK_CLR_SET; /* 使能刷新 */
}
/*************************************************************
函数功能:该函数用来设置时钟芯片的日期
应用范围:
入口参数:chDate、chMonth、chYear是设定日期的压缩BCD码
出口参数:
*************************************************************/
void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear)
{
ucRegB = ucRegB | MASK_SETB_SET; /* 1= 禁止刷新 */
ucDateChannel = chDate;
ucMonthChannel = chMonth;
ucYearChannel = chYear;
ucRegB = ucRegB & MASK_CLR_SET; /* 0=使能刷新 */
}
void main(void)
{
uchar i,ucTimeArray[6];
SCON = 0x00;
Delay(25); //Delay(5);
P1_4=0; //选择DS12887
P1_3=1;
P1_2=0;
/* 第一次初始化时用
InitDs12c887();
*/
ucTimeArray[0]=0x05;
ucTimeArray[1]=0x08;
ucTimeArray[2]=0x21;
ucTimeArray[3]=0x12;
ucTimeArray[4]=0x07;
ucTimeArray[5]=0x00;
SetTime(ucTimeArray[5],ucTimeArray[4],ucTimeArray[3]);
SetDate(ucTimeArray[2],ucTimeArray[1],ucTimeArray[0]);
for( i=0;i<6;i++)
ucTimeArray[i] = 0;
while(1)
{
ucTimeArray[0]=GetYear();
ucTimeArray[1]=GetMonth();
ucTimeArray[2]=GetDate();
ucTimeArray[3]=GetHours();
ucTimeArray[4]=GetMinutes();
ucTimeArray[5]=GetSeconds();
Display(ucTimeArray+3);
Delay(1);
}
}
void Display(uchar *ucPt)
{
uchar ucTemp[6];
ucTemp[0] = (*ucPt)>>4;
ucTemp[1] = (*ucPt)&0x0f;
ucPt++;
ucTemp[2] = (*ucPt)>>4;
ucTemp[3] = (*ucPt)&0x0f;
ucPt++;
ucTemp[4] = (*ucPt)>>4;
ucTemp[5] = (*ucPt)&0x0f;
SBUF=tab[ucTemp[5]];
while(!TI);
TI = 0;
SBUF=tab[ucTemp[4]];
while(!TI);
TI = 0;
SBUF=tab[ucTemp[3]];
while(!TI);
TI = 0;
SBUF=tab[ucTemp[2]];
while(!TI);
TI = 0;
SBUF=tab[ucTemp[1]];
while(!TI);
TI = 0;
SBUF=tab[ucTemp[0]];
while(!TI);
TI = 0;
}
//延时程序
void Delay(unsigned char no)
{
unsigned char i,j; //延时参数
for(; no>0; no--)
{
for(i=0; i<100; i++)
for(j=0; j<100; j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -