4035|7

23

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

PIC12F508做的风扇控制器 [复制链接]



PIC12F508单片机是没有中断的,定时器、按键中断只能是查询方式。

编译器用的XC8,编译环境IDE用的是MPLAB X IDE。

下载器是PICKIT3.
原来的电风扇就两个档,不能摇头,一直对着人吹,对健康不利。所以进行改造。
功能与结构:
两个LED是指示灯,闪烁是为了省电。
控制器交流电用的是TLP3503,是光耦可控硅。
按键可以选择弱风、中风、强风和关机,关机后,单片机是掉电模式。关机模式时,此按键可以把单片机唤醒。
不管什么情况,只要不按键,半个小时候,关机,处于掉电模式

//***************************************************
//           __________________
//       VDD-| 1            8 |-VSS
//       GP5-| 2           27 |-GP0/DAT
//       GP4-| 3           26 |-GP1/CLK
//GP3/RMCLR--| 4           25 |-GP2
//           |________________|
//               12F508
//***************************************************

//按键唤醒

#include
#include

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config OSC = IntRC      // Oscillator Selection bits (internal RC oscillator)
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT Enable )
#pragma config CP = OFF         // Code Protection bit (Code protection off)
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital input, MCLR internally tied to VDD)

#define uchar unsigned char
#define uint unsigned int


#ifndef TRUE
#define TRUE  1
#endif

#ifndef FALSE
#define FALSE 0
#endif

#ifndef ON     //风扇开
#define ON   0
#endif

#ifndef OFF   //风扇关闭
#define OFF  1
#endif

uchar  speed1=5,speed2=3,speed3=5,speed4=3;//
uchar model;
bit Fan_Open;

#define LED1   GP4
#define LED2   GP2
#define KEY1   GP3
#define KEY2   GP4
#define FAN1   GP0
#define FAN2   GP1
bit   KEY_F1,KEY_F2;   //读出休眠前的按键状态。;
uchar  count;
uint   Delay_Time;
bit        LED2_F;
bit        LED1_F;
/***********函数声明***********/
void wind ();
uchar read_key(void);
void keycount();
void DelayMs(unsigned int msec);
/***********初始化***********/
void Init()
{
     TRIS=~0x3F;  //GP3输入,其它输出
     OPTION = 0xC4; //分频器给定时器 32  4MHz
     TMR0=0x64;   //5ms x=257-tJ/4F
     Fan_Open=1;
  LED1_F=1;
  LED2_F=1;
  Delay_Time=1800;
}
void  main()
{   
Init();

while(1)
   {
      //  if((GPWUF==1)&&(KEY1==0))   //引脚引起的中断唤醒
        //  {
           //   Init();
         // }
       if(Fan_Open==0)
        {
         FAN1=OFF;
         FAN2=OFF;
         LED1=OFF;
         LED2=OFF;
         LED2_F=0;
         LED1_F=0;
         DelayMs(2000);//延时一段时间,避免按键没有起来就唤醒单片机了。
         OPTION =0x24;  //引脚中断唤醒使能 弱上拉使能
        // KEY_F2=KEY2;
         KEY_F1=KEY1;   //读出休眠前的按键状态。
         SLEEP();
       }
      if(TMR0==0xFF)
           {
             TMR0=0x63;   //
             keycount();
             count++;
             if((count==100)||(count==200))
             {
                if(LED1_F==1)
                {
                 LED1=~LED1;
                }
              if(LED2_F==1)
                {
                 LED2=~LED2;
                }
             }
            if(count==200)//1s
            {
             count=0;
             if(Fan_Open==1)
              {
             wind ();
              }
             Delay_Time--;
             if(Delay_Time==0)//30分钟后全关闭,要重新按键开机才行
                  {
                  Fan_Open=0;
                   }
        }
    }
  }
}

