|
这是我最后修改后的代码
# a" v; f+ l" {5 n! T: I% b. J+ Z- h- L; M2 }- k) ~) A! L
0 将遥控器上的2,4,6,8按键定义为电脑上显示的相应按键的数值为01,03,02,04
0 M$ E. h+ f" j1 @3 P; U1 d+ ^, b" t( |! Z
+ s; ?$ u4 B2 g4 t# E+ h
; v; o" Z( ?* Z& u
#include "reg52.h" 8 |1 S7 y3 J8 E; ]* J
8 B& y' F) z) }/ ?" c+ d) N1 m/ r4 ^+ C9 D3 R- @
typedef unsigned int u16;
) A2 n I- L3 Vtypedef unsigned char u8;6 @; Z) J1 o8 l l# ]1 C5 K
sbit P0_0=P2^2;
: P7 V1 d! u, A( a& C0 Zsbit P0_1=P2^3;% M/ [; |: @8 I: o; x
sbit P0_2=P2^4;
& ]6 [3 l( S5 t) H# L- h8 q7 G; R$ A; d2 x
sbit LSA=P2^2;
5 k- w3 k- }7 F) psbit LSB=P2^3;
- h( W) ~, u' R8 [" rsbit LSC=P2^4;; O1 Q' R: c+ `( d( Z( {- I/ r9 O, M
7 w( X: ~% e, e& `+ K. Q3 G) n6 Xsbit IRIN=P3^2;
; u5 B8 t( e% m1 h* q* @, S
9 A; M8 d8 J6 J7 n/ D3 J1 s& ku8 IrValue[6];: Y( l# B6 d3 f7 `; T& d M' R
u8 time;
8 M1 R, G- [4 m& V. L/ t- B% F5 M) i) b H/ |
u8 DisplayData[8];( G/ F2 ^8 p7 m! b
u8 SendData;9 Q( Y. q: w( K3 l5 T, O& {
u8 code smgduan[17]={
; K! y& X, [: ?0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
$ K2 [ b3 w+ ?# A0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
( n+ g1 F7 p( e$ S- B8 k5 k( S! V" `. [0 l9 S, M0 N7 R
5 E# b, m7 S6 d0 Z4 M2 i+ q; r
5 f) i7 e) a7 V) t( ~3 b: a# D) r, | @
void delay(u16 i) //延时& e+ p, S6 \* t6 n @; t
{7 o+ e% o( `7 L9 t
while(i--); * ]) g) y9 N+ A! ^! o1 d
}1 e2 R$ e1 z" G6 A( y
! c5 f ~$ }& {$ C
; _2 N# @2 A, o3 ?5 [/ ]) O
m+ E% H8 [* J; N% E7 bvoid DigDisplay() //数码管显示函数. D( W& m4 e9 t6 F0 x8 d' l. h
{2 t2 F2 a+ e! |/ g% C- t: B0 b
u8 i;8 \$ d% G9 _. E4 B9 z+ Q& L0 Y
for(i=0;i<3;i++), F2 A& U" C8 \0 P
{% i h- h1 M9 [6 r& l7 y
switch(i) # N' M. G* y8 X4 Q3 r" E
{
* d0 H, C# n1 t1 _) M0 r* z+ b case(0):
{1 \5 b1 O2 K" A- A LSA=0;LSB=0;LSC=0; break;! H0 E* |) P" J4 M% M2 N' G
case(1):
) X. S- S5 Q, ] LSA=1;LSB=0;LSC=0; break;. r1 v2 |; ?8 b, W2 K+ o
case(2):
, e! J; R; e* E+ Q; S LSA=0;LSB=1;LSC=0; break;
K/ t6 g* G2 j) G }
; v- v2 V. w" W1 h! O- z P0=DisplayData[2-i];
0 k l* C; Z: ]6 E! G" \ u delay(100);
6 m' y" M! ~0 W( Z2 Z; g' y P0=0x00;
. z- m+ l1 q. W7 R }
2 B! ]0 x8 c3 G' n2 S2 u! p}
& W. Y6 _4 Y& ?( n9 [( _# t: C
$ y+ |( f W t3 m5 M9 F+ P3 q2 J. q d, E# e
6 \% W/ B0 ?% Y1 J" ]% z" i; b; v
void IrInit() //初始化红外线接收 [; z3 J& o9 O( n
{' c4 o6 a F+ @3 g' W
IT0=1;
3 e3 m! Q2 j) U" d6 |- s" p EX0=1;
( O) s2 B# `( y+ D& _1 _ EA=1; 7 [( r( |: ^" ~
. B- P$ r! ], N \0 |: w( s& ^
IRIN=1;
. |( k2 _+ l! [6 y& j& ]5 B) l}! E7 f& n5 q @" p! x, W
# `& |8 d" X5 a8 Z) r3 d+ d& u4 \void UsartInit() // 设置串口
- k3 O7 g" N$ N0 U$ s{) f. d9 c/ {4 c1 Q+ V7 n
SCON=0X50; //工作方式为1( x0 Y+ a6 m8 D7 u8 P
TMOD=0X20; //计数器工作方式2
! }5 Q- k+ I8 E6 g: ?$ v( R PCON=0X80; //波特率加倍0 D( k. c, `6 u5 m5 W- G2 Y
TH1=0XF3; //波特率4800) \) z6 M5 z ~
TL1=0XF3;6 I* @& T9 ]9 l3 |
ES=1;
# {; R" V5 Q- T' G8 i$ I# [ EA=1; 6 p6 p: ^9 b' c& j D
TR1=1; 7 \7 H4 a, `6 z: _# L
}8 g+ L9 N5 J) }
; X: l8 G$ h4 A4 Z/ N9 D* ~0 |- E7 b: s. \" y
void main() //主函数
8 m3 C: n: f' |. l# w& a, s{
0 n- j$ n# h+ v; Z5 ?& e, Q; l7 z1 G( w! a2 j% C
IrInit();
& [% r) A6 u1 t UsartInit();9 U7 @$ w) d3 I- G% {" u& m( [0 s
while(1)
" P& E b- }3 p3 p; X6 o5 A( ` { . R) Q1 Y5 d; S" F$ w% y, d
DisplayData[0] = smgduan[IrValue[2]/16];4 M: p7 }# C( p
DisplayData[1] = smgduan[IrValue[2]%16];
: G9 O s: c* [+ \" K: A& @ DisplayData[2] = smgduan[16];
6 I X$ U: y) N DigDisplay();7 S, K- {9 a. g* S% M
% Y' C7 L4 \4 Y1 M) B if(SendData==1)
) E) \0 k$ ^" T4 } {5 U( J1 S! p- V( B
/* 红外线按键对应值, f7 \# ~- P. r9 Q4 ?* w5 J
2---0x18 4--0x08& Z& V' B0 J- I; F0 y
8--0x52 6--0x5a
! f& e, n/ ?! f( a; T3 G*/+ d* y0 K) D: s+ _; T8 z! T
if(IrValue[2]==0x18)
) j) l8 m; T2 d: s/ G- D- U {" u* k; k/ P* d1 U8 X
SBUF=0x01;1 A8 M3 t% a/ V) [5 V k! Z
}. n+ r9 u9 ]0 M9 U8 p( B" J
else if(IrValue[2]==0x08)4 Z0 v4 Z9 Y$ u0 q% V8 R
{$ M+ E' C. h d i
SBUF=0x03;
0 \) c. g# ?' N8 c1 \% b }
5 n8 u1 K X: f+ l7 y U else if(IrValue[2]==0x5a)
" o- j6 I7 ? U {
5 V3 u. }2 v' O9 j$ _4 k SBUF=0x04;
. o% l- a f8 N# g3 Z1 K }
4 n8 a5 l- ^! w" {" O else if(IrValue[2]==0x52)/ E6 {) }; f' D6 |$ ]* R
{$ ^% s: C7 {' S; l
SBUF=0x02;
! W. ?$ V2 X1 t3 ]4 ~ R- q3 E }
0 N }: e4 c6 ^: q; ^( t SendData=0;; f3 F& H" W m! I
}
" w# W6 q; y# b2 z' ? }
1 A, [% ~) Y* Q. \* p0 B. g}
2 Q1 U4 j- U0 J2 q, K
/ ~) s" }" b9 N5 M3 fvoid ReadIr() interrupt 0 //读取红外线数值的中断函数3 q" l' g5 y* e( t4 y& c
{
! E/ s/ R# x6 |& z u8 j,k;. p, t6 U8 `* y/ o, S
u16 err;7 |: ^% J( ~: }
Time=0;
/ Q$ Q7 D4 U4 {$ w% c- m delay(700); 9 ?# R1 p- t; \4 H
if(IRIN==0) 1 f% U5 ?+ ]! F. B; F6 U
{
2 v- m' J4 r2 Q* D2 t $ _: b# V: T7 i9 X7 U2 B# z7 x
err=1000;
, U% I! ]) ^" n" r. p" F 6 s! |; W" N( t+ \9 U, p
while((IRIN==0)&&(err>0)) 3 \, E& Q7 E: v. g7 \4 N
{ $ H+ a/ q; `) x# _0 V% l$ _, M
delay(1);
, C6 t S5 a5 s# C% P! g) S err--;' L# ]) p2 K1 X1 p# k: D( b( @
}
6 N% E& s+ E/ Q+ z% w4 V5 X if(IRIN==1) 3 m$ X7 i5 d# ^7 \, `
{1 i2 F/ }: ~' T" w8 e6 w/ s7 G# ]! V
err=500;
% ]7 s& F; P1 N; H while((IRIN==1)&&(err>0)) % ~* c& g( @7 a7 z& T6 U- y
{
+ K ~$ X/ A& u* f delay(1);/ P/ P2 @+ {- F; T
err--;
* h5 x) l9 ?2 h6 y }
- B D4 \, @* F. W2 p9 e5 q for(k=0;k<4;k++)
' O5 a+ ]3 T4 K! g# L { # D' E# }% | F: y- a, t% b
for(j=0;j<8;j++) 3 x1 Z4 H' _1 D+ G6 T; k
{7 [4 ~$ m4 x& U2 ~4 K) N4 W
5 u: }: ?) a& z% k' F
err=60; - J, j; \6 Q# A8 `' N6 L, [5 T
while((IRIN==0)&&(err>0))# R$ Q5 }$ ?( y7 E4 i7 E( ?
{
, c% C% ~4 J4 N7 r* y" ~ delay(1);
- ]; |' T m4 \; A err--;
! G. ~5 K1 ^ T7 _9 t. @" R }
5 t% z1 m! h4 {3 C: M err=500;- z. ~4 f! R! X; l/ T9 z
while((IRIN==1)&&(err>0)) ( ?8 O* R6 X2 t, ]) X( P
{2 U9 u7 V, ]8 Z+ Q- Y" {0 e; G
delay(10); //0.1ms3 t/ {7 D0 v, E9 F- G
Time++;" \+ N8 t! l8 C4 N, C
err--;7 G0 ^; t' v& d- y) O$ j
if(Time>30)
6 H) P L7 {1 q f {
8 t' s8 I( t! }7 b return;
. U! r2 M! @( ]8 G }7 L7 T, g! R& z7 h9 S, G r
}3 N8 c( {, D4 w( U# h
IrValue[k]>>=1; , h& Z# o* i1 T% \$ }' ~3 k7 {, E
if(Time>=8)
7 q5 h) i; H; v; v {
. W/ V# ^, z$ l, } c8 b K: o IrValue[k]|=0x80;5 @1 z2 O& w. b) q: j/ A& w' |' I
}
) W. T4 P4 A; M2 {( O Time=0; $ R3 v( ~3 U1 _- g. v* ^5 E
}
: ~ w$ F4 _0 a5 r }
# L0 B" B9 O- c# z1 Q0 R1 ]1 ] }: @7 g' O9 d" ~. L; g
if(IrValue[2]!=~IrValue[3])
M7 f; ]- x/ }) c: S2 k {+ @# R; b, w) e
SendData=0;
& V$ u- a* q4 b6 I return;
$ s& ^2 i( l9 i( F1 x" V9 |1 A8 r }$ R& U) `2 @% P$ X% ^
else
8 t7 Y; L5 ^$ u; Z9 K \/ B {
1 o# ~! q; `& g4 N+ f SendData=1;
( m# x' V9 X& J& K6 Q8 l }/ f" @3 c, k/ W7 B5 E" ]- h0 H2 N$ S
} ! J' ^! x& v5 J% [1 A3 m; C
}2 z8 r' I1 f9 y Q7 {/ H- d
' [& ` V( r+ k r. Y' }! B+ O
' W6 m" B% O. K; ]( K! A$ z3 H
void Usart() interrupt 4 //串口通信中断函数, P. h& S$ X+ F' R
{ B; {# l/ i% \- x+ e8 A/ w# j
u8 receiveData;- N! S9 H6 C, q1 e6 }. j
# Z. `, Y9 ^' r8 Y
receiveData=SBUF;+ H; U% s2 H# d' A
RI = 0; 5 u( \' Z- k1 B6 V6 A
// SBUF=IrValue[2]; , S: d9 x; J; Q1 X7 ~ W
while(!TI); # i* t" H, s1 C! `: o
TI=0;
0 G, W- Y4 g4 ^ J3 z} |
|