用51单片机控制DS12C887实时时钟_鈊銣祉氺_新浪博客

通过读取实时时钟芯片DS12C887,达到更新显示时间的目的
特点:时间准确,断电后不需要调整

显示部分使用MAX7219作为驱动块
****************************************************************************
DS12C887      52单片机

  A0-A7   ==    P0;

  R\W    ==     P3^6;

  DS     ==    P3^7;

  AS     ==    ALE;

  CS     ==    P2^7;

 

单片机与MAS7219相连;

P1^0===DIN    P1^1==DOUT     P1^2==CSK
******************************************************************************
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int


#define MIN XBYTE[0x7f02]
#define HOUR XBYTE[0x7f 04]
#define DAYOFWEEK XBYTE[0x7f 06]
#define DAYOFMONTH XBYTE[0x7f 07]
#define MONTH XBYTE[0x7f 08]
#define YEAR XBYTE[0x7f 09]
#define REG_A XBYTE[0x7f 0a]
#define REG_B XBYTE[0x7f 0b]


uchar year2,month2,dayofweek2,dayofmonth2,hour2,min2;


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;
 }
}


void display()
{
 // 略去
}

void main(void)
{
 uchar setflag;
 init_serial();

 
 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();
  
  
  display();
  
}

本文只是显示DS12C887里面的时间  并不能以用按键来调整时间  朋友可以自己加上一些功能。希望朋友多多交流!~!

已投稿到:
郑重声明:资讯 【用51单片机控制DS12C887实时时钟_鈊銣祉氺_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——