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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-9 15:47 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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