找回密码
 注册
关于网站域名变更的通知
查看: 755|回复: 3
打印 上一主题 下一主题

红外遥控按键PWM控制小车前进后退

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-9 07:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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=2WM++;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=8WM--;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

该用户从未签到

2#
发表于 2018-11-9 18:39 | 只看该作者
kkkkkkkkkkk
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-19 21:19 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表