|
/********************************************************************************** * stm32F103VET6 红外驱动【遥控器解码实验程序】 0 X6 A& E! F8 F6 T ?+ m8 L * * 遥控器 :42位编码 - X0 Y8 H9 w% v9 ?7 a- v * 0 x3 R. z2 H+ D7 o+ k% b: A ***********************************************************************************/ #include "stm32f10x.h" #include "exti.h" & ?6 l9 E9 Q, z #include "beep.h" #include "SysTick.h" : Z7 I0 J [( Z: x #define LED1_0 GPIOD->BRR = 0x00000100 //LED低电平 #define LED2_0 GPIOD->BRR = 0x00000200 1 q6 S: `0 a9 F; r #define LED3_0 GPIOD->BRR = 0x00000400 " {3 ? ^0 @8 I' h1 `6 B: y #define LED4_0 GPIOD->BRR = 0x00000800 * y" P5 b% p# b t! A #define LED1_1 GPIOD->BSRR = 0x00000100 //LED高电平 #define LED2_1 GPIOD->BSRR = 0x00000200 #define LED3_1 GPIOD->BSRR = 0x00000400 #define LED4_1 GPIOD->BSRR = 0x00000800 5 d+ ]' U! j' q- E5 @: p #define IR_Hongwai_0 GPIOE->BRR = 0x00000004 //红外数据低电平 6 }& d! z- z5 [ #define IR_Hongwai_1 GPIOE->BSRR = 0x00000004 //红外数据高电平 7 `! n: c) f1 o6 Y* m r% J) G #define IR_Hongwai_x GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) //读取红外电平状态 % T0 o- y0 G0 G7 q. m unsigned char TimeByte; $ q7 j+ R% B1 x unsigned int IR_Tireafg[4]; $ z$ ~2 c3 E; H( m2 T unsigned int IR_xidwrit[8] = {0, 0, 0, 0, 0, 0 ,0, 0}; 5 q. D6 Y6 S6 p$ i7 [ /* $ M* R @0 M4 p5 H+ U* S) H7 a7 [. J * GPIO端口配置子函数 f6 g; ^: [2 T, T9 ]4 p: q$ e */ ' S3 M* w! ?5 A6 h void GPIO_InitStructReadtempCmd(void) { 3 P1 ?7 H! b* }& A3 i$ n" U& y7 x GPIO_InitTypeDef GPIO_InitStruct; 6 S" ~3 `5 H5 |% m- M GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; //配置GPIO管脚 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; //配置管脚为输入上拉 ; x* ^+ A# I, n- @' Z GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置管脚速率50MHZ ( Q2 h$ z; Y5 G# l0 M( I+ Z GPIO_Init(GPIOE, &GPIO_InitStruct); //初始化指定端口 * ^3 Z: G4 c$ B. u & g- h a6 F3 N# y GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置管脚陪推挽式输出 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 1 f0 ?9 x$ W. ? GPIO_Init(GPIOB, &GPIO_InitStruct); + J0 p$ P( |: t: A& h GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; K1 H% i- b0 v GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStruct); } 9 a9 e6 [2 e! `9 G /* * 配置外设时钟子函数 " Q+ L4 M2 N9 ]% ?6 ~6 d7 o( M */ void RCC_APB2PeriphReadtempyCmd(void) { & I0 X7 P; M, O RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开GPIOB外设时钟 " x2 f1 P) Z% U& L/ k; r8 r RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //打开GPIOE外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开GPIOD外设时钟 9 [8 C% [. o* M3 i; x6 ] RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); //打开AFIO复用功能外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); # [) d; \( M7 u5 L& [ } ) O9 s# D) @6 _ /* ; \4 m, m* S, ~1 A0 c& V * 计算低脉宽持续时间Count1 * 10us */ |, a7 X# O" J unsigned int IR_HongwaiRead_LSB_Cmd() { + D3 {9 h3 ]8 x0 N3 T d. T K, C unsigned int Count1 = 0; //定义时间变量 IR_Hongwai_0; //红外数据低电平 do //进入循环体 { 5 Q; n% g4 f( `8 z% Z) s Count1++; //时间变量加1 Delay_10us(1); //延时10us } while(IR_Hongwai_x == 0); //判断条件如果读出来的红外数据为高电平跳出循环体 " g* C% w9 T! s: J: |7 E6 O+ Z return(Count1); //返回时间变量积数 } * c: \- Y* R v& Q) ~5 y2 E L. i /* 0 q9 o; h: ~+ z * 计算高脉宽持续时间Count2 * 10us 4 t' N" i- {* q7 T/ Z */ unsigned int IR_HongwaiRead_MSB_Cmd() { unsigned int Count2 = 0; //定义时间变量 IR_Hongwai_1; //红外数据高电平 do //进入循环体 { . L, n8 ]6 L9 D' Q$ \: P$ K) X Count2++; //时间变量加1 Delay_10us(1); //延时10us # v" E5 s4 l3 D9 } } while(IR_Hongwai_x == 1); //判断条件如果读出来的红外数据为低电平跳出循环体 1 L9 N8 k3 v/ |0 X return(Count2); ) C3 R" W( H: W: Y. ? p } ; j2 d; P* Y$ n& M 5 T: ~7 c" D5 h- T4 g$ A$ g0 [1 F /* * b( F% |/ Q0 j6 Y$ F8 w2 L) g% I * 函数主体 ' i% n; v& t2 l9 r2 L2 y: k; F */ 6 F7 A8 r2 B7 w int main(void) { & W4 ^6 F1 E/ p6 V* s5 h( j9 f8 K SystemInit(); //初始化系统时钟进入72M主频 SYSTICK_InitStructReadTCmd(); //初始化SysTick配置器寄存器 " J6 L- u" M9 y6 k5 e RCC_APB2PeriphReadtempyCmd(); //初始化外设时钟配置寄存器 2 d6 Z \7 d4 ], i s GPIO_InitStructReadtempCmd(); //初始化GPIO端口配置寄存器 EXTI_InitStructReadtempCmd(); //初始化EXTI外部线路寄存器 " n- r( D2 X2 y L NVIC_InitStructReadtempCmd(); //初始化NVIC中断配置寄存器 ' s% ?. \& D; y: y; r8 n n while(1) { ! ~- W' _$ y- d4 g" X } 6 c9 q; g/ o3 {% m } - j( e- I$ P: l3 m& y! K0 ^& C0 w /* ; r' _, |) j& `- m- h * EXTI外部中断线服务程序 */ ( ^' N) G" A2 H2 l& s: c# O# x$ b. z2 T void EXTI2_IRQHandler(void) { 1 G% c5 f- q- m( ?2 g( _ unsigned char i = 0; 0 v& u: w" y' f4 F unsigned char flag = 1; // unsigned char flag1 = 1; ' Y' B7 J& P% s) i! C, B unsigned int Countline2 = 0; ; \' v: ], k& _" j: j- {0 e IR_Hongwai_1; Countline2 = IR_HongwaiRead_LSB_Cmd(); //低电平引导码 9ms判断 if((Countline2 < 850) || (Countline2 > 950)) //小于8694us 大于9272us 一直循环否则跳出 { return; & C+ ~3 }* P) P. M) i } Countline2 = IR_HongwaiRead_MSB_Cmd(); //高电平引导码 4.5ms判断 & `$ `, l$ Y Z: w! j+ ? if((Countline2 < 400) || (Countline2 > 450)) //小于4195us 大于4712us 一直循环否则跳出 % Q0 t& m) H3 G+ c { % A4 t7 F! h; N" O return; } ; M* }8 }6 Z$ k TimeByte = 0; 3 ~1 [8 R* {' p) w' I& v1 x3 l for(i = 1; i < 14; i++) { TimeByte = TimeByte >> 1; Countline2 = IR_HongwaiRead_LSB_Cmd(); //低电平延时0.56 判断 if((Countline2 < 40) || (Countline2 > 85))//小于425us 大于851us 一直循环否则跳出 4 C8 K* _2 F, u; ~. l: k { 7 _; s, G, E+ m* C! R- ]6 d" p. k3 _ return; } Countline2 = IR_HongwaiRead_MSB_Cmd(); //高电平延时0.56判断 : b0 e/ B% j B: Q$ w if((Countline2 < 40) || (Countline2 > 200))//小于425us 大于1793us 一直循环否则跳出 % h( V" m) l! g$ f { return; } if( Countline2 > 130) //高电平延时大于1300us写1否则写0 2 T0 G/ r- r' C. {6 z) R* {$ |2 z& ? { TimeByte |= 0x80; //写1 } $ X" W9 k0 c% e% P) @. E } IR_Tireafg[0] = TimeByte; TimeByte = 0; for(i = 14; i < 27; i++) { 8 _* [% y0 Y) A* ~0 k! `5 q TimeByte = TimeByte >> 1; 3 P+ |; k: D7 e0 o8 f: { Countline2 = IR_HongwaiRead_LSB_Cmd(); 3 E% g- U3 X5 J9 b if((Countline2 < 40) || (Countline2 > 85)) { return; } 6 P* A# p; d' {7 T ( k/ [- \% t. `8 Q! ~& _ Countline2 = IR_HongwaiRead_MSB_Cmd(); $ k6 D q7 \2 e' U0 ~- j" Q if((Countline2 < 40) || (Countline2 > 200)) # ~( G/ | |& E5 n { return; } if( Countline2 > 130) { 0 x* x; l# X8 y6 b4 i6 @$ k7 A TimeByte |= 0x80; } } IR_Tireafg[1] = TimeByte; 1 X! U' _5 e- k0 r/ g3 b5 W TimeByte = 0; 6 z/ p' _1 S% n/ O2 h7 M" ~# i8 t1 x. g for(i = 27; i < 35; i++) ! w4 I) f1 n8 p, z2 S+ j { , T. m( {( z9 O; Y* X, U8 ? TimeByte = TimeByte >> 1; % a' Z/ J$ s3 e) D4 P Countline2 = IR_HongwaiRead_LSB_Cmd(); , c- ~( W% t3 \9 v" ^ if((Countline2 < 40) || (Countline2 > 85)) ! S( q! g- O9 |! I { % n6 W6 H, l$ o e8 P: w0 z return; } % U+ ~. G) s+ X3 e% I Countline2 = IR_HongwaiRead_MSB_Cmd(); $ I' |: d3 [( \6 b* q5 p# U" J if((Countline2 < 40) && (Countline2 > 200)) / M3 I1 K( m. ~; v* @) Y/ q { return; ' q$ U3 P9 C. F& N- l4 B* e0 h$ u } * _7 ^7 T8 u! K: G- s if( Countline2 > 130) w% _' n8 c, W+ I9 X1 I7 h. D { # j d$ H. q' M g1 e( l" q TimeByte |= 0x80; } $ K7 \$ `. v3 R' D) |0 S* I } IR_Tireafg[2] = TimeByte; TimeByte = 0; for(i = 35; i < 43; i++) { & Q7 h) w7 {+ `2 N, D) X' V: P9 S TimeByte = TimeByte >> 1; 5 s/ F# _% |2 I1 l5 i7 H) U& ]/ ^ Countline2 = IR_HongwaiRead_LSB_Cmd(); while((Countline2 < 40) || (Countline2 > 85)) ' i* j6 @' j9 ?' j+ x. W { return; } 6 y9 X- R* X7 s7 y# f7 |8 a Countline2 = IR_HongwaiRead_MSB_Cmd(); while((Countline2 < 40) || (Countline2 > 200)) { return; * i7 |; ^. Q- t+ e } if( Countline2 > 130) $ H& F) F, ?6 C& \ { TimeByte |= 0x80; 8 |; N$ y4 {- ?/ d2 @! V8 r } } 7 {% L8 e0 l* g IR_Tireafg[3] = TimeByte; 8 B7 l3 ^! `9 h) B' X( R //************************判断用户正码和反码***************************************// do & Z7 Q5 T( b2 U0 B: p { - t5 y3 O% q! t; U- t9 L if(IR_Tireafg[0] == 0x08 & IR_Tireafg[1] == 0xF7 ) R% O" u* Y; d { flag = 0; } 1 O* O- x; a6 n' V7 S/ x } while(flag == 1); r h: S# @( I4 ?5 ]7 ` //************************判断按键正码和反码***************************************// 8 ]% e0 p6 J! W0 l! u; U9 q /* do { 4 K* d H" Z' }% V: H$ u if(IR_Tireafg[2] == ~IR_Tireafg[3]) ' G" u! {) x. S8 e, N! h3 S7 o { flag1 = 0; } / Y1 e4 o" ^( E" x } while(flag1 == 0); */ //************************按下键码对应LED点亮**************************************// ; X' n+ |# Z7 w9 G0 f7 F4 p& M switch (IR_Tireafg[2]) 8 O6 z: j$ Y, Z) l { 1 {7 C5 p Q e$ _% W, ~- E case 0x00: //按键 0 LED1_1; LED2_0; LED3_0; LED4_0; break; . ^! ~3 R/ M0 I$ F case 0x01: //按键 1 LED1_0; LED2_1; LED3_0; LED4_0; break; case 0x02: //按键 2 LED1_0; LED2_0; LED3_1; LED4_0; break; 0 W- v: b1 `" O case 0x03: //按键 3 : z0 `& x. I" j2 }' w LED1_0; LED2_0; LED3_0; LED4_1; break; ; f4 D3 g$ W1 Q/ c case 0x04: //按键 4 / F8 Y- a- q1 q; D LED1_0; LED2_0; LED3_1; LED4_0; break; case 0x05: //按键 5 LED1_0; LED2_1; LED3_0; LED4_0; break; 1 @9 J0 _" h: w9 Y+ V case 0x06: //按键 6 LED1_1; LED2_0; LED3_0; LED4_0; 4 l7 t' R+ w" O# K" k break; " n$ ~# m' ], t/ V" w$ [) _ case 0x07: //按键 7 ) x. x$ U: `9 r# n LED1_1; LED2_0; LED3_1; LED4_0; break; 5 M# D, ?' t5 q1 W5 r, ?: [ case 0x08: //按键 8 LED1_0; LED2_0; LED3_0; LED4_0; break; , D3 A0 \7 O% O, s# b, R case 0x09: //按键 9 2 h8 [/ h3 u2 L* p, V LED1_0; LED2_1; LED3_0; LED4_1; ! d- v# O$ a* |" ~ break; case 0x15: //静音键 LED1_0; LED2_1; LED3_1; LED4_0; 2 U. Q6 U( O5 K5 Z$ b, Z break; case 0x1C: //开机键 LED1_1; LED2_0; LED3_0; LED4_1; break; 1 H9 w/ y+ u. }$ c 5 Z. I, S+ m: B+ I! v& P2 V3 x case 0x14: //OSD键 LED1_1; LED2_1; LED3_0; LED4_0; , X; x" n/ ~ t$ C& b, b break; ( p9 @) O* N8 S$ E' ?( U case 0x0E: //RECALL键 6 O% J/ i4 f/ ~ i LED1_0; LED2_0; LED3_1; LED4_1; * R7 s. B: N2 r, v4 E/ M break; . a$ N- q3 J7 m& ? case 0x19: //SLEEP键 LED1_1; LED2_1; LED3_1; LED4_0; 0 x- q: F6 k ]" ~( `# v) | break; ' c# c! r" g$ x0 x case 0x0A: //A/C键 3 c/ {' O. S/ \ LED1_0; LED2_1; LED3_1; LED4_1; break; ; \' f! V5 g4 q+ b case 0x0F: //TV/AV键 & e9 e/ s( \+ e' n e1 B LED1_1; LED2_1; LED3_1; LED4_1; break; 7 }6 w/ `$ y! B u5 R case 0x13: //PP键 LED1_1; LED2_0; LED3_1; LED4_0; 2 K: e, i- X; t; x break; 4 j, k3 L" s5 V& j3 d! R8 Y; Z 8 a( e6 {, h! M case 0x0C: //GAME键 4 g2 h2 c6 T: B* ^5 |# I LED1_0; LED2_1; LED3_1; LED4_1; break; case 0x1E: //V-键 ; l0 G$ T+ W8 _* L7 y. G. l, h* | LED1_1; LED2_1; LED3_1; LED4_0; 4 @" P& }6 t7 f% b# F- u3 Q break; $ p" m1 b6 D/ \$ r- S case 0x1F: //V+键 LED1_0; LED2_0; LED3_1; LED4_0; break; 6 x- F) X: l# f5 A* B) r9 }8 |: t case 0x1B: //P+键 4 c- P3 R$ f8 m' p H LED1_0; LED2_0; LED3_0; LED4_1; " J& T/ K+ ~! {3 R. d break; case 0x1A: //P-键 9 w( \' z# v- X4 X7 t6 m LED1_1; LED2_0; LED3_0; LED4_0; break; ' c E4 }. w: X j$ M 4 G: ?, S6 C# h: C2 ~2 D$ j' U( R case 0x10: //MENU键 / o" R, _! p& Y: Q8 j LED1_0; LED2_1; LED3_0; LED4_0; break; $ V% W, P3 M) g$ P) R 0 W6 t9 K6 C( x$ q default : break; " d) S# C" x. I3 @! [! l } // Beep_lookCmd(); //蜂鸣器按键音 EXTI_ClearITPendingBit(EXTI_Line2); //清除EXTI2外部线路挂起位 " n: g4 r ?4 _- q4 o } : S( `/ a) W1 I) D4 H/ w /*******************************************END****************************************/ |
| 谢谢分享 |
微信公众号
手机版