欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32F407單片機學習紅外開空調源程序
[打印本頁]
作者:
qinshuai
時間:
2019-5-25 18:30
標題:
STM32F407單片機學習紅外開空調源程序
單片機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)
2019-5-25 18:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
hw_f103zet6.rar
(6.81 KB, 下載次數: 44)
2019-5-25 18:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
陳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