搜索
bottom↓
回复: 12

PIC12F508做的风扇控制器。

[复制链接]

出0入0汤圆

发表于 2014-6-21 16:58:01 | 显示全部楼层 |阅读模式
本帖最后由 yjbin 于 2014-6-21 18:53 编辑

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

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

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

用万用板焊接的线路板以及和风扇的结合。



所有的文档:




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

  10. //按键唤醒

  11. #include <pic.h>
  12. #include <xc.h>

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

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

  20. #define uchar unsigned char
  21. #define uint unsigned int


  22. #ifndef TRUE
  23. #define TRUE  1
  24. #endif

  25. #ifndef FALSE
  26. #define FALSE 0
  27. #endif

  28. #ifndef ON     //风扇开
  29. #define ON   0
  30. #endif

  31. #ifndef OFF   //风扇关闭
  32. #define OFF  1
  33. #endif

  34. uchar  speed1=5,speed2=3,speed3=5,speed4=3;//
  35. uchar model;
  36. bit Fan_Open;

  37. #define LED1   GP4
  38. #define LED2   GP2
  39. #define KEY1   GP3
  40. #define KEY2   GP4
  41. #define FAN1   GP0
  42. #define FAN2   GP1
  43. bit   KEY_F1,KEY_F2;   //读出休眠前的按键状态。;
  44. uchar  count;
  45. uint   Delay_Time;
  46. bit        LED2_F;
  47. bit        LED1_F;
  48. /***********函数声明***********/
  49. void wind ();
  50. uchar read_key(void);
  51. void keycount();
  52. void DelayMs(unsigned int msec);
  53. /***********初始化***********/
  54. void Init()
  55. {
  56.      TRIS=~0x3F;  //GP3输入,其它输出
  57.      OPTION = 0xC4; //分频器给定时器 32  4MHz
  58.      TMR0=0x64;   //5ms x=257-tJ/4F
  59.      Fan_Open=1;
  60.   LED1_F=1;
  61.   LED2_F=1;
  62.   Delay_Time=1800;
  63. }
  64. void  main()
  65. {   
  66. Init();

  67. while(1)
  68.    {
  69.       //  if((GPWUF==1)&&(KEY1==0))   //引脚引起的中断唤醒
  70.         //  {
  71.            //   Init();
  72.          // }
  73.        if(Fan_Open==0)
  74.         {
  75.          FAN1=OFF;
  76.          FAN2=OFF;
  77.          LED1=OFF;
  78.          LED2=OFF;
  79.          LED2_F=0;
  80.          LED1_F=0;
  81.          DelayMs(2000);//延时一段时间,避免按键没有起来就唤醒单片机了。
  82.          OPTION =0x24;  //引脚中断唤醒使能 弱上拉使能
  83.         // KEY_F2=KEY2;
  84.          KEY_F1=KEY1;   //读出休眠前的按键状态。
  85.          SLEEP();
  86.        }
  87.       if(TMR0==0xFF)
  88.            {
  89.              TMR0=0x63;   //
  90.              keycount();
  91.              count++;
  92.              if((count==100)||(count==200))
  93.              {
  94.                 if(LED1_F==1)
  95.                 {
  96.                  LED1=~LED1;
  97.                 }
  98.               if(LED2_F==1)
  99.                 {
  100.                  LED2=~LED2;
  101.                 }
  102.              }
  103.             if(count==200)//1s
  104.             {
  105.              count=0;
  106.              if(Fan_Open==1)
  107.               {
  108.              wind ();
  109.               }
  110.              Delay_Time--;
  111.              if(Delay_Time==0)//30分钟后全关闭,要重新按键开机才行
  112.                   {
  113.                   Fan_Open=0;
  114.                    }
  115.         }
  116.     }
  117.   }
  118. }

  119. void wind ()
  120. {
  121.   static unsigned char         KeyTask1=0,KeyTime1;
  122.   {
  123.           switch(KeyTask1)
  124.          {
  125.            case 0:
  126.                FAN1=ON;
  127.                FAN2=OFF;
  128.                KeyTime1=speed1;
  129.                KeyTask1=1;
  130.              break;
  131.           case 1:
  132.                 KeyTime1--;
  133.               if(KeyTime1==0) KeyTask1=2;
  134.              break;
  135.           case 2:
  136.                   FAN1=OFF;
  137.                   FAN2=OFF;
  138.                   KeyTime1=speed2;
  139.                   KeyTask1=3;
  140.                   break;
  141.           case 3:
  142.                  KeyTime1--;
  143.                 if(KeyTime1==0) KeyTask1=4;
  144.         break;
  145.           case 4:
  146.                   FAN1=OFF;
  147.                   FAN2=ON;
  148.                   KeyTime1=speed3;
  149.                  KeyTask1=5;
  150.                   break;
  151.           case 5:
  152.                  KeyTime1--;
  153.                 if(KeyTime1==0) KeyTask1=6;
  154.         break;
  155.           case 6:
  156.                   FAN1=OFF;
  157.                   FAN2=OFF;
  158.                   KeyTime1=speed4;
  159.                   KeyTask1=7;
  160.                   break;
  161.           case 7:
  162.                 KeyTime1--;
  163.                if(KeyTime1==0) KeyTask1=0;
  164.            break;
  165.         default:
  166.           break;
  167.     }
  168. }
  169. }


  170. uchar read_key(void)
  171. {
  172.   static unsigned char         KeyTask=0,KeyTime;
  173.    unsigned char           KeyVal=0;
  174.     switch(KeyTask)
  175.     {
  176.       case 0:
  177.           if (KEY1==0)
  178.                 {
  179.                  KeyTime=4;
  180.                  KeyTask++;
  181.                  }
  182.               break;
  183.         case 1:    KeyTime--;
  184.                    if(KeyTime==0) KeyTask++;
  185.               break;
  186.         case 2:
  187.             if (KEY1==0)
  188.                 {
  189.                  if(KEY1==0)   {KeyVal=1;}
  190.                   KeyTask++;
  191.                  }
  192.              else KeyTask=0;
  193.               break;
  194.        case 3:
  195.           if(KEY1==1)
  196.           {
  197.            KeyTime=4;
  198.            KeyTask++;
  199.            }
  200.             break;
  201.        case 4:
  202.            KeyTime--;
  203.            if(KeyTime==0)KeyTask++;
  204.              break;
  205.        case 5:
  206.            if(KEY1==1)
  207.             {
  208.               KeyTask=0;
  209.             }
  210.            else
  211.             {
  212.               KeyTask=3;
  213.             }
  214.            break;
  215.     default:
  216.       break;
  217.     }
  218.   return KeyVal;
  219. }

  220. void keycount()
  221. {
  222.        uchar Key=0;
  223.         Key = read_key();
  224.         if(Key!=0)
  225.         {
  226.                  Delay_Time=1800;
  227.             if((Key==1)&&(Fan_Open==1))  //关闭的时候不响应
  228.                 {
  229.                 if(++model==5)
  230.                   {
  231.                    model=0;
  232.                   }
  233.                   switch(model)
  234.                   {
  235.                 case 1:      //弱风
  236.                            speed1=1;
  237.                            speed2=5;
  238.                                  speed3=3;
  239.                                  speed4=5;
  240.                                  LED2=OFF;
  241.                                  LED1=ON;
  242.                                  LED1_F=1;
  243.                                  LED2_F=0;
  244.                    break;
  245.                  case 2:   //中风
  246.                          speed1=5;
  247.                          speed2=5;
  248.                          speed3=5;
  249.                          speed4=5;
  250.                          LED1=OFF;                                    
  251.                                                  LED2=ON;
  252.                          LED2_F=1;
  253.                          LED1_F=0;
  254.                    break;
  255.                 case 3:  //强风
  256.                            speed1=5;
  257.                            speed2=3;
  258.                            speed3=5;
  259.                            speed4=3;
  260.                            LED1=ON;
  261.                            LED2=ON;
  262.                            LED1_F=1;
  263.                            LED2_F=1;
  264.                    break;
  265.                 case 4:
  266.                          Fan_Open=0;
  267.                    break;
  268.                  default:
  269.                      break;
  270.                   }
  271.             }
  272.         }
  273.         Key=0;
  274. }


  275. void DelayMs(unsigned int msec)
  276. {
  277.         unsigned int x,y;

  278.         for(x=0; x<=msec;x++)
  279.                 {
  280.                         for(y=0;y<=110;y++);
  281.                 }
  282. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入20汤圆

发表于 2014-6-21 17:03:54 | 显示全部楼层
好。程序书写中规!

出0入17汤圆

发表于 2014-6-21 17:15:13 | 显示全部楼层
mark  光耦可控硅

出0入0汤圆

发表于 2014-6-21 18:16:29 | 显示全部楼层
谢谢楼主的共享!

出0入0汤圆

发表于 2014-6-21 18:26:43 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

 楼主| 发表于 2014-6-21 19:39:36 | 显示全部楼层
经过多次的补充,材料基本完整了。可以作为实例了。盼望穿裤子啊。

出0入0汤圆

发表于 2014-6-21 22:01:51 | 显示全部楼层
收藏一下

出0入0汤圆

发表于 2014-6-21 23:10:09 | 显示全部楼层
我就好奇这个莫老大会给穿裤子嘛

出0入0汤圆

发表于 2014-6-22 18:20:04 | 显示全部楼层
mark               

出0入0汤圆

发表于 2014-7-11 20:33:28 | 显示全部楼层
楼主请问一下,有xc.h头文件吗?508FAN.rar文件里,缺这个文件。谢谢。

出0入0汤圆

发表于 2014-7-12 00:58:15 | 显示全部楼层
没有过零检测如何调速?

出0入12汤圆

发表于 2014-7-12 07:29:06 来自手机 | 显示全部楼层
馬克......

出0入0汤圆

发表于 2014-7-12 07:36:41 | 显示全部楼层
制作贴要支持。当然我纯粹路过帮顶用不上
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 16:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表