单片机
返回首页

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

2015-07-03

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

}   
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 简洁的过零调功器电路设计与分析

  • 光控电路设计与分析

  • IGBT模块通过控制门极阻断过电流

  • MT3608构成3.7V转12V的升压电路图

  • 运算放大器IC741的基本工作原理及在电路中的实现方式

  • 一个简单的红外耳机电路

    相关电子头条文章