久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7139|回復: 17
收起左側

兩路學習型風扇遙控開關帶自然風 單片機源程序+電路

  [復制鏈接]
ID:343102 發表于 2019-8-28 19:07 | 顯示全部樓層 |閱讀模式
電路原理圖如下:
兩路學習型遙控開關.jpg
制作說明:
    這個電路采用15W104單片機通過紅外遙控器控制電風扇。
    在初次使用時,首先進行按鍵學碼。
    學碼方法:找一個閑置的紅外遙控器,選擇兩個好用的按鍵,按住其中一個遙控
按鍵不放約6秒,蜂鳴器響一聲,表明學習完成。同樣方法學習另外一個遙控按鍵。
    正常使用時,短按一下已學習的按鍵即可控制對應的開關反轉,蜂鳴器會響一聲。
    第一個學習的按鍵為風扇開關,開后吹風3小時會自動關閉,防止長開。第二個學
習的按鍵為自然風開關,自然風啟動后電扇吹7秒停3秒,再按關閉自然風。由于使用
延時控制,開自然風后遙控反應會延遲。
    如果需要換別的遙控按鍵或另外一個遙控器,重新上述操作,即可刪除舊的按鍵,
使用新的按鍵。
        紅外接收端為1腳。輸出端為5腳,低電平為工作態。蜂鳴器接8腳,低電平為工作
態。
    落地扇或臺扇一般有3個檔位,實際制作時可將其中一個檔位改成遙控,另外兩個
仍用手動。我是將最慢的1檔改成了遙控。
    電路圖是借用別人的,程序也是應邀修改的,只要把8腳的led指示燈換成蜂鳴器即
可。當然不換也行,看各人愛好。程序不會沖突,指示燈和蜂鳴器都是低電平工作。

