51单片机自关机代码实现

我自带电路图,急要,私我。
一段定时关机的代码就行。
基础代码不复杂,很快的,快来快来

#include<reg51.h>
#include <as.h>
#include <sd.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar  miao,shi,fen,t,al,temp;
int k;
sbit SCLK = P1^4; /*实时时钟时钟线引脚 */
sbit IO = P1^5; /*实时时钟数据线引脚 */
sbit RST = P1^6; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;  
//校时按键与C51的引脚连接定义
sbit key1=P1^2;  //设置键
sbit key2=P1^7;  //加键
sbit dianji=P1^3;
sbit xiadong=P3^2;          
                                                                                                                                                                                                                
void write_byte(uchar dat)//写一个字节
{
    ACC=dat;
    RST=1;
    for(al=8;al>0;al--)
    {
        IO=ACC0;
        SCLK=0;
        SCLK=1;
        ACC=ACC>>1;
    }
}
uchar read_byte()//读一个字节
{
    RST=1;
    for(al=8;al>0;al--)
    {
        ACC7=IO;
        SCLK=1;
        SCLK=0;
        ACC=ACC>>1;
    }
    return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
{
    RST=0;
    SCLK=0;
    RST=1;
    write_byte(add);
    write_byte(dat);
    SCLK=1;
    RST=0;
}
uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
{
    uchar temp;
    RST=0;
    SCLK=0;
    RST=1;
    write_byte(add);
    temp=read_byte();
    SCLK=1;
    RST=0;
    return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
 uchar Decimal;
 Decimal=bcd>>4;
 return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允许写,禁止写保护 
//write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
//write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
//write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
//write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
//write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
//write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
//write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
write_1302(0x8e,0x80); //打开写保护
}  
void init() //定时器、计数器设置函数
{
    TMOD=0x11; //指定定时/计数器的工作方式为3
    TH0=0;  //定时器T0的高四位=0
    TL0=0;  //定时器T0的低四位=0
    EA=1;  //系统允许有开放的中断
    ET0=1; //允许T0中断
    TR0=1; //开启中断,启动定时器
}
void main()
{
    ds1302_init();
    init();          //调用定时计数器的设置子函数
    key1=1;
    key2=1;
    dianji=0;
    TR0=1; 
    xiadong=1;
    while(1)  //无限循环下面的语句:
    {
       if(key2==0)
       {
         delay(20);
         if(key2==0)
           {
              t=50;
              TR0=0;
              miao=0;
              temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302
                 write_1302(0x8e,0x00);
                 write_1302(0x80,0x80|temp);//miao
              write_1302(0x8e,0x80);
              fen++;
              if(fen==60){fen=0;}
              temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
              write_1302(0x8e,0x00);//允许写,禁止写保护 
              write_1302(0x82,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
                 write_1302(0x8e,0x80);//打开写保护
            
              while(t>0)
               {
                 t--;
                 xianshi( shi,fen); 
               }
                        
              TR0=1;
              temp=(miao)/10*16+(miao)%10;
              write_1302(0x8e,0x00);
              write_1302(0x80,0x00|temp);//miao数据写入DS1302
              write_1302(0x8e,0x80);                    
            }
        } 
      TR0=1;                        
      if(key1==0)
        {
           delay(20);
           if(key1==0)
            {
              t=50;
              TR0=0;
              shi++;
              if(shi==24){shi=0;}
              temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
              write_1302(0x8e,0x00);//允许写,禁止写保护 
              write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
                 write_1302(0x8e,0x80);//打开写保护
              miao=0;
              while(t>0)
               {
                 t--;
                 xianshi( shi,fen); 
               }
                     
              TR0=1; //开启中断,启动定时器
              temp=(miao)/10*16+(miao)%10;
              write_1302(0x8e,0x00);
              write_1302(0x80,0x00|temp);//miao数据写入DS1302
              write_1302(0x8e,0x80);
             }                        
   }  
    k=shi*100+fen;
   if(xiadong==1)
   {
     if(0<=k && k<400){dianji=0;}
     if(400<=k && k<=530 ){dianji=1;}
     if(530<k && k<1830){dianji=0;}
     if(1830<=k && k<=2030){dianji=1;}
     if(2030<k && k<2400){dianji=0;} 
   }
   if(xiadong==0)
   {
     if(0<=k && k<500){dianji=0;}
        if(500<=k && k<=630){dianji=1;}
     if(630<k && k<1700){dianji=0;}
     if(1700<=k && k<=2000){dianji=1;}
     if(2000<k && k<2400){dianji=0;} 
   }
     
   
   xianshi(shi,fen);
     
  }      //调用键盘扫描子函数
}
void timer0() interrupt 1  //取得并显示日历和时间
{
   miao = BCD_Decimal( read_1302(0x81) );
   fen = BCD_Decimal( read_1302(0x83) );
   shi  = BCD_Decimal( read_1302(0x85) );
}
#ifndef  _as_h_
#define     _as_h_
#include<math.h>
#include<sd.h>
#include<wei.h>
sbit dian=P2^7;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char code tab[]={0x70,0xb0,0xd0,0xe0};
int numb[4]={0};
int a,b,c,d,js;
int x;
void xianshi( int ho, mi)
{  
    a=ho/10;
    b=ho%10;
    c=mi/10;
    d=mi%10;
    numb[0]=a;
       numb[1]=b;
    numb[2]=c;
    numb[3]=d;
     x=0;
     dian=0;
    while(x<4)
       { 
         P0=tab[x];
         js=30;
         while(js>0)
          { 
            P2=table[ numb[x]];
            if(x==1)
             { dian=1;}
            js--;
          }
         P2=0x00;
         x++;
       }
  }
#endif
#ifndef  _sd_h_
#define     _sd_h_
void  delay(int z)
{
    int x,j;
    for(j=0;j<z;j++)
     for(x=0;x<=50;x++);
}
#endif

找我