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

📄 set_time.c

📁 校园打铃系统
💻 C
字号:
#include<reg52.h>
#define  uchar unsigned char


/**************************************************************/
/*MAX7219*********************************************************/
/******************************************************************/
sbit CLK=P1^0;
sbit DIN=P1^1;
sbit LOAD=P1^2;
/**************************************************************/
void send(unsigned char add,unsigned char dat);
void Initial_7219(void);
/**************************************************************/
/***********************************************************/
void set_minite();
void set_hour();
uchar add_hour(uchar hour);
uchar add_minite(uchar minite);
uchar minus_hour(uchar hour);
uchar minus_minite(uchar minite);
void delay1(uchar time);
void set_time();
sbit s1=P3^4;
sbit s2=P3^5;
sbit s3=P3^6;
sbit s4=P3^7;
#define keycode P3 & 0x0f0
/************************************************************/
/*****************************************************************/
void Initial_7219(void)
{
   send(0x0c,0x01);//Shut down
   send(0x0b,0x07);//Scan Limit
   send(0x0a,0x0fa);//Intensity
   send(0x09,0x0ff);//Decode Mode
}
/**************************************************************/
void send(unsigned char add,unsigned char dat)//Send 16Bytes
{
   unsigned char Databuf,i,j;
   LOAD=0;
   i=0;
    while(i<16)
       {
       	if(i<8)
          {
          Databuf=add;
          }
        else
          {
          Databuf=dat;
          }
         for(j=8;j>=1;j--)
           {
              DIN=Databuf&0x80;
              Databuf=Databuf<<1;
              CLK=1;
              CLK=0;
           }
        i=i+8;
       }
    LOAD=1;
}
/*************************************************************/
/***********************MAX7219*********************************/
/***************************************************************/
/***************************************************************/

//实时时钟芯片DS1302 C51源程序
/****************************************************************

 公司名称:
 模块名称:DS1302.c
 功    能:实时时钟模块           时钟芯片型号:DS1302
 说    明:
 程序设计:zhaojunjie
 设计时间:2002.03.02
 版 本 号: 20020302
*********************************************************************/
sbit SCL = P3^0;// DS1302 Serial-Clock Input  pin 7
sbit SDA = P3^1;// DS1302 Serial-Data  Input  pin 6
sbit RST = P3^2;// DS1302 Chip-Seclet  Input  pin 5
code uchar time_data[60]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
                0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,
                0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,
                0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,
                0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x50,
                0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};

#define  DS1302_WP    0x8E
#define  DS1302_RESET   RST=0;SCL=0;RST=1
#define  DS1302_WP_ENABLE  Write_Ds1302(DS1302_WP,0X00)
#define  DS1302_WP_DISENABLE  Write_Ds1302(DS1302_WP,0x80)
unsigned char set_rtc_code[3]={0x00,0x00,0x00};
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char read_rtc_code[3];

void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);
void Set_RTC(void);

/****************************************************************************/
/****************************************************************************/
void Write_Ds1302_Byte(unsigned  char temp)
{
 unsigned char i;
 for (i=0;i<8;i++)
  {
   SCL=0;
     SDA=temp&0x01;
     temp>>=1;
     SCL=1;
   }
}
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
 DS1302_RESET;
 Write_Ds1302_Byte(address);
 Write_Ds1302_Byte(dat);
 RST=0;
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
 unsigned char i,temp=0x00,temp_temp;
 DS1302_RESET;
 Write_Ds1302_Byte(address);
 for (i=0;i<8;i++)
 {
  if(SDA)
   temp|=0x80;
  SCL=0;
   temp>>=1;
  SCL=1;
 }
 RST=0;
 temp_temp=temp/16;
 temp=temp%16;
 temp=temp+temp_temp*10;
 return (temp);
}
/****************************************************************************/
/****************************************************************************/
void Read_RTC(void)
{
 unsigned char i,*p;
 p=read_rtc_address;
 for(i=0;i<3;i++)
 {
  read_rtc_code[i]=Read_Ds1302(*p);
  p++;
 }
}
/***********************************************************************/
/***********************************************************************/
void Set_RTC(void)
{
 unsigned char i,*p;
 p=write_rtc_address;
 for(i=0;i<3;i++)
 {
  Write_Ds1302(*p,set_rtc_code[i]);
  p++;
 }
}
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/



 /*****************************************************************/
 /* 时间设置set_time******************************************************/
