haoDIY创好电子音响电脑科技DIY小制作发明移动版

主页 > 电子DIY > 单片机 >

diy电风扇简易定时控制器

本身的床头电扇的机器按时器坏掉了,筹备51单片机给计划了一个.措施在尝试板初法式试通过,守候元件寄到就可以做板子了,只是有点挥霍单片机的资源。

一,计划思绪:

2.        按键部门:

3.        继电器部门:

二,道理图

diy电风扇简易定时控制器

 

三,措施清单

/*********************************************
体系名称:电电扇浅显按时节制器
创键人:w418781840 日期:2008.7.6
体系成果:
**********************************************/
/*********************************************
函数名称: 声明区
成果描写:
**********************************************/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define SEG P0 //数码管段选.
#define DIG P2 //数码管位选
uchar dis[2]; //数码驱动组
uchar code TAB[]={ 0xC0,0xF9,0xA4,0xB0,0x99,//0-4共阳.
      0x92,0x82,0xF8,0x80,0x90,0xff};//5-9,熄灭符
uchar start,stop,close,sum,time; //各其本变量
uchar fliflag,cflag,zflag,x,y;//各符号位
uint count_T0,count_T1,c_count; //计数变量
sbit K1=P3^7; //成果移位键
sbit K2=P3^2; //加一键和切换移位键.
sbit K3=P3^3; //减一.
sbit RLED=P2^2; //红灯,表电扇动弹状态.
sbit YLED=P2^3; //黄灯,表电扇停息状态
sbit BLED=P2^4; //蓝灯,表体系状态
sbit CLED=P2^6; //电扇节制位
sbit ZLED=P2^7; //体系事变节制位
/*********************************************
函数名称:延时1MS函数    
成果描写:表现挪用.
**********************************************/
void delay1ms(uchar x)
{
uchar i,j;
for(i=0;i<x;i++)
   for(j=0;j<120;j++);
}

/*********************************************
函数名称:表现函数
成果描写: 表现分走时,两位表现.
**********************************************/
void display(void)
{
uchar i,scan=1;
for(i=0;i<2;i++)
{ SEG=0xff;
   DIG=~scan;
   SEG=TAB[dis[i]];
   delay1ms(5);
   scan<<=1;
}
}
/*********************************************
函数名称:延时5MS函数
成果描写:按键消抖挪用.
**********************************************/
void delay5ms(uchar x)
{
uchar j;
for(j=0;j<x;j++)
   display();
}

/*********************************************
函数名称: 初始化函数
成果描写: 各变量初始化.
**********************************************/
void init()
{ 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;
}
/*********************************************
函数名称: 疏散函数
成果描写: 疏散表现十位,个位
**********************************************/
void disnner(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分钟.
**********************************************/
void timer0(void)interrupt 1
{ 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间断处事函数
成果描写: 调解时刻闪烁用.
**********************************************/
void timer1(void)interrupt 3
{
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;
   }
}
}
/*********************************************
函数名称:键扫描函数
成果描写: 调解时刻
**********************************************/
void scanner(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(); //检测按键..
}
}

(责任编辑:admin)
    haoDIY创好电子 版权所有,电话微信13977534587