|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控按键PWM控制小车前进后退3 ?( v8 C0 f8 x/ y" G
/*-----------------------------------------------5 z. Y/ n: r3 V1 E* r
名称:遥控器红外解码液晶显示6 v5 `9 g# F7 F/ f
内容:按配套遥控器上1-9会在液晶上显示
- R q1 t) D! n1 P. R------------------------------------------------*/
2 ~' T' N, F% y' C! i4 ?( C: K#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
, O1 f/ C. ?' }3 x0 x5 x#include "lcd1602.h"! X: w8 z6 s. C9 A5 [* @
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换! p+ i4 a% F1 W9 P" {3 y
! b/ H) b. u; h' }% x/ d" G/ hsbit IR=P3^2; //红外接口标志
( F; l, E @. `- w% Z. x' _ ^& v: S" x
sbit DU = P2^6;
; |3 i# G! U R! L- bsbit WE = P2^7; 2 `- P$ p5 y! s& z# N# r# V
5 ~6 f" R( }. n
/*------------------------------------------------& @8 F$ P8 U0 [3 w3 u" P( z4 H
全局变量声明# Y6 ^) o# U, o; @; M2 ?) G
------------------------------------------------*/ - K+ i9 P U, w( j
uchar irtime;//红外用全局变量( z3 c' ? H9 }& ]9 |2 ?
uchar num; //遥控器按键
" V3 t4 V4 M$ Y) m, Buchar PWM,count,kk,a;
9 d* l( z) @& P9 x F4 _sbit LED=P1^3;
" s% k& I1 D* y( B! E/ _: Y% fbit irpro_ok,irok;
) e& ^4 n6 ?( n" M3 vuchar code ASCII[] = "0123456789";
" t: a5 R; O9 g) s/ G) E* iuchar IRcord[4];. t& \& B0 m" d; `$ b" V% n
uchar irdata[33];
' K D& \3 J/ _# b' h
* x1 D& x; f3 Z+ @( d6 y- Bvoid cmg88()//关数码管4 ?, S. @2 M0 U9 A3 R9 V4 S% i
{0 N% ?" w& ]/ b. ^3 d% m
DU=1; ; K8 C" N5 O& ]$ ^& V4 O
P0=0X00;! m2 ~- M' T3 ~/ B
DU=0;
6 S0 J/ h# `+ X' ]' ~" K}1 |* g; s h6 Z( E# B ~0 ~
/*------------------------------------------------
, h# V- X/ k& u/ J8 {% O 函数声明
* S5 F$ L* ?5 T* y------------------------------------------------*/' m0 V7 Q" i6 Z& {! b7 w* h! s: q% F
+ z Q$ Y% E! ~9 A+ n4 Lvoid Ir_work(void);
# X' A1 e6 \% V9 J6 W* r' ovoid Ircordpro(void);
% O( G- ^) h) V" `0 A" H( F" s, {& D$ i# h$ G5 O4 \
/*------------------------------------------------1 f# F) H. `* f
定时器0初始化4 p+ f( x9 \' o% A0 q2 S! `: x
------------------------------------------------*/
9 r8 h4 v) s4 L3 [3 H- nvoid TIM0init(void)//定时器0初始化$ b K& I9 M) E9 H/ {
{7 C8 l! X) Z. D* ~/ V" x- l
! N* R: `7 |" c& c
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值. e6 J5 [& w+ B! N9 R0 p+ @# z
TH0=0x00; //重载值
6 a, J6 W* Q7 r9 M+ }, D3 h TL0=0x00; //初始化值 A4 n& X5 \- ^9 M
ET0=1; //开中断
% @0 D" U6 w+ x3 {6 V: d TR0=1; % Y6 r9 Z% i5 H: c+ G
}
" A0 x" q0 S5 ^! |$ ^( T' p/*------------------------------------------------
3 h( B+ k( q0 O/ ~5 ~9 Y5 m 外部中断0初始化
; \/ n3 J6 o. F4 \------------------------------------------------*/4 h4 ^3 X3 e3 e# E2 x. g" b1 H! F
void EX0init(void); M& r0 R8 n0 Q' X6 J3 |# a& _
{! @& g* c9 i3 }* Z/ P9 h7 u
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)5 G' [' i1 N: d4 C' L! I
EX0 = 1; //使能外部中断+ ?7 n, U( m. d# s- [9 b
EA = 1; //开总中断
6 O8 y9 S! t: E) E( U- a}& _+ o& e5 a- h" }# k9 C. a
/*------------------------------------------------9 V8 o Z/ i# k* S) i
定时器0中断处理
( a! B3 t; ?7 O& E, q------------------------------------------------*/
: {0 g+ M4 l, P2 D5 y5 n5 o) Y1 @% Y
void tim0_isr (void) interrupt 1 using 19 B8 s* a* R! O
{9 y& D/ \# L: w3 p; [! x8 C2 p
irtime++; //用于计数2个下降沿之( u! y9 r9 E3 J7 f
' V; }, w4 k( d6 n4 e
count++;
6 Z' z3 U/ }% {! @) q4 o) |1 R if(count==10)
6 w9 o w) ^ M2 p# S5 p2 f% }* | {
+ ?4 [% G$ E; ^! I ~9 Q) `8 c7 c count=0;2 s2 i& O8 G' W, R* @8 |
}; R# ~2 l L$ a$ S, _
if(count< WM)( y0 x0 | J; u$ g+ f$ C
{0 m% _4 f. H# t1 C
LED=0;( N& c, X# c! l" d( G! B4 K
}
8 }9 F$ g7 g) ~' E, F' j: { else LED=1;6 y# G9 r1 K' Q1 c' A3 ?
}( b% d' m9 r2 e9 }* o
/*------------------------------------------------
; ^: Z0 h- B3 O, U 外部中断0中断处理
; G0 c& T+ l. J1 F; p* |------------------------------------------------*/& i( a7 u4 A3 ~0 h* ]" k- Z
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
" T( v N) S! }1 q1 G7 C# d{
9 c4 n. O. Q! b+ x" v static uchar i; //接收红外信号处理" O& ~) k1 `7 `( ~
static bit startflag; //是否开始处理标志位, a" d+ y! q+ V4 u( j
- T |: \8 ^% d, v; M# ~" ]3 O
if(startflag) ) m' a D$ t, ~3 S" E w; N! J7 B) X
{
0 b8 |" |' H& Z! d5 D: O" Y if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms
6 e7 C8 j3 j' d" a. ~ V* o' {# P. q1 D* x
irdata[i]=irtime; //存储每个电平的持续时间,用于以后判断是0还是1
. M7 v: H7 t+ w' U9 R: A irtime=0;- G n7 P$ A2 P, N' O) h& m) ]" v
i++;
% m6 Z- \( r8 l. u t- l B if(i==33)0 t. I, g( _% A6 V, H. |4 a: q( C
{+ u! C- z l) x% D0 T5 L
irok=1; //接收完成' p' \6 ? ~: E# n# l$ C! M
i=0;* M* V! P2 z: i, a E) [4 Z2 i5 Y3 G
}
0 ^8 l- r% D6 j, R }
G. s4 {/ n$ ?% U else3 b9 T3 ?8 F# }( b) A$ ?5 o, q
{
2 }4 F1 h {1 l& J" n) V8 ] irtime=0;
! k. K# K0 O! y* L startflag=1;! s% P0 x Q/ W9 R* V- R* i( a! N
}' \* M F4 `& s% m3 Z8 O
}7 B1 Q9 H# y+ K( ?- s
/*------------------------------------------------
+ V5 f, N& j, y) N0 q. U 键值处理
+ d9 P8 n* t$ E------------------------------------------------*/
$ ?2 p7 T3 s% | i$ ~9 Q
% i) ~8 f% @- i0 M+ D R! a6 ]- v8 f3 kvoid Ir_work(void)//红外键值散转程序
" b5 M: E% h# Q{
5 e- x5 `" e' R; `7 i# d9 p switch(IRcord[2])//判断第三个数码值' L8 R% z6 H! w0 }1 \% R
{
0 M& j0 q5 }1 ?6 e. ^" S1 i case 0x0c:num=1;break;//1 显示相应的按键值
2 f, l/ B! G, P) ~; t case 0x18:num=2 WM++;if(PWM==11){PWM=0;};break;//2
" d5 I' @+ F3 d- S8 t' ` case 0x5e:num=3;break;//3) } I) ?9 c2 c! u9 l2 x4 y2 C1 B
case 0x08:num=4;break;//4
; w; ~5 a2 Y; l/ p8 s8 V; S case 0x1c:num=5;break;//5" Z; w2 c+ v7 w
case 0x5a:num=6;break;//6& w+ _7 @0 r" B5 V. B
case 0x42:num=7;break;//7# ?" M1 B0 N/ d5 v
case 0x52:num=8 WM--;if(PWM==-1){PWM=10;};break;//8
7 \( E2 k+ M) o2 ]4 k' i case 0x4a:num=9;break;//9 {/ j; `- L n; _) e' }
default:break;
. w) D0 x1 T( P( u }7 C$ V$ N9 d# k4 Z9 p( v3 o8 p
irpro_ok=0;//处理完成标志3 E* a' r3 z) ? W. ~! x. E
}
( F# V7 H& O+ b9 z; m/ e/*------------------------------------------------
, L: [4 x: W$ ~& q 红外码值处理' ~* e4 Q7 a. @, u' r$ _
------------------------------------------------*/
/ E: x& J$ ?( X& Y' `void Ircordpro(void)//红外码值处理函数
" ^! Q% W, B5 J J{
Y$ p, I1 H0 ~& f unsigned char i, j, k;
2 z4 {; J* G8 M6 T4 k& V2 Y unsigned char cord,value;
0 z: h( k7 }, S/ b% I6 ^9 S% x: W1 [# _: O4 I. x
k=1;
. |+ _4 E d& B3 Z for(i=0;i<4;i++) //处理4个字节0 u4 H& a z% k x. {. A
{
. m4 B! R0 W) ]! U8 ~* x; U% ` for(j=1;j<=8;j++) //处理1个字节8位
3 I7 j, x. k& I5 W. I {
% A7 J. P" T( ~, Z8 D# \) G4 { cord=irdata[k];
/ ?+ X v) r8 H/ X: g! m& r* [* C if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
9 F6 h: g! r& F; C2 L' z* P* y5 y if(j<8)
7 T/ ~( t! `/ D! C {: ]- [2 K; Q8 U5 B" Q
value>>=1;
2 x# z- T' f2 E+ b }. h5 f9 s) g; N: k* J& W
k++;
, h6 o$ C! {: J) C$ S( a }& \0 h! Q, ^ W: B0 `9 A6 F
IRcord[i]=value;3 x2 C# p$ H0 L1 S/ I, I/ B6 ]
value=0; " ~+ B3 p9 I- B$ m
} % {" |0 x/ \' ^ P" Z, E) \
irpro_ok=1; //处理完毕标志位置1
8 e3 I1 Y0 c- s* [* k) _, o3 p}
# X! O6 }3 A1 D
+ d& n: L# b/ T# u/*------------------------------------------------
$ f4 G# f/ C* F: L% |. L 主函数" t! p2 ?( x* c8 V6 v1 m* M
------------------------------------------------*/
( e! w3 Z8 E0 n) J# R/ N! C1 y
* I: m. h: f j, N7 v) \void main()! E" O- e" r, _9 v4 H( m1 {, A
{
7 b2 D5 e& ^6 j3 p$ i) ^! R* e cmg88(); //关数码管% P9 ]7 s& V3 M# X2 G$ n, U4 [
lcd_init(); //初始化5 p3 M4 _; o% r" F6 c
% [4 g4 V" o2 o5 N0 I9 n
EX0init();- e- j, Z. G5 W( |3 K
TIM0init();
) b4 {' G8 z) z) c" V- b# S/ ?7 Q DisplayListChar(1,0," ");
- l! Z1 I2 _( c9 Y4 _0 _0 N DisplayListChar(2,1,"num=");; @8 w7 n4 m$ b' `1 F' z$ T' o; w
DisplayListChar(2,1,"PWM="); u! w1 D* ?! J% b5 e% N5 r
! a, {) _5 b {4 i S4 @
while(1)
. d. ]( P8 T; K( J' E* C {
9 ~5 R1 Z& o8 j6 ?; a2 o! X+ x DisplayOneChar(13,1,ASCII[PWM/10]); DisplayOneChar(14,1,ASCII[PWM%10]);
" Y$ i: u2 l5 U6 B( Q& d: R8 p2 [8 R$ f
if(irok==1)
5 s8 o$ a8 u3 D" A {
; w; V5 P% `2 x6 F Ircordpro();
P$ H% ~9 V/ T8 e- j irok=0; G5 Y! S$ W* i6 R
}! g" ?- y1 Y0 B) k
if(irpro_ok==1)
* O2 O; h1 l2 O {
1 ]9 F# S/ n( w3 u+ |" q. J Ir_work();
0 Q$ f2 @/ j4 X: O4 E1 G- ]0 y }
$ w7 e, Q0 \, v5 J1 I5 f }8 `9 r9 e: O) u* B2 C2 J; y
}
; E) K8 S M$ m& z& d. j' \& G4 l9 R; X+ h) ^
|
|