|
这是我最后修改后的代码' J. _. ^( Q+ [+ A- I- t
1 l0 v; ~9 |8 ]3 R, ?/ g
0 将遥控器上的2,4,6,8按键定义为电脑上显示的相应按键的数值为01,03,02,04! u: x: f, ]- Z/ G# p$ U$ Y4 z
6 `( k6 H$ M# J
j, U/ Q6 ?; \! x7 i2 v/ U1 P! f8 [) N
#include "reg52.h"
* B2 {$ W2 c) O; l; \% C3 P
; R" g) O9 {8 E' W$ h7 i- n
) M `( T* O. ntypedef unsigned int u16; ' w! D X0 D Q4 D
typedef unsigned char u8;
6 P7 l, g$ c- B1 [0 B" [* ^sbit P0_0=P2^2;
2 K! V }+ r, R a2 F# l1 }3 Asbit P0_1=P2^3; x2 M; X+ D: b( W% F5 |8 E/ V
sbit P0_2=P2^4;& Q' o( ]! h* b/ a0 D+ T
- b& k. h9 g! ?, C3 R& o8 p- N
sbit LSA=P2^2;
1 s; Z, W* d r: m2 F$ lsbit LSB=P2^3;
/ |- @# W; {9 W* l8 Dsbit LSC=P2^4;
0 ]6 E9 t( d0 I1 K& C
- Q% h: S! t, w( I5 H4 e" J* `sbit IRIN=P3^2;
( @$ U& b$ ] F) p- p) a2 ]( G7 q, y: S; w: Z
u8 IrValue[6];
3 v* ?" }! U2 g |+ T& r* u2 ku8 time;4 j8 s1 G2 n: m% x2 L
3 u; A- O- r0 |0 _u8 DisplayData[8];9 e8 g0 w) l; _4 v
u8 SendData;
8 u- U2 Y6 M. ^; I" fu8 code smgduan[17]={& }: o, G% k" {4 d
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
) N' m- k2 F: Z& A: I7 ^0 l: j0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};) e5 q6 m: B* I' T% X
: s# b/ }) i4 u" M% V
+ E% \( O: u0 L0 B1 o
) D+ x& k1 x! Q. @! Q* zvoid delay(u16 i) //延时6 c% M) ^$ ?* S+ z
{
0 [0 U& w4 \% s6 A6 q while(i--);
$ Z$ j$ M) G! x4 P7 t) Q}
( Y0 }2 h& A6 Q2 d- D- S9 v3 D/ d
3 d* e$ w+ |- [! A
% b5 t7 J* s; _9 t+ n5 U$ ]& h* e- X
void DigDisplay() //数码管显示函数8 V6 k# s. _- E, ~% a
{
0 ^+ Z) i9 d: m( T u8 i;4 E. `# ], `9 Z7 V& h) I/ t
for(i=0;i<3;i++)
$ k. A9 T6 E$ x1 M+ o; A1 h% J {5 l4 {; _! ]# y; A \! }# W/ [
switch(i)
! y% h4 ]: g# V" S9 p {4 y& Y/ {+ k' `) d- r% E
case(0):+ s, H; |4 x) `
LSA=0;LSB=0;LSC=0; break;# L) o& Q u* h3 d- P0 x' Z4 x6 K
case(1):
5 p8 G* d7 O1 ^9 A5 X LSA=1;LSB=0;LSC=0; break;' E$ ^5 G# g( V# z) C' n6 m
case(2):. o# S7 `( O1 z0 m- H- U
LSA=0;LSB=1;LSC=0; break; , _! l Z/ n2 L$ C
}2 c, ^$ M1 g& |/ c" `' B6 l
P0=DisplayData[2-i];
. I5 G1 S+ X, [2 X( x5 Q delay(100); & P6 a, V& w9 ~' T
P0=0x00;
% C5 T, ^8 U0 r/ ~# d% a" g5 h } + `5 a: @) Z5 l8 N( ~7 ^* y
}! l, R* ?" e$ L% C3 W) }
! q" p* |! c( j6 C/ A' z
8 u7 m, O5 B9 }8 m! ]1 Y: \! l
, q7 H" U" z) n1 m7 o
' F1 J1 t# J" ^
void IrInit() //初始化红外线接收
% {" I" @4 \6 o4 M2 y. H{
. {2 c5 M' Q$ B8 y" c IT0=1;
) h [; R% r e EX0=1;+ J0 l' V! s! b! Z6 J6 s
EA=1; 2 I, `; p, R( D P$ P
0 A/ L6 r* h' x" _& a* g IRIN=1;$ X. c3 h0 S4 C1 r! ]
}
4 }9 f2 Z6 }- `) [! f: \8 f
% ?2 v& p* S9 v4 R& F4 [void UsartInit() // 设置串口
9 W) ?: o! g% u6 T, [{
1 B! S3 Q6 J5 N9 U SCON=0X50; //工作方式为1
, ~; v' i' E0 A/ m: W TMOD=0X20; //计数器工作方式2/ R) t! M; x3 x
PCON=0X80; //波特率加倍
' |, O! D2 a) l3 ?0 t, c8 Y TH1=0XF3; //波特率4800
4 n2 g# l, N6 ] TL1=0XF3;0 s5 x5 z0 V0 h' _, r: H
ES=1;
- E! q9 M; z: S3 t EA=1; 9 q( _- S+ T- d+ V$ p$ X7 ^! l K
TR1=1;
# E4 `3 C: X& m' z7 d}
2 u# U3 \7 V& x1 J" d' e" g0 [, i) @2 j/ S& q% r3 \8 O
4 x( N. q7 ~- A* k. x3 C* }
void main() //主函数 ?( v9 \& u5 _: B" Z: |
{ " x! Q! L2 k! f8 x
b0 H$ L3 F' d
IrInit();
# B! M! f! v% j) f1 _* m8 ^- S- ? UsartInit();
9 Z- ?' g( z% g' O. h; x4 m while(1)
. H$ p6 M* p* y8 M { 0 k1 x5 ?8 V; P' E# ~
DisplayData[0] = smgduan[IrValue[2]/16];9 v( f9 w: @& }: Y
DisplayData[1] = smgduan[IrValue[2]%16];
! `; z- g" L$ k7 U. o DisplayData[2] = smgduan[16];
+ n! s/ j" ^' v; R8 ^5 t DigDisplay();
. T6 {" y: }9 o# T/ |6 E5 f& x3 p
if(SendData==1)/ X* ?& N; F3 X$ E6 ?, u
{
3 i( r# w+ D4 T. q- V. |" P5 _/* 红外线按键对应值
" ]& U. T( t, P. @. v 2---0x18 4--0x08
4 O4 v; n k( M: _0 I# Y 8--0x52 6--0x5a
7 h& A5 E! s6 ~. b( q2 c*/& W3 l7 U1 W; A6 e/ o) b
if(IrValue[2]==0x18)) y( d9 X& [2 \; m6 U
{
6 @8 P1 X7 o, ?! r/ z SBUF=0x01;
+ G$ X- z9 @* @- o- ] }# B, S6 p% B0 [- y0 B; @+ W! g
else if(IrValue[2]==0x08): o8 ]5 L& W5 d4 w
{
9 M" k) u2 w }% c9 ? SBUF=0x03;0 T& m* T3 g& o4 b1 g
}: a( U O& w8 ~, }( P4 ^% h
else if(IrValue[2]==0x5a)7 M* K0 V) D; Y1 g; ^' }* n
{. ]. u, a0 v( s: Z
SBUF=0x04;. M9 E" Z3 z$ Z8 y( k* C
}
9 Y. `8 [7 T2 I* \3 i else if(IrValue[2]==0x52)
# K: H) e7 X& \+ S* K c- t {
1 i% k0 H9 X! a, U3 A. H2 I3 l! ` SBUF=0x02;
$ c( y8 k" D' W8 M' _- Q) L1 _ }
$ E H2 I$ p- k5 a% ^7 h7 M SendData=0;
0 M+ r3 {2 `+ \% j9 I }
# g, R8 @, B' Q1 b: P# A7 S, | } % f4 ^/ {% e; h. y' Q- G
}* P4 v" Q6 _) R; T. Q j, F% _
% q9 x! [, Q. _8 r7 ^! M
void ReadIr() interrupt 0 //读取红外线数值的中断函数6 N4 c, k8 Z' J, R
{
5 ~* P2 Z3 [5 Z u8 j,k;4 m1 Z9 W2 w! g \' Q# W C; F* h
u16 err;
% |8 V2 f2 n4 b* V2 A1 k. L/ B3 ] Time=0;
* T; ~8 p! j$ ^9 P7 ~) {! e/ G% L delay(700);
/ a+ ^; `, G- Q: j( |5 D if(IRIN==0)
9 {* y" V' R' L: V" h& Z9 V: D% F- C/ J) f { 8 ~# c3 p2 {3 ~) R2 ]
4 Q& v; a) N, R6 T" ^3 U err=1000; % c! g* [# f$ c# ?1 W, K1 k5 K
3 W e( k/ J* i, n# ?" M2 H1 K while((IRIN==0)&&(err>0))
$ ]" f) y9 w, h m! F7 r% } {
! o' k% n# @3 j/ J/ ^6 Q delay(1);) R. {# v y$ {
err--;
: ~. }+ C0 V! F7 x% ? }
; P4 H6 @5 H2 I$ ?7 V if(IRIN==1)
: P9 [) ~! Q$ ?3 W {' h$ x/ ]4 i: v2 }3 X) y
err=500;4 O1 i0 V* Y S
while((IRIN==1)&&(err>0))
+ U5 I# t5 V' P9 E/ r3 m- z' l {
7 v+ f, X+ r/ K4 J4 E* N9 A delay(1);
x5 a5 _* W# j8 J, z3 U err--;
_$ A- g! u2 _4 Q }" l' i- c/ T7 ^$ W3 K
for(k=0;k<4;k++) * T% L8 [7 S W* z
{
0 x. b( o. l1 f/ Z0 P* b4 b2 G for(j=0;j<8;j++)
4 t: O5 f6 R# u2 l2 F. M5 ] {
# `- O9 q) {! x: j; u/ s& D
8 v0 v* P; n8 ~ x" M err=60; k) ~4 K; w' t
while((IRIN==0)&&(err>0))
' L4 I1 v" K# j V* o; X {! W/ F7 A/ M; O2 }) Y$ i/ |
delay(1);; ?4 |- O" ^# E. [; E' R) q
err--;
_8 c( S8 Q8 }/ w3 k }
( O I8 w9 i, }7 ?: M err=500;2 }8 o& ^# Z1 Q6 J
while((IRIN==1)&&(err>0)) 5 ]( B6 ]& |. ?4 k
{8 `% g6 U R: [) X5 C
delay(10); //0.1ms) K2 A5 K" U8 w3 Q0 @; U1 F% U$ e2 j
Time++;/ z/ t- \5 O9 _" M0 C! Y/ f4 l5 t
err--;3 `; j& x+ D! N5 ~
if(Time>30)/ P s: y% D6 `6 e5 u; ]* c4 L
{
0 H3 F/ v7 ~$ n- U return;) u/ `, B8 ^' v4 |# a- g) O- j! x
}
- [+ @" m5 |* [9 p9 U }
, c% d0 ]/ G( U& A# G. l4 A9 G IrValue[k]>>=1;
' L0 @ X* c* J if(Time>=8) 4 \8 X1 O# T* m# p" K( S/ U# N9 U& [, I
{
& m$ T- a- p% q) g2 j/ i8 p IrValue[k]|=0x80;
- ?1 `, |5 B) M# i# C7 f. M }
% i- A, ^0 T, E3 d3 H Time=0;
) c) V+ s8 D0 B& S7 D' n }- b0 d/ S) _5 Q, Q8 z
}
6 t8 ~5 e7 O: P T% l# t( W+ l }
; ~5 E0 W7 f% y3 F if(IrValue[2]!=~IrValue[3])8 R( ^1 `2 X; u; E$ S
{& N9 f5 p4 }) D$ H% U- `* f
SendData=0;
4 r$ V6 ~$ w3 F9 l return;
@) w. ~. X/ c, J- S# v2 X }
( W* @* o1 u& ~0 {$ v5 J4 f; G9 E else
7 u1 A0 l* X. S$ P {6 f) O, i" u1 G
SendData=1;
, X! d) h3 ^) _9 f0 c4 b9 V; B }$ l$ {* H$ o x8 L) S) ]8 l
}
/ [( ~3 s( a! ^( y}
; l$ H4 M3 ^. B2 {- F ^
$ t; o" \. d, N; F/ L- f1 u" |
( [: d1 J8 |" ivoid Usart() interrupt 4 //串口通信中断函数; W1 ]" D7 H2 Z- c
{# G; ]4 d. S9 M6 x: h* \5 ?
u8 receiveData;& e' v* G% a9 y9 ]* w. ?5 r
# ~0 L5 S Y) x2 {3 _9 f
receiveData=SBUF;; N& Y* s% A# s! |% B+ {. I
RI = 0;
. E+ c+ r' v, d8 |6 v // SBUF=IrValue[2];
9 L0 C4 `# b4 ?- A while(!TI); 7 b. ~3 J/ B4 N8 t+ |% C, K1 Y. T
TI=0;
) f6 s4 T5 C! `7 b& L& }} |
|