锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

51单片机驱动DS12C887的时钟芯片C语言程序

时间:2024-05-24 05:07:10

      本程序旨在读出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; */ /* 每小时报警中断 */  }   

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章