單片機源程序如下:
  1. #define CPU_Fosc 11059200uL //定義時鐘,自適應解碼和延時用
  2. #include <REG51.h>
  3. #include<EROM_STC10_11_15.h>
  4. #include<intrins.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned  int
  7. #define USER_H     0x80  //用戶碼高8位
  8. #define USER_L     0x7F  //用戶碼低8位
  9. #define Check_EN   0   //是否要校驗16位用戶碼:不校驗填0,校驗則填1
  10. #define CA_S       40   //長按時間設置,單位:108mS(即 108mS整數倍,10倍以上為宜)
  11. /*┈┈┈┈┈┈┈┈┈┈ 基準 ┈┈┈┈┈┈┈┈┈┈┈*/
  12. #define  Boot_Limit     (((9000+4500) +2000)/Step)   //引導碼周期上限   
  13. #define  Boot_Lower     (((9000+4500) -2000)/Step)   //引導碼周期下限   
  14. #define  Bit1_Limit     ((2250 +800)/Step)           //“1”周期上限
  15. #define  Bit0_Limit     ((1125 +400)/Step)     //“0”周期上限
  16. #define  Step       400//紅外采樣步長:400us
  17. #define  TH_H  ((65536-Step*(CPU_Fosc/300)/40000)/256)  //定時器高8位基準賦值
  18. #define  TH_L  ((65536-Step*(CPU_Fosc/300)/40000)%256)  //定時器低8位基準賦值
  19. sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0
  20. sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1
  21. uint     IR_BT;           //解碼效果返回:0無效,1有效,2短按,3長按
  22. uchar    NEC[4];       //解碼存放:16位用戶碼、操作碼正反碼
  23. uint     cntCA;           //長按計數
  24. uint     cntStep;    //步數計
  25. bit      IRa,IRb;    //電位狀態保存
  26. bit      IRsync;    //同步標志
  27. bit      bz1,bz2,bz3,bz4;
  28. bit      m1,m2;     //紅外輸入鍵值變量
  29. uint     BitN;               //位碼裝載數
  30. uchar    num1,num2,num3,num4;
  31. uchar  aa;
  32. float   tm;
  33. /********************************************/
  34. sbit  out_1  = P3^0;   //輸出1
  35. sbit  BE  = P3^3;   //蜂鳴器
  36. sbit  IR     = P3^4;    //定義紅外線接口(任意引腳)
  37. /************************************************/
  38. //========================================================================
  39. // 函數: void  delayms(unsigned int ms)
  40. // 描述: 延時函數。
  41. // 參數: ms,要延時的ms數, 這里只支持1~65535ms. 自動適應主時鐘.
  42. // 返回: none.
  43. // 版本: VER1.0
  44. // 日期: 2013-4-1
  45. // 備注:
  46. //========================================================================
  47. void  DelayMs(unsigned int ms)
  48. {
  49.      unsigned int i;
  50.          do{
  51.               i = CPU_Fosc / 13000;
  52.                   while(--i)        ;   //14T per loop
  53.      }while(--ms);
  54. }

  55. /****************蜂鳴器*************************/
  56. void beep()
  57. {
  58. BE=0;
  59. DelayMs(500);
  60. BE=1;
  61. }

  62. /***************寫數據 ***************************/

  63. void W_W_1(void)//寫數據
  64. {
  65. num1 = NEC[2];
  66. EA = 0;     //關中斷
  67. EROM_C(0);    //讀擦除EPPROM
  68. EROM_W(0,5,num1); //寫EPPROM
  69. num2 = EROM_R(0,5); //讀EPPROM
  70. EA = 1;  //開中斷
  71. }

  72. /**************寫數據 ****************************/

  73. void W_W_2(void)//寫數據
  74. {
  75. num3 = NEC[2];
  76. EA = 0;     //關中斷
  77. EROM_C(1);    //讀擦除EPPROM
  78. EROM_W(1,10,num3); //寫EPPROM
  79. num4 = EROM_R(1,10); //讀EPPROM
  80. EA = 1;  //開中斷
  81. }

  82. /****************遙控短按處理*************************/

  83. void KZ0()//函數:遙控短按處理
  84. {
  85.    beep();
  86. num2 = EROM_R(0,5); //讀EPPROM
  87. num4 = EROM_R(1,10);
  88. if(num2 == num1)
  89. {
  90. //   bz3 = m1;
  91. //  out_1 = ~out_1;
  92.    m1=~m1;
  93. }
  94. if(num4 == num3)
  95. {
  96.    m2=~m2;
  97. }
  98. }

  99. /*****************遙控長按處理********************/

  100. void KZ1()//函數:遙控長按處理
  101. {
  102.   beep();
  103. //m2 = 1;
  104. //m1 = 1;
  105. aa ++;
  106. if(aa == 1)
  107. {
  108.   W_W_1();//讀寫程序
  109. }
  110. if(aa == 2)
  111. {
  112.   W_W_2();//讀寫程序
  113.   aa = 0;
  114. }
  115.   
  116. }
  117. /****************紅外解碼初始化************************/

  118. void IR_Init() //紅外線解碼初始化
  119. {
  120. TMOD &= 0xF0;    //清定時器0
  121. TMOD |= 0x01;    //定時器0:16位定時器
  122. TL0 = TH_L;        //每步時間
  123. TH0 = TH_H;
  124. ET0 = 1;
  125. EA  = 1;
  126. TR0 = 1;
  127. }

  128. /****************主函數*************************/
  129. void main(void)
  130. {
  131. P3M0 = 0x03;   //
  132. P3M1 = 0x00;   //
  133. m1 = 0;
  134. m2 = 0;
  135. BE=1;
  136. IR_Init();      //紅外線解碼初始化
  137. num2 = EROM_R(0,5); //讀EPPROM
  138. num4 = EROM_R(1,10); //讀EPPROM
  139. while(1)
  140. {
  141.   if((IR_BT == 2) || (IR_BT == 3))//遙控檢測     
  142.   {
  143.    tm=0;                //有操作,開機時間清0
  144.    if(IR_BT == 2)
  145.     KZ0();      //短按處理   
  146.    else        
  147.     KZ1();      //長按處理
  148.     IR_BT = 0;  //清有效標志
  149.   }
  150.    if(tm>27000000)        //風扇開啟3小時后關閉(3*3600*1000000us/400us=27000000次)
  151.     {
  152.      m1=1;                        //風扇停電
  153.      tm=27000001;   //停止計時防止溢出
  154.     }
  155.      out_1=~m1;
  156.          if(m1==1)
  157.           {
  158.            if(m2==1)
  159.             {
  160.              DelayMs(7000);          //風扇通電7s
  161.              out_1=1;
  162.              DelayMs(3000); //風扇停電3s
  163.                 }
  164.           }
  165. }
  166. }            
  167. /********************** 定時器0中斷函數************************/
  168. void time0(void) interrupt 1
  169. {
  170. TL0 = TH_L;        //重賦值
  171. TH0 = TH_H;
  172. IRb = IRa;     //上次電位狀態
  173. IRa = IR;     //當前電位狀態
  174. tm ++;
  175. cntStep ++;     
  176. if(IR_BT == 1)
  177. if(cntStep > 300)
  178. IR_BT = 2;//解碼有效后,如果無長按,120ms(400us×300)后默認短按
  179. if(IRb && !IRa)         //是否下降沿(上次高,當前低)
  180. {
  181.   if(cntStep > Boot_Limit)      //超過同步時間?
  182.   {
  183.       if(IR_BT == 1) //解碼有效后,繼續按住遙控>CA_S即長按
  184.    if(++ cntCA > CA_S)
  185.    IR_BT = 3;
  186.    IRsync = 0;      //同步位清0
  187.   }
  188.   else
  189.   if(cntStep > Boot_Lower)
  190.   {
  191.    IRsync = 1; //同步位置1,裝載位碼數
  192.    BitN = 32;
  193.   }     
  194.   else
  195.   if(IRsync) //如果已同步
  196.   {
  197.    if(cntStep > Bit1_Limit)
  198.    IRsync = 0;            
  199.    else
  200.    {
  201.     NEC[3] >>= 1;   
  202.     if(cntStep > Bit0_Limit)NEC[3] |= 0x80;    //“0”與“1”
  203.              if(-- BitN == 0)   
  204.     {
  205.      IRsync = 0;         //同步位清0
  206.               #if (Check_EN == 1)     
  207.      if((NEC[0] == USER_H) && (NEC[1] == USER_L) && (NEC[2] == ~NEC[3])) //校驗16位用戶碼、操作碼正反碼
  208.       {  
  209.       IR_BT = 1; //解碼有效,接下來判斷:短按?長按?
  210.       cntCA = 0;  
  211.      }      
  212.      #else
  213.      if(NEC[2] == ~NEC[3])//校驗操作碼正反碼
  214.      {
  215.       IR_BT = 1;
  216.       cntCA = 0;
  217.      }
  218.      #endif     
  219.     }
  220.     else
  221.     if((BitN & 0x07) == 0)//NEC[3]每裝滿8位,移動保存一次(即 BitN%8 == 0)
  222.     {
  223.      NEC[0] = NEC[1];
  224.      NEC[1] = NEC[2];
  225.      NEC[2] = NEC[3];   
  226.     }
  227.    }
  228.   }
  229.   cntStep = 0;   //步數計清0
  230. }   

  231. /******************************************/
  232. if(IR_BT == 1)//寫鍵值指示
  233. {
  234.   num1 = NEC[2];
  235. }
  236. /*****************************************/
  237. if(IR_BT == 1)//寫鍵值指示
  238. {
  239.   num3 = NEC[2];
  240. }
  241. }
