EDA365电子论坛网

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

作者: 深圳奔    时间: 2012-8-19 21:03
标题: 遥控器解码
#include <reg51.h>
6 D$ a( H) x+ O- e#include <intrins.h>) @0 d, L5 x" R6 t3 X
void delay(unsigned char x);//x*0.14MS
' L- `3 s5 F7 h: Y7 n# @void delay1(unsigned char ms);# q# J, E3 a* U; i- t: h. ?8 H
void send_char( char txd);1 {2 i& I# z' p$ ^% w4 M
sbit IRIN = P3^2;//INT0(外部中断0输入口)* b* J+ Q3 ]) i% R
typedef unsigned char uint8;& N  ?' d9 e7 o4 c% _% Z3 z
unsigned char IRCOM[8];
6 [3 ^' P4 Q( q! l9 w. aunsigned char code table[16] = ) S% u' ^6 a5 g
                    {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,# D1 h2 T1 d0 J
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F* h( G6 M: [, o" m. A
/*波特率:9600*/
$ {3 Q! {" C" }: pvoid uart_init()1 i! c( p, v0 _% n: n" G
{9 D, Z0 O' H/ L& l. s2 j" ^
        TMOD = 0x20;                        // 定时器1工作于8位自动重载模式, 用于产生波特率
( r& n8 u: ?- l' X2 r; e        TH1 = 0xFD;                                // 波特率9600
3 Z6 d( d; B$ ~, B1 J8 W" R( U' w        TL1 = 0xFD;3 Q* K$ ]! @* B. l( M
       
' F6 u5 e- V4 g6 ]% ~; f* S! f& }        SCON = 0x50;                        // 设定串行口工作方式
" _) v% N0 M9 d8 w' y. h( P' v        PCON &= 0xef;                        // 波特率不倍增
. U  p1 {/ A1 m# n4 d" P                  T4 m9 m5 B3 K3 I: c
        TR1 = 1;                                // 启动定时器1
, L3 w, [* U# B4 w        : G) m& g/ A% g
}* m3 W% e# ~% V/ G; H' L
/*UART发送一字节*/
$ W2 T# B- R; \. B9 e1 m' K3 }' _4 w5 O; H8 D, s
void send_char(unsigned char txd)
4 @. }5 o1 I, Y, S// 传送一个字符
0 c1 Y  M) ]. P& ]{
( I& Z- g) Y# t8 `$ |0 o# T  
+ N4 N( p% ^  o! D( p        SBUF = txd;, P, z: R: t, @3 L3 n( Y
        while(!TI);                                // 等特数据传送
& n1 V$ O2 K7 E& I: B  H        TI = 0;       
: A3 D" P! i0 g* r$ m                                // 清除数据传送标志0 K& L& J! D/ Z5 J: H
}
8 V/ P+ {0 U2 q2 Z$ b: O: K" i4 Kmain()
. ?7 Z# K* {3 W{/ O4 R/ S8 W2 @6 Q
           ! x5 v3 @# l  Q
IE = 0x81;    //允许总中断中断,使能 INT0 外部中断
6 f1 x% x" W( e' q3 P, B TCON = 0x1;   //触发方式为脉冲负边沿触发
' i8 O; A( f' ?& I$ ?+ K  q7 a% u delay(1);0 Q' V7 A$ p7 \' N7 J6 T1 |

5 d$ a# G& E+ J1 i0 C# F         IRIN=1;
: [+ ?4 h! g! Y' H' o8 L             //BEEP=1;
$ h' ~/ R$ v" P6 Y* ?                 //RELAY=1;
/ L: J. G' F" y- m) l                 for(;;)
" }( k, [: }  ?3 o2 R                 {
& O6 @* {7 F7 ?) g          uart_init();
# v: _% W* v- M7 r- Y                : R7 C/ [: ^; y! E
                  }/ ?/ A0 a* b  H( Q, C2 O3 Y
                                        0 }+ p3 ?' V" L3 \
} //end main
: R& c: ]! i- V4 q# r( w3 |//以下是中断服务程序
/ Z# E7 }% `# f& v$ Pvoid IR_IN() interrupt 0 using 0- z$ ?( P  L9 M- Q$ j$ B1 V9 ?" C
{3 G: e" p+ T3 z& f8 D# _
unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据* L9 I1 A5 b* o3 r' K. }
  EA = 0;//禁止总中断2 K: O/ Z: [* [! k1 e
I1://标号
. u  T/ T. l  |$ M3 N. ]  for (i=0;i<4;i++)8 ~" L: ^$ `& g+ M* _5 `  h2 @
   {' Z- F) C" l( c* O* t5 `* L3 ]
    if (IRIN==0) break;; e4 y$ U' S& ?; B
        if (i==3)' E+ v7 u3 g3 O: ?/ g& R+ c
      {EA =1;return;}//如果i等于3就打开放中断( H2 R$ F! u* y6 ]  k. \6 m' ~
   }
& E( r6 W, U  f! @  delay(20);
2 p5 g) q0 G( V0 I" L; z    if (IRIN==1) goto I1;  //确认IR信号出现5 a( g9 S" M" I4 a' ^& {( w6 f
  while (!IRIN)            //等 IR 变为高电平
' l! N$ O2 I: r" u2 f5 B    {delay(1);}  y* c# z( L# g% ~8 N% u
) `9 T1 Q& k3 O! U; q% z: N
for (j=0;j<4;j++)
1 w3 K, T& ]) J- W% S { / a5 k' `9 d" u9 Q
  for (k=0;k<8;k++): W; H8 q  s4 p" D$ y
  {. \2 a  ?4 T+ o! N
         while (IRIN)            //等 IR 变为低电平! b$ O6 Y% h+ G' z7 _2 x: `
            {delay(1);}
; u! o7 c; ~( w' T, F6 ~* V           while (!IRIN)          //等 IR 变为高电平
1 V) A$ x# ?2 F; L  p; e            {delay(1);}
  R  C& x( k+ k' i0 c     while (IRIN)           //计算IR高电平时长! E6 N5 m, ~' H2 Z7 R9 }1 r) X0 D
      {                           //如果IRIN等于1的时候就计算delay的个数
( J9 Q+ S9 S* L# w) S+ q( l+ {           delay(1);/ e  e0 u- r8 `  B7 [& |
           N++;           
( x- h+ H0 s; l1 s. _           if (N>=30) {EA=1;return;}4 u! x8 [; t( O# P
          }0 {) a) s4 P3 {' N* s6 {7 `
     IRCOM[j]=IRCOM[j] >> 1;
! H: r: g" P1 v6 H     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}2 f; `, P% U5 a: p' s1 d
     N=0;0 ^* P/ m- \6 F& p
  }//end for k1 p  g% f* l$ `" z  W6 D" A) U; p
}//end for j4 K0 }8 k* P9 o1 n8 m$ w* L5 |
   
8 g2 X( ^; Z5 K   if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
$ D" W! b! u6 ?4 J% z1 s0 n' p- D3 g   IRCOM[5]=IRCOM[2] & 0x0F;# c+ Z% B3 H% y- x4 Z5 |8 x0 \
   IRCOM[6]=IRCOM[2] & 0xF0;
/ R3 s4 t4 N" T* s   IRCOM[6]=IRCOM[6] >> 4;8 s0 b+ L$ m% O2 |7 G! w0 w$ T" ~
  // beep();
+ b- _4 h$ H6 {   EA = 1;
' i$ q  d$ u* p3 n2 R' ]: u7 Y& r9 n5 K: ]
          send_char(IRCOM[2]);  J! |6 V9 O3 v* n# `( i2 g
% P5 l  \8 F. F, ^% Z. d: `3 Y% Y9 O
}//end interrupt9 Z! A0 b5 C, W7 h1 h( k; _

# ]' G- g5 Y% C% P" G3 }& j5 d//下面是延时程序0 V0 o) h+ |; ^# L
void delay(unsigned char x)//x*0.14MS,unsigned char x是参量3 Y0 m. j! x' R' A* S. ]; }  N% P
{
! x% C/ v/ X! E; Z1 |$ j unsigned char i;
  ^$ w" C$ W( h) K7 Y5 _         while(x--)
7 j! f: x2 m* D5 A: u        {9 k8 \  V2 y' m6 J' a8 Y# Q3 b
                for (i = 0; i<13; i++) {}3 r2 o' m7 l4 N  ?# n! f! G
        }- i  g! n( |/ L6 D
}
; I7 i$ Q) D& _3 k* B
9 x1 ?; D6 X2 \//下面是延时程序0 i" g- b: ~- ?2 d% D, J
void delay1(unsigned char ms)//unsigned char ms是参量" A5 R6 n7 _# T0 U
{
/ o% s+ a: _& t' R7 u unsigned char i;
5 H; m0 P, W5 \$ p3 ?+ w         while(ms--)
$ g5 X1 n0 t" ]& R, @, Q        {+ t  s8 F9 O# ]1 e; F0 h8 i% F8 U
                for(i = 0; i<120; i++)
+ g9 _& f7 M7 k3 j                {1 \6 m' X2 R7 Y' W) }% P9 W" D5 k
                        _nop_();
4 M) T2 g, n* G/ X1 A0 t( U. _                        _nop_();
3 u( v$ C5 g1 I( d- [. E8 C4 y0 b+ I                        _nop_();
3 M4 q' F0 w  _, P                        _nop_();5 o" ?1 t* R% x( d% \9 k  J
                }; n. D& I8 l/ U
        }
8 F2 _& C$ h0 {, t}
作者: liangkai520    时间: 2014-7-18 13:56





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2