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

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值