/********************************************************************************** : n& y G) g" ^% ^: [' E * stm32F103VET6 红外驱动【遥控器解码实验程序】 , m, p# Y! l2 S$ t3 E5 z$ R* w1 ` * ! t. q$ u& Z* `( C: U2 G * 遥控器 :42位编码 % U* i! f7 Q$ m- Z" t * * ~% K' r6 L, c$ E( p; R* A% N ***********************************************************************************/ #include "stm32f10x.h" #include "exti.h" #include "beep.h" #include "SysTick.h" #define LED1_0 GPIOD->BRR = 0x00000100 //LED低电平 #define LED2_0 GPIOD->BRR = 0x00000200 #define LED3_0 GPIOD->BRR = 0x00000400 ; h1 j- G7 s; @& u- ~+ D& P, w8 ] #define LED4_0 GPIOD->BRR = 0x00000800 $ ]+ F9 s3 [" S! ^$ K #define LED1_1 GPIOD->BSRR = 0x00000100 //LED高电平 3 g( m' g" z9 O! z7 A #define LED2_1 GPIOD->BSRR = 0x00000200 * @' _3 [3 X) J/ q- ]7 y #define LED3_1 GPIOD->BSRR = 0x00000400 ! {" G1 G7 Y$ j; | #define LED4_1 GPIOD->BSRR = 0x00000800 #define IR_Hongwai_0 GPIOE->BRR = 0x00000004 //红外数据低电平 #define IR_Hongwai_1 GPIOE->BSRR = 0x00000004 //红外数据高电平 #define IR_Hongwai_x GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) //读取红外电平状态 5 _* N) @ F: {; T; C) I( v unsigned char TimeByte; unsigned int IR_Tireafg[4]; $ b' ]& D7 g2 i( ` unsigned int IR_xidwrit[8] = {0, 0, 0, 0, 0, 0 ,0, 0}; /* * GPIO端口配置子函数 */ void GPIO_InitStructReadtempCmd(void) 1 x+ G5 R: ]/ A* k { GPIO_InitTypeDef GPIO_InitStruct; & Q; C! p- M9 X7 I7 @! g' e, j GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //配置GPIO管脚 9 T$ X, x2 V' b( K M GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //配置管脚为输入上拉 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置管脚速率50MHZ GPIO_Init(GPIOE, &GPIO_InitStruct); //初始化指定端口 V+ T: S* h! t$ q. ]$ w) o5 ~( W 1 J. G1 c. g( a, v* G" e GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; 4 L- H3 H# Q/ \6 @7 w: g GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置管脚陪推挽式输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; ; E g! Z8 _% y4 @$ f GPIO_Init(GPIOB, &GPIO_InitStruct); ; a% K5 B" Z; K4 { GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; 0 `% K" N+ W' s- j GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStruct); } /* * 配置外设时钟子函数 */ void RCC_APB2PeriphReadtempyCmd(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开GPIOB外设时钟 3 B& S% R5 u5 v5 d3 c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //打开GPIOE外设时钟 # x1 g- g: t4 f9 m RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开GPIOD外设时钟 * g& |& {1 u7 a7 u3 K5 D RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); //打开AFIO复用功能外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); 1 Z1 G, D/ Y# W4 G } /* * 计算低脉宽持续时间Count1 * 10us m% T0 z2 {5 X# Q" |3 C( s: s/ z */ unsigned int IR_HongwaiRead_LSB_Cmd() { unsigned int Count1 = 0; //定义时间变量 6 o1 ]. u7 s$ ~" p9 R; t IR_Hongwai_0; //红外数据低电平 do //进入循环体 $ h5 t. n% g- h1 X- H6 i* K { $ q1 ]* L! A9 \# p Count1++; //时间变量加1 Delay_10us(1); //延时10us } while(IR_Hongwai_x == 0); //判断条件如果读出来的红外数据为高电平跳出循环体 7 A+ J* h* f/ J6 F$ u: X return(Count1); //返回时间变量积数 ' l/ X0 v! F! W: V5 T } 0 e4 V- H! [1 M, W /* 3 F! H* d! q4 y0 U& E" n$ Z& u4 W * 计算高脉宽持续时间Count2 * 10us ( P3 p- b \0 U+ X' u* G! Y */ unsigned int IR_HongwaiRead_MSB_Cmd() ; b2 ]( A' G i+ |2 h& G { - F1 l% e2 N( f0 g- M; A unsigned int Count2 = 0; //定义时间变量 IR_Hongwai_1; //红外数据高电平 do //进入循环体 ) w7 X1 o3 f3 k. M { Count2++; //时间变量加1 Delay_10us(1); //延时10us } while(IR_Hongwai_x == 1); //判断条件如果读出来的红外数据为低电平跳出循环体 return(Count2); } % @ s# s, j" h7 p k% |; v + F& @9 k% @7 r% D /* * 函数主体 1 u6 }! \, S" Z" Z2 W */ int main(void) % m1 b8 i% ~, t3 t B; [ { SystemInit(); //初始化系统时钟进入72M主频 * x2 V$ |' }( }6 ?8 y, W SYSTICK_InitStructReadTCmd(); //初始化SysTick配置器寄存器 RCC_APB2PeriphReadtempyCmd(); //初始化外设时钟配置寄存器 GPIO_InitStructReadtempCmd(); //初始化GPIO端口配置寄存器 EXTI_InitStructReadtempCmd(); //初始化EXTI外部线路寄存器 NVIC_InitStructReadtempCmd(); //初始化NVIC中断配置寄存器 7 Y3 @5 ~. @3 s- v: [ while(1) + j2 s3 t. _+ S3 j; G$ ?# w { * s6 f* }7 C( g$ V } : D: O) i% O2 ]. p% \5 v- U9 `3 D } ~ A- g/ I" ~5 L/ r7 j /* * EXTI外部中断线服务程序 */ $ S' ^) ~' z" S, Q! y6 I( } void EXTI2_IRQHandler(void) $ w N# ~6 m( E7 O! N { ; J. v& P; O$ R6 I, F3 n9 p8 G unsigned char i = 0; 8 f) ?% B, `) E* F unsigned char flag = 1; // unsigned char flag1 = 1; unsigned int Countline2 = 0; % W/ {$ D9 i2 Y3 ~8 Q5 Y# R IR_Hongwai_1; , j f5 z( |+ o9 ^) ^9 k Countline2 = IR_HongwaiRead_LSB_Cmd(); //低电平引导码 9ms判断 if((Countline2 < 850) || (Countline2 > 950)) //小于8694us 大于9272us 一直循环否则跳出 { return; , _9 a. K, J. e( W1 V } Countline2 = IR_HongwaiRead_MSB_Cmd(); //高电平引导码 4.5ms判断 if((Countline2 < 400) || (Countline2 > 450)) //小于4195us 大于4712us 一直循环否则跳出 { return; } TimeByte = 0; for(i = 1; i < 14; i++) , \ h: M. G. O" v/ b/ W; W { # ]5 w/ ` x- Y7 x TimeByte = TimeByte >> 1; $ k B% b0 m; y Countline2 = IR_HongwaiRead_LSB_Cmd(); //低电平延时0.56 判断 " H2 T+ D' }- Z3 `! {/ e# O; v+ O if((Countline2 < 40) || (Countline2 > 85))//小于425us 大于851us 一直循环否则跳出 { 2 q3 j" \5 h; T: e P6 |8 g return; % @2 v# C ~ {6 k9 { } Countline2 = IR_HongwaiRead_MSB_Cmd(); //高电平延时0.56判断 if((Countline2 < 40) || (Countline2 > 200))//小于425us 大于1793us 一直循环否则跳出 2 `: _+ E3 R. ]1 Y/ F- N { ! r! t+ p# P) M0 a' F) n( ? L9 } return; 2 I2 t' [: M( P# r& w } if( Countline2 > 130) //高电平延时大于1300us写1否则写0 { TimeByte |= 0x80; //写1 ; S# ]3 x H% M" @ } } IR_Tireafg[0] = TimeByte; ! H9 b& p" ~; c, {. |0 H4 v2 b TimeByte = 0; 5 Z2 a+ n, [" F% s for(i = 14; i < 27; i++) { & | c0 z% i1 e2 [ TimeByte = TimeByte >> 1; ' M2 g) t& p S$ Z& ?3 \! B Countline2 = IR_HongwaiRead_LSB_Cmd(); if((Countline2 < 40) || (Countline2 > 85)) * b& v; J8 A2 s) `) K { 2 \1 [: e7 J9 {7 F' Y return; } , Y& R, e3 ?5 R. g) Z1 l# t Countline2 = IR_HongwaiRead_MSB_Cmd(); 7 t4 m* J# n4 s8 ^+ p if((Countline2 < 40) || (Countline2 > 200)) { 9 P4 Q D! X' j0 ]# l& m$ s return; } if( Countline2 > 130) { ; q" ?/ s" Y9 y, w: H& p( N TimeByte |= 0x80; } , K0 s* A+ O9 I: U- h } IR_Tireafg[1] = TimeByte; TimeByte = 0; 9 ?3 j$ \$ n. t" s& @+ k ) X, s9 s: I' N2 Y% h for(i = 27; i < 35; i++) { , A- M# @, i; {5 X" P) A' } TimeByte = TimeByte >> 1; $ U' G) A t$ f0 A4 I0 v" m Countline2 = IR_HongwaiRead_LSB_Cmd(); ; V$ {+ p3 C s" | if((Countline2 < 40) || (Countline2 > 85)) 4 x! i* l7 T% g. L4 \ { return; ( d4 J w% J7 N$ f Z } 5 N9 h: {/ r( L6 m( K Countline2 = IR_HongwaiRead_MSB_Cmd(); if((Countline2 < 40) && (Countline2 > 200)) { # X% O* E8 X" K" X9 n return; 0 W0 T S; F! T( W; k } 0 `+ |, E* p: R n% b if( Countline2 > 130) + [* ^) C" ?$ g+ M9 {* L { TimeByte |= 0x80; } ^/ U! s8 h5 M" l5 P$ N" f8 J0 B } IR_Tireafg[2] = TimeByte; TimeByte = 0; ) i9 T. f+ B7 S4 O1 Y for(i = 35; i < 43; i++) { $ B6 Q% T# _& Z6 ~, s e' M" @4 I2 O TimeByte = TimeByte >> 1; Countline2 = IR_HongwaiRead_LSB_Cmd(); while((Countline2 < 40) || (Countline2 > 85)) 8 p& W$ E: U6 C9 ^5 o4 {# j { ) N& ]/ S1 L3 K; t x% S/ Q/ R return; } Countline2 = IR_HongwaiRead_MSB_Cmd(); # x+ N6 C1 n/ g7 c2 I while((Countline2 < 40) || (Countline2 > 200)) " h* b/ P; {6 N+ e# v% g { return; * q' A' |; g6 Q; z6 [8 y) q } H" H. H& @6 A/ z p if( Countline2 > 130) 8 n5 |- p2 a6 ` { % O" ~, f- {& o* r TimeByte |= 0x80; # c3 H' E2 @( q. K A1 o } } IR_Tireafg[3] = TimeByte; $ [7 I7 N( R6 I# @% p //************************判断用户正码和反码***************************************// do { * P& B4 w- l! l2 Z. O0 i9 E if(IR_Tireafg[0] == 0x08 & IR_Tireafg[1] == 0xF7 ) { flag = 0; . M& n) j9 k. ?- [* W } } while(flag == 1); : W9 `, [& M% j* f3 c/ m //************************判断按键正码和反码***************************************// 7 u" U, y: x6 Z' S* A0 E /* do + {$ Z9 O7 b* B; a% K; U* E { if(IR_Tireafg[2] == ~IR_Tireafg[3]) { flag1 = 0; } } while(flag1 == 0); */ d& q/ W' m6 h' b9 R4 _6 ]: w 2 {9 Q: x4 y( r( J //************************按下键码对应LED点亮**************************************// $ @9 e, K) _4 _8 ~) F9 } switch (IR_Tireafg[2]) 3 n; b1 E: r1 {6 F { . q1 b1 J4 Q' z9 u l case 0x00: //按键 0 LED1_1; LED2_0; LED3_0; LED4_0; + P( @' Y, \: w7 W break; ! l4 j- S: e+ I- E) y- i. a8 s case 0x01: //按键 1 . J* ], i7 Q5 a5 N. |( J2 S" F LED1_0; LED2_1; LED3_0; LED4_0; break; 5 `! \) M* Q* d6 N. } G* P0 a case 0x02: //按键 2 ! a6 r5 h6 N8 b' ?1 z/ v8 J LED1_0; LED2_0; LED3_1; LED4_0; break; 4 x% U5 { Y! A, @8 I 6 S' L1 q: r6 h" H$ E- {5 `& D. X case 0x03: //按键 3 9 a0 V# r# t+ \( p& ?7 Y; u5 z LED1_0; LED2_0; LED3_0; LED4_1; break; - [2 N4 J! d$ b+ g+ [8 k; b 3 z, \! I) s6 C, \7 k6 S case 0x04: //按键 4 LED1_0; LED2_0; LED3_1; LED4_0; ' R; b$ i& i. l! m! _2 t: x$ y break; % |4 |; Y8 A+ G$ d" D9 l* f case 0x05: //按键 5 ; E5 F% e0 a; P1 o8 ~* [+ n2 x4 G% w LED1_0; LED2_1; LED3_0; LED4_0; ) D9 }! I t, O* r) ^ break; $ ~2 r8 b. X# k0 S4 J# Y) d+ U . `- l% p5 { Q R' U case 0x06: //按键 6 % | G) ~# q. @" M6 d LED1_1; LED2_0; LED3_0; LED4_0; break; 0 W7 ]+ {# r) g, h9 j h case 0x07: //按键 7 ( o3 Q8 Z2 V& z# Y LED1_1; LED2_0; LED3_1; LED4_0; 5 v3 v1 D1 T0 g break; case 0x08: //按键 8 x# p8 D8 u# b$ A. |9 `7 k8 A LED1_0; LED2_0; LED3_0; LED4_0; . T' M* j/ z1 x; g3 R break; 8 w' K0 V% ?/ Z case 0x09: //按键 9 * G( N7 ~7 }8 P LED1_0; LED2_1; LED3_0; LED4_1; : l9 D5 ?# x$ C: O O8 Q break; y2 H. Y3 U$ I6 @ ^2 ~+ E5 r 1 ^ U* ^; ]+ h9 r case 0x15: //静音键 @3 M* T Z. @) V% \ LED1_0; LED2_1; LED3_1; LED4_0; break; ; p; t& X9 z& ]9 u/ V) p0 K, w8 Q case 0x1C: //开机键 2 T$ J& y# V+ M; m1 i; c LED1_1; LED2_0; LED3_0; LED4_1; break; & X8 T9 I% i( x! F) y' y3 u( \9 v case 0x14: //OSD键 LED1_1; LED2_1; LED3_0; LED4_0; ) p1 k- V; O, q( ^1 V break; - `7 V2 b: P8 Q5 V5 j) z case 0x0E: //RECALL键 ( ]0 t2 P8 f0 Z% F LED1_0; LED2_0; LED3_1; LED4_1; break; case 0x19: //SLEEP键 ' Q* z, \( d# e# x I LED1_1; LED2_1; LED3_1; LED4_0; break; 4 { a: z$ `- R7 M" `0 { case 0x0A: //A/C键 LED1_0; LED2_1; LED3_1; LED4_1; break; case 0x0F: //TV/AV键 G3 ~ Q9 r" [0 [! G8 y1 Y LED1_1; LED2_1; LED3_1; LED4_1; break; 5 _5 | M" h. J% Z& U! r. v6 K. U( T / o" q6 Y# f: o5 J' p; Y case 0x13: //PP键 7 W( [; E8 Y I2 g+ N" q LED1_1; LED2_0; LED3_1; LED4_0; + D& A" b! a: ^+ m6 M- J4 J6 Q break; 1 m& d2 M* u2 [4 k @9 A1 o7 Z C8 v; X/ i case 0x0C: //GAME键 4 g) P E' l' r LED1_0; LED2_1; LED3_1; LED4_1; $ f6 @' i3 |7 v+ m6 E break; . _0 C# U" c f case 0x1E: //V-键 4 C7 m& N6 ]7 }) S/ g. Q/ e+ Z LED1_1; LED2_1; LED3_1; LED4_0; ; y5 c* |( v! Y ^$ ? n% U6 x3 q break; case 0x1F: //V+键 * S+ D: L$ A8 ~' a9 s: { LED1_0; LED2_0; LED3_1; LED4_0; ; Y7 D' ]$ O& b7 P" E break; ( a F# t8 q/ S, P4 e case 0x1B: //P+键 * @% y8 V4 K5 p* L LED1_0; LED2_0; LED3_0; LED4_1; 9 [1 X! e! n+ V# d1 R break; case 0x1A: //P-键 LED1_1; LED2_0; LED3_0; LED4_0; break; case 0x10: //MENU键 ! B$ T) ?6 I$ b0 b LED1_0; LED2_1; LED3_0; LED4_0; break; 0 w8 V4 J/ H- P( }/ _ default : break; / q4 e5 w# O0 t } 2 y+ V6 D& S2 R! D( O5 o9 a9 p // Beep_lookCmd(); //蜂鸣器按键音 EXTI_ClearITPendingBit(EXTI_Line2); //清除EXTI2外部线路挂起位 + f+ I) d4 A T } /*******************************************END****************************************/ |
谢谢分享 |