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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4567|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STM32F407單片機(jī)學(xué)習(xí)紅外開(kāi)空調(diào)源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:392682 發(fā)表于 2019-5-25 18:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)STM32F103ZET6 or STM32F407ZET6紅外接收頭VS1838b
普通紅外發(fā)射管

單片機(jī)源程序如下:
  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  //打開(kāi)空調(diào)命令的紅外信息存儲(chǔ)首地址
  8. //#define        CLOSE_KT        600        //關(guān)閉空調(diào)命令的紅外信息存儲(chǔ)首地址       
  9. //#define SET_26          1200        //設(shè)置26度 紅外信息存儲(chǔ)首地址
  10. //#define OPEN_TY          1800        //打開(kāi)投影 紅外信息存儲(chǔ)首地址
  11. //#define        CLOSE_TY  2400        //關(guān)閉投影 紅外信息存儲(chǔ)首地址

  12. //#define HW_DAT_SIZE 500 //存儲(chǔ)紅外信息數(shù)組內(nèi)元素的個(gè)數(shù)

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

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

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

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

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

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

  70.         HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中斷相關(guān)標(biāo)志位
  71.       }
  72.    }
  73.        
  74.    buff[0]=num;//buff[0]用來(lái)表示,整個(gè)數(shù)組內(nèi)有用信號(hào)的個(gè)數(shù)buff[1]--buff[num-1]
  75.    TIM_Cmd(TIM5,DISABLE ); //關(guān)閉定時(shí)器5
  76.    
  77.    return;

  78. }

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

  102. /******************************************************************************/
  103. /*從文件HWData.TXT的指定位置讀取遙控紅外信息*/
  104. //pos為文件內(nèi)部地址指針位置,用來(lái)引導(dǎo)從哪個(gè)字節(jié)開(kāi)始讀取
  105. //buff用來(lái)保存讀取出的紅外信息
  106. //注意:先讀出該位置的第一個(gè)數(shù)(unsigned short int類型)存于buff[0],代表了buff里面有多少個(gè)有用數(shù)據(jù)(包括buff[0]本身)
  107. //size為buff所指的內(nèi)存塊的大小
  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 );        //以讀方式打開(kāi)HWData.TXT
  116.         //f.fptr = pos;        //文件內(nèi)部位置指針
  117.         f_lseek(&f,pos);
  118.         f_read(&f, &buff[0], sizeof( unsigned short int ), &num);        //讀取指定地址的第一個(gè)數(shù)據(jù)(有用數(shù)據(jù)的大。嬗赽uff[0]
  119.         //f.fptr = pos; //讀取過(guò)上面的一個(gè)數(shù)據(jù)后,指針位置已經(jīng)改變
  120.         f_lseek(&f,pos);
  121.         f_read(&f, buff, buff[0]*sizeof(unsigned short int), &num);
  122.         f_close(&f);       
  123. }


  124. /******************************************************************************/
  125. /*將學(xué)習(xí)到的遙控信號(hào)保存在文件HWData.TXT的指定位置里面,*/
  126. //pos為文件內(nèi)部地址指針位置,用來(lái)引導(dǎo)從哪個(gè)字節(jié)開(kāi)始寫入
  127. //buff所指,為待寫入的紅外信號(hào)
  128. //注意:buff[0]里面的數(shù)代表buff里面有多少個(gè)有用數(shù)據(jù)(包括buff[0]本身)
  129. //size為buff所指的內(nèi)存塊的大小
  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 );        //以寫的方式打開(kāi)HWData.TXT,如果不存在,則新建這個(gè)文檔
  145.         //f.fptr = pos;        //文件內(nèi)部位置指針
  146.         f_lseek(&f,pos);
  147.         //num1=;
  148.         f_write(&f, buff, buff[0]*sizeof(unsigned short int), &num);        //將信息寫入文件中的指定位置
  149.         f_close(&f);
  150. }
復(fù)制代碼

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


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:641794 發(fā)表于 2020-1-7 13:23 | 只看該作者
可以買這個(gè)整個(gè)的源碼嗎?謝謝大佬,因?yàn)槲易罱苍谧鲞@個(gè)
回復(fù)

使用道具 舉報(bào)

板凳
ID:336378 發(fā)表于 2020-1-8 11:18 | 只看該作者
   大神寫的好, 支持,紅外寫的好比較少。有沒(méi)項(xiàng)項(xiàng)目中實(shí)踐過(guò)?
回復(fù)

使用道具 舉報(bào)

地板
ID:694864 發(fā)表于 2020-4-10 23:46 | 只看該作者
我想請(qǐng)問(wèn)下,,我想測(cè)紅外頻率怎么加進(jìn)去呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日本一区二区在线播放 | 宅女噜噜66国产精品观看免费 | 欧美日韩综合一区 | 天天色图 | 国产精品自产av一区二区三区 | 久草资源在线视频 | 欧美一级免费看 | 一区二区精品 | 国产精品久久国产精品 | 91精品国产91久久久久久 | 91精品麻豆日日躁夜夜躁 | h在线看| 欧美视频在线看 | 日韩精品专区在线影院重磅 | 欧美精品久久久久 | 女女爱爱视频 | 亚洲一区二区三区桃乃木香奈 | 精品国产一区二区三区观看不卡 | 欧美日韩在线高清 | 在线看日韩 | 国产精品久久久久久婷婷天堂 | 色吊丝在线 | 国产一区二区三区免费观看在线 | 99re视频在线| 亚洲国产成人精品女人久久久野战 | 亚洲精品综合 | 日韩精品成人 | 亚洲综合视频 | 一区二区视频在线 | 亚洲一级二级三级 | 欧美一级网站 | 一级毛片在线播放 | 户外露出一区二区三区 | 日韩欧美在线观看视频 | 自拍偷拍亚洲欧美 | 精品国产一区二区三区在线观看 | 国产高清久久久 | 日韩欧美三级电影 | 性高朝久久久久久久3小时 av一区二区三区四区 | 天堂免费| 玩丰满女领导对白露脸hd |