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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 43190|回復: 46
打印 上一主題 下一主題
收起左側

用STC八腳單片機STC15F104E制作紅外遙控燈扇

  [復制鏈接]
跳轉到指定樓層
樓主
    餐桌頂上只有一個照明燈,天熱了,就在燈的位置再裝一個微風電扇,這樣就不必為電扇專門拉電線了。
    往年用的是STC89C52RC芯片的最小系統板、紅外接收和繼電器模塊組裝的。
    實際上只用到了單片機3個IO口,而STC89C52RC有32個IO,大材小用,板子又大感覺挺浪費的。
    從網上查到STC有8腳的單片機芯片,后來網購時順便就買了幾個STC15F104E。


    看看圖片,是不是很小巧。查了相關資料,這個芯片內部集成高精度R/C時鐘的,連晶振都不用再接的,燒錄時可在5M~35M之間自行設置的。
而且STC網站上還有相應的紅外接收例程《STC15系列只用一個定時器中斷的紅外接收程序》,這樣只要在此例程基礎上,稍加改動就可用了。
    除了電源正負極引腳外其他六個都可以用作普通IO口的。電路很簡單的,直接在洞洞板上焊接上8腳IC座和一個電阻、一個白色LED還有紅外接收模塊,其他就是外接引線了。這里我用P32接到紅外接收數據口上,P33作為閃爍燈,P34、P35外接到繼電器模塊上。P33接了個閃爍燈,STC文檔里面建議用3K以上電阻串聯LED的,這里就用的3K的。


    注意,照明燈是接到繼電器的常閉觸點上的,這樣即使5V電源模塊或單片機出故障了,墻上的開關還是能控制照明燈的。


    總共是三塊小板子用熱熔膠粘接到PVC電線槽板上的。從左到右分別是220V轉5V電源模塊、自制單片機模塊、5V繼電器模塊。
代碼中需要根據自己的需要來設定頻率,這里是12M。
#define MAIN_Fosc                12000000L        //定義主時鐘, 模擬串口和紅外接收會自動適應。5~36MHZ
還要制定設備用戶代碼。
#define        User_code                0xB649                //定義紅外接收用戶碼


    如圖,燒錄時需要制定內置時鐘頻率,必須和代碼里面一樣的。
    安裝前,先用兩個LED燈泡測試一下了。






   后來,網上有文章說內置RC時鐘,頻率不穩定的,受外界環境影響較大。不過想來對于紅外線接收這種應用來說,即使有頻漂,影響應該不大的。


   反正已經裝上了,過了這個夏天,是否頻漂拭目以待了。后來想到,其實可以把閃爍燈換掉,改用繼電器控制一個弱光燈的,這樣根據需要調節燈光亮度了。

