|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控按键PWM控制小车前进后退
" u9 @3 ?5 H: j, Y/*-----------------------------------------------
( \ K; u/ {8 o9 V 名称:遥控器红外解码液晶显示
$ ~" Z5 d& [) Y1 H, a 内容:按配套遥控器上1-9会在液晶上显示4 _. C7 D% d4 b* f
------------------------------------------------*/
! y4 Q! i: l' o* v$ K#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义9 X0 p, W; u; V3 ]2 X6 `2 V
#include "lcd1602.h" |( P# }5 z& |4 m% r
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换# T% V# l, f s
. k t0 v S5 Y- Fsbit IR=P3^2; //红外接口标志
! G. A1 c& O9 n
5 D; h! N, D+ X9 c5 ^sbit DU = P2^6;/ {) }& ~( b$ v' Y/ W0 t# v! h
sbit WE = P2^7;
6 A" _9 Y' _: V+ x8 V! k- i) b. |( G6 M7 ~% o
/*------------------------------------------------
5 i+ R% A2 _! M0 F# g 全局变量声明; V$ M) v% p- i* u
------------------------------------------------*/
; s4 g+ w) s. Z! L5 juchar irtime;//红外用全局变量
5 q( L7 x) k9 k/ G4 e2 T- t1 i- Wuchar num; //遥控器按键% g* L; [$ R: M$ |7 Z
uchar PWM,count,kk,a;- K: q8 |) l7 b+ H: n- v8 o
sbit LED=P1^3;8 [6 [& u& V# a# Z, N
bit irpro_ok,irok;
$ G7 N+ h' `* n! E. R; j6 U+ P# B+ B+ Yuchar code ASCII[] = "0123456789";
2 }( `4 r9 X3 r( U. auchar IRcord[4];
; P2 i" W+ e8 K( L* O: Tuchar irdata[33];8 f# `+ z- B* x$ @; M3 s% h
" r! S( u: v: u" m4 n$ T3 ?% [$ I0 Ivoid cmg88()//关数码管# k, L, D3 ]7 g x7 e
{3 a* H0 c! n5 D% g' l) u, K
DU=1; * Q% I0 ?5 W+ E }+ @: u4 j, U& C
P0=0X00;
. i/ p( `( b/ a# R* z DU=0;
, N! }7 V" c& G! _}
4 \# }# F) x, ~# G+ _7 f0 b. ~9 G/*------------------------------------------------8 H8 A& n& M3 p9 T# O- p
函数声明, `1 }5 ~9 W" _( s
------------------------------------------------*/
/ K5 J/ w) }* \5 [ Q% U' q9 A3 P: G: f
void Ir_work(void);; }# h$ O g) Q4 o) d, a" U
void Ircordpro(void);
8 x3 L7 U S. Q3 a/ r# H- q
" J8 X0 u1 d' L1 ^- x8 b8 Z/*------------------------------------------------, V1 @6 j# y" U
定时器0初始化
0 d/ M" s3 A0 b------------------------------------------------*/
' L: k1 m7 k6 n- tvoid TIM0init(void)//定时器0初始化
3 P- _) P& N3 P8 b8 n4 o, }' e{ L! C* {! b8 T" @. M8 W
6 u% |4 Y) q6 ~) X TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
4 Q7 ?- z: X1 E7 ~+ @ TH0=0x00; //重载值
9 U/ p3 i. B7 h5 f+ }3 i TL0=0x00; //初始化值" N: k0 h1 \- u w+ f6 D
ET0=1; //开中断
# F! U0 x/ o- ~ R& O* u TR0=1; " c8 }5 Y7 _) ~2 p
}
& ^6 w. K( v4 _1 W. m& H$ Q/*------------------------------------------------5 e( S# c/ Z: b) _
外部中断0初始化
6 X( i, t, {' K3 z7 z8 M- Q------------------------------------------------*/
2 g4 {4 F' ?# bvoid EX0init(void)" ^' M# h" s% Y; P0 l: y
{, U7 c; L7 N- j8 f" I; Y
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
+ S6 I1 z- G0 F EX0 = 1; //使能外部中断
+ w1 o% S" u3 C* M. U! ?+ ^ EA = 1; //开总中断: Z% D" _8 d' q* V3 \
}: w/ e0 Z/ O: ?; Y5 ~
/*------------------------------------------------
6 R1 ~/ F/ j' Q" |6 J( g( c) D 定时器0中断处理
- E7 m& F- r" q: c: J------------------------------------------------*/) \: A# I3 ~0 W6 m! K$ s
) r6 A2 S2 w. x3 k9 V( X1 Jvoid tim0_isr (void) interrupt 1 using 1
) o0 d) J1 j+ ^( {7 [2 w{
: O4 P( ~8 r. u0 m+ ?( E1 |) h irtime++; //用于计数2个下降沿之0 R0 t8 V( w- y3 ^
" e3 ~& m- ^1 y8 ^/ g
count++;
3 q+ S/ ^$ c `; h) [ if(count==10)
M* ~6 Y+ x( x. N# ~ {
3 c+ D7 w; }# l0 G) j count=0;3 R% H2 q# M( D* Y* _3 g& @
}. `1 ^0 T9 a' {1 V7 \; [3 U! ]# h' ~% s
if(count< WM)$ Y+ m/ {4 r. S- U: V/ i
{8 a/ W: A4 d% `- k: h
LED=0;
5 ^ d L8 I7 H& r$ `* [ }
) U1 s! Q* [/ S5 y9 c* o' E else LED=1;
, X5 ?$ w) G, j}5 @5 R2 ^8 F9 ~# O
/*------------------------------------------------9 c. Q; @1 `: {7 g
外部中断0中断处理% }8 [5 o+ c9 n: _0 S
------------------------------------------------*/
1 E$ x* t+ G3 }7 Tvoid EX0_ISR (void) interrupt 0 //外部中断0服务函数2 b; A Q4 t5 y+ H. C# k0 p
{+ a6 i$ y7 x7 t s
static uchar i; //接收红外信号处理
/ `0 i2 m, |' K9 [7 X, W static bit startflag; //是否开始处理标志位: i4 I& N, o0 n: q- l
& q* {% R6 `# l6 t if(startflag) # ?; Y j8 ]8 I$ H* I
{
8 G/ k: B+ _. x4 x5 ^8 N/ N, j; A if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms# O. B. Q' u5 Q- a" J: O- t
4 w" P# ]3 a4 y irdata[i]=irtime; //存储每个电平的持续时间,用于以后判断是0还是1' {0 B: A. z( `* T2 _1 {# t. Z8 u
irtime=0;
' E1 |5 X! G) A5 v5 b" q i++;
2 I) o& @2 q- G( L2 { if(i==33)' S/ n; \+ K4 P2 [/ M% X
{5 B% h R$ ^( u) @
irok=1; //接收完成: [3 B/ C$ z% s: Q9 j4 X
i=0;
- _/ o6 _# I+ `( o+ [2 p }' |9 x! U' }, H f: P2 j$ {
}
, L/ Q1 w. D* M2 v+ V else' X9 w5 E8 p! ]# e
{# G+ X3 }5 }$ f% x$ j( g
irtime=0;
1 z9 d0 k& ?/ o startflag=1;4 @. g# E1 A3 c! R3 \; g
}
& n6 B. P5 @& w" e% S$ s}
6 `' M+ E+ `, y; c, R M/*------------------------------------------------$ G4 F; K' q, a1 H$ r* r% ~
键值处理( w3 S1 W5 I) b& H
------------------------------------------------*/
) x' w% B2 r3 }. m' e; a
* p; J2 b2 {. Q% c1 y# Mvoid Ir_work(void)//红外键值散转程序; N: g7 c) `" u8 i9 ~
{' C/ O; T5 _: [
switch(IRcord[2])//判断第三个数码值
' v7 q3 G6 _3 I0 M# J; b: p4 |2 _ {8 s. ?# D3 z7 a8 B$ |. s0 P# f
case 0x0c:num=1;break;//1 显示相应的按键值
[( H6 u% c! H! {( q: s case 0x18:num=2 WM++;if(PWM==11){PWM=0;};break;//2 A# p6 x# [" j$ c& P
case 0x5e:num=3;break;//34 V8 x0 S6 G/ F; B. J& A8 Z
case 0x08:num=4;break;//49 ?8 |. S% @5 n7 M
case 0x1c:num=5;break;//5( {/ R5 @. V/ G. g; ^) K
case 0x5a:num=6;break;//6* {* V" Q) q, Z& q" k
case 0x42:num=7;break;//7
0 Q# z5 p* t$ Q case 0x52:num=8 WM--;if(PWM==-1){PWM=10;};break;//8
) U, h% ?$ P$ s% u, X. F; \ case 0x4a:num=9;break;//9. Z2 m) n% E: e/ p9 Q. J/ q
default:break;
; H T) k6 s/ u' R2 ^7 y$ [9 A" @ }1 \+ }7 ?5 C9 x6 k0 G' f3 O
irpro_ok=0;//处理完成标志" A! |. o5 \5 t- O
}
8 \5 {4 d) W- |+ E- I2 J# [/*------------------------------------------------& R8 Q; j. i6 r7 W
红外码值处理
2 ]& A# A7 t2 a* L/ W------------------------------------------------*/
+ K. t1 a" I" M3 K9 u5 z5 nvoid Ircordpro(void)//红外码值处理函数
5 j( w* N( e! K" J3 u; P) o{ $ o, T1 j' H6 K9 W' U7 h
unsigned char i, j, k;
$ R" B3 ~7 S3 F4 L8 u: V unsigned char cord,value;# p+ T6 Z4 W0 T" T, F
% w( k3 J3 Z- x
k=1;0 Y: N$ D- H0 |/ V* `
for(i=0;i<4;i++) //处理4个字节7 O4 U K; V. S" [2 j/ `
{3 D4 m: ^# ~+ F& v, x2 Z
for(j=1;j<=8;j++) //处理1个字节8位4 X0 D$ K6 e8 W) h
{
) k2 T& \1 ]3 t) p* }; z cord=irdata[k];
% ^+ P& A( Y; j0 Y) C1 @& D9 N if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
3 y3 x% X( w- T% E; O" ~ if(j<8)
8 R$ i3 r4 [$ k, L {% E2 A) S4 f/ _% v- D/ p: [
value>>=1;% F6 U: [0 E( @- s. X# A3 K
} l4 S. ?5 `5 C" S# C7 g
k++;: ]; x3 k5 L5 r, P
}
+ }: ^ Z# z& ~6 { IRcord[i]=value;
( O2 t9 Y! y' G9 z# t3 Z value=0;
% V. n5 v' J7 G# v. _/ s+ K1 e }
8 Y+ ?; q7 |' ]9 [ R B- e$ q irpro_ok=1; //处理完毕标志位置1
7 K$ \5 O4 l, y: G} v& `$ p+ x: @3 w
3 T. w3 A5 Q' u) G# \5 H' l8 m
/*------------------------------------------------
, { g4 t7 d+ q* T4 `2 _1 j% y 主函数0 K" [9 A1 q6 p4 z
------------------------------------------------*/' Y5 n/ t7 W5 `. P0 B) }
# h' P8 r* m* T9 F4 ~
void main()0 z) ~4 j9 m% y' r
{
6 B5 x$ [3 I: v p: W( c4 R cmg88(); //关数码管* p- J2 c. H1 e/ b2 c4 x" g
lcd_init(); //初始化
9 T$ l( r& c9 o. e( U
0 c8 L- |8 t$ l# S7 ]5 J5 O2 I C. O EX0init();
6 w4 Z! g* I! P X TIM0init();9 p, R1 ]: W' U) x# x4 M% b
DisplayListChar(1,0," ");- p$ ^7 c3 z4 i+ y! a" d
DisplayListChar(2,1,"num=");
8 w+ p2 h. B( o! _& |1 Z9 ?9 W2 m5 V1 r DisplayListChar(2,1,"PWM=");
- O) H) U5 F. j4 L9 E9 T* y
, Z7 O p0 p2 S+ L5 j while(1)
% ^' V! n0 P* j& x {& [7 g0 q4 }: |7 e5 i
DisplayOneChar(13,1,ASCII[PWM/10]); DisplayOneChar(14,1,ASCII[PWM%10]);
6 O. h: D; I2 h& W- ~% n8 s$ y4 @1 P- F6 {! J9 Y9 p
if(irok==1); c9 g) o% y7 L* u8 X
{ _' X4 N* g! v4 k' C
Ircordpro();
6 i& o8 b' H1 s1 g- a irok=0;* G$ [, ?4 P( H" n; q3 x/ R
}8 g% r* e9 T4 L/ \
if(irpro_ok==1)8 b9 Z: J- q3 Z
{/ r9 _2 a- O3 B g2 m
Ir_work();
2 q; [ |' h; k$ z. h5 M4 a" e! J }
8 Z B: Q/ d4 S( A0 e$ i }
. C5 p: W/ k( |8 s) a! W}" U- l# m% g: u1 l
: _5 T, |9 F0 q; L- C |
|