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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32F407單片機學習紅外開空調源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:392682 發表于 2019-5-25 18:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機STM32F103ZET6 or STM32F407ZET6紅外接收頭VS1838b
普通紅外發射管

單片機源程序如下:
  1. #include "HW.h"
  2. #include "timer.h"
  3. #include "ff.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. #include "string.h"

  7. //#define        OPEN_KT          0  //打開空調命令的紅外信息存儲首地址
  8. //#define        CLOSE_KT        600        //關閉空調命令的紅外信息存儲首地址       
  9. //#define SET_26          1200        //設置26度 紅外信息存儲首地址
  10. //#define OPEN_TY          1800        //打開投影 紅外信息存儲首地址
  11. //#define        CLOSE_TY  2400        //關閉投影 紅外信息存儲首地址

  12. //#define HW_DAT_SIZE 500 //存儲紅外信息數組內元素的個數

  13. //
  14. //#define HW_Input PAin( 1 )//紅外信號觸發引腳,也是定時器輸入捕獲引腳

  15. unsigned char HW_INT_STA_F_GROUP = 0;//紅外中斷狀態標志組
  16. unsigned char HW_learn_mode = 0; //紅外學習模式,值為0則一般模式,值為0xf0時表示進入紅外學習模式
  17. /******************************************************************************/
  18. /*紅外模塊的初始化,包括定時器5與3的初始化*/
  19. void HWInit(void)
  20. {
  21.         TIM5_CH2_Cap_Init(Timer5_MAX_Count,84-1); //以1Mhz的頻率計數 //定時器5 通道2 初始化(邊沿捕獲,計數最大值為0xffff)
  22.         TIM_SetCounter( TIM5, 0 );         //將定時器里的殘留值也消掉       
  23.         TIM3_PWM_Init(2211,0);//定時器3 PWM初始化,不分頻,計數頻率位84Mhz,計數上限為1893
  24. }

  25. /******************************************************************************/
  26. /*紅外信息學習函數,定時器的輸入捕獲功能學習遙控信號*/
  27. //buff用來保存紅外信息
  28. //注意:buff[0]里面的數代表buff里面有多少個有用數據(包括buff[0]本身)
  29. //size為buff所指的內存塊的大小
  30. void HWInfroLearn(unsigned short int *buff, unsigned short int size)
  31. {
  32.         unsigned short int num = 0;        //用來計數收到的信息數量
  33.         unsigned char cnt =0;;        //定時器計數
  34.        
  35.         while(HW_Input == 1)        //等待紅外遙控信號的觸發(收到的第一個遙控信號一定是低電平)
  36.          {
  37.                  
  38.           }

  39.          TIM_Cmd( TIM5, ENABLE ); //使能定時器5//開始計時,并且開啟定時器5的中斷                
  40.          
  41.     while( cnt < 10 )   //10*65536us =600多毫秒,如果一個電平時間超過600毫秒,則認為信號已經發送完畢
  42.     {
  43.                 if( ( HW_INT_STA_F_GROUP &(1 << Tim5_Int_F ) ) != 0 )//如果進入過中斷
  44.                 {
  45.                         if((HW_INT_STA_F_GROUP & (1<<Tim5_Edge_F)) != 0)
  46.                         {
  47.                                 TIM_Cmd(TIM5,DISABLE );         //關閉定時器5

  48.                                 buff[num] = TIM_GetCapture2(TIM5)+cnt*Timer5_MAX_Count; // 得到電平時間
  49.                                
  50.                                 if( num < size )
  51.                 {
  52.                                         num++;                        //保存序號自增
  53.                 }
  54.                                 else                     //出錯則發送error
  55.                 {
  56.                                         puts("buff size too samll \r\n");
  57.                                         buff[0]=500;
  58.                                         HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中斷相關標志位
  59.                                         return;
  60.                 }

  61.                                 cnt= 0;//清除變量值
  62.                                                
  63.                                  TIM_SetCounter(TIM5,0);   //將定時器里的殘留值也消掉
  64.                                  TIM_Cmd(TIM5,ENABLE );          //開啟定時器5
  65.                         }
  66.                         else
  67.                         {            
  68.                                 cnt++;               
  69.                         }

  70.         HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中斷相關標志位
  71.       }
  72.    }
  73.        
  74.    buff[0]=num;//buff[0]用來表示,整個數組內有用信號的個數buff[1]--buff[num-1]
  75.    TIM_Cmd(TIM5,DISABLE ); //關閉定時器5
  76.    
  77.    return;

  78. }

  79. /******************************************************************************/
  80. /*紅外信息的發射,利用定時器的PWM波輸出,把遙控信號還原發射出去,載波頻率38Khz左右*/
  81. //buff里面為待發射的紅外信息
  82. //注意:buff[0]里面的數代表buff里面有多少個有用數據(包括buff[0]本身)
  83. //size為buff所指的內存塊的大小
  84. void HWInfroSend(unsigned short int *buff, unsigned short int size)
  85. {
  86.         unsigned short int i;
  87.        
  88.         //TIM3_PWM_Init(1893,0);//定時器3 PWM初始化,不分頻,計數頻率位72Mhz,計數上限為1893
  89.         TIM_Cmd(TIM3, ENABLE);
  90.                          
  91.         for(i=1; i<buff[0]; i++ )  //從數組的第二個元素開始,因為buff【0】=0,第一次邊沿,是作為開始條件的,那時定時器里面還沒有開始計數,等到
  92.         {                                                //第二個邊沿到來,第一個低電平才算是正式被記錄下來。                                                          
  93.                  (i%2 == 1) ? TIM_SetCompare2(TIM3,737) : TIM_SetCompare2(TIM3,0); //輸出38khz,占空比為1/3的PWM;,輸出低電平,也就是不發送載波                               
  94.                  delay_us( buff[i] );                             //載波或者低電平維持時間,就是將就收到的紅外信息還原發射出去                                                                                              
  95.         }                                                                                                   
  96.                           
  97.         TIM_SetCompare2(TIM3,0);// 輸出低電平,
  98.         delay_ms(1);                               //確保已經輸出低電平,,輸出低電平的原因為,怕一直使NPN三極管道通,驅動紅外發射管,燒壞管子
  99.         TIM_Cmd(TIM3, DISABLE); //用完之后關閉定時器
  100.                  
  101. }

  102. /******************************************************************************/
  103. /*從文件HWData.TXT的指定位置讀取遙控紅外信息*/
  104. //pos為文件內部地址指針位置,用來引導從哪個字節開始讀取
  105. //buff用來保存讀取出的紅外信息
  106. //注意:先讀出該位置的第一個數(unsigned short int類型)存于buff[0],代表了buff里面有多少個有用數據(包括buff[0]本身)
  107. //size為buff所指的內存塊的大小
  108. void HWInfroRead(unsigned long pos, unsigned short int *buff, unsigned short int size)
  109. {
  110.         static FIL f;        //文件變量f
  111.         unsigned  int num;
  112.        
  113.         memset(&f,0,sizeof(FIL));
  114.        
  115.         f_open( &f, "0:\\HWData.txt",FA_READ );        //以讀方式打開HWData.TXT
  116.         //f.fptr = pos;        //文件內部位置指針
  117.         f_lseek(&f,pos);
  118.         f_read(&f, &buff[0], sizeof( unsigned short int ), &num);        //讀取指定地址的第一個數據(有用數據的大小),存于buff[0]
  119.         //f.fptr = pos; //讀取過上面的一個數據后,指針位置已經改變
  120.         f_lseek(&f,pos);
  121.         f_read(&f, buff, buff[0]*sizeof(unsigned short int), &num);
  122.         f_close(&f);       
  123. }


  124. /******************************************************************************/
  125. /*將學習到的遙控信號保存在文件HWData.TXT的指定位置里面,*/
  126. //pos為文件內部地址指針位置,用來引導從哪個字節開始寫入
  127. //buff所指,為待寫入的紅外信號
  128. //注意:buff[0]里面的數代表buff里面有多少個有用數據(包括buff[0]本身)
  129. //size為buff所指的內存塊的大小
  130. void HWInfroWrite(unsigned long pos, unsigned short int *buff, unsigned short int size)
  131. {
  132.         static FIL f;        //文件變量f
  133.         long num=0;
  134.        
  135.         memset(&f,0,sizeof(FIL));
  136.        
  137.         // unsigned short int  num1=0;
  138.         if( buff[0] >= size)
  139.         {
  140.                 puts( "size too small 2\r\n");
  141.                 return;
  142.         }
  143.        
  144.         f_open( &f, "0:\\HWData.txt",FA_OPEN_ALWAYS | FA_WRITE );        //以寫的方式打開HWData.TXT,如果不存在,則新建這個文檔
  145.         //f.fptr = pos;        //文件內部位置指針
  146.         f_lseek(&f,pos);
  147.         //num1=;
  148.         f_write(&f, buff, buff[0]*sizeof(unsigned short int), &num);        //將信息寫入文件中的指定位置
  149.         f_close(&f);
  150. }
