EDA365电子工程师网

标题: 遥控器解码 [打印本页]

作者: 深圳奔    时间: 2012-8-19 21:03
标题: 遥控器解码
#include <reg51.h>
0 @  f8 p$ ~/ F- h  W#include <intrins.h>6 C$ G8 e6 i* p5 u& N# N6 Y7 E' y
void delay(unsigned char x);//x*0.14MS& E+ K8 }2 e9 ^+ O
void delay1(unsigned char ms);" c; q( H" Z9 Y" o! w/ X: s( H8 ^
void send_char( char txd);
; _( k& F* D) [1 v1 K5 bsbit IRIN = P3^2;//INT0(外部中断0输入口)/ n7 N! R" A/ C5 P! E, R
typedef unsigned char uint8;/ g! K4 B& Z& m, P! y
unsigned char IRCOM[8];
) i8 c' [' K! kunsigned char code table[16] = " }: g+ T+ p" w4 ~
                    {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,4 z' Q7 Z; h8 b
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F
. ?) S0 g0 \" |2 U! C, k: ?8 ~# b4 w; Y/*波特率:9600*/
0 ^7 r- [* p) \  c3 Z2 g+ gvoid uart_init()- s( N* |) w. ^5 J
{
" v6 ?& f: [: I  @2 A$ {        TMOD = 0x20;                        // 定时器1工作于8位自动重载模式, 用于产生波特率2 `" ?. J  I; v& K( G8 `$ s  ]
        TH1 = 0xFD;                                // 波特率9600
* [; i, l( H4 m2 A  J        TL1 = 0xFD;" R* A9 {# ~% _5 N3 X6 k
       
  l& }% O% W  W0 ], Q4 [, l        SCON = 0x50;                        // 设定串行口工作方式7 [2 E' Z! t! J" k% e0 i
        PCON &= 0xef;                        // 波特率不倍增6 J" k' |" s  Z! Z7 ^" r
                . `2 j4 M# l1 C/ g3 ]  r) C
        TR1 = 1;                                // 启动定时器1
/ w1 h* ~) y2 d3 z1 {. s$ e. W2 c        8 B$ I& N: O# i3 ?
}3 A7 v- A0 N* i# I' N4 ]
/*UART发送一字节*/
/ [9 W7 K  I* y3 V; r% U1 p' X4 r
void send_char(unsigned char txd)
  Q5 |# P+ P' C, K! I1 \" P// 传送一个字符# O6 U9 F6 @& @2 {4 u0 {$ C7 Z: \
{0 M0 G; m6 ~; f: e0 [0 h; D( T: R
  ( q( s2 P9 S+ j% m" c+ Q
        SBUF = txd;' D. o) z# X9 H( X' P. j
        while(!TI);                                // 等特数据传送9 F  o, n" z' b# e  K7 u
        TI = 0;       
% `  Y  C& i. Q# j' i+ t+ H* M3 k                                // 清除数据传送标志
& t# Y1 d6 K3 [: Y6 D}2 s, ^8 }: Q) S- l
main()1 B5 m4 u6 f9 {) R  [' Q& Z! n
{1 s, Y3 z: i5 n& t# A0 ~  u5 l1 _
          
6 b% C  M2 C) O IE = 0x81;    //允许总中断中断,使能 INT0 外部中断
$ d8 b$ H; A( q TCON = 0x1;   //触发方式为脉冲负边沿触发( z/ Y$ d: r9 F7 A. W8 z
delay(1);4 }4 `$ ^5 G. X" a: z

& V& w- ~6 h# a- a8 U         IRIN=1;
, X, Z5 X4 \  m; |% V             //BEEP=1;2 ]0 |4 e! c1 A& J( J- F1 x# l
                 //RELAY=1;. Y$ C- }- N) |, x5 Q
                 for(;;)
( T6 i( |3 X: Z  H3 u  ^                 {
: l+ \" Q. J  \" X% \          uart_init();7 Z' T4 I% w$ K# w- N5 ]7 i; o
               
; m1 v" C! M' y' Z. K+ ~8 P                  }, Q9 c$ y, l" D4 F- h
                                        " h! G! V7 y/ {
} //end main" M0 f3 K, w" T' f6 d  _2 x
//以下是中断服务程序
* }6 T0 V! M4 r0 a1 u3 T2 Z: lvoid IR_IN() interrupt 0 using 0
3 r) d+ {9 |6 O& \+ c{
# V" S$ E" J. p unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据9 I7 u9 g' m5 q: z+ t+ x9 O! g
  EA = 0;//禁止总中断
) {5 ?' p5 }: H$ VI1://标号
7 l5 e" V) F5 Y  a. Z3 _  for (i=0;i<4;i++)
3 h5 q% d7 |$ s6 Q& h- ]   {7 I7 U5 M$ ^, c+ C6 M* L; B
    if (IRIN==0) break;
7 H9 G3 @: Y$ t, z$ j        if (i==3)
6 S6 s7 Y1 u. V) U) Q% D1 X. [      {EA =1;return;}//如果i等于3就打开放中断
# I. s0 @! |' W* ]9 s  i5 v& ~   }# G* D3 L; }% r; ]; E; W1 W& s
  delay(20);
1 @8 f0 m6 K+ \8 \+ w- w: m    if (IRIN==1) goto I1;  //确认IR信号出现& G$ X9 b2 J# U
  while (!IRIN)            //等 IR 变为高电平4 T+ s6 N% [0 I3 h7 E# y
    {delay(1);}
+ s- {+ K& A6 ^* C' @* j5 C; L# W" A! e% ^6 A& a: O! G
for (j=0;j<4;j++)1 [. k2 U. g3 w3 R
{ 9 H: W' G) v# Q: `9 e& J5 K
  for (k=0;k<8;k++), S9 e8 y  V$ o# a) \. \* x7 s
  {8 ^( r) ~* Z( n; N# ~) m5 @4 K
         while (IRIN)            //等 IR 变为低电平
7 J  E* ~& S: c3 M+ O$ k            {delay(1);}2 t# j7 X* S2 d: M# V
           while (!IRIN)          //等 IR 变为高电平5 l  @  G3 N8 V
            {delay(1);}
& f4 l' ?( X  `1 p     while (IRIN)           //计算IR高电平时长
% L! w- q! z7 {( ^5 }1 u0 P      {                           //如果IRIN等于1的时候就计算delay的个数
2 s" j! z- Q# `! `7 c           delay(1);
( O' G. b7 x# L1 J3 I           N++;           ! s1 _2 ]. R) g5 B3 X4 ?  h
           if (N>=30) {EA=1;return;}" i! i4 ^& c. B! x/ ]/ N
          }
$ \) V. B& Y( J: f     IRCOM[j]=IRCOM[j] >> 1;
+ A8 n: {) f: j1 `4 n0 x. _' E     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
) p5 R  N+ V5 b" Q6 r1 r$ l0 G     N=0;: u* V, [: c7 z# l
  }//end for k" ^8 I0 `: [8 q8 D# e
}//end for j$ |2 C# O" u" V8 G4 p
   
; V# Q; ^% g; c4 s% o   if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}+ @0 W+ L7 {  b5 C" \
   IRCOM[5]=IRCOM[2] & 0x0F;7 m# K9 P! S% g3 D" I/ o2 d
   IRCOM[6]=IRCOM[2] & 0xF0;8 p. {4 A/ o! `1 |
   IRCOM[6]=IRCOM[6] >> 4;
; {* j* q! Y+ u  // beep();3 w3 w) ?# k# N5 _( {
   EA = 1;
8 S9 l: }) \8 w2 ]: f, r
  R0 }4 d+ x% w+ M          send_char(IRCOM[2]);
/ j$ ~/ @$ w! z5 B, u# I
. {: l/ ]- Q( R7 J& [/ }}//end interrupt
, V( G* e9 w9 e" R5 ?0 _; y5 n8 C1 M5 x  |% g) r$ P
//下面是延时程序. Z/ J- s" g. [' E) N0 P  S. \9 ?
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量7 F2 ^: U+ b3 H5 N  r2 [, \
{
, \5 g& _- \' j" ~+ f unsigned char i;
& S7 h, n/ K; P         while(x--)0 Q  V: l; q) x
        {- f/ R+ @; F* y: z2 H7 g
                for (i = 0; i<13; i++) {}! X, H* R. [0 X/ i# K& p
        }' h3 {# n7 U* G" P6 H
}8 B1 X. B# P" c7 {' \
. P/ @6 }" ]( e' Y6 |( [7 w
//下面是延时程序0 L9 D+ y9 h: r
void delay1(unsigned char ms)//unsigned char ms是参量
3 R5 f1 P. Q6 f{
$ ^8 G6 w8 d4 y, r! ? unsigned char i;  O5 X, I5 l* B' R+ W
        while(ms--)
; M8 Z( u/ G5 v4 `# |        {
2 H) c6 I5 s2 [7 ^7 i- d1 f                for(i = 0; i<120; i++)
: ]8 y- A8 l1 G* G7 V                {
, e' E) K* ~9 l. Z' g5 `8 H                        _nop_();# ]7 q" y& Q; E$ M) n2 D/ v- R
                        _nop_();
; v% L2 a. U  }: C- h                        _nop_();
2 ]0 F" I; ~% O$ g                        _nop_();8 W5 W- Y' n% H. g
                }( ?' o7 @2 D) j; t
        }! F8 A( W6 J3 S; Y
}
作者: liangkai520    时间: 2014-7-18 13:56





欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2