void set_minite()
{uchar hour,minite;
uchar hour_h,hour_l,minite_h,minite_l;

 while(s4==1)
      {send(0x08,0x0f);//5---8灭
       send(0x07,0x0f);
       send(0x06,0x0f);
       send(0x05,0x0f);
       Read_RTC();
       hour=read_rtc_code[2];//读DS1302
       minite=read_rtc_code[1];
       hour_h=hour/10;
       hour_l=hour%10;
       send(0x01,hour_h);//显示小时
       send(0x02,hour_l);
       minite_h=minite/10;
       minite_l=minite%10;
       send(0x03,minite_h);//显示分钟
       send(0x04,minite_l);

    delay1(450);
    send(0x03,0x0f);//显示分钟灭
    send(0x04,0x0f);
    delay1(450);

       if(s3==0)//3键
         {
         set_hour();
          break;
          }
        else
           if(s1==0)
             {
              minite=add_minite(minite);//时间加一
              set_rtc_code[1]=minite; //
              Set_RTC();

              }
            else
              if(s2==0)
               {
                minite=minus_minite(minite);//时间减一
                set_rtc_code[1]=minite; //
                Set_RTC();

               }


}
}


void set_hour()
{uchar hour,minite;
 uchar hour_h,hour_l,minite_h,minite_l;

while(s4==1)
      {send(0x08,0x0f);//5---8灭
       send(0x07,0x0f);
       send(0x06,0x0f);
       send(0x05,0x0f);
       Read_RTC();
       hour=read_rtc_code[2];//读DS1302
       minite=read_rtc_code[1];
	   hour_h=hour/10;
	   hour_l=hour%10;
       send(0x01,hour_h);//显示小时
       send(0x02,hour_l);
	   minite_h=minite/10;
	   minite_l=minite%10;
       send(0x03,minite_h);//显示分钟
       send(0x04,minite_l);
       delay1(450);
      send(0x01,0x0f);//显示小时灭
      send(0x02,0x0f);
      delay1(450);
       if(s3==0)
         {set_minite();
          break;
          }
        else
           if(s1==0)
             {
              hour=add_hour(hour);//时间加一
              set_rtc_code[2]=hour; //
                 Set_RTC();
              }
            else
              if(s2==0)
               {
                hour=minus_hour(hour);//时间减一
                set_rtc_code[2]=hour;
                 Set_RTC();
               }

}

}
uchar add_hour(uchar hour)
      {hour++;
       if(hour>23)
          hour=0;
       hour=time_data[hour];
       return (hour);
        }


uchar add_minite(uchar minite)
      { minite++;
        if(minite>59)
           minite=0;
           minite=time_data[minite];
           return (minite);
        }


uchar minus_hour(uchar hour)
      {if(hour==0)
          hour=23;
          else
           hour--;
        hour=time_data[hour];
            return(hour);
       }


uchar minus_minite(uchar minite)
      {
      if(minite==0)
          minite=59;
          else
          minite--;
        minite=time_data[minite];
            return(minite);
        }

 /**************************************************/
/********************************
//延时//
********************************/
void delay1(uchar time)
{uchar i,j;
 for(i=0;i<time; i++)
     for(j=0;j<time;j++)
     ;
}


void set_time()
{
 bit a;
 P3=0x0ff;
 DS1302_WP_ENABLE;
 Set_RTC();
if(s3==0)
    {a=~a;
     if(a==0)
       set_hour();
     else
       set_minite();
     }

}

 /**************************************************/
 /**************************************************/
 /***************时间设置完*************************/
void main()
 { Initial_7219();//初始化

  while(1)
  {
 set_time();
 }
 }

⌨️ 快捷键说明

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