單片機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
|