本程序旨在讀出DS12C887的時間,顯示部分只做了分和秒的部分,已通過測試,詳細(xì)注釋很好用的。#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 ] /*時報(bào)警*/ #define SECONDW XBYTE [ 0xbf01 ] /*秒報(bào)警*/ #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; /* 保存更新周期標(biāo)志位*/ uchar dt[6] = { 0x06,0x01,0x01,0x00,0x00,0x00 }; /* 時標(biāo)緩沖區(qū)及初值 ,設(shè)置時間,用于時間校準(zhǔn)?*/ 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};/*顯示位*/ /*顯示函數(shù)*/ 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++); } /* 初始化工作狀態(tài)函數(shù)*/ void initstat ( void ) { MCA = 0x2f; /*選時鐘32.768KHz,中斷周期500ms*/ ACC = MCC; /* 清中斷請求標(biāo)志 */ ACC = MCD; /* VRT = 1,數(shù)據(jù)有效 */ /* 中斷允許,時標(biāo)十進(jìn)制,24小時制,芯片開始工作*/ MCB = 0x72; /* HOURW = 0x17;*/ /*每小時報(bào)警中斷*/ SECONDW=0X3b; /*每秒報(bào)警中斷 , 可以選用,用于顯示秒點(diǎn)的閃動*/ EA = 1; EX0 = 1; /* 開外部中斷0*/ } /* 寫時標(biāo)函數(shù) */ 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]; } /* 讀時標(biāo)函數(shù) */ void rMC ( void ) { do { ACC = MCA; } /* 讀取UIP位 */ while ( uip_bit ); /* 等待周期更新結(jié)束 */ dt[0]=YEAR; dt[1]=MONTH; dt[2]=DAY; dt[3]=HOUR; dt[4]=MU; dt[5]=SECOND; /* 讀時標(biāo)值到緩沖區(qū) */ } void main ( void ) { SP=0x60; wMC ( ); /* 調(diào)用寫時標(biāo)函數(shù) */ initstat ( ); /* 調(diào)用初始化工作狀態(tài)函數(shù)*/ 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服務(wù)函數(shù)*/ void time ( void ) interrupt 0 using 1 { ACC = MCC; /* 讀取寄存器C*/ if ( ACC^4 ) rMC ( ); /* 周期更新結(jié)束,讀取時標(biāo)值*/ if ( ACC^5 ) rMC( ); /* 秒報(bào)警*/ SECONDW=0x3b; /* HOURW = 0x17; */ /* 每小時報(bào)警中斷 */ }
評論