復制代碼

所有資料51hei提供下載:
兩路學習型風扇遙控開關帶自然風6.rar (51.48 KB, 下載次數: 150)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:17109 發表于 2019-8-30 16:36 | 顯示全部樓層
師博你好;可以增加一只led燈用來學習狀態顯示嗎
   
上電立即進入學習狀態,紅色LED燈閃動,用電視機或DVD遙控器對著紅外接收器,按下其中任一按鍵發射信號,紅色LED燈熄滅,蜂鳴器叫一聲,表示學習成功。該按鍵會被自動識別對應使用。
在學習狀態如果沒有按下任何遙控器按鍵,10秒后自動退出學習狀態
回復

使用道具 舉報

ID:343102 發表于 2019-8-30 21:41 | 顯示全部樓層
ll13536121668 發表于 2019-8-30 16:36
師博你好;可以增加一只led燈用來學習狀態顯示嗎
   
上電立即進入學習狀態,紅色LED燈閃動,用電視機或D ...

你說的這些功能不是不能實現,只是個人感覺是畫蛇添足意義不大。
首先,這個程序已經有按鍵提示了(蜂鳴器或led指示燈),再增加一個學習指示燈意義不大。在電源電路中增加一個電源指示燈,并與紅外接收器放一起,用以給遙控器指示一個目標,這個都比學習指示燈更有意義。
其次,首次開機時必須學習按鍵,否則無法遙控。再增設一個10秒后自動退出學習狀態功能就沒有任何意義了,反而添亂。
這個程序在任何時候長按按鍵6S以上就會自動學習新按鍵,是非常實用的。
回復

