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

📄 year1.c

📁 采用AT89S52系列单片机与实时时钟芯片DS12C887相结合
💻 C
字号:
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define uint  unsigned int

//--------------------------------------------//DS12C887寄存器地址定义
#define DS12C887_M  XBYTE [0x7f00]//秒
#define DS12C887_MA XBYTE [0x7f01]//秒报警
#define DS12C887_F  XBYTE [0x7f02]//分
#define DS12C887_FA XBYTE [0x7f03]//分报警
#define DS12C887_S  XBYTE [0x7f04]//时
#define DS12C887_SA XBYTE [0x7f05]//时报警
#define DS12C887_X  XBYTE [0x7f06]//星期
#define DS12C887_R  XBYTE [0x7f07]//日
#define DS12C887_Y  XBYTE [0x7f08]//月
#define DS12C887_N  XBYTE [0x7f09]//年
#define DS12C887_CE  XBYTE [0x7f32]//纪
#define DS12C887_A  XBYTE [0x7f0a]//寄存器A,A.7—只读判断忙闲
#define DS12C887_B  XBYTE [0x7f0b]//寄存器B,B.7—控制工作状态:0正常、1停止
                                  //         B.2—BCD码或二进制选择:0 二进制
								  //         B.1—24/12小时模式选择:1 24小时进制
#define DS12C887_C  XBYTE [0x7f0c]//寄存器C
#define DS12C887_D  XBYTE [0x7f0d]//寄存器D  只读,读取该寄存器可使设置的时间和工作模式生效

//--------------------------------------------//DS12C887相关变量定义
uchar year;
uchar month;
uchar day;
uchar hour;
uchar minute;
uchar second;
uchar century;
uchar week;
//uint str[2]={0x0000,0x0000};
uint a[2]={0,0},b[2],c[2],d[2];
uint table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit data1=P1^6;
sbit clock=P1^7;
unsigned char n,second_flag,minute_flag,hi;

void LED(unsigned int *str);

//--------------------------------------------//时钟判断忙闲
void clock_judge_busy(void)
{ while( DS12C887_A & 0x80 );//忙则循环等待
}

//--------------------------------------------//时钟读数据
void clock_read_data(void)
{
  clock_judge_busy();
  century= DS12C887_CE;

  clock_judge_busy();
  year = DS12C887_N;   //
  clock_judge_busy();
  month = DS12C887_Y;  //
  clock_judge_busy();
  day = DS12C887_R;    //
  clock_judge_busy();
   week=DS12C887_X;
  
  
  clock_judge_busy();
  hour = DS12C887_S;   //
  clock_judge_busy();
  minute = DS12C887_F; //
  clock_judge_busy();
  second = DS12C887_M; //

}
//--------------------------------------------//时钟写数据
void clock_write_data(void)
{ uchar i;
  DS12C887_B = 0x80;   //
  DS12C887_CE= century;
  DS12C887_N = year;   //
  DS12C887_Y = month;  //
  DS12C887_R = day;    //
  DS12C887_S = hour;
  DS12C887_X=week;   //
  DS12C887_F = minute; //
  DS12C887_M = second; //
  DS12C887_A = 0x20;   //
  i= DS12C887_C;       //
  i= DS12C887_D;       //
  DS12C887_B = 0x00;   //
}

void delay(unsigned int t)    //1ms的延时子程序
   {
 unsigned int i,j;
 for(i=0;i<t;i++)
    for(j=0;j<120;j++);
   }


//--------------------------------------------//主程序
void main()
{
   
       TMOD=0X01;
	 TH0=0XD8;
	 TL0=0XF0;
	 TR0=1;
	 IE=0X82;
   /*      week=0x04;
         year   = 0x07; //写入时间:2007年09月18日12时00分00秒(要设定的时间)
       month  = 0x09;
      day    = 0x20;
       hour   = 0x07;
       minute = 0x02;
       second = 0x00;
       century= 0x20;    
       clock_write_data() ;   */
          while(1) {
           if(second_flag){
           clock_judge_busy();
           second = DS12C887_M;
           clock_judge_busy();
           minute = DS12C887_F;
	   d[1]=(second&0x0f)|((second<<4)&0x0f00);
	   d[0]=(minute&0x0f)|((minute<<4)&0x0f00);
           LED(d);
            second_flag=0; }    
           if(minute_flag){
            EA=0;
            clock_judge_busy();
             century=DS12C887_CE;               
             clock_judge_busy();
             year=DS12C887_N;
             a[0]=(century&0x0f)|((century<<4)&0x0f00);
	    a[1]=(year&0x0f)|((year<<4)&0x0f00);
           LED(a);
           delay(1000);
           clock_judge_busy();
             month=DS12C887_Y;               
             clock_judge_busy();
             day=DS12C887_R;
             c[0]=(month&0x0f)|((month<<4)&0x0f00);
	   c[1]=(day&0x0f)|((day<<4)&0x0f00);
           LED(c);
           delay(1000);
           clock_judge_busy();
           hour = DS12C887_S; 
           clock_judge_busy();                                                                                      
           week = DS12C887_X; 
           b[0]=(week&0x0f)|((week<<4)&0x0f00);
	   b[1]=(hour&0x0f)|((hour<<4)&0x0f00);
           LED(b);
           minute_flag=0;
           delay(1000);
           EA=1;}  
	 }  
  }

//*********************************************中断服务程序
void time0()interrupt 1 using 0
{
         TH0=0xD8;
	 TL0=0xF0;
	 n++;
	 if (n==100)
	 {
	 	n = 0;
		second_flag =1;
                hi++;
	 }
         if(hi==120){
                 hi=0;
                 minute_flag=1;
         }
}

//*****************************************************显示时间
void LED(unsigned int *str)
 {	unsigned char seg, i,j;
 	 for(i=0;i<2;i++){
          seg=table[str[i]>>8];
	   for(j=1;j<=8;j++){
	     clock=0;
		 if(0x01&(seg>>(8-j))) data1=1;
		 else data1=0 ;
		 clock=1;}
	   seg=table[str[i]&0x000f];
	   for(j=1;j<=8;j++){
	     clock=0;
		 if(0x01&(seg>>(8-j))) data1=1;
		 else data1=0 ;
		 clock=1;}
	  
	     }

 }
   

⌨️ 快捷键说明

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