单片机
返回首页

基于DS12C887的日历时钟显示系统设计

2016-09-07 来源:eefocus

在银行或者其他的公共场合中,经常会看到显示实时信息的显示屏,其中包括年、月、日、星期、时间等,本例子的功能是在51单片机系统中设置、获取、记录实时的日历时钟信息并通过数码管显示,选用日历时钟芯片DS12C887作为实时时钟芯片,为系统提供详细的时间信息,次款芯片内部有锂电池,可以带掉电的情况下保存10年以上。

 

主要器件:

1、  AT89C52单片机芯片,用于对时钟芯片的控制和初始化,并控制数码管显示。

2、  日历时钟芯片DS12C887。

 

试验流程图;


 

 

试验电路图:
 

试验程序代码:
//CalendarClk.h程序

#ifndef    _CALENDARCLK_H           // 防止CalendarClk.h被重复引用

 

#define    _CALENDARCLK_H

 

#include

#include

 

#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_B&0x7f;                  // SET=0,芯片DS12C887恢复正常数据更新状态

}

 

 

/* 获取日历时钟函数 */

void gettime()

{

       while (REG_A&0x80==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

       SCON = 0x50;                            // 工作方式1,波特率9600kbit/s,允许接收

}

 

 

void main(void)

{

       uchar setflag;

       init_serial();

 

       /* 设置DV2、DV1、DV0为010,打开芯片DS12C877内部晶振 */

       REG_A = REG_A&0xaf;                     // DV2=DV0=0

       REG_A = REG_A|0x20;               // DV1=0

 

       REG_B = REG_B&0x7b;                    // SET=0,时间数据正常更新;DM=0,二进制数据模式

       REG_B = REG_B|0x02;               // 寄存器B的24/12位置1,24小时时间模式

      

       while (1)

       {

              setflag = getdata(); // 通过查询方式获取串口数据

      

              /* 如果获取到正确数据,则设置时间 */

              if (setflag==0x01)

                     settime();

      

              /* 调用获取日历时钟函数 */

              gettime();

             

              /* 13位数码管显示日历、星期和时间信息 */

              display();

       }           

}

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

  • SOC系统级芯片设计实验

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

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

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

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

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章