新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)驅(qū)動DS12C887的時鐘芯片C語言程序

51單片機(jī)驅(qū)動DS12C887的時鐘芯片C語言程序

作者: 時間:2016-11-30 來源:網(wǎng)絡(luò) 收藏
本程序旨在讀出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)警中斷 */  }   


評論


技術(shù)專區(qū)

關(guān)閉