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

📄 12c887.c

📁 12887实时时钟芯片的程序包。适用范围:时钟芯片ds12c887的驱动
💻 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 + -