|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控按键PWM控制小车前进后退
8 E/ c, ~" E9 H7 k+ G, y* P2 g/*-----------------------------------------------5 y) {! p: n! m6 J5 L$ K! x
名称:遥控器红外解码液晶显示
. r% b! m; `+ G2 n" ` 内容:按配套遥控器上1-9会在液晶上显示
" M* T4 w" O5 B t------------------------------------------------*/
; E' l: Y: \/ P#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义: M& S$ I$ W' H. ^4 X
#include "lcd1602.h"
1 t5 l J/ A7 w- _9 r1 e#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
# r3 R. m- L9 [+ t' p2 i2 A
7 H P/ u3 o0 _. G$ wsbit IR=P3^2; //红外接口标志
8 T1 J7 N0 p/ K4 C# Y: B2 `+ g4 J! z3 i# R# j
sbit DU = P2^6;* G- V, ^6 t' u7 X
sbit WE = P2^7;
5 K. H) ]- y' w9 [0 ]# L+ S! L
2 u# k' i. J6 c/ E( q% B; E' f/*------------------------------------------------
, D% U/ Q, @4 ~5 W( J9 P 全局变量声明
+ M6 ^; \3 c& k2 n+ ^( d/ K------------------------------------------------*/ 4 ?! L; E7 g9 `# g }1 P* b w
uchar irtime;//红外用全局变量$ Y" x4 [5 o0 b/ \
uchar num; //遥控器按键 q1 ?- T8 J8 h
uchar PWM,count,kk,a;3 P. r$ i. @9 t! H% g; G
sbit LED=P1^3;+ u) T, \5 v4 d
bit irpro_ok,irok; L: }4 W' o( e9 h" @
uchar code ASCII[] = "0123456789";
$ }6 S" r6 F5 U/ t% U! Guchar IRcord[4];
& ^8 t5 S/ ~6 M) kuchar irdata[33];
5 ^- W W+ i/ W( I, K* [3 v/ P( o/ o. ?( S' D; i* o3 L
void cmg88()//关数码管
7 T3 s( g2 X! C9 o{
2 B! L* A& l. l) j; I: t C3 [ DU=1; ; W3 k& P: z3 r3 g
P0=0X00;
/ ]! `4 `& C$ ~; D- c8 @& y V DU=0;
3 D1 U) T9 _4 |: k}
5 j5 S! E, r/ s. P; l/*------------------------------------------------9 p% V% F0 e1 V' W9 _
函数声明* ?0 a2 ~ S8 l8 r% f/ w. v. t ?0 k
------------------------------------------------*/9 \, l+ h7 U& y$ ]% M& ]
0 N2 Z% m0 h$ y" ivoid Ir_work(void);
& `1 M* s1 k, n4 @7 R6 j$ ?void Ircordpro(void);
! A4 \% z. [; J9 ?
$ _1 X- C' F5 x- P s5 t/*------------------------------------------------- d; M( N5 X7 z% ?# D
定时器0初始化: r; G6 I9 Z) S7 q
------------------------------------------------*/
3 k$ S# ]9 J1 L2 {, hvoid TIM0init(void)//定时器0初始化
* O( n# Q7 `& p, D. a- y: W{& c6 J: s" `( \7 h
3 a. ~( {8 L: B) j' @4 J
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
Y/ K; B! P1 F0 l TH0=0x00; //重载值
0 k1 i" |+ l6 [ TL0=0x00; //初始化值
. \. p4 O I, ?1 q% A9 K ET0=1; //开中断8 M( j* P* c4 t5 w+ c& ?0 X
TR0=1; 4 G% X6 N: I5 ]8 s+ {
}! b6 Q9 f% F2 O) a6 ], m
/*------------------------------------------------ g: N" L4 v( G3 D# X* ^ ^ R; r
外部中断0初始化% p" |$ T3 P# x F$ r+ `" h+ k
------------------------------------------------*/
: H3 d1 ^1 U* Vvoid EX0init(void)7 o4 j8 z' B4 p1 d1 ^' I, e
{# x# W1 }) Z$ D( O3 I
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)9 O; O7 b3 |" X" V
EX0 = 1; //使能外部中断
- Y `; w3 }" k+ D EA = 1; //开总中断5 x9 | X: }. \! Z9 G
}
z1 b) {, x! a, O: P; c/*------------------------------------------------
3 l( r4 f6 G' D4 | 定时器0中断处理, y/ {. m; c. s: D9 R3 c4 Y" k' b4 Q
------------------------------------------------*/
& W7 [! O2 r- M- m6 Y" q! A0 C4 }& o7 C9 y
void tim0_isr (void) interrupt 1 using 1- o5 t# e# z. c: M, O( O
{
+ c% \- N) ^/ l$ L0 d3 P) Q1 t irtime++; //用于计数2个下降沿之
9 q, u) z; x8 `& V$ C5 @: A7 C h, S6 y# s9 \
count++;
* K3 U5 w' O5 u( ~' Y/ ]% g0 e$ Y! W if(count==10)# X7 N' e3 h/ v5 [% D
{
4 g' y3 k, N% W }, K6 l count=0; Y1 {: q. W1 `" ?# N3 q
}
0 g' p& U. o6 E; s if(count< WM)
+ R2 R1 z c& f, L3 y {
4 N3 f3 x4 ~ B LED=0;
1 J* W. S: f5 K3 v- V }- A5 Y% m0 ]+ r; n" P; l6 ?3 X
else LED=1;
7 g9 F1 g6 L- h* E$ J}8 _8 p- J* r4 q
/*------------------------------------------------
: o) I+ U. D0 [) r( t 外部中断0中断处理3 E$ d Z( w9 c+ @. `0 x4 i
------------------------------------------------*/- Z( x5 V G1 E1 v' h3 U7 y
void EX0_ISR (void) interrupt 0 //外部中断0服务函数1 u6 m' c2 V7 [ Q( T1 A5 {
{
3 S& m- n5 f/ p static uchar i; //接收红外信号处理
! @, k, X9 v: K) F1 J8 D static bit startflag; //是否开始处理标志位3 f1 _" u w/ U" v
( I/ E' h- S* S' [: W$ A3 E if(startflag)
& f+ O! d- l) Q+ R# Q+ m {
( G: }5 L1 x! j+ M% E2 R if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms4 r c! B' p( N8 h) y
, e9 F' o3 T' T* q
irdata[i]=irtime; //存储每个电平的持续时间,用于以后判断是0还是1
, a [/ |% [7 f1 K. v irtime=0;
, j4 ~8 I% A. Q# I* f+ F+ w i++; ?3 D7 | @5 Y4 _5 h9 C% B
if(i==33)
- s& ^1 c) X$ H( u7 _% G, A5 G {
( l% P* f& ?- p9 Z1 u irok=1; //接收完成/ v0 H- s6 T1 A
i=0;, C) d- \1 m& s8 K1 l, ~
}
5 V' ], q$ Z) y* D) L" { }& K7 k2 N( O" ?6 P: f
else$ Q$ m6 G3 D5 ~. U" M9 D, Y% y% L+ u4 F
{7 c* c0 |4 H: U2 _
irtime=0;9 }! I7 x2 u$ B6 ^1 L0 A! B5 y
startflag=1;( g) _+ z5 r3 h% O6 P; v( }
}4 T6 G" [+ N0 A- T& y3 g/ A
}4 X7 p% [5 [+ \( y8 O% J
/*------------------------------------------------
, g. m: r5 s; A) I. O' T1 x- K( R' M 键值处理
; M j* o D. i* g; |* Q------------------------------------------------*/
9 k7 h' F- \! H% y$ k* k* A4 Q. w& R" _3 e
void Ir_work(void)//红外键值散转程序
% {, }- H* `' S4 ^% b{
* p8 X6 F: p; g" z switch(IRcord[2])//判断第三个数码值
6 t+ P$ ?# }' v1 L {/ C+ f* u9 V% `
case 0x0c:num=1;break;//1 显示相应的按键值! |# X8 X; G, b! @
case 0x18:num=2 WM++;if(PWM==11){PWM=0;};break;//2
# |9 e! E" U! v6 r( k1 X case 0x5e:num=3;break;//3 x$ i0 x1 N+ Q/ m. P) t
case 0x08:num=4;break;//4: V$ s. M) ?8 ^0 a* g/ g1 C% Q
case 0x1c:num=5;break;//5
* M. T0 J2 q/ E3 @" ]( z case 0x5a:num=6;break;//6
{& O3 \5 e6 q1 O4 O: [ case 0x42:num=7;break;//7
: e, m, l8 ^3 O5 w5 R case 0x52:num=8 WM--;if(PWM==-1){PWM=10;};break;//8 {' i6 A. }, Y% H9 Q3 }
case 0x4a:num=9;break;//9" T; Q/ ?6 m L( H( k! L
default:break;
) B5 S4 K1 d0 j1 E: i- g+ h }
- D( \( {# e* t: Z4 z7 o+ j irpro_ok=0;//处理完成标志0 ~9 \( J2 E$ S. R2 t' r
}, R2 @ v/ C( n( W
/*------------------------------------------------; [3 m& o4 n' _0 v" P
红外码值处理
5 [/ o' b. G+ |& @' L! c) b4 ~------------------------------------------------*/
$ j7 h, P( Q7 U* Svoid Ircordpro(void)//红外码值处理函数
& k/ {- s1 i, E/ [{
9 I4 B1 c6 R' [, e unsigned char i, j, k;
3 o4 n$ w3 G* O6 F# S' b. G9 q) A unsigned char cord,value;
/ h/ ]3 U/ q- [: D3 n' k* K0 ^5 K, ^. ]
k=1;3 _2 J: f* ^) V2 G2 Z4 |
for(i=0;i<4;i++) //处理4个字节
- L0 S# v$ z; ]% D {
9 p, m4 D+ k9 [3 L$ {# q, r for(j=1;j<=8;j++) //处理1个字节8位
& l1 ^: H) C9 k: E {
1 Y" M5 a: Z2 m% W8 ` cord=irdata[k];
1 b" u) L% ], T, ]" j if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差! a2 k2 F7 @# M7 V/ ^) L% g( B
if(j<8)
) Z4 d$ k: ~+ M. }0 W& y {! c( p! ~8 R- C3 L
value>>=1;
' Z8 u. b! r. E( F( P% S, P6 n }, p5 m. }8 T5 t. I
k++;
+ {( e9 x: N& o" Y* A% W9 I- u } D; c3 e7 d% R0 a( z
IRcord[i]=value;/ E6 p# [( e" \4 U8 N+ e2 M
value=0; / K/ C% ~/ v. ?( \8 {0 m
} 5 a& |: S9 ~* P
irpro_ok=1; //处理完毕标志位置15 G/ {/ w3 S, b
}
9 R( t- E2 ]5 Z4 l. v V
& J9 M9 O$ Y* q0 \) N- C/*------------------------------------------------
' @8 \3 ~8 _/ V! j. n- G) c4 w 主函数+ r* [1 w' {! P% z8 [# M
------------------------------------------------*/
2 ~. k$ w) ~8 D5 Z; L+ }* {
; b: k/ Q% D n5 P- ivoid main()
$ n- _/ i0 }* W- Z* h5 |{, [4 C. P; b1 I1 Z2 M& x2 E0 F
cmg88(); //关数码管1 a7 I* r% N! h" `4 G
lcd_init(); //初始化$ N. q5 U7 I, R+ i" a7 T) n+ a
3 O9 l, u$ j( L( C! L
EX0init();
& v5 L( y9 f* s, s6 I TIM0init();4 d. Q V' p, Q! R; x0 F" j0 }
DisplayListChar(1,0," ");
/ e: n( f' g. x: _* D DisplayListChar(2,1,"num=");# W' \: e& Y* ^/ S7 ^9 U
DisplayListChar(2,1,"PWM=");
1 W- l( F3 ]) L; h( T8 z0 d. |8 N, W/ C c! g
while(1) a% f3 \$ p) n, s
{
( J: K! \% B8 X6 S" J6 Y DisplayOneChar(13,1,ASCII[PWM/10]); DisplayOneChar(14,1,ASCII[PWM%10]);. \: g8 ^- {1 S; y5 j
' N6 d& B9 a8 ]" ~
if(irok==1)
) ~/ V+ g& Q7 b# q& [# R5 R) c6 j {
9 w1 i8 n# E9 f! ]9 J8 X Ircordpro();* b! _5 r% a) `5 w) \8 w
irok=0;7 G3 R- t4 b( i
}
" c) g9 V2 d C5 r( i if(irpro_ok==1) C0 I$ p% S% `7 Y" L
{
/ P/ R$ {' K y Ir_work();
' U4 D+ v6 a( u }6 k* F/ P7 ~$ t$ E/ ^# Q$ s
}( a/ V* Q. v! g# ?: [
}! Q6 @9 H5 C* t5 k& n) [& t1 [, [& B
0 L& \1 w+ w' O# g$ F. j$ m |
|