求助定时开关倒计时开关定时插座设计
本人喜欢 听收音机以及想在睡眠的时候定时关闭机器。在磁动力论坛找到一个厨房定时器。但是不太适合。本人不会更改程序。希望论坛大哥哥大姐姐帮忙改一下。本人根据磁动力的修改一下电路。希望有好心哥哥姐姐支持。这些也方便好多人使用。磁动力的程序如下,#include <AT89X051.h>
#define KEY P3_5
#define POW P3_7
#define SON P3_4
static bit State_b; //此值为1时说明定时开始了
static unsigned int StateT_i; //此标识值为设置后按键松开的时标
static unsigned char Time_c; //定时目标值 每单位5分种
static unsigned int TimeCountS_i; //当前秒值 每单位20MS
static unsigned char TimeCountM_c; //当前分值 每5分清0
static unsigned char TimeCountCM_c; //现走时,每单位5分
static unsigned char Flash_c; //闪烁计时
static unsigned char Cyc_c; //圆周显示计时
static unsigned char CycN_c;
void DelayNms(unsigned int MS_i);
void InitMCU(void);
void Display(unsigned char LED_c);
void main(void)
{
P1 = 0x00; //开机全LED亮2秒
P3 = 0xF0;
DelayNms(2000);
InitMCU();
while(1);
}
void InitMCU(void)
{
EA = 1; //允许CPU中断
ET0 = 1; //定时器0中断打开
TMOD = 0x1; //设定时器0为模式1,16位模式
TH0=0xB1;
TL0=0xDF; //设定时值为20000us(20ms)
TR0 = 1; //开始定时
State_b = 0;
Time_c = 1; //开机定时值为5分钟
TimeCountS_i = 0;
TimeCountM_c = 0;
TimeCountCM_c = 0;
Flash_c = 0;
CycN_c = 0;
Cyc_c = 0;
}
void Time0(void) interrupt 1
{
unsigned int Temp;
TH0=0xB2; //已修正35us
TL0=0x02; //设定时值为20000us(20ms)
Flash_c++;
if (Flash_c > 100)
Flash_c = 0;
Cyc_c++;
if (Cyc_c > 25)
Cyc_c = 0;
if (State_b==0)
StateT_i++; //设置时标计数
else
TimeCountS_i++; //走时时标计数
if (TimeCountS_i > 3000)
{
TimeCountM_c++; //分值进1
TimeCountS_i = 0; //毫秒值清零
}
if (TimeCountM_c == 5)
{
TimeCountCM_c++; //5分值进1
TimeCountM_c = 0; //分值清零
}
if (Time_c == TimeCountCM_c) //时间到
{
SON = 0; //响铃20秒
for(Temp=0; Temp<200; Temp++)
{
DelayNms(100);
if (KEY == 0)
Temp = 300; //当有按键时退出 无防抖必要
}
POW = 0;//控制电路断电
}
if (StateT_i == 200) //定时值设定后4秒或开机4秒,自动转入走时
State_b = 1;
if (KEY == 0)
{
DelayNms(30); //延时30ms
if (KEY == 0) //按键生效
{
if (State_b)//当前状态在走时中
{
POW = 0;//控制电路断电
while(1); //这里电路已失电停止动作了
}
else
{
//当前状态是设置状态时
Time_c++; //定时值加1
if (Time_c > 12)
Time_c = 1;
StateT_i = 0; //清除计数标识
}
}
DelayNms(300); //延时300ms
}
if (State_b)
{
if (CycN_c == 12)
CycN_c = 0; //一圈
if (Cyc_c == 0)
CycN_c++;
Display(CycN_c);
if (Flash_c > 50) //闪烁,当前走时处理
Display(TimeCountCM_c);
}
Display(Time_c); //目标定时值显示
DelayNms(4);
P1 = 0xFF;
P3 = P3 | 0x0F; //关显示
}
void DelayNms(unsigned int MS_i)
{
unsigned char Temp_i;
for(; MS_i > 0; MS_i--)
for(Temp_i = 0; Temp_i < 255; Temp_i++);
}
void Display(unsigned char LED_c)
{
switch (LED_c)
{
case 1: P1_1 = 0;
break;
case 2: P1_2 = 0;
break;
case 3: P1_3 = 0;
break;
case 4: P1_4 = 0;
break;
case 5: P1_5 = 0;
break;
case 6: P1_6 = 0;
break;
case 7: P1_7 = 0;
break;
case 8: P3_0 = 0;
break;
case 9: P3_1 = 0;
break;
case 10: P3_2 = 0;
break;
case 11: P3_3 = 0;
break;
case 12: P1_0 = 0;
break;
case 0: P1_0 = 0;
break;
}
}
这这这……去淘宝买个定时插座吧,9.9元包邮 改进的图片 有噪声。不方便嵌入到我的机器里面。谢谢您的回复 以前也喜欢晚上睡觉之前听听收音机,调成睡眠模式就OK了。现在听得少了,偶尔用手机听听FM。话说现在收音机应该都有定时关机功能了吧,为什么还要自己整呢,多麻烦啊。 这个电路不知道你有没有实际搭测过,应该是一个按键就实现了你的要求 买个电风扇定时开关,两根线,随便玩。 支持DIY支持DIY
页:
[1]