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

📄 ds12c887.c

📁 DS12C887的C程序
💻 C
字号:
/*本程序旨在读出DS12C887的时间,显示部分只做了分和秒的部分*/
/*创建时间2006。1。29*/
# include < absacc.h >
# include < reg51.h >
# define uchar unsigned char
# define MCA XBYTE [ 0xbf0a ]    /*寄存器A*/
# define MCB XBYTE [ 0xbf0b ]    /* 寄存器B*/
# define MCC XBYTE [ 0xbf0c ]    /* 寄存器C*/
# define MCD XBYTE [ 0xbf0d ]    /*寄存器D */
# define HOURW XBYTE [ 0xbf05 ]  /*时报警*/
# define SECONDW XBYTE [ 0xbf01 ]  /*秒报警*/
# define YEAR XBYTE [ 0xbf09 ]
# define MONTH XBYTE [ 0xbf08 ]
# define DAY XBYTE [ 0xbf07 ]
# define HOUR XBYTE [ 0xbf04 ]
# define MU XBYTE [ 0xbf02 ] 
# define SECOND XBYTE [ 0xbf00 ]
sbit uip_bit = ACC^7;   /* 保存更新周期标志位*/
uchar  dt[6] = { 0x06,0x01,0x01,0x00,0x00,0x00 };  /* 时标缓冲区及初值 ,设置时间,用于时间校准?*/
sbit bita=P2^0;
sbit bitb=P2^1;
sbit bitc=P2^2;
sbit bitd=P2^3;
code uchar dispcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
                         0x7d,0x07,0x7f,0x6f};
uchar dispbit[4]={0,0,0,0};/*显示位*/
/*显示函数*/
void disp()
     {
     uchar k;
     bita=1;bitb=bitc=bitd=0;
     P0=dispcode[dispbit[0]];
     for(k=0;k<150;k++);
     bita=bitc=bitd=0;bitb=1;    
	 P0=dispcode[dispbit[1]];    
	 for(k=0;k<150;k++);     
	 bita=bitb=bitd=0;bitc=1;     
	 P0=dispcode[dispbit[2]];     
	 for(k=0;k<150;k++);     
	 bita=bitb=bitc=0;bitd=1;     
	 P0=dispcode[dispbit[3]];     
	 for(k=0;k<150;k++);    
	 }

/* 初始化工作状态函数*/
void initstat ( void )
{
 	MCA = 0x2f;   /*选时钟32.768KHz,中断周期500ms*/
	ACC = MCC;  /* 清中断请求标志 */
	ACC = MCD;  /* VRT = 1,数据有效 */
	/* 中断允许,时标十进制,24小时制,芯片开始工作*/
    MCB = 0x72;
/*	HOURW = 0x17;*/  /*每小时报警中断*/
    SECONDW=0X3b; /*每秒报警中断  , 可以选用,用于显示秒点的闪动*/  
	EA = 1;
	EX0 = 1;  /* 开外部中断0*/
}
/* 写时标函数 */
void wMC ( void )
{
    MCB = 0x80;   /* 置SET位为1,芯片停止工作 */
    YEAR=dt[0];
    MONTH=dt[1];
    DAY=dt[2];
    HOUR=dt[3];
    MU=dt[4];
    SECOND=dt[5];

}

/* 读时标函数 */
void rMC ( void )
{
 	do  { ACC = MCA; }   /* 读取UIP位 */
    while ( uip_bit );	      /* 等待周期更新结束 */
    dt[0]=YEAR;
    dt[1]=MONTH;
    dt[2]=DAY;
    dt[3]=HOUR;
    dt[4]=MU;
    dt[5]=SECOND;  /* 读时标值到缓冲区 */
}
void main ( void )
{
    SP=0x60;
    wMC ( ); /* 调用写时标函数 */
	initstat ( ); /* 调用初始化工作状态函数*/
    while (1)
       {
        rMC();
        dispbit[0]=dt[3]/16;
        dispbit[1]=dt[3]%16;
        dispbit[2]=dt[4]/16;
        dispbit[3]=dt[4]%16;
        disp();
        }
}
/* 外部中断0服务函数*/
void time ( void ) interrupt 0 using 1
{
	ACC = MCC;  /* 读取寄存器C*/
    if ( ACC^4 )   rMC ( );  /* 周期更新结束,读取时标值*/
	if ( ACC^5 )   rMC( );  /* 秒报警*/
    SECONDW=0x3b;
/*	HOURW = 0x17; */ /* 每小时报警中断 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -