找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7685|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

用51單片機(jī)編程修復(fù)遙控電風(fēng)扇 帶源碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
家里的遙控電風(fēng)扇主板主控?zé)龎牧,閑著沒事用多年沒有玩的51單片機(jī)進(jìn)行編制程序,將原來的主板上的單片機(jī)拆除,各個(gè)功能按鍵和指示燈不動(dòng),把51單片機(jī)對應(yīng)各個(gè)功能管腳用飛線接上,再用502膠水給固定住,防止松動(dòng)。下來用KELL軟件編程。經(jīng)測試一切正常帶自然風(fēng)、睡眠風(fēng)、定時(shí)功能;取消原來的遙控功能(因個(gè)人愛好,很少用遙控)。待源碼需要的朋友隨意下。單片機(jī)為89C51或52都行,注意時(shí)鐘:11.0592,不同時(shí)鐘定時(shí)時(shí)間差異大。

單片機(jī)源程序如下:
  1. /************************************************************************
  2.   家里的遙控電風(fēng)扇主板燒壞了,閑著沒事用閑置的STC89C51單片機(jī)做了一個(gè)控制板
  3.   不帶遙控,利用原來的按鍵進(jìn)行設(shè)計(jì)一個(gè)控制板,經(jīng)測試一切運(yùn)行正常。
  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. /*===================關(guān)機(jī)特殊功能定義======================*/
  12. sfr ISP_CONTR=0xe7;           //特殊功能寄存器定義
  13. /*=============================按鍵功能定義=================*/
  14. sbit s1=P3^7;        //開機(jī)、關(guān)機(jī)與 風(fēng)類選擇
  15. sbit s2=P3^3;        //        關(guān)機(jī)
  16. sbit s3=P3^5;        //搖頭
  17. sbit s4=P3^6;        //定時(shí)開關(guān)
  18. /*==========================輸出功能IO口定義==================*/
  19. sbit sui_mian_feng =P0^0;         //睡眠風(fēng)指示
  20. sbit zi_ran_feng= P0^1;         //自然風(fēng)指示
  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. /*============工作時(shí)間狀態(tài)指示LED燈的IO口定義===================*/
  30. sbit timer_30=P1^0;         //定時(shí)30分鐘LED指示
  31. sbit timer_1h=P1^1;         //定時(shí)1小時(shí)LED指示
  32. sbit timer_2h=P1^2;         //        定時(shí)2小時(shí)LED指示
  33. sbit timer_4h=P1^3;        // 定時(shí)4小時(shí)LED指示
  34. /*=========================延時(shí)時(shí)間函數(shù)=======================*/
  35. void delay_1 (char sum)                   //按鍵消抖延時(shí)
  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)                   //蜂鳴頻率延時(shí)時(shí)間(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)                   //風(fēng)速延時(shí)時(shí)間 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 時(shí)間
  55.                   beep_out=1;
  56.                   delay_2 (10);
  57.                  }
  58. }
  59. /*=================定時(shí)器0初始化=====================*/
  60. void timer1_int (void)                 //定時(shí)器中斷0         初始化
  61. {   TMOD|=0x01;                                // 定時(shí)器0工作模式 1
  62.         TH0=0x16;                           //放定時(shí)初值
  63.     TL0=0xf6;                          //放定時(shí)初值
  64.     TR0=0;                                  //關(guān)閉定時(shí)器(暫時(shí)未開啟)
  65.     ET0=0;                                  //開啟中斷
  66.         PT0=1;                                  //中斷優(yōu)先級(jí)1
  67.         EA =1;
  68. }
  69. /*=================定時(shí)器1初始化=====================*/
  70. void timer2_int (void)                //風(fēng)類定時(shí)器中斷 1 初始化
  71. {        TMOD|=0x20;                          //工作模式2
  72.     TH1=0x06;                        // 設(shè)定初始值        50ms
  73.     TL1=0x06;                   //設(shè)定初始值
  74.     TR1=0;                          //開啟定時(shí)器
  75.     ET1=0;                           //開啟外部中斷
  76.         PT1=0;                                //中斷優(yōu)先級(jí)0
  77.         EA =1;                                //開啟總中斷開關(guān)
  78. }
  79. /*====================外部中斷1初始化=====================*/
  80. void guan_ji_int(void)                   //外部中斷 1
  81. {
  82.    EA =1;                                 //中斷總開關(guān)
  83.    EX1=1;                                //中斷開關(guān)
  84.    IT1=0;                        // 觸發(fā)方式0,低電平觸發(fā)
  85.    PX1=1;                 //中斷優(yōu)先級(jí) 最高
  86. }
  87. /*======================外部中斷1程序======================*/
  88. void guan_ji(void) interrupt 2 using 2                 //關(guān)機(jī)的外部中斷 2
  89. {
  90.           if (s2==0&&s3!=0&&anjian>=1)                // 關(guān)機(jī)
  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;}//蜂鳴后、關(guān)機(jī)、整機(jī)復(fù)位  
  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)                        //風(fēng)扇定時(shí)工作時(shí)間程序
  111.                     {  delay_1(100);                //        100*100 時(shí)間
  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 小時(shí)
  118.                                                    case (2):                                                                  
  119.                                                             feng_min (1); TR0=1;ET0=1;miao=3600;timer_30=1;timer_1h=0;        break;                //1 小時(shí)
  120.                                                    case (3):
  121.                                                             feng_min (1); TR0=1;ET0=1;miao=5400;timer_30=0;timer_1h=0;        break;                //1.5 小時(shí)
  122.                                                    case (4):
  123.                                                             feng_min (1); TR0=1;ET0=1;miao=7200;timer_30=1;timer_1h=1;timer_2h=0;break;         //2 小時(shí)
  124.                                                    case (5):
  125.                                                             feng_min (1); TR0=1;ET0=1;miao=9000;timer_30=0;timer_2h=0;break;                //2.5 小時(shí)
  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小時(shí)
  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 小時(shí)
  130.                                                    case (8):
  131.                                                             feng_min (1); TR0=1;ET0=1;miao=28800;timer_1h=0;timer_4h=0;        gao_su=1;            break;                //5 小時(shí)
  132.                                                    case (9):
  133.                                                             feng_min (1);TR0=1;ET0=1;miao=28800;timer_1h=1;        timer_2h=0;timer_4h=0;        break;                //6 小時(shí)
  134.                                                    case (10):
  135.                                                             feng_min (1);TR0=1;ET0=1;miao=28800;timer_1h=0;timer_2h=0;timer_4h=0;        break;                //7 小時(shí)
  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小時(shí)

  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. /*===========================定時(shí)器中斷0(關(guān)機(jī))程序==============================*/
  144. void timer1(void) interrupt 1  using 1           //定時(shí)器(0)控制
  145.          {        tcount1++;
  146.             TH0=0X16;
  147.                 TL0=0Xf6;                                                  //50ms
  148.             if(tcount1==20)                                //1秒時(shí)間
  149.                   {  tcount1=0;
  150.                      second1++;       
  151.                          timer_30=~timer_30;          //定時(shí)閃亮指示
  152.                          if(second1>=miao)                 //設(shè)定的定時(shí)時(shí)間等于當(dāng)前時(shí)間
  153.                           {         second1=0;
  154.                              for (a;a<10;a++)
  155.                                   {         feng_min (1) ;
  156.                                          beep_out=1;
  157.                                      delay_3(20);                 //間隔1 秒  60*5000 時(shí)間
  158.                                   }
  159.                                   ISP_CONTR=0x20;                 // 整機(jī)復(fù)位關(guān)機(jī)(由軟件)
  160.                            }
  161.                   }
  162.     }
  163. /*==============================定時(shí)器1中斷(風(fēng)類選擇)工作程序====================================*/         
  164. void timer2(void) interrupt 3 using 3                 //  模擬風(fēng)與自然風(fēng)選擇控制
  165.          {         
  166.             tcount++;
  167.                 TH1=0x06;                        // 初始數(shù)        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)                // 進(jìn)行設(shè)定的自然風(fēng)程序        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;                                           //停機(jī)
  184.                                          delay_2(100);                                 //  100*20
  185.                                           zhong_su_out = 0;                         // 關(guān)2 檔
  186.                                          zhong_su=0;
  187.                                          delay_3(400);                                 //         工作 10秒
  188.                                          zhong_su_out = 1;       
  189.                                          zhong_su =1;                           //停機(jī)
  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)                //進(jìn)行設(shè)定的睡眠風(fēng)程序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;                        //停機(jī)
  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);                        //停機(jī)         10秒
  223.                                                         }
  224.                                                         c=0;
  225.                                         }
  226.                  }
  227.           }       
  228. /*===================================風(fēng)扇運(yùn)行主程序==================================*/                 
  229. void main()
  230. {   timer1_int ();        //定時(shí)器0初始化
  231.         timer2_int ();        //定時(shí)器1初始化
  232.         guan_ji_int();        //外部中斷1初始化
  233.         delay_3 (1);   //緩沖25.3毫秒
  234.         while(1)   //無條件永遠(yuǎn)執(zhí)行大循環(huán)
  235.         {
  236.             
  237.                 if(!s1)                        //開機(jī)和進(jìn)行速度選擇 ;睡眠風(fēng)和自然風(fēng)選擇
  238.                  {
  239.                          delay_1(100);         //按鍵消抖延時(shí)
  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;         //開啟自然風(fēng)模式
  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;        // 開啟在睡眠風(fēng)模式
  259.                                            }
  260.                  }
  261.            if (s2==0&&anjian>=1)                // 關(guān)機(jī)
  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;                  //進(jìn)行關(guān)機(jī)
  270.                                                           }
  271.                                         }       
  272.                          }
  273.                 if (s3==0&&anjian!=0)        //風(fēng)扇搖頭開和關(guān)
  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)                        //風(fēng)扇定時(shí)工作時(shí)間選擇程序                  
  287. ……………………

  288. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
多功能電風(fēng)扇修復(fù)程序.rar (1.86 KB, 下載次數(shù): 56)
電風(fēng)扇程序序.rar (3.18 KB, 下載次數(shù): 69)



評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:235106 發(fā)表于 2017-9-23 20:44 | 只看該作者
電路原理圖隨后補(bǔ)上
回復(fù)

使用道具 舉報(bào)

板凳
ID:235106 發(fā)表于 2017-9-23 22:32 | 只看該作者
電路圖已經(jīng)完成,請大家指教!

電風(fēng)扇原理圖.png (126.5 KB, 下載次數(shù): 172)

電風(fēng)扇修復(fù)程序的電器原理圖

電風(fēng)扇修復(fù)程序的電器原理圖
回復(fù)

使用道具 舉報(bào)

地板
ID:235106 發(fā)表于 2017-9-23 22:36 | 只看該作者
謝謝!

電風(fēng)扇原理圖.png (126.5 KB, 下載次數(shù): 163)

風(fēng)扇原理圖(重新上傳)

風(fēng)扇原理圖(重新上傳)
回復(fù)

使用道具 舉報(bào)

5#
ID:96682 發(fā)表于 2017-9-25 17:09 | 只看該作者
LZ,還留一手,新手想仿制電路圖這關(guān)就卡殼了
回復(fù)

使用道具 舉報(bào)

6#
ID:1 發(fā)表于 2017-9-28 14:54 | 只看該作者
wc86110 發(fā)表于 2017-9-25 17:09
LZ,還留一手,新手想仿制電路圖這關(guān)就卡殼了

有電路圖啊 放大以后可以看得很清晰
回復(fù)

使用道具 舉報(bào)

7#
ID:146874 發(fā)表于 2017-10-6 12:01 | 只看該作者
正在學(xué)習(xí)這個(gè),感謝分享
回復(fù)

使用道具 舉報(bào)

8#
ID:237453 發(fā)表于 2017-10-6 13:12 | 只看該作者
can i using all brand fan reamote control
回復(fù)

使用道具 舉報(bào)

9#
ID:105075 發(fā)表于 2018-1-19 22:03 | 只看該作者
第一個(gè)rar文件是HEX文件,C語言就更好了。
回復(fù)

使用道具 舉報(bào)

10#
ID:272625 發(fā)表于 2018-1-25 00:44 | 只看該作者
樓主資料大好了,剛好有一個(gè)壞的沒丟.有時(shí)間試下
回復(fù)

使用道具 舉報(bào)

11#
ID:272625 發(fā)表于 2018-1-25 00:51 | 只看該作者
沒有遙控,美中不足
回復(fù)

使用道具 舉報(bào)

12#
ID:152164 發(fā)表于 2018-3-8 01:35 | 只看該作者
想加遙控功能
回復(fù)

使用道具 舉報(bào)

13#
ID:289019 發(fā)表于 2018-3-8 09:26 | 只看該作者
哈哈 很好的應(yīng)用  我玩單片機(jī)很多年了  幾乎沒給自己做過東西 都是給別人做了
回復(fù)

使用道具 舉報(bào)

14#
ID:113858 發(fā)表于 2019-5-16 01:31 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表