|
單片機(jī)STM32F103ZET6 or STM32F407ZET6紅外接收頭VS1838b
普通紅外發(fā)射管
單片機(jī)源程序如下:
- #include "HW.h"
- #include "timer.h"
- #include "ff.h"
- #include "delay.h"
- #include "usart.h"
- #include "string.h"
- //#define OPEN_KT 0 //打開(kāi)空調(diào)命令的紅外信息存儲(chǔ)首地址
- //#define CLOSE_KT 600 //關(guān)閉空調(diào)命令的紅外信息存儲(chǔ)首地址
- //#define SET_26 1200 //設(shè)置26度 紅外信息存儲(chǔ)首地址
- //#define OPEN_TY 1800 //打開(kāi)投影 紅外信息存儲(chǔ)首地址
- //#define CLOSE_TY 2400 //關(guān)閉投影 紅外信息存儲(chǔ)首地址
- //#define HW_DAT_SIZE 500 //存儲(chǔ)紅外信息數(shù)組內(nèi)元素的個(gè)數(shù)
- //
- //#define HW_Input PAin( 1 )//紅外信號(hào)觸發(fā)引腳,也是定時(shí)器輸入捕獲引腳
- unsigned char HW_INT_STA_F_GROUP = 0;//紅外中斷狀態(tài)標(biāo)志組
- unsigned char HW_learn_mode = 0; //紅外學(xué)習(xí)模式,值為0則一般模式,值為0xf0時(shí)表示進(jìn)入紅外學(xué)習(xí)模式
- /******************************************************************************/
- /*紅外模塊的初始化,包括定時(shí)器5與3的初始化*/
- void HWInit(void)
- {
- TIM5_CH2_Cap_Init(Timer5_MAX_Count,84-1); //以1Mhz的頻率計(jì)數(shù) //定時(shí)器5 通道2 初始化(邊沿捕獲,計(jì)數(shù)最大值為0xffff)
- TIM_SetCounter( TIM5, 0 ); //將定時(shí)器里的殘留值也消掉
- TIM3_PWM_Init(2211,0);//定時(shí)器3 PWM初始化,不分頻,計(jì)數(shù)頻率位84Mhz,計(jì)數(shù)上限為1893
- }
- /******************************************************************************/
- /*紅外信息學(xué)習(xí)函數(shù),定時(shí)器的輸入捕獲功能學(xué)習(xí)遙控信號(hào)*/
- //buff用來(lái)保存紅外信息
- //注意:buff[0]里面的數(shù)代表buff里面有多少個(gè)有用數(shù)據(jù)(包括buff[0]本身)
- //size為buff所指的內(nèi)存塊的大小
- void HWInfroLearn(unsigned short int *buff, unsigned short int size)
- {
- unsigned short int num = 0; //用來(lái)計(jì)數(shù)收到的信息數(shù)量
- unsigned char cnt =0;; //定時(shí)器計(jì)數(shù)
-
- while(HW_Input == 1) //等待紅外遙控信號(hào)的觸發(fā)(收到的第一個(gè)遙控信號(hào)一定是低電平)
- {
-
- }
- TIM_Cmd( TIM5, ENABLE ); //使能定時(shí)器5//開(kāi)始計(jì)時(shí),并且開(kāi)啟定時(shí)器5的中斷
-
- while( cnt < 10 ) //10*65536us =600多毫秒,如果一個(gè)電平時(shí)間超過(guò)600毫秒,則認(rèn)為信號(hào)已經(jīng)發(fā)送完畢
- {
- if( ( HW_INT_STA_F_GROUP &(1 << Tim5_Int_F ) ) != 0 )//如果進(jìn)入過(guò)中斷
- {
- if((HW_INT_STA_F_GROUP & (1<<Tim5_Edge_F)) != 0)
- {
- TIM_Cmd(TIM5,DISABLE ); //關(guān)閉定時(shí)器5
- buff[num] = TIM_GetCapture2(TIM5)+cnt*Timer5_MAX_Count; // 得到電平時(shí)間
-
- if( num < size )
- {
- num++; //保存序號(hào)自增
- }
- else //出錯(cuò)則發(fā)送error
- {
- puts("buff size too samll \r\n");
- buff[0]=500;
- HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中斷相關(guān)標(biāo)志位
- return;
- }
- cnt= 0;//清除變量值
-
- TIM_SetCounter(TIM5,0); //將定時(shí)器里的殘留值也消掉
- TIM_Cmd(TIM5,ENABLE ); //開(kāi)啟定時(shí)器5
- }
- else
- {
- cnt++;
- }
- HW_INT_STA_F_GROUP &= Clear_Int_F;//清除中斷相關(guān)標(biāo)志位
- }
- }
-
- buff[0]=num;//buff[0]用來(lái)表示,整個(gè)數(shù)組內(nèi)有用信號(hào)的個(gè)數(shù)buff[1]--buff[num-1]
- TIM_Cmd(TIM5,DISABLE ); //關(guān)閉定時(shí)器5
-
- return;
- }
- /******************************************************************************/
- /*紅外信息的發(fā)射,利用定時(shí)器的PWM波輸出,把遙控信號(hào)還原發(fā)射出去,載波頻率38Khz左右*/
- //buff里面為待發(fā)射的紅外信息
- //注意:buff[0]里面的數(shù)代表buff里面有多少個(gè)有用數(shù)據(jù)(包括buff[0]本身)
- //size為buff所指的內(nèi)存塊的大小
- void HWInfroSend(unsigned short int *buff, unsigned short int size)
- {
- unsigned short int i;
-
- //TIM3_PWM_Init(1893,0);//定時(shí)器3 PWM初始化,不分頻,計(jì)數(shù)頻率位72Mhz,計(jì)數(shù)上限為1893
- TIM_Cmd(TIM3, ENABLE);
-
- 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ù),等到
- { //第二個(gè)邊沿到來(lái),第一個(gè)低電平才算是正式被記錄下來(lái)。
- (i%2 == 1) ? TIM_SetCompare2(TIM3,737) : TIM_SetCompare2(TIM3,0); //輸出38khz,占空比為1/3的PWM;,輸出低電平,也就是不發(fā)送載波
- delay_us( buff[i] ); //載波或者低電平維持時(shí)間,就是將就收到的紅外信息還原發(fā)射出去
- }
-
- TIM_SetCompare2(TIM3,0);// 輸出低電平,
- delay_ms(1); //確保已經(jīng)輸出低電平,,輸出低電平的原因?yàn),怕一直使NPN三極管道通,驅(qū)動(dòng)紅外發(fā)射管,燒壞管子
- TIM_Cmd(TIM3, DISABLE); //用完之后關(guān)閉定時(shí)器
-
- }
- /******************************************************************************/
- /*從文件HWData.TXT的指定位置讀取遙控紅外信息*/
- //pos為文件內(nèi)部地址指針位置,用來(lái)引導(dǎo)從哪個(gè)字節(jié)開(kāi)始讀取
- //buff用來(lái)保存讀取出的紅外信息
- //注意:先讀出該位置的第一個(gè)數(shù)(unsigned short int類型)存于buff[0],代表了buff里面有多少個(gè)有用數(shù)據(jù)(包括buff[0]本身)
- //size為buff所指的內(nèi)存塊的大小
- 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 ); //以讀方式打開(kāi)HWData.TXT
- //f.fptr = pos; //文件內(nèi)部位置指針
- f_lseek(&f,pos);
- f_read(&f, &buff[0], sizeof( unsigned short int ), &num); //讀取指定地址的第一個(gè)數(shù)據(jù)(有用數(shù)據(jù)的大。嬗赽uff[0]
- //f.fptr = pos; //讀取過(guò)上面的一個(gè)數(shù)據(jù)后,指針位置已經(jīng)改變
- f_lseek(&f,pos);
- f_read(&f, buff, buff[0]*sizeof(unsigned short int), &num);
- f_close(&f);
- }
- /******************************************************************************/
- /*將學(xué)習(xí)到的遙控信號(hào)保存在文件HWData.TXT的指定位置里面,*/
- //pos為文件內(nèi)部地址指針位置,用來(lái)引導(dǎo)從哪個(gè)字節(jié)開(kāi)始寫入
- //buff所指,為待寫入的紅外信號(hào)
- //注意:buff[0]里面的數(shù)代表buff里面有多少個(gè)有用數(shù)據(jù)(包括buff[0]本身)
- //size為buff所指的內(nèi)存塊的大小
- 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 ); //以寫的方式打開(kāi)HWData.TXT,如果不存在,則新建這個(gè)文檔
- //f.fptr = pos; //文件內(nèi)部位置指針
- f_lseek(&f,pos);
- //num1=;
- f_write(&f, buff, buff[0]*sizeof(unsigned short int), &num); //將信息寫入文件中的指定位置
- f_close(&f);
- }
復(fù)制代碼
所有資料51hei提供下載:
hw_stm32f407vet6.rar
(6.4 KB, 下載次數(shù): 53)
2019-5-25 18:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
hw_f103zet6.rar
(6.81 KB, 下載次數(shù): 44)
2019-5-25 18:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|