EDA365电子工程师网

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

作者: 深圳奔    时间: 2012-8-19 21:03
标题: 遥控器解码
#include <reg51.h>! s( q( [/ U; q; x  h- G0 E, J
#include <intrins.h>
$ D  B' W4 k& n7 n0 ?% {void delay(unsigned char x);//x*0.14MS, a( I6 @1 c. G; a; a
void delay1(unsigned char ms);/ \! j2 V. b" w, y4 N' p# j2 }, g$ T# \
void send_char( char txd);
+ r; u9 V8 O) k8 P1 Csbit IRIN = P3^2;//INT0(外部中断0输入口)  D( H8 C& o" ~3 e& Q* I0 y+ N
typedef unsigned char uint8;' z; Y( L6 o& n/ l" e
unsigned char IRCOM[8];
1 m/ Q  l2 k2 n& B, \1 Z' ^unsigned char code table[16] =
+ Y: n6 h- ]2 T: }* A* B/ [                    {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0 Z3 V. B/ F+ k9 B. z
                                        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//16进制的0--F9 K) ^! y) c+ @6 ]2 o8 u# V
/*波特率:9600*/0 Z6 c+ `% y& M0 V9 I
void uart_init()3 O$ Q5 T( A# L
{- ]* q6 r# X6 O/ Q% A
        TMOD = 0x20;                        // 定时器1工作于8位自动重载模式, 用于产生波特率+ J0 X$ [+ \+ o1 D& Z5 n& X1 e: [
        TH1 = 0xFD;                                // 波特率9600) t* k) w& R% B7 S1 G
        TL1 = 0xFD;( `8 w/ H3 j+ @/ n
        , a2 E5 F% m1 ]' I* z3 B
        SCON = 0x50;                        // 设定串行口工作方式& R5 |, L$ l% Z: G: u
        PCON &= 0xef;                        // 波特率不倍增
; S! f: b$ R8 o, m6 h# ?               
& v7 A, q1 E' O        TR1 = 1;                                // 启动定时器1, @/ T& Z/ e* I, h8 Z
        " [. i* f) w2 _) z: a3 R  V0 R
}' C/ p, _. H$ S# G9 Y" S
/*UART发送一字节*/6 D: E) Y, s; m6 e" l
5 A# u+ r$ T3 z' u9 m1 O! R
void send_char(unsigned char txd)
. `" U2 Q+ S, S// 传送一个字符
* d* v8 L' {+ G1 q4 k, S{
5 n- j* n' D( B& z& V$ C! L( I: o  & K) c- k* q: _, A
        SBUF = txd;9 F* V/ T! s3 w  J5 s" e! G( ?
        while(!TI);                                // 等特数据传送
+ ?3 E  M" N9 P6 M% e        TI = 0;       
0 C9 b: }5 @4 d  x                                // 清除数据传送标志
  K* ~6 N4 l/ f6 S}
' I) I! T$ A5 nmain()) `9 X! X' V, ?
{; F/ e- u# d$ i( P+ F$ l7 b
             Q  Q% q) Y' L6 \" [
