|
制作出来的实物图如下:
电路原理图如下:
protel99画的PCB图如下:(51hei附件中可下载工程文件)
/*------------------------程序说明----------------------------*/
/*---本程序运行在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;
}
}
|
评分
-
查看全部评分
|