|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的红外遥控灯 原理图及程序
# K' B- U" I; m' L9 V6 J2 ~6 V* c
5 l/ d, r. D: J% ~- V
0 A- r. w; H6 D$ d3 T, P, b红外遥控灯单片机原理图:
- L9 E3 d1 t6 Z; {" c( r# R $ }( F. Z4 G0 g- Z+ S
//头函数9 t. r# x7 G$ _
#include <reg52.h>
9 x2 l ?3 X9 _1 I//宏定义& O) b' [' L* k: S1 R" X$ z+ l
#define uint unsigned int
+ ?+ v/ X. j* W& R8 @#define uchar unsigned char
& u4 z- r! Y2 \# D! [0 \( |2 A: H) J- X- D. i% Q
: Y, i, U' R1 c
//时间计算6 Q( O+ I: f3 g+ \0 \3 O) W% Z
#define Imax 14000 //此处为晶振为11.0592时的取值,
: t, d0 u6 b: u1 n8 @" ~) V) e#define Imin 8000 //如用其它频率的晶振时,
: ?1 Y9 I P) g9 b J* O6 q#define Inum1 1450 //要改变相应的取值。
" D% ]6 i- p7 T' c8 ?3 x#define Inum2 700 , t, | S! n3 ^ e" C7 { d) ~
#define Inum3 3000 8 P8 v& q+ F4 T# r, o, e* Z4 s
sbit led1=P2^3;7 F! x: a( M3 i5 c% _3 Q
sbit led2=P2^0;; Y% d7 B! Y a; ^7 M3 X6 c
//解码变量
~" \6 p; V5 d3 Xunsigned char Im[4]={0x00,0x00,0x00,0x00};4 e3 {/ B! Q% f( d$ Y: Y
8 A% {$ G, N, N9 i- b3 V" r. q
7 C2 l; y$ H/ @) }2 s8 Q//全局变量
/ f4 k+ F! ? U- Luchar f;
" i: K7 z* ^5 `unsigned long m,Tc;
+ j% u; |& w' ^ Xunsigned char IrOK;
, f# o& a; u# }8 E! ]$ t9 e0 ?4 V" e* g# J, {+ B) T/ X: Y. x
) {, L* D. g1 @; H
6 \# ]' O+ l% H7 ?6 P/ W5 P* I# P+ s
//主函数! I/ ~) O% x. [" _4 n9 n' l
void main()
9 g1 K9 q" C( f4 X1 d W{1 O+ R2 E/ ]9 H1 p1 U8 H* t# h F
P2=0xff;3 }3 s% m2 a# W0 _) o
( f! h5 z- D7 c" Y+ E; r
EA=1;//开启总中断
; m, p! Y: Q5 W1 O
% U. l# I G! q! |8 }" _7 o IT1=1;//下降沿有效+ r; U% c2 g" w3 L! V5 M' `- L1 w
EX1=1;//外部中断1开
$ z5 k) ] @4 `$ ` % l- t ?/ u- J2 Y* n4 X
TMOD=0x01;//定时器初始化
0 `+ Z; ~0 R" T3 q- B TH0=0;//T0赋初值: g E9 [9 ~# u) N% @; u# |
TL0=0;
9 i; \1 Y* V- }, o& l TR0=0;//t0开始计时
Z, R" n8 \: F3 r" L while(1)- @' t. w% m" s m" B
{- o( l8 r* o3 D3 W9 D8 n* g5 |: R
if(IrOK==1) 1 ?3 R& H- U5 ]7 w
{5 d! ?# O1 B6 V3 H
//1键
, e4 o2 c5 T( a( p- u, ~2 v3 r& t if(Im[2]==0x0c)
+ t9 ~; c6 U9 _# Z5 U9 Y2 }, c3 e* f {
5 D) v$ K ~: H7 R' _ P2=0x00;0 w+ d% e* P( D0 n! Z
led1=0;/ m7 n; V) `1 u& U" B0 `
}
' M) _$ e* @3 e' w //2键 c1 O9 R7 U, y/ k- w% L4 l
else if(Im[2]==0x18)
/ m5 @* K: u' \# s3 q {
" s8 x- \2 `6 D3 U //P2=0xa2;/ G( B& d5 e- l- ?0 X9 G
led1=1;
! g9 K+ W6 i; S% Y6 ]8 k) J# E& g }# R3 t; H, W i6 c5 R
//3键
6 Z" F) [( f2 B- h3 m6 ^ else if(Im[2]==0x5e)+ m/ d( i+ W! b
{
% J* N0 C. n- ~' t) C P2=0xb0;+ Z% [3 \/ d( f- d& R
}
+ T5 u& e, E( e( M //41 E8 V6 |9 ~! B
else if(Im[2]==0x08)( F: H8 _: ^9 I& |/ p
{3 l$ l, `+ h3 U6 j' ~ K
// P2=0x08;( \7 ?* G6 ~1 N* c2 x# n% s! ~
led2=0;/ Q' S% q: U8 C0 j" F; F% Y0 l; T, j
}, j/ l. {: m4 [/ R R" b3 H
//5$ J9 b: H: |7 M( u% E
else if(Im[2]==0x1c)2 \% \$ R4 }" U1 N, H
{9 h. q8 ]8 n; T- I
// P2=0x91;5 |, E* ?# u! d9 g
led2=1;" y. j- [# s) F% @ j+ d
}- N& i* s' x; i9 e9 m' I3 C- y- F
//6: | G4 I: H1 X
else if(Im[2]==0x5a)2 P4 M' Y6 d/ w2 d: S
{
, Q% g$ o- Q( q$ Z0 g P2=0x8c;
% r$ h. W9 T1 d- T8 y0 M8 l4 G) F( f" _ }
6 [# J4 x# n% D3 _ //7键
* i% @2 {, M/ J! s else if(Im[2]==0x42)
5 {' @+ v/ u$ i ?7 L, { {$ b' E$ P$ k* @$ W z2 {
P2=0xf8;
2 v: m1 @3 P. Z7 x9 e; o }% S6 V/ p7 C! w* R! }
//8$ S: }7 }' s, U5 G
else if(Im[2]==0x52)
. L! F8 u5 }3 t {
d( ]/ i3 i3 \3 r5 n6 {: v P2=0x80;
. {" b0 o( ?2 v# R) {' _5 p }) U$ u+ v* P7 J; i
//98 A! ], [7 [9 M' K2 E* I
else if(Im[2]==0x4a)
( @; l& S$ \1 ^/ \$ T" ~, G {+ X' e! U6 R$ `, g# r
P2=0x90;! @$ \; C% N ]1 N; L: b- p* a' J# z
}
: O7 _5 x) _& }( D9 e* s //0# o- c" Z9 P* S# E
else if(Im[2]==0x16)
% e) [; p& C, N. x$ l) ?# { {
' p$ n# u/ s+ A$ \% W; D0 { P2=0xc0;1 `/ b" a, t3 y
}8 a$ R: M7 [2 u; i
//关机
2 p q' @2 l9 S% X else if(Im[2]==0x45)
: I/ n% a" s" ~$ F9 h; V {
7 I9 F1 B3 h3 j" i( W7 }- x P2=0xff;
# I8 ^, Z& ]" k+ E }7 K' p a$ l# d+ {9 c1 e0 C2 @% R: y* _
IrOK=0; ; J; k( `) G& {9 i1 a& U, Q4 X+ R
}( Z* }4 n, v7 }: y5 l* m) `
}) r/ `% x( I; a
}+ @) ~* I2 v1 U( {
/ C. I& x- g! g y5 C* [
2 ?; G7 V9 p, _* k//外部中断解码程序_外部中断1/ ^/ x- L" J% d% b" \; w8 e
void intersvr1(void) interrupt 2 using 1) s( Q# g0 D# ?( F3 X) ^
{- [1 }6 A0 v. X4 D* ~( k* W
TR0=1;4 K9 G; ?( S/ f! m5 J
Tc=TH0*256+TL0;//提取中断时间间隔时长
4 E+ J" A t5 y/ ~+ X+ E9 Z TH0=0; 2 {, h6 `3 N' |6 U
TL0=0; //定时中断重新置零
' y' g* x4 r i b- f; b if((Tc>Imin)&&(Tc<Imax))
7 |# D# Z: U; x {
0 v: s! H, c. M. U; ^% A m=0;, |9 o" z# K t0 Y
f=1;
) |4 U' K* P0 L return;+ q: }) o4 c1 U3 E
} //找到启始码
/ e2 k% X* L8 ~! R+ k0 J' M if(f==1)1 w) u2 i8 W; c$ X! I
{
9 _9 T- f1 Z& [: ? if(Tc>Inum1&&Tc<Inum3) ( v! [: l1 J1 X3 H) q# l
{
7 v) n9 y3 B! x q% V$ m8 k Im[m/8]=Im[m/8]>>1|0x80; m++;
4 K7 W; Q8 ]& A$ c# B. v& C }3 f0 q G; g1 Q7 s" h
if(Tc>Inum2&&Tc<Inum1) % b7 h$ s* _ Y* k% P4 o1 Y
{, o$ y8 u$ c7 L1 q9 f, ]. W$ @; \
Im[m/8]=Im[m/8]>>1; m++; //取码, R) K: O2 g5 ?7 G4 f3 \
}
* J" q) X+ ]$ U4 w if(m==32)
; V; K$ |2 o. V$ H& ~# C9 k {
% f% Y' D8 h. p& Q8 y6 R- O( l S m=0; ) v c8 Z7 C7 ^5 i/ e! r
f=0;- ]( H5 v& s( }
if(Im[2]==~Im[3])
% h; H7 y; t" f6 _/ b: O9 S4 f1 |4 [ {
/ {& X3 H0 r5 Y* _ ~9 v IrOK=1;, [" V. \- R9 E0 g) S$ X
TR0=0; 4 U/ j9 T% ~9 F- w* a% s
}+ E5 d6 B& m3 F! B0 Y W' I1 G" Q
else IrOK=0; //取码完成后判断读码是否正确
$ s. { C; S9 b3 A8 Q$ U. _
7 R/ E/ t! T6 I2 w$ a5 O
; _; U! K6 f. k D
) L6 z4 |1 h0 [6 O2 ~0 H2 g' w! k; E" P. j6 A/ E2 P3 A# U
…………限于本文篇幅 余下代码请从论坛下载附件…………
: W! G% i( x2 p' n- [7 Y
; W0 v2 `7 V2 Y3 H) ?
9 N! n T1 |+ ~3 m# Z$ l |
|