⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12887.c

📁 多路巡回检测
💻 C
字号:
/*
管脚配置:
MOT: 接地
CS:  接P27  地址:0x7f00

AS:  接单片机 ALE
R/W: 接 RW
DS:    接 RD
RESET:  接高
IRQ: 空
SQW:    空
*/

#include <reg51.h>

#define  DS12887   0x7f00     //定义时钟芯片的片选基址

#define  DS12887_sec   DS12887+0x00 // 秒
#define  DS12887_min   DS12887+0x02  // 分
#define  DS12887_hour  DS12887+0x04  // 时

#define  DS12887_day   DS12887+0x06  // 星期
#define  DS12887_date  DS12887+0x07  // 日期
#define  DS12887_month DS12887+0x08  //月份
#define  DS12887_year  DS12887+0x09  //年

#define  DS12887_Reg_A DS12887+0x0a //寄存器A
#define  DS12887_Reg_B DS12887+0x0b //寄存器B
#define  DS12887_Reg_C DS12887+0x0c //寄存器C
#define  DS12887_Reg_D DS12887+0x0d //寄存器D

sbit P27=P2^7;
unsigned char  xdata  *REG_ADD; 

unsigned char Date_Time[7]={8,6,3,2,19,31,21};//年月日周时分秒 定义时间数组并设定初始值

void Delay1ms(unsigned int ms);//延时1毫秒(不够精确的)
void Init_Dis();
void Lcd_Dis_String(unsigned char addr,unsigned char *p);
void Lcd_Dis_Char(unsigned char addr,unsigned char c);

void Write_Ds12887()
{
   P27=0;
   REG_ADD=DS12887_Reg_B;
   *REG_ADD=0x80; 
  
   REG_ADD=DS12887_year;  *REG_ADD=Date_Time[0];  //年
   REG_ADD=DS12887_month; *REG_ADD=Date_Time[1];  //月
   REG_ADD=DS12887_date;  *REG_ADD=Date_Time[2];  //日期
   REG_ADD=DS12887_day;   *REG_ADD=Date_Time[3];  //星期
   REG_ADD=DS12887_hour;  *REG_ADD=Date_Time[4];  //时
   REG_ADD=DS12887_min;   *REG_ADD=Date_Time[5];  //分
   REG_ADD=DS12887_sec;   *REG_ADD=Date_Time[6];  //秒
   REG_ADD=DS12887_Reg_A; *REG_ADD=0x20; 
   REG_ADD=DS12887_Reg_B; *REG_ADD=0x06;

}

void Read_Ds12887()
{  
   unsigned char temp;  
   REG_ADD=DS12887_Reg_A;
   do 
   { 
     temp=*REG_ADD;    
   }while((temp&0x80)==0x80);
   
   REG_ADD=DS12887_year;  Date_Time[0]=*REG_ADD;  //年
   REG_ADD=DS12887_month; Date_Time[1]=*REG_ADD;  //月
   REG_ADD=DS12887_date;  Date_Time[2]=*REG_ADD;  //日期
   REG_ADD=DS12887_day;   Date_Time[3]=*REG_ADD;  //星期
   REG_ADD=DS12887_hour;  Date_Time[4]=*REG_ADD;  //时
   REG_ADD=DS12887_min;   Date_Time[5]=*REG_ADD;  //分
   REG_ADD=DS12887_sec;   Date_Time[6]=*REG_ADD;  //秒
} 


/********************************************************************/
void Display_Calendar(void)
{
 //Lcd_Dis_String(0x80,"                 ");
 Lcd_Dis_String(0x80,"20  -  -  ");
  Lcd_Dis_Char(0x82,(Date_Time[0]/10)|0X30);
   Lcd_Dis_Char(0x83,(Date_Time[0]%10)|0X30);//显示年,转换成了ASC码
    Lcd_Dis_Char(0x85,(Date_Time[1]/10)|0X30);
     Lcd_Dis_Char(0x86,(Date_Time[1]%10)|0X30);//显示月
      Lcd_Dis_Char(0x88,(Date_Time[2]/10)|0X30);
       Lcd_Dis_Char(0x89,(Date_Time[2]%10)|0X30);//显示天
 if(Date_Time[3]==1)
  Lcd_Dis_String(0x8d,"Mon");
 if(Date_Time[3]==2)
  Lcd_Dis_String(0x8d,"Tue");
 if(Date_Time[3]==3)
  Lcd_Dis_String(0x8d,"Wen");
 if(Date_Time[3]==4)
  Lcd_Dis_String(0x8d,"Thu");
 if(Date_Time[3]==5)
  Lcd_Dis_String(0x8d,"Fri");
 if(Date_Time[3]==6)
  Lcd_Dis_String(0x8d,"Sat");
 if(Date_Time[3]==7)
  Lcd_Dis_String(0x8d,"Sun");//显示星期,以上信息均第一行显示
  
 Lcd_Dis_String(0xc0,"          :  :"); 
  Lcd_Dis_Char(0xc8,(Date_Time[4]/10)|0X30);
   Lcd_Dis_Char(0xc9,(Date_Time[4]%10)|0X30);//时
    Lcd_Dis_Char(0xcb,(Date_Time[5]/10)|0X30);
     Lcd_Dis_Char(0xcc,(Date_Time[5]%10)|0X30);//分
      Lcd_Dis_Char(0xce,(Date_Time[6]/10)|0X30);
       Lcd_Dis_Char(0xcf,(Date_Time[6]%10)|0X30);//秒
}
/*
void extern1_IRS(void) interrupt 2//只要把值存入外部变量就可以调用了
{
 if(Right==0)//地址右移(位选择)
 {
  wr_com(++addr);
  wr_com(0x0f);//光标闪烁
  delay1ms(500);
  if(addr==0x90) addr=0xbf;
  if(addr==0xd0) addr=0x7f;
 }
 if(add==0)//数值改变
 {
  wr_com(0x0e);//显示光标但不闪烁
  wr_com(addr);
  wr_dat(num++);
  wr_com(addr);//带有光标的位的数值改变
  if(num==0x3a)
    num=0x30;
  delay1ms(500);
  
 }*/
void main()
{

  Init_Dis();
  Delay1ms(1000);
  Write_Ds12887();
  while(1)
  {  
   Read_Ds12887();
   Display_Calendar();
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -