找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4168|回复: 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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表