IE = 0x81;    //允许总中断中断,使能 INT0 外部中断
# s3 A! v0 [  m TCON = 0x1;   //触发方式为脉冲负边沿触发/ N9 n' n2 k" p0 B8 M( s) `
delay(1);
$ F8 x! z$ Z: X; f- O) \  ~( m) e2 L % ?# p3 z8 L5 F$ p6 W
         IRIN=1;7 E9 x  b8 w+ ~$ {, i4 w
             //BEEP=1;# J' @3 ]0 |0 O1 n1 }
                 //RELAY=1;9 D) ]; h! w/ ?* s. H7 d& I
                 for(;;)
5 D  S  P6 k, Y# r/ E+ _2 f                 {
& E: C" V1 @- A4 E' q1 _5 Z          uart_init();
" M+ a, N+ ^# F7 Z( N  ^4 C! W$ a5 g               
/ I2 h8 F4 d" M: S# F( u                  }, k0 O3 g! I7 Y) G
                                        # C4 \( e" Z2 j* A9 K  [4 |8 y
} //end main# l6 G0 S8 u/ }: B, r! r
//以下是中断服务程序
; A6 N# J) h  ], evoid IR_IN() interrupt 0 using 0
9 F" h" O2 O2 f+ d{
" o! \5 T( S3 i1 q unsigned char i,j,k,N=0;//无符号数据单字节整型数或字符型数据9 X1 m+ D& \3 C# c: k
  EA = 0;//禁止总中断+ j+ ?1 Q, Y" U% I, o
I1://标号/ y+ e( F# u: M
  for (i=0;i<4;i++)
" C6 x# K, u- _" d- u4 d; \   {) p& s- v/ |( v8 z" N3 m2 ]: E
    if (IRIN==0) break;
1 F) c5 E- _6 R$ x$ m: {. ~; M        if (i==3)7 `% p+ c, r1 }
      {EA =1;return;}//如果i等于3就打开放中断+ U" ]4 g/ ~1 b. C# ?
   }; @" U+ S+ w8 f- K- y
  delay(20);) `6 l' z" C& J; `- M2 u
    if (IRIN==1) goto I1;  //确认IR信号出现; {# }' C5 u8 h; C7 ?/ _6 |% P  _
  while (!IRIN)            //等 IR 变为高电平) R5 Z2 N  M! [5 Q( B% u) J
    {delay(1);}2 k( ]  @2 v2 H3 |

8 B/ F& K3 C  x4 P# v for (j=0;j<4;j++)
" n% H2 b# n" q9 g% Q { : x& c" }1 g) R! y
  for (k=0;k<8;k++)) i2 R# n( K; i
  {+ v+ o6 |. R/ J& `3 n3 v
         while (IRIN)            //等 IR 变为低电平0 u. _3 K4 A; O4 e. }
            {delay(1);}2 d7 P1 z( c* ?9 g
           while (!IRIN)          //等 IR 变为高电平
" Y. j$ F: b/ V$ p            {delay(1);}; A; x- I3 U4 ?3 K8 m+ x1 |) x
     while (IRIN)           //计算IR高电平时长/ t( r( n2 r5 b1 p2 z8 ?
      {                           //如果IRIN等于1的时候就计算delay的个数/ o) V1 q- A4 W+ X& G0 b
           delay(1);
8 D% J5 S3 h+ ^' e* @, s& @           N++;           # H3 R. d% d$ h8 R( @
           if (N>=30) {EA=1;return;}4 ^- ?  q4 Y$ S9 u
          }
; s6 G3 {! {! z$ e     IRCOM[j]=IRCOM[j] >> 1;; [! j9 Y# P, n! A' z- J: k" x
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}8 Z* T7 e! T6 U/ r6 ]& Z% {. h+ X  S
     N=0;2 S) [1 {! N9 F) v2 `6 c9 d
  }//end for k
: k8 O3 l5 j2 D- I }//end for j
& }. z2 d3 X. a1 i1 T% E6 C   
# b3 u4 ?# c: Z   if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}+ Q; L/ {4 t" ?
   IRCOM[5]=IRCOM[2] & 0x0F;" h% T9 |( ~9 D$ P* s
   IRCOM[6]=IRCOM[2] & 0xF0;
2 b- x" f8 A  ]$ a( e9 H2 o   IRCOM[6]=IRCOM[6] >> 4;
, M4 e  O4 p/ N  // beep();
# b  j/ G8 r6 T* `8 _   EA = 1;9 w# y2 ^% j( T4 ?8 i# q% w, z

8 V3 l. X4 b' ?* n/ J, N) K          send_char(IRCOM[2]);
. l: Y8 a8 y' |. r* N3 U2 q+ D* q& x8 d7 ]! X8 W2 Q/ u
}//end interrupt% n, I: c7 ]! t! d: s; K

' d. r/ S$ J$ X4 ?( w& E3 N//下面是延时程序
/ ]; X7 r0 U" j4 Jvoid delay(unsigned char x)//x*0.14MS,unsigned char x是参量6 F9 Y: e# p( n! f
{
( y5 |* w. B% [8 r$ {& O% f  ~. L unsigned char i;
7 w$ d* Z, K8 s" d7 Z0 D         while(x--)
7 z- t! X' T) t2 |/ S        {
7 L) @% b+ _0 K, a' \) ~8 d& a6 ?                for (i = 0; i<13; i++) {}$ y! u- H: d3 i. {* [
        }7 @+ Z, w$ {5 {
}
( u; T1 w) q# `8 [7 U# T( V: _# `* z% O$ b! u/ N
//下面是延时程序
. U& @9 m3 q; |: L" G4 Yvoid delay1(unsigned char ms)//unsigned char ms是参量& d7 Z1 E( a7 C: ^( W
{
( V, y: y  {0 G' e3 r) }) S unsigned char i;* ]& ~! K' \: Y% O. {" I
        while(ms--)
7 z- w# f6 Y  |  g4 m! q# d        {
1 K( ^7 F6 G& ?0 ?+ n& }                for(i = 0; i<120; i++)! L' O# Z) j2 j) v: B
                {$ n3 K; Y' n* n& G( d5 J9 |5 d9 s
                        _nop_();
  O$ a" x3 p* Q9 r, o                        _nop_();
7 o- ?, _$ c. \- z3 L: H                        _nop_();+ H7 ?  {- b& v* o4 c: _
                        _nop_();5 u/ n" c  B0 n8 O
                }
9 H* Q2 H* L  l  p        }
1 o. ~# u' z. X, n  y. ?}
作者: liangkai520    时间: 2014-7-18 13:56





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