在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32編程之用TIM定時(shí)器的輸入捕獲功能紅外遙控解碼

            STM32編程之用TIM定時(shí)器的輸入捕獲功能紅外遙控解碼

            作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
            1、主程序

            本文引用地址:http://www.biyoush.com/article/201611/315581.htm

            #include "sys.h"
            #include "usart.h"
            #include "led.h"
            #include "lcd.h"
            #include "delay.h"
            #include "remote.h"
            #include "stm32f10x_tim.h"
            /*
            程序功能:用STM32的定時(shí)器輸入捕獲功能進(jìn)行紅外解碼。
            當(dāng)按下紅外遙控器的按鍵時(shí),LCD顯示鍵值和連按的次數(shù);
            同時(shí)串口也輸出同樣的數(shù)據(jù)。

            日期:2015年7月27日
            地點(diǎn):湖北工業(yè)職業(yè)技術(shù)學(xué)院電子工程
            硬件連接:
            PA1---TIM5_CH2;
            */


            int main(void)
            {
            u8 i=0;
            delay_init();
            NVIC_Configuration();
            uart_init(9600);
            LED_Init();
            LCD_Init();
            Remote_Init();
            LCD_Clear(RED);
            POINT_COLOR=BLUE;
            LCD_ShowString(30,60,200,16,16,"IRD TEST!");
            LCD_ShowString(30,80,200,16,16,"PLEASE PRESS!");
            LCD_ShowString(30,100,200,16,16,"KEYNUM IS : ");
            LCD_ShowString(30,120,200,16,16,"KEYCOUNT IS : ");

            while(1)
            {
            if(Remote_Scan()!=0)
            {
            LCD_ShowNum(118,100,Remote_Scan(),4,16);
            LCD_ShowNum(134,120,RmtCnt,4,16);
            printf("press keynum:%d n",Remote_Scan());
            printf("press keycount:%d n",RmtCnt);

            }
            delay_ms(10);
            i++;
            if(i>25)
            {i=0;LED0=~LED0;}
            }
            }

            2、頭文件:

            #ifndef __RED_H
            #define __RED_H
            #include "sys.h"


            #define RDATA PAin(1) //紅外數(shù)據(jù)輸入腳

            //紅外遙控識(shí)別碼(ID),每款遙控器的該值基本都不一樣,但也有一樣的.
            //我們選用的遙控器識(shí)別碼為0
            #define REMOTE_ID 0

            extern u8 RmtCnt;//按鍵按下的次數(shù)

            void Remote_Init(void); //紅外傳感器接收頭引腳初始化
            u8 Remote_Scan(void);
            #endif

            3、源文件

            #include "remote.h"
            #include "delay.h"
            #include "usart.h"
            #include "stm32f10x_conf.h"
            #include "stm32f10x_tim.h"

            //紅外遙控解碼驅(qū)動(dòng) 代碼

            //紅外遙控初始化
            //設(shè)置IO以及定時(shí)器4的輸入捕獲
            void Remote_Init(void)
            {

            GPIO_InitTypeDef GPIO_InitStructure;
            NVIC_InitTypeDef NVIC_InitStructure;
            TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
            TIM_ICInitTypeDef TIM_ICInitStructure;

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTB時(shí)鐘
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//TIM5 時(shí)鐘使能

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 輸入
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉輸入
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
            GPIO_SetBits(GPIOA,GPIO_Pin_1);//初始化GPIOA1


            TIM_TimeBaseStructure.TIM_Period = 10000; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值 最大10ms溢出
            TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //預(yù)分頻器,1M的計(jì)數(shù)頻率,1us加1.
            TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
            TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模

            TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx

            TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; // 選擇輸入端 IC2映射到TI5上
            TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿捕獲
            TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
            TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻
            TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置輸入濾波器 8個(gè)定時(shí)器時(shí)鐘周期濾波
            TIM_ICInit(TIM5, &TIM_ICInitStructure);//初始化定時(shí)器輸入捕獲通道

            TIM_Cmd(TIM5,ENABLE ); //使能定時(shí)器5


            NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5中斷
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占優(yōu)先級(jí)0級(jí)
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)3級(jí)
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
            NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器

            TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允許更新中斷 ,允許CC2IE捕獲中斷
            }


            //遙控器接收狀態(tài)
            //[7]:收到了引導(dǎo)碼標(biāo)志
            //[6]:得到了一個(gè)按鍵的所有信息
            //[5]:保留
            //[4]:標(biāo)記上升沿是否已經(jīng)被捕獲
            //[3:0]:溢出計(jì)時(shí)器
            u8 RmtSta=0;
            u16 Dval;//下降沿時(shí)計(jì)數(shù)器的值
            u32 RmtRec=0;//紅外接收到的數(shù)據(jù)
            u8 RmtCnt=0;//按鍵按下的次數(shù)
            //定時(shí)器5中斷服務(wù)程序
            void TIM5_IRQHandler(void)
            {
            if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
            {
            if(RmtSta&0x80)//上次有數(shù)據(jù)被接收到了
            {
            RmtSta&=~0X10;//取消上升沿已經(jīng)被捕獲標(biāo)記
            if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//標(biāo)記已經(jīng)完成一次按鍵的鍵值信息采集
            if((RmtSta&0X0F)<14)RmtSta++;
            else
            {
            RmtSta&=~(1<<7);//清空引導(dǎo)標(biāo)識(shí)
            RmtSta&=0XF0;//清空計(jì)數(shù)器
            }
            }
            }
            if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)
            {
            if(RDATA)//上升沿捕獲
            {

            TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);//CC1P=1 設(shè)置為下降沿捕獲
            TIM_SetCounter(TIM5,0); //清空定時(shí)器值
            RmtSta|=0X10;//標(biāo)記上升沿已經(jīng)被捕獲
            }else //下降沿捕獲
            {
            Dval=TIM_GetCapture2(TIM5);//讀取CCR1也可以清CC1IF標(biāo)志位
            TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC4P=0設(shè)置為上升沿捕獲

            if(RmtSta&0X10)//完成一次高電平捕獲
            {
            if(RmtSta&0X80)//接收到了引導(dǎo)碼
            {

            if(Dval>300&&Dval<800)//560為標(biāo)準(zhǔn)值,560us
            {
            RmtRec<<=1;//左移一位.
            RmtRec|=0;//接收到0
            }else if(Dval>1400&&Dval<1800)//1680為標(biāo)準(zhǔn)值,1680us
            {
            RmtRec<<=1;//左移一位.
            RmtRec|=1;//接收到1
            }else if(Dval>2200&&Dval<2600)//得到按鍵鍵值增加的信息 2500為標(biāo)準(zhǔn)值2.5ms
            {
            RmtCnt++; //按鍵次數(shù)增加1次
            RmtSta&=0XF0;//清空計(jì)時(shí)器
            }
            }else if(Dval>4200&&Dval<4700)//4500為標(biāo)準(zhǔn)值4.5ms
            {
            RmtSta|=1<<7;//標(biāo)記成功接收到了引導(dǎo)碼
            RmtCnt=0;//清除按鍵次數(shù)計(jì)數(shù)器
            }
            }
            RmtSta&=~(1<<4);
            }
            }
            TIM_ClearFlag(TIM5,TIM_IT_Update|TIM_IT_CC2);
            }

            //處理紅外鍵盤
            //返回值:
            // 0,沒(méi)有任何按鍵按下
            //其他,按下的按鍵鍵值.
            u8 Remote_Scan(void)
            {
            u8 sta=0;
            u8 t1,t2;
            if(RmtSta&(1<<6))//得到一個(gè)按鍵的所有信息了
            {
            t1=RmtRec>>24;//得到地址碼
            t2=(RmtRec>>16)&0xff;//得到地址反碼
            if((t1==(u8)~t2)&&t1==REMOTE_ID)//檢驗(yàn)遙控識(shí)別碼(ID)及地址
            {
            t1=RmtRec>>8;
            t2=RmtRec;
            if(t1==(u8)~t2)sta=t1;//鍵值正確
            }
            if((sta==0)||((RmtSta&0X80)==0))//按鍵數(shù)據(jù)錯(cuò)誤/遙控已經(jīng)沒(méi)有按下了
            {
            RmtSta&=~(1<<6);//清除接收到有效按鍵標(biāo)識(shí)
            RmtCnt=0;//清除按鍵次數(shù)計(jì)數(shù)器
            }
            }
            return sta;
            }



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