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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-1 16:08 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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