void wind ()
{
  static unsigned char         KeyTask1=0,KeyTime1;
  {
          switch(KeyTask1)
         {
           case 0:
               FAN1=ON;
               FAN2=OFF;
               KeyTime1=speed1;
               KeyTask1=1;
             break;
          case 1:
                KeyTime1--;
              if(KeyTime1==0) KeyTask1=2;
             break;
          case 2:
                  FAN1=OFF;
                  FAN2=OFF;
                  KeyTime1=speed2;
                  KeyTask1=3;
                  break;
          case 3:
                 KeyTime1--;
                if(KeyTime1==0) KeyTask1=4;
        break;
          case 4:
                  FAN1=OFF;
                  FAN2=ON;
                  KeyTime1=speed3;
                 KeyTask1=5;
                  break;
          case 5:
                 KeyTime1--;
                if(KeyTime1==0) KeyTask1=6;
        break;
          case 6:
                  FAN1=OFF;
                  FAN2=OFF;
                  KeyTime1=speed4;
                  KeyTask1=7;
                  break;
          case 7:
                KeyTime1--;
               if(KeyTime1==0) KeyTask1=0;
           break;
        default:
          break;
    }
}
}


uchar read_key(void)
{
  static unsigned char         KeyTask=0,KeyTime;
   unsigned char           KeyVal=0;
    switch(KeyTask)
    {
      case 0:
          if (KEY1==0)
                {
                 KeyTime=4;
                 KeyTask++;
                 }
              break;
        case 1:    KeyTime--;
                   if(KeyTime==0) KeyTask++;
              break;
        case 2:
            if (KEY1==0)
                {
                 if(KEY1==0)   {KeyVal=1;}
                  KeyTask++;
                 }
             else KeyTask=0;
              break;
       case 3:
          if(KEY1==1)
          {
           KeyTime=4;
           KeyTask++;
           }
            break;
       case 4:
           KeyTime--;
           if(KeyTime==0)KeyTask++;
             break;
       case 5:
           if(KEY1==1)
            {
              KeyTask=0;
            }
           else
            {
              KeyTask=3;
            }
           break;
    default:
      break;
    }
  return KeyVal;
}

void keycount()
{
       uchar Key=0;
        Key = read_key();
        if(Key!=0)
        {
                 Delay_Time=1800;
            if((Key==1)&&(Fan_Open==1))  //关闭的时候不响应
                {
                if(++model==5)
                  {
                   model=0;
                  }
                  switch(model)
                  {
                case 1:      //弱风
                           speed1=1;
                           speed2=5;
                                 speed3=3;
                                 speed4=5;
                                 LED2=OFF;
                                 LED1=ON;
                                 LED1_F=1;
                                 LED2_F=0;
                   break;
                 case 2:   //中风
                         speed1=5;
                         speed2=5;
                         speed3=5;
                         speed4=5;
                         LED1=OFF;                                    
                                                 LED2=ON;
                         LED2_F=1;
                         LED1_F=0;
                   break;
                case 3:  //强风
                           speed1=5;
                           speed2=3;
                           speed3=5;
                           speed4=3;
                           LED1=ON;
                           LED2=ON;
                           LED1_F=1;
                           LED2_F=1;
                   break;
                case 4:
                         Fan_Open=0;
                   break;
                 default:
                     break;
                  }
            }
        }
        Key=0;
}


void DelayMs(unsigned int msec)
{
        unsigned int x,y;

        for(x=0; x<=msec;x++)
                {
                        for(y=0;y<=110;y++);
                }
}





最新回复

学习了  详情 回复 发表于 2015-4-25 09:12

赞赏

1

查看全部赞赏

点赞 关注(1)
 

回复
举报

2856

帖子

260

TA的资源

五彩晶圆(高级)

沙发
 
本帖最后由 ltbytyn 于 2014-6-24 20:35 编辑

我对TLP3503的兴趣大于文章本身。TLP3503不是什么光耦可控硅,确切叫法应该是过零光耦,作用电压过零切入,防止切入时产生电弧。外部接个可控硅来驱动电机。
TLP3503资料.pdf (170.09 KB, 下载次数: 31)
 
 
 

回复

3191

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
PIC12F508能容纳这么多C代码吗?
 
个人签名为江山踏坏了乌骓马,为社稷拉断了宝雕弓。
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
nice
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 
厉害哦 谢谢分享哦
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

6
 
好!有启发。我也早想在家里的电器上能够用单片机改造下,如电饭煲等。
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

7
 
好东西,最近在弄个电话机,上面用的508 正好参考下,对编译器不太熟悉
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表