一乐电子

一乐电子百科

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 405|回复: 6
收起左侧

[其他DIY] 蓝牙遥控模块 红外遥控学习转发模块

[复制链接]
发表于 2019-5-12 22:31 | 显示全部楼层 |阅读模式
本帖最后由 LBQ691477940 于 2019-6-1 16:08 编辑 , V( V4 q: F  i5 Q

: d4 X4 w3 K& {2 y6 M
用安卓手机按制所有带红外遥控器的家电、设备
一个APP界面可以学习家里所有以38K红外载波编码的任意红外遥控器,再也不用看场电视要拿好几个红外遥控器了。
如:空调、电视、机顶盒、风扇、台灯..........等等,常用的按键学习在手机APP中,从而达到一机在手控制家里的所有家电的目的。
资料下载链接:https://pan.baidu.com/s/1sXdwAajvwUgH4o0k6ljmCw 7 A7 E  ~& [! G" U
提取码:wcvd
; _$ N6 K3 X9 H) r  k6 T
22.png
" U, J* L! D8 H; F3 o# O  F6 n! B4 a) _3 p, I, b. u' g1 ]6 J
11.png ( n. l8 d5 w7 z) h; ?* v; a
- s9 {+ {2 Q. A9 Q1 k
33.png 9 Y- S; s7 {6 U

2 _) Q8 z: z) ^! x# U. c; o
/***************************************************************************************************4 r* ~: e) k6 |) _1 d
单片机:
) z6 Q* V0 z6 x  [- e        STC11F02E或兼容芯片" B, O- O  w# X6 B( z; G7 I' O
晶振:4 Q0 F0 |& ]$ f! q! j, d+ h
        11.0592Mhz2 {% n4 w4 A7 q; B+ i
波特率:57600
2 H0 S, U7 ~* f: \9 C3 R1 U/ N" M; X
/ P+ E. f; F) ~& N5 D红外接收:
% n/ q- K9 ~4 x' e$ v# t& y        P3.3口即外部中断1(此引脚不可自由更改): p; q5 P7 i' F5 n" }8 X: Y
定时器0:8 P6 x* s. v6 E/ F
        1.接收红外码时为12T/16位计数模式不使用定时器0中断功能: H& D& }$ T% p$ g3 W- x- [* m6 i
        2.发射红外码时为1T/8位自重载模式且用定时器0产生38Khz=13uS中断功能
# M9 W  a$ P3 f定时器1:
8 D4 X+ O2 [: X, u* A0 V        为1T/8位自重载模式作为串口波特率发生器(使能波特率加倍)% b" T0 z0 ^& }9 \+ L3 Z( P' Q# i. S
红外发射管:
# Y1 r- |% P. A! a+ _; `        为P1.0口驱动NPN三极管(此引脚可自由更改)( m2 D  I# i& U* O6 Q- m5 D
红外发射状态指标灯:; W. m  J. V! o. s& @( v, Y' F
        为P3.4口驱动LED低电平有效(此引脚可自由更改)
& t5 V+ |& d# i$ @6 ^& ~/***************************************************************************************************/0 g( k' ]# M! {
#include <STC12C5A60S2.H>8 r2 f8 ~3 I/ a; n* d1 i# L
#define uchar unsigned char
: E& Z/ K- T6 Q; M* ^#define uint unsigned int
( x( N3 Q1 C5 C. ^6 B9 N0 ]/***************************************************************************************************/
8 X( O% |  ]" h1 ^2 m! g#define IR_BYTE         200         //接收的最大位数为500位# q3 b% E; r  y7 q" Z+ E
/***************************************************************************************************/
. I: y' a/ O1 c0 \sbit IR_IN = P3^3;                        //一体化红外接收头的输出脚连到此脚作为红外线输入# I8 h3 l6 R1 {
sbit LED = P3^4;                        //状态指标灯
: n9 l! E% `  R, _9 h+ C, fsbit IR_out = P1^0;                        //红外发射管控制脚,驱动NPN三极管J3印字即S8050贴片, A( ?0 n1 B! h' I/ `4 O, h
/***************************************************************************************************/
3 {+ b, U/ ]5 Sbit UART_RI;                                //串口接收完成标志位
- Z# B! A- V, t# Ibit flag;                                        //发射高电平码还是低电平码标志位) C$ F, I% m1 g& _' ?
bit IR_OK;                                        //红外线接收完成标志位
0 N; G3 r! I" A# }) Kuchar idata IR_data[IR_BYTE];        //红外接收及串口接收缓冲区
. I4 p5 P* j* t6 e, {, v2 `uint IR_re;                                        //红外接收的数据个数计数器        5 ]. }) R4 p! \+ U. @/ T$ i
uint UART_re;                                //串口接收的数据个数计数器                                
) _4 w1 U8 @( h/ W4 duint count;                //中断计数
3 j+ ^( q7 L' @* c2 q# C3 p8 J/***************************************************************************************************# X" O* B1 a3 _/ Y: @
名称:sys_initial! Y% L/ G, v* l9 `1 M: g
功能:系统初始化
6 Q- g% ~& @/ `, M! K//如果外部中断是仅下降沿触发,要求必须在相应的引脚维持高电平至少1个系统时钟,而且低电平也要持续至少一个系统
# _0 k# A& Q3 p' y0 M  时钟,才能确保该下降沿被CPU检测到
6 i! Z# S5 d* i5 a, O* H//如果外部中断是低电平可触发,则要求必须在相应的引脚维持低电平至少2个系统时钟,这样才能确保CPU能够检测到该低电平信号1 z9 _9 h1 S' ]! n/ x( f
/***************************************************************************************************/+ N# ~: ?6 L* [; X6 ]
void sys_initial()% E2 f, ~! K& N# u* I7 V8 y% L
{- `# c$ U0 \  z0 f" F
        PCON |= 0x80;                                //使能波特率倍速位SMOD" I* F% a* |4 u( ?# a7 {5 K9 @
        SCON = 0x50;                                //8位数据,可变波特率  |" O2 o1 R- S; E8 Q5 a
        AUXR |= 0x40;                                //定时器1时钟为Fosc,即1T
+ A  k; b' E4 W# H6 J' e* i- }        AUXR &= 0xFE;                                //串口1选择定时器1为波特率发生器* d/ l4 f3 E$ ~  B# u% e5 q
        TMOD &= 0x0F;                                //清除定时器1模式位
6 v( Y% o: `: t) K$ E1 t' t        TMOD |= 0x21;                                //设定定时器1为8位自动重装方式/设定定时器0为16位方式' M2 q- g/ n; l
        TH1        = TL1 = 0xF4;                        //设定定时初值  11.0592Mhz / 57600
4 ?5 \. {. B: |+ }        ET1 = 0;                                        //禁止定时器1中断
2 c) w' z) [  w. o" o# K1 g        TR1 = 1;                                        //启动定时器1
8 o" K% t- z* f4 w# v  r! A$ ~        ' n7 Y  U5 u$ T( }8 D+ x, B8 b
        ES = REN = 1;                                //允许串口接收中断/ i1 x$ }& \. ~9 Z5 x) R8 _( j, }
        IT1 = 1;                                //设置INT1的中断类型 (1:低电平触发 0:下降沿触发)) B7 p7 y2 I) D7 f
    EX1 = 1;                                //使能INT1中断1 d5 p( J: w3 R4 g& g" C" c
        EA = 1;                                                //使能总中断
) E# O4 j/ `2 h) r: S        IR_OK = 0;                1 F! I' J+ A4 H' i
}
+ N' T* p- E# y/***************************************************************************************************
, A9 w+ g+ t2 {2 h! H( _, S名称:com' d* }3 s  `$ X/ n! a  j' _
功能:串口发送字符数据;
" }7 v& w/ C' j+ f8 R$ H7 |, R2 \形参:TS=数据指针;n=字符长度  t2 n* S. I% |! z8 {  h
/***************************************************************************************************/1 C3 w2 N" S% r  \/ B" J  e( E
void UART1_SEND(uchar *TS,uchar n)
/ P- ]; W2 S) O" `; g. B1 f{
  C  D1 V, H, `4 _        uchar m;
' @& ^) s1 _0 @6 l        for(m = 0;m < n;m++)
) b1 @3 R) |$ Y5 V        {
1 ]4 y* j; Z* W3 M                SBUF = *(TS + m);: u& D5 @1 X, D4 [9 g( i
                while(!TI);
  P+ T( A( M: o- l                TI = 0;! B% S+ T! E' U& m" G5 y& H9 ~
        }
( P6 {/ i( V, y5 m) b% [  ?}' p9 j1 A* ~- b
/***************************************************************************************************/
8 Q7 s& G3 U7 |) d/ uvoid main()4 {  E7 K3 ~; R* \/ w2 ~8 C) M- Z
{        $ [# s& M& u" Y  J& J/ s6 c0 @
        uint i;. ^  ~6 k7 }% B! N5 ]' U
        sys_initial();0 p* g  q& h0 {+ u$ E7 Q
        LED = 0;
' B) U% t$ \8 d& c2 s, b  \        while(1)
1 A0 Y- t; I& N# T        {5 O0 M* H/ u2 ?1 }( N# U' E* `0 L
                if(UART_RI)        //接收成功7 ~# V$ }- f/ y- h, d+ f
                {
/ b+ X: |0 X0 U0 K* U2 M8 C8 f                        ES = 0;                                                //禁止串口中断) x9 ?- e" C3 g* r/ \2 _) U2 C
                        UART_RI = 0;                                //清除串口接收完成标志位
3 |9 I1 O' n* H2 v8 q0 y# g; J/ a$ \/***************************************************************************************************************/                        , ~6 h" G# x  h$ D5 ]2 }' T  P# v! D
                        if((IR_data[0] == 0xFE) && (IR_data[1] == 0xFD) && (UART_re > 10))
- q2 Z0 A1 Z: j% N1 s                        {//判断接收到的前二个指令码是否为 0xFE和0xFD且大于10个数据
1 r  g; I9 S  q                                EX1 = 0;                                //进行红外发码前先关闭外部中断03 I" N: X9 a& B; j4 W  O7 L
                                if(UART_re % 2)                        //如果收到的是单个字节则自行加一个缓冲区数据2 ^) M" m; \' T8 q0 d# K, k
                                {
1 E7 e/ \  M. h* D; T! u                                        UART_re += 1;# Z* C3 r) @" D7 T+ W" E
                                        IR_data[UART_re] = 2;//随便给个值即可0 B0 M  a* A/ K1 i4 d
                                }2 x2 L( I( e/ O/ a! x4 m
/***************************************************************************************/                        
9 m2 [# G' k, G: O, L) ?                                for(i = 2;i < UART_re;i++)/ U: U( K. [( }4 E) i
                                {                                
! |  g4 [2 c! U% V                                        flag = ~(bit)(i % 2);                                  //红外发送标志=1* N+ b- e- {( K2 Z7 i) x9 _* k. q
                                        TF0 = count = 0;                                          //中断计数=0& w; |' U1 w8 @: O8 N5 U
                                        TR0 = 1;        //启动定时器04 W! }0 x  R, C! V
                                        // if(IR_data <= 5)$ ^. k1 f, d" i" L" `$ V* ~& D, U
                                        // {3 n7 q6 f  U* ^7 B
                                                // IR_data = 5;
2 c3 h; @% R6 g; [1 R                                        // }7 J2 G& a- D; ^* t, {
                                        while(count < (IR_data * 90 / 13));
' O- X6 C6 s  h7 p                                        TR0 = 0;                                                         //关闭定时器08 }5 w' |- h% k
                                }                                # Z1 e4 ^. k* `3 l* C
/***************************************************************************************                        . q5 ~: W  Y8 D7 M: [! P( [/ ?
                                for(i = 2;i < UART_re;)
, n$ U& C7 O3 k0 o% h                                {                                
. B8 [- p2 ^: e/ R& h                                        //编码中的低电平
% c& e2 f( d/ L( g, \                                        flag = 1;                                                          //红外发送标志=1
7 ^0 c0 l9 [$ T7 z                                        TF0 = count = 0;                                          //中断计数=0
$ ~3 x, h* A" K1 d7 U: h                                        TR0 = 1;                                                          //启动定时器02 f, d8 b* y( i/ w0 k9 I5 q
                                        while(count < (IR_data * 90 / 13));
- ]7 S, I" |- E% [/ C                                        TR0 = 0;        ' D5 ^' ?6 b9 p! [8 o" z& p5 ?
                                        i++;//关闭定时器0
! L$ N) f8 N5 ?$ h+ s5 F. m                                        //编码中的高电平
% K- L. M' F) ^- Z* H$ h0 h                                        flag = 0;                                                          //红外发送标志8 F1 s. z  R  m& j
                                        TF0 = count = 0;                                          //中断计数=0
! G8 z7 _) N; G2 r; {8 d                                        TR0 = 1;                                                          //启动定时器0; _7 v/ g6 S, h( \  G( V
                                        while(count < (IR_data * 90 / 13));9 q& N9 s3 K& g' r2 }% ~
                                        TR0 = 0;                                                          //关闭定时器0
% r0 e+ X  L& k' p                                }
' `. o4 c* c7 o/***************************************************************************************/                                ( Y+ W2 j2 e* ?' S: f
                                SBUF = 0xFC;                                        //发射完成返回一个0xFC给PC机表示发射完毕
  }- S/ }3 l6 F; U$ f/ T                                while(!TI);
, h9 [3 A0 M6 [! f- i                                TI = 0;
3 F6 s5 H4 C! b7 N7 k9 S$ W/***************************************************************************************/                                
% ~, _& s/ ~. U0 @                                EX1 = 1;                                                //红外发码发完后才再次允许外部中断09 c) h1 U& M; i. t! p! J- t' d5 B) {- u
                        }
- o/ b7 B! S5 c4 U( e3 _                        for(UART_re = IR_BYTE;UART_re > 0;UART_re--)
) c0 w9 k% s  k' W                                IR_data[UART_re] = 0;                        //清除串口接收区,且将UART_re清09 E8 d) d) j* y4 k* [3 V0 z
                        LED = IR_out = 0;                                        //红外管 = 0不发光1 @. Z6 s$ v: N1 G
                        ES = 1;                                                                //重新允许串口中断
: w' Y$ ?. j0 P9 R, n) B/***************************************************************************************************************/                        
6 m: ~. w, \% D6 H; R                }                1 k3 v! w9 d" B) w
        }
, T7 O# b6 J$ L9 _& \6 y}
- o" I0 ], ~9 c) b4 _6 p/***************************************************************************************************************/
( M: x- I% Z- A6 s$ R; B: M) tvoid timer0(void) interrupt 1
  ]% b4 J  w/ W( T) h{' d  t! X0 V& U
        count += 1;4 y- b5 K" l# L7 ^
        if(flag == 1)                        //如果红外发送标志=10 r- j. X6 _% P% ]) c7 X% k
        {
) X7 o% j" b$ z. s: d; z                //这里可以改为=1不取反另用ne555产生38K信号与IR_out口的信号相与后接IR" u' o+ H3 l8 P  X- }
                LED = ~LED;                        //红外发射指示状态=取反
  y& B! J) v- E; d2 g3 ], `        }                                                3 o0 p# _! x8 p
        else
) j* k! k: A6 a3 v) }9 k1 {# F- j        {  x% O; S8 n* G" s8 }
                IR_out = 0;                        //红外管=0不发光3 `1 }6 r  z  y6 B3 I
        }  u. M( c* q4 z: S
}
" w# |+ m! x9 k4 S. P( j' t/***************************************************************************************************************/

- V, b  e% @" [4 E! q
发表于 2019-5-13 04:38 | 显示全部楼层
请问可以分享线路图及模块资料吗?谢谢!
! }( K- W- I* d1 z
发表于 2019-5-13 09:32 | 显示全部楼层
这个不错诶,还可以自己做个APP什么的
发表于 2019-5-13 10:21 来自手机 | 显示全部楼层
这个好,有时间试试!
发表于 2019-5-15 14:11 | 显示全部楼层
算个广告贴吗?

点评

你说了算  详情 回复 发表于 2019-5-17 23:45
 楼主| 发表于 2019-5-17 23:41 | 显示全部楼层
本帖最后由 LBQ691477940 于 2019-5-17 23:54 编辑 # C: {) a/ u7 L: R, Q
& B# H; C0 h. }5 V7 ~
这是安卓手机端软件,写的不太完美但是能用
; F3 `1 X2 q- j
红外线遥控学习转发.rar (4.2 MB, 下载次数: 4)
 楼主| 发表于 2019-5-17 23:45 | 显示全部楼层
风满楼 发表于 2019-5-15 14:115 i) Q, r# t% i7 K8 m
算个广告贴吗?
/ a! [! ?" ?& }' |- d! X8 R9 R
你说了算* K1 \, C  Q  O$ N$ T. a5 {* h
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号-1粤公网安备44522102000183号 )

GMT+8, 2019-9-17 00:55 , Processed in 0.109239 second(s), 41 queries , Gzip On.

Powered by yleee

© 2008-2019 一乐电子

快速回复 返回顶部 返回列表