復制代碼

所有資料51hei提供下載:
hw_stm32f407vet6.rar (6.4 KB, 下載次數: 53)
hw_f103zet6.rar (6.81 KB, 下載次數: 44)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:641794 發表于 2020-1-7 13:23 | 只看該作者
可以買這個整個的源碼嗎?謝謝大佬,因為我最近也在做這個
回復

使用道具 舉報

板凳
ID:336378 發表于 2020-1-8 11:18 | 只看該作者
   大神寫的好, 支持,紅外寫的好比較少。有沒項項目中實踐過?
回復

使用道具 舉報

地板
ID:694864 發表于 2020-4-10 23:46 | 只看該作者
我想請問下,,我想測紅外頻率怎么加進去呢
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区久久精品 | 99re国产| 乱码av午夜噜噜噜噜动漫 | 看羞羞视频免费 | 中文字幕免费视频 | 亚洲天天干| 玖玖免费| 怡红院免费的全部视频 | 日韩色在线 | 国产成人99久久亚洲综合精品 | 欧美性另类 | 久久久久久久久精 | 欧美日韩视频在线第一区 | 91在线播| 一区二区三区在线播放视频 | 人成在线视频 | 日韩av在线一区 | 精品一区二区三区四区 | 久久国产免费 | 91av在线视频观看 | 国产精品视频二区三区 | www.天天操.com| 欧美精品在欧美一区二区 | 草草草影院 | 拍真实国产伦偷精品 | 黄色在线免费观看 | 九九九久久国产免费 | 在线欧美视频 | 国产一级一级国产 | 久久综合九色综合欧美狠狠 | 亚洲视频精品在线 | 国产成人免费视频 | 99久久国产综合精品麻豆 | 午夜影院黄 | 日韩中文在线 | 色婷婷综合网站 | 天天操夜夜操 | 精品网站999www | 日本成人片在线观看 | 四虎影院在线播放 | 五月天婷婷丁香 |