单片机STM32F103ZET6 or STM32F407ZET6红外接收头VS1838b
普通红外发射管
单片机源程序如下:
- #include "HW.h"
- #include "timer.h"
- #include "ff.h"
- #include "delay.h"
- #include "usart.h"
- #include "string.h"
- //#define OPEN_KT 0 //打开空调命令的红外信息存储首地址
- //#define CLOSE_KT 600 //关闭空调命令的红外信息存储首地址
- //#define SET_26 1200 //设置26度 红外信息存储首地址
- //#define OPEN_TY 1800 //打开投影 红外信息存储首地址
- //#define CLOSE_TY 2400 //关闭投影 红外信息存储首地址
- //#define HW_DAT_SIZE 500 //存储红外信息数组内元素的个数
- //
- //#define HW_Input PAin( 1 )//红外信号触发引脚,也是定时器输入捕获引脚
- unsigned char HW_INT_STA_F_GROUP = 0;//红外中断状态标志组
- unsigned char HW_learn_mode = 0; //红外学习模式,值为0则一般模式,值为0xf0时表示进入红外学习模式
- /******************************************************************************/
- /*红外模块的初始化,包括定时器5与3的初始化*/
- void HWInit(void)
- {
- TIM5_CH2_Cap_Init(Timer5_MAX_Count,84-1); //以1Mhz的频率计数 //定时器5 通道2 初始化(边沿捕获,计数最大值为0xffff)
- TIM_SetCounter( TIM5, 0 ); //将定时器里的残留值也消掉
- TIM3_PWM_Init(2211,0);//定时器3 PWM初始化,不分频,计数频率位84Mhz,计数上限为1893
- }
- /******************************************************************************/
- /*红外信息学习函数,定时器的输入捕获功能学习遥控信号*/
- //buff用来保存红外信息
- //注意:buff[0]里面的数代表buff里面有多少个有用数据(包括buff[0]本身)
- //size为buff所指的内存块的大小
- void HWInfroLearn(unsigned short int *buff, unsigned short int size)
- {
- unsigned short int num = 0; //用来计数收到的信息数量
- unsigned char cnt =0;; //定时器计数
-
- while(HW_Input == 1) //等待红外遥控信号的触发(收到的第一个遥控信号一定是低电平)
- {
-
- }
- TIM_Cmd( TIM5, ENABLE ); //使能定时器5//开始计时,并且开启定时器5的中断
-
- while( cnt < 10 ) //10*65536us =600多毫秒,如果一个电平时间超过600毫秒,则认为信号已经发送完毕
- {
- if( ( HW_INT_STA_F_GROUP &(1 << Tim5_Int_F ) ) != 0 )//如果进入过中断
- {
- if((HW_INT_STA_F_GROUP & (1<<Tim5_Edge_F)) != 0)
- {
- TIM_Cmd(TIM5,DISABLE ); //关闭定时器5
- buff[num] = TIM_GetCapture2(TIM5)+cnt*Timer5_MAX_Count; // 得到电平时间
-
- if( num < size )
- {
- num++; //保存序号自增
- }
- else //出错则发送error
- {
- puts("buff size too samll \r\n");
- buff[0]=500;
- HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中断相关标志位
- return;
- }
- cnt= 0;//清除变量值
-
- TIM_SetCounter(TIM5,0); //将定时器里的残留值也消掉
- TIM_Cmd(TIM5,ENABLE ); //开启定时器5
- }
- else
- {
- cnt++;
- }
- HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中断相关标志位
- }
- }
-
- buff[0]=num;//buff[0]用来表示,整个数组内有用信号的个数buff[1]--buff[num-1]
- TIM_Cmd(TIM5,DISABLE ); //关闭定时器5
-
- return;
- }
- /******************************************************************************/
- /*红外信息的发射,利用定时器的PWM波输出,把遥控信号还原发射出去,载波频率38Khz左右*/
- //buff里面为待发射的红外信息
- //注意:buff[0]里面的数代表buff里面有多少个有用数据(包括buff[0]本身)
- //size为buff所指的内存块的大小
- void HWInfroSend(unsigned short int *buff, unsigned short int size)
- {
- unsigned short int i;
-
- //TIM3_PWM_Init(1893,0);//定时器3 PWM初始化,不分频,计数频率位72Mhz,计数上限为1893
- TIM_Cmd(TIM3, ENABLE);
-
- for(i=1; i<buff[0]; i++ ) //从数组的第二个元素开始,因为buff【0】=0,第一次边沿,是作为开始条件的,那时定时器里面还没有开始计数,等到
- { //第二个边沿到来,第一个低电平才算是正式被记录下来。
- (i%2 == 1) ? TIM_SetCompare2(TIM3,737) : TIM_SetCompare2(TIM3,0); //输出38khz,占空比为1/3的PWM;,输出低电平,也就是不发送载波
- delay_us( buff[i] ); //载波或者低电平维持时间,就是将就收到的红外信息还原发射出去
- }
-
- TIM_SetCompare2(TIM3,0);// 输出低电平,
- delay_ms(1); //确保已经输出低电平,,输出低电平的原因为,怕一直使NPN三极管道通,驱动红外发射管,烧坏管子
- TIM_Cmd(TIM3, DISABLE); //用完之后关闭定时器
-
- }
- /******************************************************************************/
- /*从文件HWData.TXT的指定位置读取遥控红外信息*/
- //pos为文件内部地址指针位置,用来引导从哪个字节开始读取
- //buff用来保存读取出的红外信息
- //注意:先读出该位置的第一个数(unsigned short int类型)存于buff[0],代表了buff里面有多少个有用数据(包括buff[0]本身)
- //size为buff所指的内存块的大小
- void HWInfroRead(unsigned long pos, unsigned short int *buff, unsigned short int size)
- {
- static FIL f; //文件变量f
- unsigned int num;
-
- memset(&f,0,sizeof(FIL));
-
- f_open( &f, "0:\\HWData.txt",FA_READ ); //以读方式打开HWData.TXT
- //f.fptr = pos; //文件内部位置指针
- f_lseek(&f,pos);
- f_read(&f, &buff[0], sizeof( unsigned short int ), &num); //读取指定地址的第一个数据(有用数据的大小),存于buff[0]
- //f.fptr = pos; //读取过上面的一个数据后,指针位置已经改变
- f_lseek(&f,pos);
- f_read(&f, buff, buff[0]*sizeof(unsigned short int), &num);
- f_close(&f);
- }
- /******************************************************************************/
- /*将学习到的遥控信号保存在文件HWData.TXT的指定位置里面,*/
- //pos为文件内部地址指针位置,用来引导从哪个字节开始写入
- //buff所指,为待写入的红外信号
- //注意:buff[0]里面的数代表buff里面有多少个有用数据(包括buff[0]本身)
- //size为buff所指的内存块的大小
- void HWInfroWrite(unsigned long pos, unsigned short int *buff, unsigned short int size)
- {
- static FIL f; //文件变量f
- long num=0;
-
- memset(&f,0,sizeof(FIL));
-
- // unsigned short int num1=0;
- if( buff[0] >= size)
- {
- puts( "size too small 2\r\n");
- return;
- }
-
- f_open( &f, "0:\\HWData.txt",FA_OPEN_ALWAYS | FA_WRITE ); //以写的方式打开HWData.TXT,如果不存在,则新建这个文档
- //f.fptr = pos; //文件内部位置指针
- f_lseek(&f,pos);
- //num1=;
- f_write(&f, buff, buff[0]*sizeof(unsigned short int), &num); //将信息写入文件中的指定位置
- f_close(&f);
- }
复制代码
所有资料51hei提供下载:
hw_stm32f407vet6.rar
(6.4 KB, 下载次数: 53)
|