你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32接收红外遥控数据

[复制链接]
STMCU小助手 发布时间:2022-8-20 17:00
一. 简介) E7 ?8 l# Q+ J$ T5 O
最近在做项目的过程中,由于使用的是核心板,没有按键,尝试通过串口进行数据发送,进行控制,但是太麻烦了。于是想到了通过红外遥控进行控制。经济又实惠,还可以隔空远程操作,且只有一个数据线,YYDS。1 c' H5 v) `. _. m: v  x% [
& C- |6 g- f' V, b& E1 {
二. 红外遥控数据传输协议3 x" C- x9 j. v* P- ]) ^: Q
不做过多的理论知识的简介,主要是为了教大家怎么使用。传输过程如下. R9 I' n3 x7 b$ W; U
/ R. t& ]/ J* g4 k6 V4 T
1.空闲态 为 高电平
# b/ A+ O6 N1 n, T0 f% x2.引导码 : 9ms的低电平 和 4.5ms的高电平
1 v& m% C2 o& }( ?  v5 W5 j3.数据码: 数据码包括四个部分依次是用户码、用户反码、键码和键码反码,每个8位,共32位,560us的低电平加560us的高电平表示数据0,560us的低电平加1.68ms的高电平表示数据11 H$ i9 |/ M& M+ S
4.停止位:可以忽略,软件中可以不用管% m, [/ ]0 H' k3 Y
依次按照对应的时间来检测就可以。, F/ F0 K9 s6 k( [4 H: R2 _

5 @3 m- C3 W$ A1 Z# Q本次设计通过外部IO中断来进行红外数据的读取,低电平触发(空闲为高电平)。; Q; h) J1 ^; T6 Z; z. a# ~" f0 }
- {1 C' c, @) y- X$ T
三. 程序设计& Y- I/ F/ z: h0 `$ i* N/ o
1.定义好相关变量,RCC和GPIO
( n. l0 m8 b& }/ ]! x% W) N
  1. //红外遥控控制  m/ R0 e% T& t# e9 S& f$ t, R5 S# |
  2. #define InfraredGPIOPort        GPIOB
    ; G! M$ I' ~; F' }
  3. #define InfraredGPIOPin         GPIO_Pin_0   $ ?% S3 Q# {- Z" _' J- j8 j  ?
  4. #define InfraredRCC_APB         RCC_APB2Periph_GPIOB
复制代码
) s9 Z6 R$ l  b3 e# {- ~
2.GPIO初始化
' A+ I2 v1 n: M, P$ N
  1. void InfraredGPIOInit(void)//GPIO口初始化- K. C/ z8 N9 i# G7 [7 H# M5 o
  2. {
    - o$ ^8 P9 X1 p. S6 J  u3 T
  3.     GPIO_InitTypeDef GPIOInitStruct;
    6 _' ]7 r* C- i! v
  4.     RCC_APB2PeriphClockCmd(InfraredRCC_APB | RCC_APB2Periph_AFIO ,ENABLE); //开启时钟  RCC_APB2Periph_AFIO& P) c5 O: s% |$ E
  5.     GPIOInitStruct.GPIO_Pin = InfraredGPIOPin;8 L1 R% ^, A6 ]5 M" f" _5 |; F
  6.     GPIOInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    * ^5 L0 j' \* Z1 V
  7.     GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
    1 t$ j0 t. \0 S- i) l5 S
  8.     GPIO_Init(InfraredGPIOPort,&GPIOInitStruct);
    ! l2 n9 O( W1 p" [% I+ d2 J6 k$ _
  9. }
复制代码
0 t. H; h+ ]& s- r- g
3.开启中断2 g2 w8 v0 i5 r. }: A: ^
中断控制线可以根据自己的Pin来确定,如果是GPIO_Pin_8,那么这里就是EXTI_Line8.
5 `" X! }  {, G9 [
  1. void InfraredEXTIInit(void)//中断初始化& k6 p# h8 t8 R7 Y" d. w% a) p
  2. {
    % C1 ^3 |2 B' @9 u) h
  3.     EXTI_InitTypeDef EXTI_InitStructure;% ?" F  J9 l& Y8 j  \# L
  4.     NVIC_InitTypeDef NVIC_InitStructure;//定义中断结构体变量) ?* m1 i) j6 E/ U" N0 {8 L4 @
  5. ! Q2 K; l7 }4 v: |" Y
  6.         //中断配置8 h+ x/ V- ~- r, z  b2 ^
  7.         EXTI_ClearITPendingBit(EXTI_Line0);
    1 x( s8 [# w9 z" s9 u4 ^( B+ k
  8.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);  ; Q+ {4 z  Y8 y. U4 L" m; I* K# x
  9. ' R) |+ L2 M6 L! x  l
  10.         EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    * G1 [, d0 n' t6 e5 \  d' L! Y
  11.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;8 u. E, s& r$ U3 V4 d
  12.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  - Q; F4 c3 O# Q/ q6 B
  13.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;. z2 _1 m) K6 ]' A
  14.         EXTI_Init(&EXTI_InitStructure);  O4 I. f5 F  z; m' q( A* K
  15.         - w  A, I2 h! a+ k, w
  16.            NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道
    0 Z% b9 b6 ]! i, T' K
  17.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3 F6 y" ^" S" I, C6 ~
  18.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;                //子优先级
    ! h1 ~. P/ `$ v* j: I
  19.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能
    & m5 X( D# U" C
  20.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
复制代码
2 T4 f( R3 a7 J* b4 y% I
4.电平持续时间计数
) S! L6 n0 F0 p, {/ Q' G$ u0 W这里主要是对电平的出现时间进行一个计数9 i# y; q- A* ?
  1. //计算低电平的持续时间/ o* }* u6 R) p2 G
  2. uint16_t InfraredRecvLowTime(void)
    4 ]+ k/ {/ H4 D; Q* r  A
  3. {
    # |# c* j2 [3 I7 t( a: l
  4.     uint16_t time = 0;
    5 w- k' c* y* h- M+ r; E; N% b7 _
  5.     while(GPIO_ReadInputDataBit(InfraredGPIOPort,GPIO_Pin_0) == 0)7 r; _  G( ~+ }( ]5 a
  6.     {
    ' g; g* ]+ ?* {+ ?/ Z% Q4 P0 l
  7.         if(time >= 500)
    ; K* R1 b  \5 w
  8.             break;
    5 Q+ z7 `3 m# B# R$ g3 \# N" u! A
  9.         time +=1;4 z+ ?* J! i* X
  10.         delay_us(17);
    8 C8 O0 m. U* E6 c( O$ V4 B8 k9 V
  11.     }
    - I9 ?1 r9 x8 ^: b& c; Z0 F
  12.     return time;
    ' I6 h2 A& ^8 K# e
  13. }   
    ( {# |3 R' t! A. u
  14. //计算高电平的持续时间5 N/ w) [* e! j. `7 A
  15. uint16_t InfraredRecvHighTime(void)
    ( }& Q+ _* v! P
  16. {
    + k2 F) R  ]8 ~9 H8 w7 P9 q
  17.     uint16_t time = 0;
      N5 V! H& k' R) n& ?
  18.     while(GPIO_ReadInputDataBit(InfraredGPIOPort,GPIO_Pin_0) == 1)+ k3 N& {5 Y, `1 ~( e
  19.     {
      V6 h6 S0 E: J! F1 \/ U0 O9 q
  20.         if(time >= 250)8 Z' P3 \7 E1 C! L2 c5 }7 D
  21.             break;
    : m' R+ @) |: p. o( l2 V  z3 i* s
  22.         time +=1;: [9 I, H% j% J1 [; E
  23.         delay_us(17);8 r7 |- Z9 R! B: N+ M3 r$ H
  24.     }' j2 F- S4 ~4 k6 F; Y: H
  25.     return time;
    ' ?0 k. V0 i$ Q/ q0 {7 L
  26. }
    ; |3 e0 g4 j  W, I, I6 G
  27. ) q9 s- V& v, s
复制代码
& n: X0 u4 a% f/ k" a! y! x
5.编写中断控制函数. o4 ]+ b! u9 q: I
通过数据的参数过程进行判断,就可以了。持续时间需要在一个范围内,可以自己测试后设置。
: U" r' |; K4 j; n8 u
: S6 Q" A* j: F% i$ c! l% N
  1. uint8_t InfraredDataRecv() //获取红外遥控数据
    5 P6 O3 ~2 X' P3 N9 G0 O6 J( {. V) @
  2. {
    ( p2 A& Z9 S9 u4 z% E
  3.     uint16_t time;
    $ P. K. @4 T5 M/ t4 ]  d) W
  4.     uint8_t i,j;
    # Q( e' w/ x' _3 S4 K
  5.     uint8_t data[4] = {0};
    - O: g" \  P  B( ^/ U/ b4 S$ Q( a$ U
  6.     //获取引导码: r5 @8 `! p" [( R) _! m* X
  7.     time = InfraredRecvLowTime();3 v! z: t- w/ m" o
  8.     if(time < 400 || time >= 500)
    $ U; S7 z# N8 B. i+ A
  9.         return 0x00;9 N5 T1 I; T* G9 s) o6 n! d
  10.     time = InfraredRecvHighTime();
    ' G6 F$ q& E* s- H
  11.     if(time < 150 || time > 250)8 M1 l- w; {! u2 `- p: u% A
  12.         return 0x00;
    8 s! _. V7 U$ ?+ S) R
  13.     //获取数据
    # k8 V6 Y2 O3 I4 Y) D
  14.     for(i = 0; i < 4 ; i++). C% I& P+ w/ f4 _
  15.     {
    1 z1 W6 s; i, H2 Y' c. A
  16.         for(j = 0 ; j < 8 ;j ++)
    ; \  |, L/ G6 W3 h
  17.         {
    $ e3 E' G3 S0 S7 ]" G2 I
  18.             time = InfraredRecvLowTime();6 ^# x7 D. M5 h/ |
  19.             if(time < 20 || time > 35)
    1 Z( D, i- G- n- [  Z8 {9 `2 ~
  20.                 return 0x00;
    : X, X: _# T1 t" ?
  21.             time = InfraredRecvHighTime();   //通过高电平的时间长短来判断数据0,17 x: }# p+ m9 T* e8 w: h5 E' |
  22.             if(time < 35)   //数据0
    . |% c% p  ~/ T( j% K
  23.             {
    . ?# r7 @  a0 c: ~' ~) V% \
  24.                 data<i> <<= 1;! O( c0 z+ E7 z1 S0 V0 _& Q
  25.                 data<i> |=0x0;
    ( T8 M6 g8 O  B, M' F( M
  26.             }
    1 n5 R) r, q& x7 p5 d
  27.             else
    : P: E2 q% ~/ o4 G( q
  28.             {2 G  n" O, y( a
  29.                 data<i> <<= 1;
    : o; `- K; A( L6 c1 ~2 g+ g
  30.                 data<i> |= 0x1;0 J0 w4 O, M4 z5 ]9 q+ _
  31.             }
    ( y3 B/ ?2 U. Z- S# x) k. v, T
  32.         }0 t9 I1 g, z3 F8 k( B+ w
  33.     }+ e8 b% ^8 B- U' @
  34.     return data[2];& q2 X1 H+ n8 s$ e' L
  35. }% y) e, X# x3 U2 l" K2 m
  36. void EXTI0_IRQHandler(void)5 H( m: o8 x& T8 c/ `: H
  37. {
    - Q; }  d  Z+ B: M
  38.   if(EXTI_GetITStatus(EXTI_Line0) != RESET)" E8 t$ T' P5 F; n$ G
  39.   {
    7 r+ W1 ~) M( Q
  40.     uint8_t data;
    ' ^: Y/ \; Z$ K; y3 E. d
  41.     data = InfraredDataRecv();+ M7 }& C' i. G6 h
  42.     if(data == InfraredLeft)
    8 \4 G- l( V% `- ?( M
  43.         KEYState = KEYLEFT;- _9 C0 {: |! J
  44.     else if(data == InfraredRight)
    - @. A1 m7 O6 K: E2 Q8 f" S
  45.         KEYState = KEYRIGHT;
    & ^% M* b1 X3 z( Z2 r* }
  46.     else if(data == InfraredUp)# _1 i' t% j1 D, X' i) |& _
  47.         KEYState = KEYUP;
    ' N9 I, F- B5 _9 `5 ]
  48.     else if(data == InfraredDown)
    * \2 x, s& y, e' y. m
  49.         KEYState = KEYDOWN;
    4 W" d9 T8 J2 n0 b+ `! s
  50.     else if(data == InfraredReturn)
    & K  N5 R7 o% F0 v/ }
  51.         KEYState = KEYRETURN;5 p  C; g. ?0 W+ s; ]! S8 M$ k" i
  52.     delay_ms(10);
    * b/ B6 X/ w2 _  G$ v
  53.     /*清除标志位 */
    5 ~+ j  B; C  n5 B$ ]5 M( X9 a) i
  54.     EXTI_ClearITPendingBit(EXTI_Line0);% h  P! X; U* B# d2 g/ `
  55.   }, Y8 K: ~6 a' p1 A$ F

  56. : S' U  L8 s8 V, U
  57. }
    3 Q8 Z/ E3 D9 f
  58. + {/ Y6 o. K9 ?0 n
  59. , w5 J+ ~6 b& j2 M, [/ @& T
  60. </i></i></i></i>
复制代码

- Y1 f9 v7 V9 r; ?7 t% O
# [) a" N/ p5 o4 D( x9 W/ H% O; f  K
赞 收藏 评论0 发布时间:2022-8-20 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版