- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于DS12C887的日历时钟显示系统设计
在银行或者其他的公共场合中,经常会看到显示实时信息的显示屏,其中包括年、月、日、星期、时间等,本例子的功能是在51单片机系统中设置、获取、记录实时的日历时钟信息并通过数码管显示,选用日历时钟芯片DS12C887作为实时时钟芯片,为系统提供详细的时间信息,次款芯片内部有锂电池,可以带掉电的情况下保存10年以上。
?
主要器件:
1、??AT89C52
2、??DS12C887。
?
试验流程图;
?
试验电路图:
试验程序代码://CalendarClk.h程序
#ifndef????_CALENDARCLK_H???????????//?防止CalendarClk.h被重复引用
?
#define????_CALENDARCLK_H
?
#include reg52.h
#include absacc.h
?
#define uchar unsigned char
#define uint unsigned int
?
/* DS12C887?内部专用寄存器宏定义?*/
#define MIN XBYTE[0x0102]
#define HOUR XBYTE[0x0104]
#define DAYOFWEEK XBYTE[0x0106]
#define DAYOFMONTH XBYTE[0x0107]
#define MONTH XBYTE[0x0108]
#define YEAR XBYTE[0x0109]
#define REG_A XBYTE[0x010a]
#define REG_B XBYTE[0x010b]
?
/*?由串口获得的日历时钟信息变量,用于对芯片时间的设置?*/
uchar year1,month1,dayofweek1,dayofmonth1,hour1,min1;
?
/*?芯片DS12C887提供的日历时钟信息变量?*/
uchar year2,month2,dayofweek2,dayofmonth2,hour2,min2;
?
#endif
?
//CalendarClk.c程序
#include CalendarClk.h
?
/*?从串行口获取数据函数,数据包括:year1,month1,dayofweek1,
dayofmonth1,hour1,min1。如果获取到正确数据则返回1,否则返回0 */
uchar getdata()
{
???????//?略去
}
?
/*?设置日历和时钟函数?*/
void settime()
{
???????REG_B = REG_B|0x80;???????????????// SET=1,芯片DS12C887处于设置状态
?
???????MIN = min1;
???????HOUR = hour1;
???????DAYOFWEEK = dayofweek1;
???????DAYOFMONTH = dayofmonth1;
???????MONTH = month1;
???????YEAR = year1;
?
???????REG_B = REG_B0x7f;??????????????????// SET=0,芯片DS12C887恢复正常数据更新状态
}
?
?
/*?获取日历时钟函数?*/
void gettime()
{
???????while (REG_A0x80==0x00)???????//?直到UIP=0时,才能读取日历时钟信息???????{
???????{????
??????????????min2 = MIN ;
??????????????hour2 = HOUR;
??????????????dayofweek2 = DAYOFWEEK;
??????????????dayofmonth2 = DAYOFMONTH;
??????????month2 = MONTH;
??????????????year2 = YEAR;
???????}
}
?
/* 13位数码管显示年、月、日、星期、时、分?*/
void display()
{
???????//?略去
}
?
/*?串口初始化函数?*/
void init_serial()
{
???????TMOD = 0x20;???????????????????????????//?定时器T1使用工作方式2
???????TH1 = 250;
???????TL1 = 250;
???????TR1 = 1;?????????????????????????????//?开始计时
???????PCON = 0x80;????????????????????????????// SMOD = 1
???
文档评论(0)