|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控按键PWM控制小车前进后退, ~9 C6 M+ |6 h* p6 U8 ]
/*-----------------------------------------------* b8 `' x& C% R" T$ B
名称:遥控器红外解码液晶显示
' Y& n. f2 u1 m0 W' G6 \% M 内容:按配套遥控器上1-9会在液晶上显示
2 ~) L( d1 K3 I8 ]------------------------------------------------*/
. e( k5 }& o' h, ]+ }: B( V#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义& q1 ~# K+ G- h3 J
#include "lcd1602.h"# N/ o& ]' t' g) o, [
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换. A& [0 Y7 F' U, n& K1 l
0 _9 K/ \8 a4 @$ ?sbit IR=P3^2; //红外接口标志
5 Z2 [8 S1 V, M6 g' I$ b+ u8 J. _* J. w! U( B: u
sbit DU = P2^6;
# ~5 T4 O* e+ P: z* Usbit WE = P2^7; # G6 {# B6 a5 B6 g1 w
, ^( u1 Q. @7 h! ^4 b X7 E/ e
/*------------------------------------------------
, m( w; X9 g% F, }2 g8 D 全局变量声明; W7 X1 l+ M5 p5 L% \4 [! @
------------------------------------------------*/
) I" Z5 I8 K+ _0 uuchar irtime;//红外用全局变量
* F, {0 n% l8 t( ~uchar num; //遥控器按键
4 r7 G/ C0 }9 D# a- Q/ @4 X( suchar PWM,count,kk,a;: J9 s/ m9 ~. |
sbit LED=P1^3;. S/ x& ], G; @
bit irpro_ok,irok;9 S" s9 h& `& n0 ?2 ]- L" n
uchar code ASCII[] = "0123456789";' S, t, U9 f5 K# s f; x; \7 g
uchar IRcord[4];
9 u9 c A3 k4 Zuchar irdata[33];. ?2 ?( |1 m3 w# f7 s2 n8 `: q! f% P
/ l# M: `# D. k) Q* a: h
void cmg88()//关数码管
0 c8 k- L/ D8 M% f8 X; f{& E7 Q5 S7 r; N; J0 O( i" g
DU=1; 3 `1 g1 S2 Z! D4 X
P0=0X00;
- U' @$ i* c" R. v DU=0;+ h5 e4 Q( W. X# G1 }
}' l# D9 E: R4 Q
/*------------------------------------------------
" u1 U& {2 G$ P$ Z 函数声明
7 B6 O7 f! p4 S$ L4 O------------------------------------------------*/7 B: q) X( L0 w3 r2 K! S
~. s& }6 w! k7 s1 j; E6 bvoid Ir_work(void);/ U* B! W2 b: l7 d2 B+ p" I% `
void Ircordpro(void);
' L/ F) s/ ~# Z! |3 O1 D7 F
3 h$ r0 K4 r* F4 L2 M5 W# N. C% n/*------------------------------------------------' C7 |& h# H6 w3 {' G, O: i' z% ? k
定时器0初始化1 d8 N0 y5 l' H( Y6 e+ a1 c1 C' `
------------------------------------------------*/
" `6 J& h5 n% S z( G9 Fvoid TIM0init(void)//定时器0初始化
( N8 \7 n2 h/ K9 j% O{
: \* I W4 i4 u
8 t( n* h( L0 B$ o# j TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
. t& q! l3 @8 h9 ]- }8 T TH0=0x00; //重载值# `2 P6 S: Z0 R- Q% ?6 _9 P
TL0=0x00; //初始化值
6 D |4 Y8 y/ |9 i1 @- A7 T. o ET0=1; //开中断
. p" j# {. u C7 s O" O- N7 j TR0=1; 7 s2 y: ^- p% h) D, h# X# ^2 R
}9 J4 o, \; J6 }) L) u
/*------------------------------------------------
% V* r& D5 M F& Z) |+ U 外部中断0初始化+ B9 a4 k K; M+ e1 h' e
------------------------------------------------*/5 ]' Q7 R4 Q8 g8 D" b
void EX0init(void)
% b: _$ e5 A, b. M{# Q5 v& B4 P6 j9 ?3 H; I
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)' M' c9 P- I" U. s" U0 Y
EX0 = 1; //使能外部中断+ S E" f8 ^; O: n
EA = 1; //开总中断3 r4 r9 T0 I5 x# ]9 S8 v* U6 t9 p
}
& B) z+ O; G8 v! T q$ F0 p/*------------------------------------------------
: V4 Q7 ~8 _; u" o& g6 p6 z+ L 定时器0中断处理" I P* Q1 M" V: c* u6 {
------------------------------------------------*/. M3 C7 Q3 v/ ?! U" o
, ^: e' t: z) j3 Z& M V( qvoid tim0_isr (void) interrupt 1 using 1* }5 B$ x5 x& q
{- c, O4 q2 Z) ?9 E( Y% Y2 }
irtime++; //用于计数2个下降沿之( I4 T3 K' O [0 @7 f0 D ^
) e+ r8 R9 ^& G& h& [0 c5 F' [* \ count++;7 ^$ _0 e C5 K& f
if(count==10)
# \- d. h2 @4 _+ U3 d" F {4 m9 V+ F/ }+ O$ X' t/ n
count=0;: c+ Q# s9 P/ W0 }
}! a. ~+ k% G: T" H
if(count< WM)
: |* x" T! }/ |" b, v {8 W! x r7 O) |" U. f
LED=0;& b7 i4 e) a% H
}
: E: d! u; S1 ` else LED=1;9 w4 _ V2 ^/ `4 a5 y
}
" D' M( T' s& f6 I% H8 c8 R* j5 ~- l/*------------------------------------------------: `/ M( p+ f; U+ Z" N
外部中断0中断处理
. J+ E) o4 x' U' t8 X1 \------------------------------------------------*/
8 E* m0 U/ y& q5 z1 v7 zvoid EX0_ISR (void) interrupt 0 //外部中断0服务函数
- t0 M9 x' A- p `: S% K7 g{
5 {- M& P7 A* P" c; p3 `; ~ static uchar i; //接收红外信号处理 k4 H7 L( u; N
static bit startflag; //是否开始处理标志位* j- A1 N' E1 x" @8 K4 z+ z& i
2 d3 R- A. q# L if(startflag) . S, L K& e6 ^3 ]
{" N% @8 W w1 f9 Y
if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms
5 y5 ~) I8 v3 m* a% i8 }
" w; S& \8 s8 K% P+ L irdata[i]=irtime; //存储每个电平的持续时间,用于以后判断是0还是19 E9 Q2 T. m0 Z6 l d8 n
irtime=0;
) o: m5 V; N6 G# G# D8 N( t; p) J i++;
$ a8 T- j% d$ B& \8 q if(i==33)
( k& u0 F; g1 V {9 p; P& D0 t2 t: e M5 Z# c& k+ J
irok=1; //接收完成- J4 n" G! p0 d2 l Y+ s1 o: V, ?
i=0;) y Q9 g9 n! k. H) l- A% _5 b0 O
}7 c! u3 t f. u/ j! [
}4 g6 G" w" m5 r- o! A6 {5 @$ j# z$ b
else
k& i# ^4 S/ ]- T- r$ z5 ]: B {
/ f6 b* k; Z1 X9 D c7 s ^ irtime=0;
* V6 _. a4 r9 E4 O( @/ X startflag=1;
+ a2 f9 | o4 B: S3 O }6 o$ D! C, X1 ^4 A
}6 w9 t j5 O, [+ R
/*------------------------------------------------0 X. g' z* R+ g$ t' z' p8 p& S& e
键值处理& C8 {5 P W0 e9 ~4 I) P
------------------------------------------------*/
" f) P) J1 g0 {3 C; X% V0 c7 M9 @) B, I8 K5 E: r- O
void Ir_work(void)//红外键值散转程序
! a/ T% U, h' q: H) A- e1 t{) O6 G" u9 o5 v2 j0 ^+ B9 a H
switch(IRcord[2])//判断第三个数码值
$ M4 K7 ~, g4 Z; f {+ D$ Y ^+ T, X
case 0x0c:num=1;break;//1 显示相应的按键值
' q0 L5 C" D0 K! `3 R% Y3 Q- [4 W; f case 0x18:num=2 WM++;if(PWM==11){PWM=0;};break;//2
0 O# Q: ~1 }; Z$ Q case 0x5e:num=3;break;//36 M% J% f7 U( g9 n% {5 o4 {
case 0x08:num=4;break;//4
; R6 W l% l$ B& }8 L i case 0x1c:num=5;break;//5# K; r! |$ z9 ^. d+ R0 F3 N
case 0x5a:num=6;break;//6" M* U) f7 ^/ p' X O
case 0x42:num=7;break;//72 o, e% o8 Q9 s* v6 f
case 0x52:num=8 WM--;if(PWM==-1){PWM=10;};break;//8
3 ?) j* U" j$ T, v case 0x4a:num=9;break;//94 T& ?* H* L9 G8 D/ e$ @
default:break;% L w# z& t: r
}1 c; z! ]' i r* _' ], w
irpro_ok=0;//处理完成标志- y* a5 J. T$ J3 z; K4 O% e! S
}1 v- u& P B r& z" M' L
/*------------------------------------------------
8 S- S7 j3 @$ u1 `* P7 } 红外码值处理4 U1 _ g; M! g/ D
------------------------------------------------*/
% z6 v! x; [4 u- N- P1 N1 E1 Dvoid Ircordpro(void)//红外码值处理函数& p4 O: |9 x( \% C* V& t
{
8 _3 a" T) F3 y+ M1 E unsigned char i, j, k;0 c$ f A& T9 K
unsigned char cord,value;
2 ^1 O4 D, g" U* n
- R0 R/ O2 M: T1 G0 ]" z, V( f5 D$ |: y k=1;; y5 g: l. M+ \7 A$ r5 i
for(i=0;i<4;i++) //处理4个字节
6 B4 F9 p, \7 E! n% ]6 x {! D: b8 ]0 b; E# m) a Y
for(j=1;j<=8;j++) //处理1个字节8位5 Q+ T$ M) n& |
{
; v" u E9 P; c# [9 O cord=irdata[k];' {9 [. e4 Q% T, e# v( i3 l4 C
if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差) R9 x7 }8 S7 \ Q% V$ ~
if(j<8)4 j8 p8 w% `! t+ u
{- R, h5 ?# E! V; {# @6 b! e' V
value>>=1;8 Z! [/ D& p6 k; O) {
}/ z3 ^1 k3 h' F) F) Q7 C
k++;
k% h# C# r3 O/ B }
) f$ x# U) D' P! y6 s' H0 R1 V IRcord[i]=value;
& S' ^ d) K: k9 ^ G$ n6 I value=0;
+ V! B/ Y0 D" V+ A } $ K1 e3 M* o Y: F& H
irpro_ok=1; //处理完毕标志位置16 [2 t' O# ?$ C1 O+ J
}
! M. I$ h P+ A! w$ W- v
) e' _% e, r" h/*------------------------------------------------
( a# B& E& D2 Q- \0 r9 b& O 主函数9 d* k8 A D5 v" z4 Q
------------------------------------------------*/
* x" V* S L1 b( t" v' P
9 t$ ?! m% S$ \# ]void main() v8 s- Z! S! Q
{7 i9 G# g( v# s6 ]7 P# A
cmg88(); //关数码管, v- M2 M- ]6 U! n7 V) @- h* w% i
lcd_init(); //初始化- B8 z9 W& a3 ^ S& F
2 S! R: L9 k4 C; @ EX0init();
' o: s2 [! ~# Z4 R, g TIM0init();
+ }6 `- s$ B t" m: _) z& f DisplayListChar(1,0," ");
- f$ P L0 N+ I3 K) s0 I DisplayListChar(2,1,"num=");4 G2 X H8 s4 k
DisplayListChar(2,1,"PWM=");
4 q, K( ^* Y' ?! {: [2 Q* m
2 J- I' K* U% g* E, ?: X: \9 [ while(1)# y4 \) R7 C: R4 n
{
$ ^' d0 w: {8 f* z% b- k DisplayOneChar(13,1,ASCII[PWM/10]); DisplayOneChar(14,1,ASCII[PWM%10]);; c- @+ N: j2 H# j0 Y2 ?+ q# K
( y( i2 p3 h) D) A M if(irok==1)( {4 a' V7 d# N- @8 }, P$ s) M
{7 U2 j9 ]; T( [1 U9 L' o
Ircordpro();0 C& K" r+ \/ Z1 e5 a9 ^6 T& X) e1 t
irok=0;
7 V% V. Y$ C% X7 Y; h }
3 c3 d0 `! V$ A& [1 g if(irpro_ok==1)
& l3 a& |9 W/ r* k8 N {$ ?9 W, @5 \! }
Ir_work();
: C5 v9 x1 R% g: D ]7 | }
% T. j* C0 y* J0 A3 ~0 l }
/ V0 Y9 l* P& B# C) T! w}
2 f0 u: d$ n9 P- P& N/ t" Q, G3 f$ c$ h; k: ?0 F/ ^
|
|