自己的床头电扇的机械守时器坏掉了,预备51单片机给规划了一个.程序在试验板开端调试经过,等候元件寄到就可以做板子了,仅仅有点糟蹋单片机的资源。
一,规划思路:
开端经过手动键给单片机供电。直到电源指示灯LED4亮.单片机运转,继电器2作业给单片机供电。经过按键设置继电器2的作业时刻,完成体系的主动断电,经过设置继电器1的作业时刻,完成电扇的间歇滚动,完成节能。
1.显现部分:经过按键,在电扇滚动时刻,暂停时刻,和体系封闭剩余时刻切换显现。数码显现两位,为“分”走时,其间体系封闭剩余时刻为“小时”走时,LED为红,黄,蓝,别离点亮对应的电扇滚动,暂停,和体系封闭剩余时刻的状况。
2.按键部分:
lK1为时刻调整移位键,按下此键,数码闪耀,一起对应的灯闪耀。在电扇滚动时刻,暂停时刻,和体系之间切换
lK2为加一和状况切换显现键,当有K1按下,为时刻加1。不然,在在电扇滚动时刻,暂停时刻,和体系之间切换显现。
lK3为减1和备用键,当有K1按下,为时刻加1,不然无效。
3.继电器部分:
l继电器1操控电扇的电源线,完成电扇的滚动和暂时。
l继电器2操控单片机体系的电源,完成体系守时封闭。
二,原理图
三,程序清单
/*********************************************
体系称号:电电扇简易守时操控器
创键人:w418781840日期:2008.7.6
体系功用:
**********************************************/
/*********************************************
函数称号:声明区
功用描绘:
**********************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSEGP0//数码管段选.
#defineDIGP2//数码管位选
uchardis[2];//数码驱动组
ucharcodeTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,//0-4共阳.
0x92,0x82,0xF8,0x80,0x90,0xff};//5-9,平息符
ucharstart,stop,close,sum,time;//各其本变量
ucharfliflag,cflag,zflag,x,y;//各标志位
uintcount_T0,count_T1,c_count;//计数变量
sbitK1=P3^7;//功用移位键
sbitK2=P3^2;//加一键和切换移位键.
sbitK3=P3^3;//减一.
sbitRLED=P2^2;//红灯,表电扇滚动状况.
sbitYLED=P2^3;//黄灯,表电扇暂停状况
sbitBLED=P2^4;//蓝灯,表体系状况
sbitCLED=P2^6;//电扇操控位
sbitZLED=P2^7;//体系作业操控位
/*********************************************
函数称号:延时1MS函数
功用描绘:显现调用.
**********************************************/
voiddelay1ms(ucharx)
{
uchari,j;
for(i=0;iX;I++)
for(j=0;j120;j++);
}
/*********************************************
函数称号:显现函数
功用描绘:显现分走时,两位显现.
**********************************************/
voiddisplay(void)
{
uchari,scan=1;
for(i=0;i2;i++)
{SEG=0xff;
DIG=~scan;
SEG=TAB[dis[i]];
delay1ms(5);
scan=1;
}
}
/*********************************************
函数称号:延时5MS函数
功用描绘:按键消抖调用.
**********************************************/
voiddelay5ms(ucharx)
{
ucharj;
for(j=0;jX;J++)
display();
}
/*********************************************
函数称号:初始化函数
功用描绘:各变量初始化.
**********************************************/
voidinit()
{fliflag=0;//闪耀标志.
cflag=1;//电扇状况标志.
zflag=0;//滚动标志.
x=30;//暂存
y=10;//暂存
CLED=1;//体系作业.
sum=0;//移位
start=30;//电扇滚动时刻
stop=10;//暂停时刻.
close=5;//体系封闭剩余时刻
count_T0=0;//T0,T1相关
count_T1=0;
c_count=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
}
/*********************************************
函数称号:别离函数
功用描绘:别离显现十位,个位
**********************************************/
voiddisnner(void)
{if(cflag==1)//1
{RLED=0;YLED=1;BLED=1;//红灯闪耀.
time=start;//显现滚动时刻.
}
if(cflag==2)
{RLED=1;YLED=0;BLED=1;
time=stop;
}
if(cflag==3)
{RLED=1;YLED=1;BLED=0;
time=close;
}
dis[0]=time/10;
dis[1]=time%10;
}
/*********************************************
函数称号:T0中止函数
功用描绘:发生1分钟.
**********************************************/
voidtimer0(void)interrupt1
{TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++count_T0==1200)//一分钟.
{count_T0=0;
if(zflag==0)//为0
{ZLED=1;//则滚动.
if(start!=99)//滚动时刻为99,显现99,不切换标志.一向滚动.
{
start–;//不,则倒计时.
if(start==0)
{zflag=1;//倒时时刻到.切换标志.
cflag=2;
start=x;//重赋值
}
}
}
else
{ZLED=0;//不然暂停.
stop–;//倒计时计数.
if(stop==0)
{cflag=1;//时刻到.
zflag=0;
stop=y;
}
}
if(close!=99)//体系时刻为99,显现99,体系一向作业..
{if(++c_count==60)//对一分计数60,即一小时后.
{c_count=0;
close–;//做一小时倒计时.
if(close==0)//时刻到,体系断电.
CLED=0;//低电平有用.
}
}
}
disnner();//别离.送显现/
}
/*********************************************
函数称号:T1中止服务函数
功用描绘:调整时刻闪耀用.
**********************************************/
voidtimer1(void)interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(++count_T1==6)//闪耀周期30MS
{
count_T1=0;
fliflag=~fliflag;//切换
if(fliflag==0)//标志有用.
{
if(sum==1)cflag=1;//选用状况闪耀.
if(sum==2)cflag=2;
if(sum==3)cflag=3;
disnner();//闪耀用.
dis[0]=10;//放平息符.
dis[1]=10;
}
else//不然,正常显现.
{
RLED=1;YLED=1;BLED=1;
dis[0]=time/10;
dis[1]=time%10;
}
}
}
/*********************************************
函数称号:键扫描函数
功用描绘:调整时刻
**********************************************/
voidscanner(void)
{if(K1==0)//为0,表有键按下.
{
delay5ms(100);//延时500MS.
if(K1==0)//还按下.刚退出.
{
while(K1==0)display();//等候开释.
delay5ms(2);//消抖.
cflag=1;//退出显现状况1.
count_T0=0;
TR0=1;//发动T0
TR1=0;//关闪耀
sum=0;//归位.
x=start;//暂存.
y=stop;//暂存.
}
else
{//不然,有移位键按下.
TR0=0;//时刻走动中止.
TR1=1;//开闪耀.
sum++;//移位.
if(sum==4)
sum=1;
}
}
if(K2==0)
{
delay5ms(2);
if(K2==0)
{
while(K2==0)display();
delay5ms(2);
if(sum)//有移位
{if(sum==1)
{
start++;
if(start==61)
start=99;
if(start==100)
start=30;
}
if(sum==2)
{
stop++;
if(stop==61)
stop=5;
}
if(sum==3)
{
close++;
if(close==9)
close=99;
if(close==100)
close=1;
}
}
else//没移位.
{
cflag++;//则进行显现状况移位.
if(cflag==4)
cflag=1;
}
}
}
if(K3==0)
{
delay5ms(2);
if(K3==0)
{
while(K3==0)display();
delay5ms(2);
if(sum==1)
{start–;
if(start==29)
start=99;
if(start==98)
start=60;
}
if(sum==2)
{stop–;
if(stop==4)
stop=60;
}
if(sum==3)
{close–;
if(close==0)
close=99;
if(close==98)
close=8;
}
}
}
}
/*********************************************
函数称号:主函数
功用描绘:
**********************************************/
main()
{
init();
while(1)
{
display();//显现
scanner();//检测按键..
}
}