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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ESP8266智能家居自學習紅外遙控設計 單片機源代碼+PCB電路圖

  [復制鏈接]
跳轉到指定樓層
樓主
Altium Designer畫的ESP8266自學習紅外遙控原理圖和PCB圖如下:(51hei附件中可下載工程文件)


ESP8266單片機源程序如下:
  1. #include "stc12c2052ad.h"
  2. #include "wifi_IR.h"

  3. #include <intrins.h>

  4. //#define ENABLE_IAP  0x83            //if SYSCLK<20MHz

  5. #define FOSC 11059200UL//12M晶振

  6. #define CMD_IDLE    0               //Stand-By
  7. #define CMD_READ    1               //Byte-Read
  8. #define CMD_PROGRAM 2               //Byte-Program
  9. #define CMD_ERASE   3               //Sector-Erase



  10. uint addr;//EPPROM地址
  11. //uchar cou;
  12. bit study_send_switch,LED_state;

  13. void SaveLevelTimeLength(uint addr);//存儲電平時長
  14. void IrSend();//紅外發射                                         
  15. void Read_Key();
  16. void IrStudy();
  17. void IapIdle();
  18. void byte_write(uint addr, uchar dat);
  19. void SectorErase(uint sector_addr);
  20. uchar byte_read(uint addr);


  21. void TIMER0_RELOAD(uint addr)//裝入定時器
  22. {
  23. TR0=0;
  24. TF0=0;
  25. TH0=byte_read(addr);//從指定的地址讀出電平的長度
  26. TL0=byte_read(addr+1);//從指定的地址讀出電平的長度
  27. TR0=1;//啟動定時器

  28. }
  29. //---------------------------------------------------

  30. void IrSend()//紅外發射
  31. {
  32.         uchar level_cnt;        //電平個數

  33.         level_cnt=byte_read(addr);//讀出電平個數
  34.         addr++;//地址后移一位
  35.         while (1)
  36.         {
  37.                 F38_4KHZ_ON();//因為紅外碼大部分都是起始一段高電平,所以此處一開始就打開。
  38.                 TIMER0_RELOAD(addr);//時長裝入定時器,開始計時
  39.                 addr+=2;// 地址移到沒有取過的地方,TIMER0_RELOAD函數取了兩個地址的數據
  40.                 while (!TF0);//等待定時器0溢出
  41.                
  42.                 if(level_cnt--==0)break;//判斷是否取完
  43.                 F38_4KHZ_OFF(); IR_SEND = 1;//停止發射
  44.                 TIMER0_RELOAD(addr);//時長裝入定時器,開始計時
  45.                 addr+=2;//地址移到沒有取過的地方,TIMER0_RELOAD函數取了兩個地址的數據
  46.                 while (!TF0);//等待定時器0溢出
  47.                 if(level_cnt--==0)break;//電平數是否完畢
  48.         }
  49.         F38_4KHZ_OFF(); IR_SEND = 1;//停止發射
  50. }
  51. //---------------------------------------------------

  52. void SaveLevelTimeLength(uint addr)//存電平時長
  53. {
  54.         TR0=0;
  55.         byte_write(addr, ~TH0);
  56.         byte_write(addr+1, ~TL0);  //電平時長存入eeprom中
  57.         TH0=0;//定時器初值歸0
  58.         TL0=0x65;//查手冊知道,編程一個字節需要55us,編程兩個字節,所以此處需要110us。
  59.         TR0=1;//開始計數
  60. }

  61. void IrStudy()
  62. {
  63.         uint level_cnt;
  64.         uint addrtmp;

  65.         TF0 = 0;
  66.         SectorErase(addr);
  67.         addrtmp=addr;//記錄第一個地址,存儲電平個數
  68.         addr++;
  69.         TR0=0;//停止計數
  70.         while (IR_REV);//等待紅外接收管腳為低電平        
  71.         //編碼與解碼是一對逆過程,不僅在原理上是一對逆過程,在碼的發收過程也是互反的,即以前發射端原始信號是高電平,那接收頭輸出的就是低電平
  72.         TH0=0;
  73.         TL0=0;
  74.         TR0=1;//開啟定時器
  75.         
  76.         
  77.         while (1)
  78.                 {
  79.                   while (!IR_REV)        //等待高電平,等待超時;超過70MS退出
  80.                   {
  81.                         if (TF0)
  82.                         {
  83.                          goto StudyFinish;
  84.                         }                  
  85.                   
  86.                   }                        
  87.                         
  88.                 SaveLevelTimeLength(addr); //高電平到來,存低電平時長到eeprom}
  89.         level_cnt++;
  90.                 addr += 2;
  91.                         
  92.                 while (IR_REV)        //等待低電平,等待超時;超過70MS退出                        
  93.                  {
  94.                   if (TF0)
  95.                   {
  96.                     goto StudyFinish;
  97.                   }                        
  98.                 }
  99.             SaveLevelTimeLength(addr);//低電平到來存高電平電平時長
  100.                 level_cnt++;//存儲的電平個數加11
  101.                 addr+=2;//地址后移兩位
  102.                 }
  103.                 StudyFinish:
  104.                 TF0=0;
  105.                 TR0=0;
  106.                 byte_write(addrtmp,level_cnt);
  107.                 level_cnt = 0;

  108. }




  109. void Delay100ms()                //@11.0592MHz
  110. {
  111.         unsigned char i, j, k;

  112.         _nop_();
  113.         _nop_();
  114.         i = 5;
  115.         j = 52;
  116.         k = 195;
  117.         do
  118.         {
  119.                 do
  120.                 {
  121.                         while (--k);
  122.                 } while (--j);
  123.         } while (--i);
  124. }


  125. void IapIdle()
  126. {
  127.     IAP_CONTR = 0;                  //Close IAP function
  128.     IAP_CMD = 0;                    //Clear command to standby
  129.     IAP_TRIG = 0;                   //Clear trigger register
  130.     IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
  131.     IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
  132. }


  133. /************************************************************************
  134. 函數名稱:字節寫
  135. 全局變量:無
  136. 參數說明:addr:寫入地址, dat:寫入數據
  137. ************************************************************************/
  138. void byte_write(uint addr,uchar dat)
  139. {
  140.         IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  141.     IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
  142.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  143.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  144.     IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
  145.     IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
  146.     IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
  147.     _nop_();
  148.     _nop_();   
  149.         _nop_();   
  150.         _nop_();
  151.     IapIdle();   


  152. }


  153. /************************************************************************
  154. 函數名稱:扇區擦除
  155. 全局變量:無
  156. 參數說明:sector_addr:扇區地址
  157. ************************************************************************/
  158. void SectorErase(uint addr)
  159. {
  160.         IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  161.     IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
  162.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  163.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  164.     IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
  165.     IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
  166.     _nop_();
  167.     _nop_();   
  168.         _nop_();   
  169.         _nop_();
  170.         IapIdle();

  171. }

  172. /************************************************************************
  173. 函數名稱:字節讀函數
  174. 全局變量:無
  175. 參數說明:addr:所要讀取的地址
  176. 返回說明:讀取到的數據
  177. ************************************************************************/
  178. uchar byte_read(uint addr)
  179. {
  180.     uchar dat;                       //Data buffer

  181.     IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
  182.     IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
  183.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  184.     IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
  185.     IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
  186.     IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
  187.     _nop_();
  188.     _nop_();   
  189.         _nop_();   
  190.         _nop_();



  191.     dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data

  192.         IapIdle();

  193.     return dat;                     //Return Flash data
  194. }



  195. /*****************************
  196. 主程序
  197. ******************************/

  198. void main()        
  199. {
  200.         uchar i;
  201. /***********************************按復位鍵下載***********************************************************/        
  202.         if((PCON&0x10)==0) //如果POF位=0   不是上電復位
  203.         {     PCON=PCON|0x10;  //將POF位置1  此處置1是為了下一條語句復位的時候不進入此函數   
  204.               ISP_CONTR=0x60;  //軟復位,從ISP監控區啟動   復位完成 ISP_CONTR 寄存器的值是多少???
  205.         }  
  206.         else  
  207.         {     
  208.           PCON=PCON&0xef;  //將POF位清零
  209.         }
  210. /***********************************按復位鍵下載***********************************************************/
  211.         
  212.         wifi_power = 0;
  213.         IR_REV = 1;
  214.         
  215.         P1M0  = 0;
  216.         
  217.         P1M1  = 0x02; //定義P1.1為推挽輸出
  218.         
  219.         P3M0  = 0;
  220.         
  221.         P3M1  = 0xA0; //定義P3.5 P3.7為推挽輸出
  222.         
  223.         SW_WIFI_DL = 1;
  224.         
  225.         TIMER0_INIT();
  226.         serial_init();
  227.         DEBUG_LED = 1;
  228.         
  229.         while(1)
  230.         {
  231.                  PCON = 0X01;
  232.                     _nop_();
  233.                     _nop_();   
  234.                         _nop_();   
  235.                         _nop_();
  236.                
  237.                   r_string();
  238.                   if(r_comp == 1)
  239.                   {
  240.                         r_comp = 0;
  241.                
  242.                         if(tp[0] == 0)
  243.                                         {
  244.                                                 study_send_switch = 1;         //學習狀態
  245.                                         }
  246.                         
  247.                          else if(tp[0] == 0x15)
  248.                                         {
  249.                                                 study_send_switch = 0;         //發射狀態
  250.                                         }
  251.                         else if(tp[0] == 0x16)
  252.                                         {
  253.                                                 HS0038_power = 1;
  254.                                                 wifi_power = 1;
  255.                                                 IR_SEND = 1;
  256.                
  257.                                                 PCON=2;
  258.                                                 _nop_();
  259.                                                 _nop_();
  260.                                                 _nop_();
  261.                                                 _nop_();                        
  262.                
  263.                                         }
  264.                                 else
  265.                                            {
  266.                                                  EA = 0;
  267.                
  268.                                                  switch(tp[0])
  269.                                                   {
  270.                                                 
  271.                 //                                   case 0x00: study_send_switch = !study_send_switch;break;
  272.                                                    case 0x01: addr = 0;        break;
  273.                                                    case 0x02: addr = 0x200;        break;
  274.                                                    case 0x03: addr = 0x400;        break;
  275.                                                    case 0x04: addr = 0x600;        break;
  276.                                                    case 0x05: addr = 0x800;        break;
  277.                                                    case 0x06: addr = 0xa00;        break;
  278.                                                    case 0x07: addr = 0xc00;        break;
  279.                                                    case 0x08: addr = 0xe00;        break;
  280.                                                    case 0x09: addr = 0x1000;break;
  281.                                                    case 0x0a: addr = 0x1200;break;
  282.                                                    case 0x0b: addr = 0x1400;break;
  283.                                                    case 0x0c: addr = 0x1600;break;
  284.                                                    case 0x0d: addr = 0x1800;break;
  285.                                                    case 0x0e: addr = 0x1a00;break;
  286.                                                    case 0x0f: addr = 0x1c00;break;
  287.                                                    case 0x10: addr = 0x1e00;break;
  288.                                                    case 0x11: addr = 0x2000;break;
  289.                                                    case 0x12: addr = 0x2200;break;
  290.                                                    case 0x13: addr = 0x2400;break;
  291.                                                    case 0x14: addr = 0x2600;break;
  292.                
  293.                
  294.                                                      default: addr = 0x8000;break;                                
  295.                                                 
  296.                                                 }
  297.                
  298.                                                 if(study_send_switch)
  299.                                                                  {
  300.                                                                         HS0038_power = 0;
  301.                
  302.                                                                         for(i = 0;i < 5;i++)
  303.                                                                         {
  304. ……………………

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

所有資料51hei提供下載:
wifi紅外學習遙控源代碼V1.0.zip (13.48 KB, 下載次數: 207)
wifi紅外遙控PCB工程V1.0.zip (437.44 KB, 下載次數: 201)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:67537 發表于 2019-4-20 22:12 | 只看該作者
請教下,這個HS0038接收頭電源端為什么要接一個8550三極管由單片機來控制電源端,有什么其他作用嗎,還有個問題,為什么還要額外增加一個單片機,這個8266本身就有紅外功能的,另外這個電路如何修改成對射的紅外線報警器
回復

使用道具 舉報

板凳
ID:251820 發表于 2019-4-26 10:12 | 只看該作者
自學習行的
回復

使用道具 舉報

地板
ID:189467 發表于 2019-4-26 13:44 | 只看該作者
2016年的絲印,學習學習
回復

使用道具 舉報

5#
ID:609432 發表于 2019-12-27 16:26 | 只看該作者
謝謝分享 學習
回復

使用道具 舉報

6#
ID:666656 發表于 2019-12-28 20:17 | 只看該作者
謝謝分享,最近正好在接觸!
回復

使用道具 舉報

7#
ID:517951 發表于 2020-11-15 16:25 | 只看該作者
不錯,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

8#
ID:100247 發表于 2021-4-5 09:17 | 只看該作者
你好,設計的很周全,文中沒有說明ESP8266模塊起到什么作用,應該只是串口通訊吧,沒參與紅外的學習和發送動作吧?
回復

使用道具 舉報

9#
ID:758532 發表于 2021-9-18 21:26 | 只看該作者

不錯,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

10#
ID:860003 發表于 2023-2-23 15:18 | 只看該作者
不錯,剛要找這個來學習。控制家里的電熱水器!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片链接 | 国内自拍视频在线观看 | 国产成人91| 黄色网页在线观看 | 97精品超碰一区二区三区 | 91久久国产综合久久 | 精品91久久久 | 国产欧美一区二区三区在线播放 | 午夜在线视频 | 欧美在线视频网站 | 台湾a级理论片在线观看 | 亚洲午夜精品视频 | 福利视频日韩 | 久久国产综合 | 欧美综合网 | 成人在线免费电影 | 日韩2020狼一二三 | 精品成人一区二区 | 久久久久国产一级毛片高清网站 | 国产精品嫩草影院精东 | 求毛片 | 九色 在线 | 成人性生交大片 | 久久999 | 国产精品久久久久久久久久免费看 | 国产高清精品一区二区三区 | 农夫在线精品视频免费观看 | 亚洲成人自拍 | 99精品视频一区二区三区 | 国产清纯白嫩初高生在线播放视频 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产日韩欧美在线观看 | 欧美精品久久久 | 在线观看国产视频 | 久久逼逼 | 夜夜爽99久久国产综合精品女不卡 | 国产亚洲精品91 | 亚洲精品影院 | 久久久成人网 | 欧美在线a | 中文字幕在线三区 |