xxnyykl 2022-12-02 11:52 采纳率: 50%
浏览 43
已结题

51单片机自关机代码实现

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

  • 写回答

2条回答 默认 最新

  • YF云飞 Unity领域新星创作者 2022-12-02 11:55
    关注
    #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
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月2日
  • 创建了问题 12月2日

悬赏问题

  • ¥15 基础的图像处理问题求解答
  • ¥50 全国两定智慧医保接口开发相关业务文档,以及技术实现流程文档
  • ¥15 idea做图书管理系统,要求如下
  • ¥15 最短路径分配法——多路径分配
  • ¥15 SQL server 2022安装程序(英语)无法卸载
  • ¥15 关于#c++#的问题:把一个三位数的素数写在另一个三位数素数的后面
  • ¥15 求一个nao机器人跳舞的程序
  • ¥15 anaconda下载后spyder内无法正常运行
  • ¥20 统计PDF文件指定词语的出现的页码
  • ¥50 分析一个亿级消息接收处理策略的问题?