本程序旨在读出DS12C887的时刻,显现部分只做了分和秒的部分,已经过测验,具体注释很好用的。
#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; */ /* 每小时报警中止 */ }