本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
近日同时要我给他做个电饭锅控制器,早上接上电,中午回家饭就做好了。(又懒又抠,中午做说耽误时间,直接买个全自动又说贵,开个玩笑,人家为人很好的)
老婆不在家,大干一场。正好在不同单片机的同事里显屁显屁。
思路:单片机用来定时,通过继电器控制插排。
把插排中的开关拆下,换上继电器。
这是给使用者看的
定时插排控制器 使用说明
★功能:
●在设定的定时时间到达时,自动启动插排,供其他电器用电。(负载不得超过1000W)
●可设时间为:0~225分钟,级差15分钟,总定时时间为各点亮的指示灯对应数字之和。
●断电保护:若控制器意外断电,则切断插排,即使再次来电,也不会启动。建议控制器电源与插排插头接在同一电源上。
★指示灯说明:
●120 此灯亮,定时时间加120分,不亮则不加。
●60 此灯亮,定时时间加60分,不亮则不加
●30 此灯亮,定时时间加30分,不亮则不加
●15 此灯亮,定时时间加15分,不亮则不加
●sec 此灯常亮,表示控制器电源通,但未进行定时工作。此灯闪烁,表示定时器正在工作。到定时结束时,⊙亮,插排接通。
●⊙ 插排接通时,此灯亮。
★按键说明:
●120 定时时间中加120,对应灯亮。
●60 定时时间中加120,对应灯亮
●30 定时时间中加120,对应灯亮
●15 定时时间中加120,对应灯亮
●⊙ 设定好定时时间后,按该键启动定时(sec闪烁),若设定时间为零,则马上接通插排。或在定时过程中终止定时(sec常亮),若此时插排已经通电,则自动切断插排。
★使用方法:
●连接:将插排上的小插头,插入控制器右侧的插座,部分正负。然后将控制器电源插入控制器顶部的插座,分正负,注意方向。
●设定:默认定时为0分,按⊙则可接通或断开插排。若需设定定时时间,按相应数字的按键即可。总时间为对应数字相加。
例:若120,60,15亮,时间为:120+60+15=195分
若 60,30亮,时间为: 60+30=90分
此过程,必须在sec常亮(即定时器未工作并且插排未接通时)时进行。设定好时间后,按⊙启动定时器即可。
注意:由于此定时器只有开机设定,无关机设定,故此定时器只能用于可自动断电的电器(电饭煲,自动烧水壶等)的延时开机操作。无人看守时,绝对不可用于加热棒等危险电器的使用。为了您和他人的生命安全,请注意用电安全。
#include <reg52.h>
sbit jidianqi=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;//zhishi
sbit led6=P1^6;//tongdian
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
unchar wantdisp[]={0,0,0,0,0,0};
unchar disp_num_code[]={0x3f/*0*/,0x06/*1*/,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f/*9*/,0x80/*.10*/,0x40/*-11*/,0x00,
0x77/*a13*/,0x7c/*b14*/,0x39/*c15*/,0x5e/*d16*/,0x79/*e17*/,0x71/*f18*/,0x00/*g19*/,
0x76/*h20*/,0x04/*i21*/,0x0e/*j22*/,0x70/*k23*/,0x38/*l24*/,0x37/*m25*/,0x54/*n26*/,
0x5c/*o27*/,0x73/*p28*/,0x67/*q29*/,0x50/*r30*/,0x00/*s31*/,0x78/*t32*/,
0x3e/*u33*/,0x1c/*v34*/,0x7e/*w35*/,0x00/*x36*/,0x6e/*y37*/,0x00/*z38*/};
unchar i;
void displayer()
{
P0=disp_num_code[wantdisp];
delay(1);
i--;
P2=P2>>1;
if (P2==0x00)
{
delay(1);
P2=0x20;
i=5;
}
}
void chaishuzi(n)
{
wantdisp[0]=n/100000;
wantdisp[1]=n/10000%10;
wantdisp[2]=n/1000%10;
wantdisp[3]=n/100%10;
wantdisp[4]=n/10%10;
wantdisp[5]=n%10;
}
unchar sec,min,hour,count,halfsec,delay_time,aa,dl_1,dl_2,dl_3,dl_4;
bit key1_mark,key2_mark,key3_mark,key4_mark,work_mark;
void timer0(void) interrupt 1
{
//中断程序
count++;
if (count==10)
{
count=0;
if (work_mark) {led5=!led5;}
halfsec++;
if (halfsec==2)
{
halfsec=0;
sec++;
if(sec==60)
{
sec=0;
aa=++min;
if (min==250)
{
min=0;
}
}
}
if (delay_time-aa==0&&work_mark&&sec==0)
{
led6=0;
jidianqi=0;
aa=0;
}
/*if(!work_mark)
{
led6=1;
jidianqi=1;
}
*/
}
TH0=(65536-46080)/256;//50ms中断一次
TL0=(65536-46080)%256;
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;//50ms中断一次
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
led5=0;
delay_time=0;
aa=0;
sec=0;
min=0;
dl_1=120;//key1代表的时间(分)
dl_2=60;
dl_3=30;
dl_4=15;
for(;;)
{
displayer();
if (!key1&&!work_mark)
{
delay(10);
if (!key1)
{
key1_mark=!key1_mark;
led1=!key1_mark;
if (key1_mark)
{
delay_time=delay_time+dl_1;
}
if (!key1_mark)
{
delay_time=delay_time-dl_1;
}
chaishuzi(delay_time);
while(!key1);
}
}
if (!key2&&!work_mark)
{
delay(10);
if (!key2)
{
key2_mark=!key2_mark;
led2=!key2_mark;
if (key2_mark)
{
delay_time=delay_time+dl_2;
}
if (!key2_mark)
{
delay_time=delay_time-dl_2;
}
chaishuzi(delay_time);
while(!key2);
}
}
if (!key3&&!work_mark)
{
delay(10);
if (!key3)
{
key3_mark=!key3_mark;
led3=!key3_mark;
if (key3_mark)
{
delay_time=delay_time+dl_3;
}
if (!key3_mark)
{
delay_time=delay_time-dl_3;
}
chaishuzi(delay_time);
while(!key3);
}
}
if (!key4&&!work_mark)
{
delay(10);
if (!key4)
{
key4_mark=!key4_mark;
led4=!key4_mark;
if (key4_mark)
{
delay_time=delay_time+dl_4;
}
if (!key4_mark)
{
delay_time=delay_time-dl_4;
}
chaishuzi(delay_time);
while(!key4);
}
}
if(!key5)
{
delay(10);
if(!key5)
{
work_mark=!work_mark;
if (work_mark)
{
sec=0;
min=0;
count=0;
halfsec=0;
aa=0;
}
if(!work_mark)
{
led5=0;
led6=1;
jidianqi=1;
}
while(!key5);
}
}
}
}
程序中的数码管显示部分是我在调试的时候用的,给他做的没有显示(焊起来太麻烦,有增大成本,所以只用了指示灯),
[ 此贴被taowenming在2010-01-16 16:45重新编辑 ]
|
|