制作出来的实物图如下:
image.png
电路原理图如下:
image.png
protel99画的PCB图如下:(51hei附件中可下载工程文件)
A image.png
/*------------------------程序说明----------------------------*/
  • /*---本程序运行在STC8G1K08中----------------------------------*/
  • /*---时间设置步长为一分钟-------------------------------------*/
  • /*---可以根据需要更改变量K的判断值修改时间步长----------------*/
  • /*---上电后先循环点亮数码管、发光管,检测完成初始化-----------*/
  • /*---每按一下按键,则定时时间增加不同时间步长-----------------*/
  • /*---充电过程中红色指示灯闪烁表示正在充电---------------------*/
  • /*---充电完成关闭红色指示灯表示充电完成-----------------------*/
  • /*---充电中或完成后可以重新通过按键设置定时时间-------------------*/
  • /*---延时上电和延时断电选择功能,按下Key1再通电实现延时上电功能设置---*/
  • //#include "STC8xxxx.H"//<STC8G.h>
  • #include "Config.H"
  • #define uchar unsigned char
  • #define uint unsigned int
  • sbit JDQ=P5^4;           //继电器(高电平充电,低电平不充电)
  • sbit KEY1 = P3^0;        
  • sbit KEY2 = P3^1;
  • sbit RED_flash=P5^5;          //充电中指示灯闪烁
  • enum {OFF = 1, ON = 0};
  • enum {JDQ_OFF = 0, JDQ_ON = 1};
  • void key();
  • bit delay_OnOff=1;                   //延时上电和延时断电选择位,开机检查Key1设置此位,0表示延时上电,1表示延时断电。
  • uchar i;
  • uint t = 0;                   //按键计数变量
  • uint k = 0;                   //计时计数变量
  • uint m = 0;                   //闪烁计数变量
  • uint T0_flag = 0;                   //定时器运行后不为0
  • void LED_Init()    //状态指示灯检测 初始化
  • {   
  •    RED_flash=ON;
  •    Delay_ms(300);
  •    RED_flash=OFF;   
  • }
  • /******定时器0初始化,12T自动重装模式,定时60毫秒******/
  • void InitTimer0()                   //60ms定时器
  • {
  •     TMOD = 0x01;
  •     TH0=(65536-60000)/256;
  •         TL0=(65536-60000)%256;
  •     EA = 1;                   //开 总中断
  •     ET0 = 1;           //开 定时器T0中断
  • //    TR0 = 1;           //开启 定时器T0
  • }   
  • /*--------------------------主函数------------------------------*/
  • void main()
  • {         
  •         P3M0 = 0x00;
  •     P3M1 = 0x00;
  •         P5M0 = 0x00;
  •     P5M1 = 0x00;
  •         delay_OnOff=KEY1;  //延时断电或延时上电选择。0:延时上电,1:延时断电。先长按KEY1不松再通电有效
  •     JDQ = JDQ_OFF;        //关闭继电器,等待开始充电。        
  •     LED_Init();                 //状态指示灯检测 初始化
  •         Light_Level_Set(4);        //设置亮度等级1-8级
  •     for(i=0;i<10;i++)        //测试显示屏
  •                 {
  •                    AiP650_DisPlay(1,i);
  •                    AiP650_DisPlay(2,i);
  •                    AiP650_DisPlay(3,i);
  •                    AiP650_DisPlay(4,i);
  •                    Delay_ms(400);
  •                 }        
  • //        i=0;
  •         AiP650_CLR();
  •         Delay_ms(500);
  •         InitTimer0();           //定时器初始化
  •         TR0 = 0;           //关闭 定时器T0
  •         t=0;                     //上电默认充电时间
  •         
  •         while(1)
  •         {
  •          
  •           key();                                //循环按键函数
  •           AiP650_DisPlayFourNum(t);         //显示数字
  •       if(delay_OnOff==1)                //延时断电模式,定时充电未启动
  •                    {                  
  •                          if(t==0)
  •                            {
  •                              JDQ = JDQ_OFF;          //断开继电器,停止充电
  •                          TR0 = 0;            //停止定时器
  •                              RED_flash=OFF;        
  •                            }                           
  •                  else
  •                               {
  •                                  TR0 = 1;        //启动定时器
  •                                  JDQ = JDQ_ON;                          
  •                            }
  •                   }
  •           if(delay_OnOff==0)                //延时通电模式,定时充电未启动
  •                    {        
  •                      if(t==0&&T0_flag==0)
  •                              {  
  •                                  JDQ = JDQ_OFF;          //
  •                              TR0 = 0;                //停止定时器
  •                                  RED_flash=ON;                                   
  •                   }
  •                  else if(t!=0)
  •                       {
  •                                   TR0 = 1;        //启动定时器
  •                               JDQ = JDQ_OFF;                          
  •                           }
  •                          else
  •                           {
  •                                   TR0 = 0;        //停止定时器
  •                                     JDQ = JDQ_ON;
  •                           }
  •                    }
  •           if(k>=1000)                        //按键设定时间增量   30000半小时时间   60000一小时           1000一分钟
  •        {
  •            k = 0;
  •                    t-=1;                        //减去一分钟
  •                                     
  •        }
  •            Delay_ms(25);
  •         }   
  • }
  • /*---定时器T0中断函数---*/
  • void Timer0() interrupt 1
  • {
  •         
  •         TH0=(65536-60000)/256;        //赋初值
  •         TL0=(65536-60000)%256;
  •         k++;                                        //
  •         m++;                                        //
  •         T0_flag++;
  •          if(T0_flag > 1000)                //
  •           {                                
  •                   T0_flag = 1;
  •           }
  •         /*---充电过程中指示灯闪烁---*/
  •           if(m > 8)                //每480ms充电指示灯闪烁一次
  •           {                                
  •                   m = 0;
  •                   RED_flash = ~RED_flash;        //取反实现闪烁
  •           }
  • }
  • void key()        //按键操作
  • {         
  •           if(KEY1==0)                        //有键按下
  •           {  
  •                 Delay_ms(150);                  
  •             t+=30;                        
  •                 if(t>600)               
  •                 t = 0;        
  •           }               
  •         if(KEY2==0)                        //按下按键加一        
  •         {
  •                 Delay_ms(150);        
  •                 t+=1;        
  •                 if(t>600)                        
  •                 t = 1;
  •         }        
  • }                 
  • 复制代码