找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6395|回复: 13
收起左侧

用51单片机编程修复遥控电风扇 带源码

  [复制链接]
ID:235106 发表于 2017-9-23 17:01 | 显示全部楼层 |阅读模式
家里的遥控电风扇主板主控烧坏了,闲着没事用多年没有玩的51单片机进行编制程序,将原来的主板上的单片机拆除,各个功能按键和指示灯不动,把51单片机对应各个功能管脚用飞线接上,再用502胶水给固定住,防止松动。下来用KELL软件编程。经测试一切正常带自然风、睡眠风、定时功能;取消原来的遥控功能(因个人爱好,很少用遥控)。待源码需要的朋友随意下。单片机为89C51或52都行,注意时钟:11.0592,不同时钟定时时间差异大。

单片机源程序如下:
  1. /************************************************************************
  2.   家里的遥控电风扇主板烧坏了,闲着没事用闲置的STC89C51单片机做了一个控制板
  3.   不带遥控,利用原来的按键进行设计一个控制板,经测试一切运行正常。
  4. **********************************************************************/
  5. #include <reg52.h>
  6. #define  uint unsigned int   //宏定义
  7. #define uchar unsigned char
  8. uint  second,  second1, tcount, tcount1,miao;
  9. uchar anjian,jishu,jishu1,dingshi;
  10. uchar m,n,a,b,c;
  11. /*===================关机特殊功能定义======================*/
  12. sfr ISP_CONTR=0xe7;           //特殊功能寄存器定义
  13. /*=============================按键功能定义=================*/
  14. sbit s1=P3^7;        //开机、关机与 风类选择
  15. sbit s2=P3^3;        //        关机
  16. sbit s3=P3^5;        //摇头
  17. sbit s4=P3^6;        //定时开关
  18. /*==========================输出功能IO口定义==================*/
  19. sbit sui_mian_feng =P0^0;         //睡眠风指示
  20. sbit zi_ran_feng= P0^1;         //自然风指示
  21. sbit gao_su=P2^5;        //高速指示
  22. sbit zhong_su=P2^6;         //中速指示
  23. sbit di_su=P2^7;          //低速指示
  24. sbit beep_out=P2^4;                //蜂鸣输出
  25. sbit yao_tou_out=P2^3; //摇头 输出
  26. sbit gao_su_out=P2^0;        //高速 输出
  27. sbit zhong_su_out=P2^1;//中速输出
  28. sbit di_su_out=P2^2;   //低速输出
  29. /*============工作时间状态指示LED灯的IO口定义===================*/
  30. sbit timer_30=P1^0;         //定时30分钟LED指示
  31. sbit timer_1h=P1^1;         //定时1小时LED指示
  32. sbit timer_2h=P1^2;         //        定时2小时LED指示
  33. sbit timer_4h=P1^3;        // 定时4小时LED指示
  34. /*=========================延时时间函数=======================*/
  35. void delay_1 (char sum)                   //按键消抖延时
  36. {        char x,y;
  37.     for        (x=sum;x>0;x--)
  38.                  for (y=0;y<100;y++);
  39. }
  40. void delay_2 (char sum)                   //蜂鸣频率延时时间(82us)
  41. {        char x,y;
  42.     for        (x=sum;x>0;x--)
  43.                  for (y=0;y<20;y++);
  44. }
  45. void delay_3 (uint sum)                   //风速延时时间 25.3        毫秒
  46. {        uint x,y;
  47.     for        (x=sum;x>0;x--)
  48.                  for (y=0;y<5000;y++);
  49. }
  50. void  feng_min (char sum)                   //蜂鸣器声音
  51. {         char i;
  52.     for        (i=sum;i<100;i++)
  53.                 { beep_out=0;
  54.                   delay_2 (10);                //10*20 时间
  55.                   beep_out=1;
  56.                   delay_2 (10);
  57.                  }
  58. }
  59. /*=================定时器0初始化=====================*/
  60. void timer1_int (void)                 //定时器中断0         初始化
  61. {   TMOD|=0x01;                                // 定时器0工作模式 1
  62.         TH0=0x16;                           //放定时初值
  63.     TL0=0xf6;                          //放定时初值
  64.     TR0=0;                                  //关闭定时器(暂时未开启)
  65.     ET0=0;                                  //开启中断
  66.         PT0=1;                                  //中断优先级1
  67.         EA =1;
  68. }
  69. /*=================定时器1初始化=====================*/
  70. void timer2_int (void)                //风类定时器中断 1 初始化
  71. {        TMOD|=0x20;                          //工作模式2
  72.     TH1=0x06;                        // 设定初始值        50ms
  73.     TL1=0x06;                   //设定初始值
  74.     TR1=0;                          //开启定时器
  75.     ET1=0;                           //开启外部中断
  76.         PT1=0;                                //中断优先级0
  77.         EA =1;                                //开启总中断开关
  78. }
  79. /*====================外部中断1初始化=====================*/
  80. void guan_ji_int(void)                   //外部中断 1
  81. {
  82.    EA =1;                                 //中断总开关
  83.    EX1=1;                                //中断开关
  84.    IT1=0;                        // 触发方式0,低电平触发
  85.    PX1=1;                 //中断优先级 最高
  86. }
  87. /*======================外部中断1程序======================*/
  88. void guan_ji(void) interrupt 2 using 2                 //关机的外部中断 2
  89. {
  90.           if (s2==0&&s3!=0&&anjian>=1)                // 关机
  91.              {   
  92.                     delay_1(100);
  93.                     if (s2==0&&s3!=0&&anjian>=1)
  94.                             { while (s2==0) ;         //按键松手检测
  95.                                   switch (1)
  96.                                   { case (1):  feng_min (1);ISP_CONTR=0x20;break;}//蜂鸣后、关机、整机复位  
  97.                                 }       
  98.                  }
  99.           if (s3==0&&anjian>=1 )
  100.                     {        delay_1(100);
  101.                     if (s3==0&&anjian>=1)
  102.                             {   while (s3==0) ;
  103.                                         jishu++;
  104.                                      switch (1)
  105.                                           { case (1):  feng_min (1); yao_tou_out=0;  break;
  106.                                                                 default:   feng_min (1);yao_tou_out=1; jishu=0 ;break;
  107.                                                           }
  108.                                   }
  109.                     }
  110.           if (s4==0&&anjian>=1)                        //风扇定时工作时间程序
  111.                     {  delay_1(100);                //        100*100 时间
  112.                            if (s4==0)
  113.                                 { dingshi++;
  114.                                   while (s4==0);
  115.                                   switch (dingshi)
  116.                                          { case (1):
  117.                                                             feng_min (1); TR0=1;ET0=1;miao=1800;timer_30=0;                  break;            //0.5 小时
  118.                                                    case (2):                                                                  
  119.                                                             feng_min (1); TR0=1;ET0=1;miao=3600;timer_30=1;timer_1h=0;        break;                //1 小时
  120.                                                    case (3):
  121.                                                             feng_min (1); TR0=1;ET0=1;miao=5400;timer_30=0;timer_1h=0;        break;                //1.5 小时
  122.                                                    case (4):
  123.                                                             feng_min (1); TR0=1;ET0=1;miao=7200;timer_30=1;timer_1h=1;timer_2h=0;break;         //2 小时
  124.                                                    case (5):
  125.                                                             feng_min (1); TR0=1;ET0=1;miao=9000;timer_30=0;timer_2h=0;break;                //2.5 小时
  126.                                                    case (6):
  127.                                                             feng_min (1); TR0=1;ET0=1;miao=10800;timer_30=1;timer_2h=0;        timer_1h=0;gao_su=1;        break;        //3小时
  128.                                                    case (7):
  129.                                                             feng_min (1); TR0=1;ET0=1;miao=14400;timer_2h=1;timer_1h=1;        timer_4h=0;gao_su=1;        break;        //4 小时
  130.                                                    case (8):
  131.                                                             feng_min (1); TR0=1;ET0=1;miao=28800;timer_1h=0;timer_4h=0;        gao_su=1;            break;                //5 小时
  132.                                                    case (9):
  133.                                                             feng_min (1);TR0=1;ET0=1;miao=28800;timer_1h=1;        timer_2h=0;timer_4h=0;        break;                //6 小时
  134.                                                    case (10):
  135.                                                             feng_min (1);TR0=1;ET0=1;miao=28800;timer_1h=0;timer_2h=0;timer_4h=0;        break;                //7 小时
  136.                                                    case (11):
  137.                                                             feng_min (1);TR0=1;ET0=1;miao=28800;timer_30=0;timer_1h=0;timer_2h=0;timer_4h=0; break;        //7.5小时

  138.                                                    default: feng_min (1);TR0=0;ET0=0;dingshi=0;        miao=0; timer_2h=1;        timer_1h=1;        timer_4h=1;timer_30=1;break;
  139.                                                  }
  140.                                 }
  141.                 }         
  142. }
  143. /*===========================定时器中断0(关机)程序==============================*/
  144. void timer1(void) interrupt 1  using 1           //定时器(0)控制
  145.          {        tcount1++;
  146.             TH0=0X16;
  147.                 TL0=0Xf6;                                                  //50ms
  148.             if(tcount1==20)                                //1秒时间
  149.                   {  tcount1=0;
  150.                      second1++;       
  151.                          timer_30=~timer_30;          //定时闪亮指示
  152.                          if(second1>=miao)                 //设定的定时时间等于当前时间
  153.                           {         second1=0;
  154.                              for (a;a<10;a++)
  155.                                   {         feng_min (1) ;
  156.                                          beep_out=1;
  157.                                      delay_3(20);                 //间隔1 秒  60*5000 时间
  158.                                   }
  159.                                   ISP_CONTR=0x20;                 // 整机复位关机(由软件)
  160.                            }
  161.                   }
  162.     }
  163. /*==============================定时器1中断(风类选择)工作程序====================================*/         
  164. void timer2(void) interrupt 3 using 3                 //  模拟风与自然风选择控制
  165.          {         
  166.             tcount++;
  167.                 TH1=0x06;                        // 初始数        50ms
  168.         TL1=0x06;                         //0.25毫秒
  169.             if(tcount==2386)                //0.5 秒
  170.                   {
  171.                      tcount=0;
  172.                      second++;       
  173.                          zi_ran_feng=~zi_ran_feng;
  174.                      if (second>=m&&n==1)                // 进行设定的自然风程序        180秒  6 次
  175.                             {  second=0;gao_su = 1; zhong_su = 1;  di_su=1;gao_su_out = 1; zhong_su_out = 1;  di_su_out=1;
  176.                                    delay_3(60);                          //  5 *10000
  177.                                    for (b;b<2;b++)
  178.                                         {
  179.                                          gao_su_out = 0;   
  180.                                          gao_su=0;
  181.                                          delay_3(700);                                        //工作17秒   1200*10000
  182.                                          gao_su_out = 1;   
  183.                                          gao_su=1;                                           //停机
  184.                                          delay_2(100);                                 //  100*20
  185.                                           zhong_su_out = 0;                         // 关2 档
  186.                                          zhong_su=0;
  187.                                          delay_3(400);                                 //         工作 10秒
  188.                                          zhong_su_out = 1;       
  189.                                          zhong_su =1;                           //停机
  190.                                          delay_2(100);                           //
  191.                                          di_su_out = 0;               
  192.                                          di_su=0;                                  //工作 5秒
  193.                                          delay_3(200);
  194.                                          di_su_out = 1;
  195.                                          di_su=1;
  196.                                          delay_2(100);
  197.                                    }
  198.                                    b=0;
  199.                            }          
  200.                          if (second>=n&&m==1)                //进行设定的睡眠风程序360秒 4 次
  201.                                        {  second=0;         gao_su = 1; zhong_su = 1; di_su=1;gao_su_out = 1; zhong_su_out = 1;  di_su=1;
  202.                                                   delay_3(60);
  203.                                                   for (c;c<4;c++)
  204.                                                       {  
  205.                                                                    gao_su_out = 0;   
  206.                                                      gao_su=0;
  207.                                                      delay_3(200);
  208.                                                                  gao_su_out = 1;   
  209.                                                      gao_su=1;       
  210.                                                                  delay_2(100);       
  211.                                                              zhong_su_out = 0;       
  212.                                                                  zhong_su=0;
  213.                                                                  delay_3(600);                         //工作        15秒
  214.                                                                  zhong_su_out = 1;
  215.                                                                  zhong_su =1;                        //停机
  216.                                                                  delay_2(100);
  217.                                                                  di_su_out = 0;       
  218.                                                                  di_su=0;
  219.                                                                  delay_3(400);                        //工作 10秒
  220.                                                                  di_su_out = 1;       
  221.                                                                  di_su=1;
  222.                                                                  delay_3(400);                        //停机         10秒
  223.                                                         }
  224.                                                         c=0;
  225.                                         }
  226.                  }
  227.           }       
  228. /*===================================风扇运行主程序==================================*/                 
  229. void main()
  230. {   timer1_int ();        //定时器0初始化
  231.         timer2_int ();        //定时器1初始化
  232.         guan_ji_int();        //外部中断1初始化
  233.         delay_3 (1);   //缓冲25.3毫秒
  234.         while(1)   //无条件永远执行大循环
  235.         {
  236.             
  237.                 if(!s1)                        //开机和进行速度选择 ;睡眠风和自然风选择
  238.                  {
  239.                          delay_1(100);         //按键消抖延时
  240.                     if (s1==0)
  241.                           {         
  242.                             anjian++;
  243.                                    while (s1==0) ;        //松手检测
  244.                            }
  245.                          if (anjian>5)
  246.                            anjian=1;
  247.                   switch (anjian)
  248.                                       {
  249.                                                  case (1):
  250.                                                             feng_min (1);tcount=0;second=0;TR1=0;ET1 =0;di_su = 0;di_su_out=0; zhong_su = 1;zhong_su_out = 1;gao_su = 1;gao_su_out = 1;zi_ran_feng=1;sui_mian_feng =1;break; //工作在低速
  251.                                                  case (2):
  252.                                                                     feng_min (1);tcount=0;second=0;TR1=0;ET1 =0;di_su = 1;di_su_out=1; zhong_su = 0;zhong_su_out = 0;gao_su = 1;gao_su_out = 1;zi_ran_feng=1;sui_mian_feng =1;break; //工作在中速
  253.                                                  case (3):
  254.                                                                         feng_min (1);tcount=0;second=0;TR1=0;ET1 =0;di_su = 1;di_su_out=1; zhong_su = 1;zhong_su_out = 1;gao_su = 0;gao_su_out = 0;zi_ran_feng=1;sui_mian_feng =1;break; //工作在高速
  255.                                                  case (4):  
  256.                                                             feng_min (1); TR1=1;ET1 =1;di_su_out=1; di_su=1;zhong_su = 0;zhong_su_out = 0;gao_su = 1;gao_su_out = 1;zi_ran_feng=0;sui_mian_feng =1; m=15;n=1; break;         //开启自然风模式
  257.                                                  case (5):  
  258.                                                             feng_min (1); TR1=1;ET1 =1;di_su_out=0;di_su=0; zhong_su = 1;zhong_su_out = 1;gao_su = 1;gao_su_out = 1;zi_ran_feng=1;sui_mian_feng=0; n=120;m=1; break;        // 开启在睡眠风模式
  259.                                            }
  260.                  }
  261.            if (s2==0&&anjian>=1)                // 关机
  262.                      {   
  263.                             delay_1(100);         //按键消抖
  264.                             if (s2==0)
  265.                                     { while (s2==0) ;         //松手检测
  266.                                          /* jishu1++;          */
  267.                                           switch (1)
  268.                                           {
  269.                                                             case (1):  feng_min (1); dingshi=0;tcount=0;second=0;tcount1=0;second1=0;anjian=0;TR0=0;ET0 =0; TR1=0;ET1 =0;timer_2h=1;timer_1h=1;        timer_4h=1;timer_30=1;zi_ran_feng=1;sui_mian_feng=1;gao_su=1;gao_su_out=1;zhong_su=1;zhong_su_out=1;di_su=1;di_su_out=1;         break;                  //进行关机
  270.                                                           }
  271.                                         }       
  272.                          }
  273.                 if (s3==0&&anjian!=0)        //风扇摇头开和关
  274.                       {
  275.                             delay_1(100);        //        按键消抖
  276.                             if (s3==0)
  277.                                     {
  278.                                             jishu++;         
  279.                                                    while (s3==0) ;                 //松手检测
  280.                                     switch (jishu)
  281.                                           { case (1):  feng_min (1); yao_tou_out=0;  break;
  282.                                                             default:  feng_min (1);yao_tou_out=1; jishu=0; break;
  283.                                                                   }
  284.                                          }
  285.                                   }
  286.                 if (s4==0&&anjian>=1)                        //风扇定时工作时间选择程序                  
  287. ……………………

  288. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
多功能电风扇修复程序.rar (1.86 KB, 下载次数: 54)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:235106 发表于 2017-9-23 20:44 | 显示全部楼层
电路原理图随后补上
回复

使用道具 举报

ID:235106 发表于 2017-9-23 22:32 | 显示全部楼层
电路图已经完成,请大家指教!

电风扇修复程序的电器原理图

电风扇修复程序的电器原理图
回复

使用道具 举报

ID:235106 发表于 2017-9-23 22:36 | 显示全部楼层
谢谢!

风扇原理图(重新上传)

风扇原理图(重新上传)
回复

使用道具 举报

ID:96682 发表于 2017-9-25 17:09 | 显示全部楼层
LZ,还留一手,新手想仿制电路图这关就卡壳了
回复

使用道具 举报

ID:1 发表于 2017-9-28 14:54 | 显示全部楼层
wc86110 发表于 2017-9-25 17:09
LZ,还留一手,新手想仿制电路图这关就卡壳了

有电路图啊 放大以后可以看得很清晰
回复

使用道具 举报

ID:146874 发表于 2017-10-6 12:01 | 显示全部楼层
正在学习这个,感谢分享
回复

使用道具 举报

ID:237453 发表于 2017-10-6 13:12 | 显示全部楼层
can i using all brand fan reamote control
回复

使用道具 举报

ID:105075 发表于 2018-1-19 22:03 | 显示全部楼层
第一个rar文件是HEX文件,C语言就更好了。
回复

使用道具 举报

ID:272625 发表于 2018-1-25 00:44 | 显示全部楼层
楼主资料大好了,刚好有一个坏的没丢.有时间试下
回复

使用道具 举报

ID:272625 发表于 2018-1-25 00:51 | 显示全部楼层
没有遥控,美中不足
回复

使用道具 举报

ID:152164 发表于 2018-3-8 01:35 | 显示全部楼层
想加遥控功能
回复

使用道具 举报

ID:289019 发表于 2018-3-8 09:26 | 显示全部楼层
哈哈 很好的应用  我玩单片机很多年了  几乎没给自己做过东西 都是给别人做了
回复

使用道具 举报

ID:113858 发表于 2019-5-16 01:31 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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