电路原理图如下:
protel99画的PCB图如下:(51hei附件中可下载工程文件)
A
/*------------------------程序说明----------------------------*//*---本程序运行在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; } }
复制代码