欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: STM32F407單片機學習紅外開空調源程序 [打印本頁]

作者: qinshuai    時間: 2019-5-25 18:30
標題: STM32F407單片機學習紅外開空調源程序
單片機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)



作者: 陳ss1    時間: 2020-1-7 13:23
可以買這個整個的源碼嗎?謝謝大佬,因為我最近也在做這個
作者: cba_cba    時間: 2020-1-8 11:18
   大神寫的好, 支持,紅外寫的好比較少。有沒項項目中實踐過?
作者: YSY1987    時間: 2020-4-10 23:46
我想請問下,,我想測紅外頻率怎么加進去呢




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1