使用道具 舉報

ID:17109 發表于 2019-8-31 06:20 來自手機 | 顯示全部樓層
風158 發表于 2019-8-30 21:41
你說的這些功能不是不能實現,只是個人感覺是畫蛇添足意義不大。
首先,這個程序已經有按鍵提示了(蜂鳴 ...

試過在6秒內學習前面沒有提示,不知道根本不會使用還以為,程序有問題劰,加個LED提示就好
回復

使用道具 舉報

ID:416951 發表于 2019-9-1 23:12 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:34298 發表于 2019-10-20 16:00 | 顯示全部樓層
這個更好 stc15w104是寬電壓,可以用舊的手機電池供電,做個小型遙控器。
回復

使用道具 舉報

ID:616759 發表于 2019-10-28 14:45 | 顯示全部樓層
這個電路圖畫的看的我有點懵逼,不知道附件里的原理圖是不是也這樣
回復

使用道具 舉報

ID:77927 發表于 2019-11-2 12:34 | 顯示全部樓層

謝謝分享,學習學習
回復

使用道具 舉報

ID:77927 發表于 2019-11-2 12:47 | 顯示全部樓層
文件打不開,.hex文件燒錄軟件都打不開
回復

使用道具 舉報

ID:51443 發表于 2020-2-4 21:08 | 顯示全部樓層
本帖最后由 職教電子 于 2020-2-7 15:12 編輯

“ if(tm>27000000)        //風扇開啟3小時后關閉(3*3600*1000000us/400us=27000000次)
    {
     m1=1;                        //風扇停電
     tm=27000001;   //停止計時防止溢出”
其中m1=1應該為m1=0.否則,3小時后不會停。另外把
#define  Boot_Limit     (((9000+4500) +2000)/Step)   //引導碼周期上限   
#define  Boot_Lower     (((9000+4500) -2000)/Step)   //引導碼周期下限
這兩句改為
#define  Boot_Limit     (15500/Step)   //引導碼周期上限
#define  Boot_Lower     (7000/Step)   //引導碼周期下限  
能適合更多的遙控器使用。因為9012的引導碼為4500+4500,7462的引導碼是9000+4500.
回復

使用道具 舉報

ID:159575 發表于 2020-3-19 15:47 來自手機 | 顯示全部樓層
這個只能用于nec編碼的遙控器吧
回復

使用道具 舉報

ID:479492 發表于 2020-5-20 18:47 | 顯示全部樓層
將程序下載到STC15W104的繼電器控制板,按遙控器只有LED頻閃,松開按鍵,LED燈熄滅。但繼電器不會通斷。不知是怎么回事。
回復

使用道具 舉報

ID:479492 發表于 2020-5-23 18:08 | 顯示全部樓層
  為了知道自己遙控器的用戶碼,買了一個紅外遙控器解碼器,但即使將程序換成自己的用戶碼,還是不能讀到遙控器。
   后來參考網上的方法,將程序里的頻率改為12M,但Keil的設置頻率及下載器頻率按11.0592M,就可以讀到部分遙控器,并能正?刂啤
    但有部分遙控器不能讀到:如有線電視機頂盒的遙控器、LED吸頂燈的遙控器等。
回復

使用道具 舉報

ID:479492 發表于 2020-12-16 11:36 | 顯示全部樓層
后來,查了一下有線電視機頂盒的編碼規范,并與NEC碼進行了對比。如下圖所示:
機頂盒與NEC對比1.png
8.PNG
7.PNG
回復

使用道具 舉報

ID:479492 發表于 2020-12-16 11:48 | 顯示全部樓層
  按照機頂盒的編碼規范,修改了樓主的一些參數(只接收前2個8位),結果原配的遙控器沒有反應,但后來買的備用遙控器反而可以使用,但遙控機頂盒時,兩個都能夠正常使用的,并且,用讀碼器讀到的兩個遙控器的紅外碼是一樣的。不知是什么原因?
  樓主可以按照機頂盒的編碼,修改一下程序嗎?謝謝!
WORD1.png
WORD2.png
WORD3.png
WORD4.png
WORD5.png
WORD6.png
回復

使用道具 舉報

ID:51443 發表于 2022-2-9 19:40 | 顯示全部樓層
hq2000 發表于 2020-12-16 11:48
按照機頂盒的編碼規范,修改了樓主的一些參數(只接收前2個8位),結果原配的遙控器沒有反應,但后來買的 ...

原文中的NEC[3]是數據反碼,改文中的NEC[1]是數據正碼,運算結果不一樣吧?
回復

使用道具 舉報

ID:403447 發表于 2023-8-11 11:51 | 顯示全部樓層
虛心向大前輩們請教:EROM_W(1,5,num1)里,后面的num1是什么作用?與:EROM_W(1,5)結果有啥不同?
回復

使用道具 舉報

ID:403447 發表于 2023-8-14 09:10 | 顯示全部樓層
大米861 發表于 2023-8-11 11:51
虛心向大前輩們請教:EROM_W(1,5,num1)里,后面的num1是什么作用?與:EROM_W(1,5)結果有啥不同?

終于明白了。因原碼函數 void EROM_W(uchar n,uint x,uchar dat) 有3個參數,uchar n,為扇區,uint x,為地址,uchar dat ,是要寫入的數據。EROM_W(1,5,num1),即為 第 1 扇區,第 5 字節,寫入num1。悟了寫出來,避免以后有我一樣笨的能避坑。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区在线免费观看 | av免费看在线| 久久国产精品色av免费观看 | 天天操综合网站 | 91精品久久 | 91免费看片 | 一区二区三区高清 | 成人国产精品入口免费视频 | 伊人影院99 | 欧美极品视频 | 99久久婷婷| 欧美韩一区二区三区 | 日本a视频 | 亚洲视频一区在线观看 | 操久久久| 美女131mm久久爽爽免费 | 国产精品.xx视频.xxtv | 亚洲综合国产 | 天天干精品 | 国产免费一区二区三区免费视频 | 九九久久精品 | 国产精品色婷婷久久58 | 欧美在线亚洲 | 久久久久久久久91 | 国产小视频在线 | 97av视频 | 亚洲人在线观看视频 | 久久不卡区 | 国产精品mv在线观看 | 日批免费在线观看 | 国产精品国产三级国产aⅴ原创 | 欧美日韩一区二区三区四区 | 一区二区三区四区在线视频 | 91九色视频在线 | 极品一区| 国产精品一区二区三区四区五区 | 中文字幕1区 | 国产精品美女久久久久久免费 | 在线精品国产 | 爱高潮www亚洲精品 中文字幕免费视频 | 久久国产精品一区二区三区 |