單片機源程序如下:
  1. /*************        功能說明        **************

  2. 紅外接收程序。適用于市場上用量最大的HT6121/6122及其兼容IC的編碼。

  3. 對于用戶碼與User_code定義不同的遙控器,程序會將用戶碼一起從串口輸出。

  4. 使用模擬串口發送監控顯示編碼,顯示內容為ASCII碼和中文。

  5. 本接收程序基于狀態機的方式,占用CPU的時間非常少。

  6. HEX文件在本目錄的/list里面。

  7. ******************************************/


  8. /*************        用戶系統配置        **************/
  9. #define MAIN_Fosc                12000000L        //定義主時鐘, 模擬串口和紅外接收會自動適應。5~36MHZ
  10. #define D_TIMER0                125                        //選擇定時器時間, us, 紅外接收要求在60us~250us之間
  11. #define        User_code                0xB649                //定義紅外接收用戶碼

  12. /*************        以下宏定義用戶請勿修改        **************/
  13. #include        "reg51.H"
  14. #define        uchar        unsigned char
  15. #define uint        unsigned int   
  16. #define freq_base                        (MAIN_Fosc / 1200)
  17. #define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 10000))
  18. /*************        本地常量聲明        **************/         
  19. /*************        本地變量聲明        **************/
  20. sbit        P_TXD1 = P3^1;                //定義模擬串口發送腳,打印信息用
  21. sbit        P_IR_RX = P3^2;                //定義紅外接收輸入端口
  22. sbit        userLed3=P3^5;
  23. sbit         userLed4=P3^4;
  24. sbit         FlashLed=P3^3;                  //秒閃爍燈  
  25. bit                P_IR_RX_temp;                //Last sample
  26. bit                B_IR_Sync;                        //已收到同步標志
  27. uchar        IR_SampleCnt;                //采樣計數
  28. uchar        IR_BitCnt;                        //編碼位數
  29. uchar        IR_UserH;                        //用戶碼(地址)高字節
  30. uchar        IR_UserL;                        //用戶碼(地址)低字節
  31. uchar        IR_data;                        //數據原碼
  32. uchar        IR_DataShit;                //數據反碼

  33. bit                B_IrUserErr;                //User code error flag
  34. bit                B_IR_Press;                        //Key press flag,include repeat key.
  35. uchar        IR_code;                        //IR code        紅外鍵碼
  36. unsigned int Count1ms=0;        //一毫秒計數器         
  37. unsigned char   T1RH=0xFC;        //定時器時長        高位值
  38. unsigned char   T1RL=0x67;        //定時器時長        低位值

  39. /*************        本地函數聲明        **************/
  40. void        Tx1Send(uchar dat);
  41. uchar        HEX2ASCII(uchar dat);
  42. void        InitTimer(void);
  43. void        PrintString(unsigned char code *puts);
  44. /*************  外部函數和變量聲明 *****************/
  45. /* 配置并啟動T0,ms-T0定時時間 */
  46. void ConfigTimer1(unsigned int ms)
  47. {
  48.     unsigned long tmp;  //臨時變量                  
  49. //    tmp = 11059200 / 12;      //定時器計數頻率
  50.         tmp = MAIN_Fosc / 12;      //定時器計數頻率
  51.     tmp = (tmp * ms) / 1000;  //計算所需的計數值
  52.     tmp = 65536 - tmp;        //計算定時器重載值
  53.     tmp = tmp + 18;           //補償中斷響應延時造成的誤差
  54.     T1RH = (unsigned char)(tmp>>8);  //定時器重載值拆分為高低字節
  55.     T1RL = (unsigned char)tmp;
  56.     TMOD &= 0x0F;   //清零T0的控制位
  57.     TMOD |= 0x10;   //配置T0為模式1
  58.     TH1= T1RH;     //加載T0重載值
  59.     TL1 = T1RL;
  60.     ET1 = 1;        //使能T0中斷
  61.     TR1 = 1;        //啟動T0
  62. }
  63. /* T0中斷服務函數 */
  64. void InterruptTimer1() interrupt 3
  65. {
  66.         static unsigned char ti5=0;  
  67.     TH1 = T1RH;  //重新加載重載值
  68.     TL1 = T1RL;
  69.         ti5++;          //計數標志自加1
  70.         if(ti5==20)          //判斷是否到1s
  71.         {
  72.                 ti5=0;             //將靜態變量清0
  73.                 FlashLed=~FlashLed;       //LED位求反
  74.         }
  75. }
  76. /********************* 主函數 *************************/
  77. void main(void)
  78. {
  79. //        userLed3=1;
  80. //        userLed4=1;         
  81.         EA=1;        //允許總中斷
  82.         ConfigTimer1(25);        
  83.         InitTimer();                //初始化Timer           
  84.         while(1)
  85.         {
  86.                 if(B_IR_Press)                //有IR鍵按下
  87.                 {
  88.                         switch(IR_code)
  89.                         {
  90.                                 case 0x54:
  91.                                         userLed3=~userLed3;
  92.                                         break;
  93.                                 case 0x43:
  94.                                         userLed4=~userLed4;
  95.                                         break;
  96.                         }
  97.                         B_IR_Press = 0;                //清除IR鍵按下標志
  98.                 }
  99.         }
  100. }   


  101. //*******************************************************************
  102. //*********************** IR Remote Module **************************
  103. //*********************** IR Remote Module **************************
  104. //this programme is used for Receive IR Remote (HT6121).                        
  105. //data format: Synchro,AddressH,AddressL,data,/data, (total 32 bit).
  106. //send a frame(85ms), pause 23ms, send synchro of another frame, pause 94ms         
  107. //data rate: 108ms/Frame   
  108. //Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms
  109. //Bit0:high=0.5626ms,low=0.5626ms
  110. //Bit1:high=1.6879ms,low=0.5626ms
  111. //frame space = 23 ms or 96 ms                  
  112. /******************** 紅外采樣時間宏定義, 用戶不要隨意修改        *******************/  
  113. #if ((D_TIMER0 <= 250) && (D_TIMER0 >= 60))
  114.         #define        D_IR_sample                        D_TIMER0                //定義采樣時間,在60us~250us之間
  115. #endif        
  116. #define D_IR_SYNC_MAX                (15000/D_IR_sample)        //SYNC max time
  117. #define D_IR_SYNC_MIN                (9700 /D_IR_sample)        //SYNC min time
  118. #define D_IR_SYNC_DIVIDE        (12375/D_IR_sample)        //decide data 0 or 1
  119. #define D_IR_DATA_MAX                (3000 /D_IR_sample)        //data max time
  120. #define D_IR_DATA_MIN                (600  /D_IR_sample)        //data min time
  121. #define D_IR_DATA_DIVIDE        (1687 /D_IR_sample)        //decide data 0 or 1
  122. #define D_IR_BIT_NUMBER                32                                        //bit number

  123. //*******************************************************************************************
  124. //**************************** IR RECEIVE MODULE ********************************************
  125. void IR_RX_HT6121(void)
  126. {
  127.         uchar        SampleTime;         
  128.         IR_SampleCnt++;                                                        //Sample + 1   
  129.         F0 = P_IR_RX_temp;                                                //Save Last sample status
  130.         P_IR_RX_temp = P_IR_RX;                                        //Read current status
  131.         if(F0 && !P_IR_RX_temp)                                        //Last sample is high,and current sample is low, so is fall edge
  132.         {
  133.                 SampleTime = IR_SampleCnt;                        //get the sample time
  134.                 IR_SampleCnt = 0;                                        //Clear the sample counter
  135.                 if(SampleTime > D_IR_SYNC_MAX)                B_IR_Sync = 0;        //large the Maxim SYNC time, then error
  136.                 else if(SampleTime >= D_IR_SYNC_MIN)                                        //SYNC
  137.                 {
  138.                         if(SampleTime >= D_IR_SYNC_DIVIDE)
  139.                         {
  140.                                 B_IR_Sync = 1;                                        //has received SYNC
  141.                                 IR_BitCnt = D_IR_BIT_NUMBER;        //Load bit number
  142.                         }
  143.                 }
  144.                 else if(B_IR_Sync)                                                //has received SYNC
  145.                 {
  146.                         if(SampleTime > D_IR_DATA_MAX)        
  147.                                 B_IR_Sync=0;        //data samlpe time to large
  148.                         else
  149.                         {
  150.                                 IR_DataShit >>= 1;                                        //data shift right 1 bit
  151.                                 if(SampleTime >= D_IR_DATA_DIVIDE)        IR_DataShit |= 0x80;        //devide data 0 or 1
  152.                                 if(--IR_BitCnt == 0)                                //bit number is over?
  153.                                 {
  154.                                         B_IR_Sync = 0;                                        //Clear SYNC
  155.                                         if(~IR_DataShit == IR_data)                //判斷數據正反碼
  156.                                         {
  157.                                                 if((IR_UserH == (User_code / 256)) &&
  158.                                                         IR_UserL == (User_code % 256))
  159.                                                                 B_IrUserErr = 0;        //User code is righe
  160.                                                 else        B_IrUserErr = 1;        //user code is wrong
  161.                                                         
  162.                                                 IR_code      = IR_data;
  163.                                                 B_IR_Press   = 1;                        //數據有效
  164.                                         }
  165.                                 }
  166.                                 else if((IR_BitCnt & 7)== 0)                //one byte receive
  167.                                 {
  168.                                         IR_UserL = IR_UserH;                        //Save the User code high byte
  169.                                         IR_UserH = IR_data;                                //Save the User code low byte
  170.                                         IR_data  = IR_DataShit;                        //Save the IR data byte
  171.                                 }
  172.                         }
  173.                 }
  174.         }
  175. }


  176. /**************** Timer初始化函數 ******************************/
  177. void InitTimer(void)
  178. {
  179.         TMOD = 0;                //for STC15Fxxx系列        Timer0 as 16bit reload timer.
  180. ……………………

  181. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:

紅外接收1805燈扇.zip (30.92 KB, 下載次數: 506)


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏47 分享淘帖 頂4 踩
回復

使用道具 舉報

來自 2#
ID:224003 發表于 2018-9-19 15:28 | 只看該作者
天涼了,前天把這個遙控電扇拆了。說說其中的插曲。
剛裝上的頭幾天,發現用遙控器打開電扇的時候,有的時候單片機似乎就復位了,因為默認就是只開燈不開電扇的。
后來想到沒有給單片機電源端接上0.1微法的瓷片電容,就拿下來又焊上瓷片電容了。裝上再試用,接下來幾天還是有這個現象。
后來,想來也許是繼電器模塊故障,換了,就正常了。一個夏天用著都很正常的。估計,就是負責電扇開關的那個繼電器有故障了,沒拆看看,具體原因就不得而知了。

頻漂,看來這點用途根本是不用擔心的了。

評分

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

查看全部評分

回復

使用道具 舉報

板凳
ID:112693 發表于 2018-9-6 18:59 | 只看該作者
謝謝分享!好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:393398 發表于 2018-9-7 09:32 | 只看該作者
不錯,
回復

使用道具 舉報

5#
ID:395350 發表于 2018-9-8 15:03 | 只看該作者
呵呵,牛
回復

使用道具 舉報

6#
ID:255559 發表于 2018-9-21 17:35 | 只看該作者
定義的紅外接收用戶碼,是不是只能接收這個碼,那遙控器上怎么知道是哪個按鍵?
回復

使用道具 舉報

7#
ID:320226 發表于 2018-11-28 17:28 | 只看該作者
樓主  你好 可以改用STC8952RC嗎 如果改芯片要在那里修改程序?
回復

使用道具 舉報

8#
ID:399179 發表于 2018-11-28 19:15 來自手機 | 只看該作者
以前有個類似的,不太好用,不知道這個怎么樣
回復

使用道具 舉報

9#
ID:225259 發表于 2018-11-30 22:10 | 只看該作者
另外104E外部中斷有問題,觸發過多程序會死機,有遇到?
回復

使用道具 舉報

10#
ID:224003 發表于 2018-12-8 15:06 | 只看該作者
hurbocn 發表于 2018-9-21 17:35
定義的紅外接收用戶碼,是不是只能接收這個碼,那遙控器上怎么知道是哪個按鍵?

提前用51實驗板做個紅外解碼程序,顯示在數碼管或1602上
然后搞清楚了,再移植到這個八腳單片機
回復

使用道具 舉報

11#
ID:224003 發表于 2018-12-8 15:08 | 只看該作者
vbnm 發表于 2018-11-28 17:28
樓主  你好 可以改用STC8952RC嗎 如果改芯片要在那里修改程序?

當然可以了。最早就是用的STC8952RC,后來移植到這個芯片上了。
論壇教程里面有現成的程序,稍加改動就可以了。
回復

使用道具 舉報

12#
ID:224003 發表于 2018-12-8 15:09 | 只看該作者
Nemesis_126 發表于 2018-11-30 22:10
另外104E外部中斷有問題,觸發過多程序會死機,有遇到?

還沒有遇到過哦
回復

使用道具 舉報

13#
ID:435201 發表于 2018-12-12 14:36 來自手機 | 只看該作者
我也剛用這個芯片做了一個學習型的紅外遙控開關,帶60分鐘定時,經試用還不錯。
回復

使用道具 舉報

14#
ID:445163 發表于 2018-12-13 13:03 來自手機 | 只看該作者
兄弟能留個聯系方式嗎,最近在學,有問題想請教
回復

使用道具 舉報

15#
ID:151325 發表于 2019-1-14 17:41 | 只看該作者
創意不錯,謝謝樓主分享!
回復

使用道具 舉報

16#
ID:472046 發表于 2019-1-23 14:02 | 只看該作者
很詳細的教程,準備仿照樓主的程序做點自己的東西,謝謝了
回復

使用道具 舉報

17#
ID:440451 發表于 2019-3-11 19:50 | 只看該作者
非常感謝分享,謝謝,標記了!
回復

使用道具 舉報

18#
ID:43383 發表于 2019-3-14 19:48 | 只看該作者
謝謝分享。。。。。。。。。。。。。。。。。。。
回復

使用道具 舉報

19#
ID:423238 發表于 2019-4-2 05:06 來自手機 | 只看該作者
zdr833 發表于 2018-12-12 14:36
我也剛用這個芯片做了一個學習型的紅外遙控開關,帶60分鐘定時,經試用還不錯。

分享一下程序
回復

使用道具 舉報

20#
ID:128463 發表于 2019-4-16 15:13 | 只看該作者
謝謝樓主分享!
回復

使用道具 舉報

21#
ID:257024 發表于 2019-6-3 03:17 來自手機 | 只看該作者
不錯。謝謝分享!
回復

使用道具 舉報

22#
ID:507712 發表于 2019-7-17 17:01 | 只看該作者
樓主是位活雷鋒!
回復

使用道具 舉報

23#
ID:284079 發表于 2019-9-15 15:44 | 只看該作者
謝謝樓主分享!
回復

使用道具 舉報

24#
ID:381390 發表于 2019-9-17 11:37 | 只看該作者
謝謝分享!好資料
回復

使用道具 舉報

25#
ID:250717 發表于 2019-10-27 14:01 | 只看該作者
謝謝分享,能用到我的小車上
回復

使用道具 舉報

26#
ID:72088 發表于 2019-10-27 18:02 | 只看該作者
hurbocn 發表于 2018-9-21 17:35
定義的紅外接收用戶碼,是不是只能接收這個碼,那遙控器上怎么知道是哪個按鍵?

這個我也發表過文章,我用的是學習按鍵,可以學習任意一個遙控器上不常用的按鍵,http://www.zg4o1577.cn/bbs/dpj-144302-1.html
回復

使用道具 舉報

27#
ID:479984 發表于 2019-11-24 20:35 | 只看該作者
謝謝分享!好資料,51黑有你更精彩!!!
回復

使用道具 舉報

28#
ID:660892 發表于 2019-12-10 19:07 | 只看該作者
hzxyy 發表于 2018-12-8 15:08
當然可以了。最早就是用的STC8952RC,后來移植到這個芯片上了。
論壇教程里面有現成的程序,稍加改動就 ...

要怎么燒錄進去,不太懂。
回復

使用道具 舉報

29#
ID:65286 發表于 2019-12-12 16:08 | 只看該作者
支持DIY!!!!
回復

使用道具 舉報

30#
ID:206067 發表于 2020-1-29 00:44 | 只看該作者
多謝分享 使用了你的程序在15F102W上 可以用但是有個疑問   我的遙控器用戶碼是01FE 跟你的不同 實際 用戶碼好像沒起作用 只要數據碼對就可以
回復

使用道具 舉報

31#
ID:697723 發表于 2020-4-4 23:01 來自手機 | 只看該作者
搞一個試試看效果如何
回復

使用道具 舉報

32#
ID:385168 發表于 2020-4-5 04:37 | 只看該作者
下載學習一下,非常感謝樓主。
回復

使用道具 舉報

33#
ID:558859 發表于 2020-5-13 18:02 | 只看該作者
新手,感覺程序太難了
回復

使用道具 舉報

34#
ID:756506 發表于 2020-5-20 13:57 | 只看該作者
感謝分享!
回復

使用道具 舉報

35#
ID:759144 發表于 2020-5-23 15:30 | 只看該作者
感謝分享!
回復

使用道具 舉報

36#
ID:246783 發表于 2020-6-23 21:47 來自手機 | 只看該作者
hzxyy 發表于 2018-9-19 15:28
天涼了,前天把這個遙控電扇拆了。說說其中的插曲。
剛裝上的頭幾天,發現用遙控器打開電扇的時候,有的時 ...

風扇是感性負載, 啟動時電壓波動很大, 關閉時又要有泄放路徑
回復

使用道具 舉報

37#
ID:466759 發表于 2021-5-4 20:36 | 只看該作者
不錯,不過既然用單片機了,為什么不能加個18b20,做個pwm自動調速風扇?
回復

使用道具 舉報

38#
ID:701805 發表于 2021-5-30 21:25 來自手機 | 只看該作者
真是個好東西
回復

使用道具 舉報

39#
ID:701805 發表于 2021-5-30 21:31 來自手機 | 只看該作者
gravedigger 發表于 2020-1-29 00:44
多謝分享 使用了你的程序在15F102W上 可以用但是有個疑問   我的遙控器用戶碼是01FE 跟你的不同 實際 用戶 ...

請問一下我有一個小紅外遙控器,怎么修改程序,單片機知道我發送的是啥,控制繼電器合閉呀,還是隨便一個遙控器否可以用
回復

使用道具 舉報

40#
ID:701805 發表于 2021-5-31 17:26 來自手機 | 只看該作者
任何遙控器都可以控制嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 二区视频| 国产精品综合久久 | 91社影院在线观看 | av在线三级 | 在线国产一区二区三区 | 中午字幕在线观看 | 久久精品免费观看 | 美女一区| www国产成人免费观看视频,深夜成人网 | 在线观看黄色大片 | 久久婷婷色 | 99婷婷| aaa一区| 91佛爷在线观看 | 国产精品精品视频一区二区三区 | 91国自视频 | 欧美三级视频 | 99久久国产综合精品麻豆 | 亚洲精品日韩视频 | 超碰91在线 | 成人精品一区亚洲午夜久久久 | 91视频进入 | 中文一区二区 | 玖草资源| 久久久123 | 九九热精品视频在线观看 | 综合久久一区 | 一区中文 | 久久久影院 | 成人精品一区二区三区中文字幕 | 一区二区三区视频在线观看 | 国产日韩欧美在线一区 | 色www精品视频在线观看 | 久久专区| 日韩免费视频一区二区 | 欧美成人精品一区 | 日本免费一区二区三区四区 | 99精品网站 | 视频二区国产 | 日本人做爰大片免费观看一老师 | 男女羞羞视频在线免费观看 |