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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
红外遥控按键PWM控制小车前进后退+ c1 o( ?+ s8 d& [$ A4 w
/*-----------------------------------------------
4 v. ?; H; J: X4 B! R+ R) e# u  名称:遥控器红外解码液晶显示4 o( n4 C, @% N  i4 z
  内容:按配套遥控器上1-9会在液晶上显示
, K2 |/ G% w1 x6 T) Q: {! [------------------------------------------------*/! K" d0 l$ u# J3 T+ a7 `# M; {
#include<reg51.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义# G0 B  T# ?, w; \% h- {) v
#include "lcd1602.h"
/ Y  J0 R9 ~2 q( B#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换9 e/ n6 S; `* [) d) F$ I" Y

3 O3 a6 O- i4 _" L7 h' ?  ^) Isbit IR=P3^2;  //红外接口标志4 _5 \3 q: k; o

3 u8 _( f( |4 b3 t3 ^sbit DU = P2^6;
. l" T/ m, J) A; c7 S5 C' Fsbit WE = P2^7;        4 k; ?5 ^$ {5 J! ~, x/ ~; |
$ V2 R6 U7 p/ g6 `( A" o' F1 f6 R
/*------------------------------------------------+ O  \5 _' j" C: K3 N8 a
                全局变量声明
* o6 b) M7 C7 t------------------------------------------------*/
' p6 V/ V7 d. F* t% p/ Huchar  irtime;//红外用全局变量* A( q9 {( L: P
uchar  num;   //遥控器按键& P; p! `! K3 z
uchar PWM,count,kk,a;
$ E! N  o0 M2 p  i6 jsbit LED=P1^3;
: @7 z. i8 t' c. g. j; C# |bit irpro_ok,irok;
& M7 E6 b8 P# o* N) O) Buchar code ASCII[] = "0123456789";
6 C1 c- o; g) wuchar IRcord[4];
/ n& I; _$ U! quchar irdata[33];
1 v% u- F" x* Z! a3 n1 j$ G& q" S  S
void cmg88()//关数码管
! c/ k2 Q0 p/ |' P5 J{; d* u/ h: n. v& j) g1 l
        DU=1;  3 Y  }* o' W" t& B2 D+ A
        P0=0X00;
. ]8 N$ t% \1 w4 F' z& c8 X" u- S- x0 ?3 v        DU=0;
  `/ r% u" r2 `& f6 J1 h+ h. _}, s0 Z* Q4 W% F0 P
/*------------------------------------------------
- f6 B) _% G. O- ?" q) @                  函数声明4 u% |) o  x* u4 z
------------------------------------------------*/) v0 Y- G. ?6 H; i/ ~$ N; }
7 P  r- k- b1 G. t# T
void Ir_work(void);
. N* K0 o# ^9 L( U+ j4 Tvoid Ircordpro(void);. W7 s3 }3 k, x8 S. T! U8 [0 p% I  ]( S
& ?( z6 q) s/ L
/*------------------------------------------------, I1 Z  q' ^% l) T( N2 x  s
                定时器0初始化
& g4 r9 G: x! y0 G$ U: Z------------------------------------------------*/4 g2 j1 i% m$ _3 f1 B
void TIM0init(void)//定时器0初始化2 ^9 C) o% u6 z4 \
{
5 Z' |. W; P( q8 I- V" b( W
3 V7 n5 @3 `: A0 v8 T6 D" J3 a  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值  J6 [. a3 E+ e. ]2 M9 q% z
  TH0=0x00; //重载值  M2 ^) Y3 {1 ?8 `
  TL0=0x00; //初始化值( E1 T$ g( D, }# Z. w/ Y
  ET0=1;    //开中断7 f1 H% p# U9 Z& v  U- B& f" B
  TR0=1;   
9 ?% }; I0 E5 k2 {0 {8 Q4 J7 B}
5 }8 e9 K+ @1 ^' a: q( Q/*------------------------------------------------1 f: j; [8 ^1 _4 t
                  外部中断0初始化
5 W9 Y3 p+ y2 }- }$ B& q. z9 K. @------------------------------------------------*// ]  M3 U% l- [9 D0 C7 F  _* V
void EX0init(void)
" ^4 X+ j' k5 l{
, w, n' ^! R( r; `! y) F: G IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)0 \+ ~" P! n( u8 [
EX0 = 1;   //使能外部中断9 q# n7 @8 E( \, x
EA = 1;    //开总中断$ `* \/ M1 V) N
}% @; G  f  s+ X" d
/*------------------------------------------------
2 E6 {; o5 L' U( g                  定时器0中断处理
. v* J3 d8 G* p: F# {------------------------------------------------*/- ]+ c, p2 u' C+ q. h2 J

+ U9 x" `' o- _% s7 mvoid tim0_isr (void) interrupt 1 using 1& T( o7 h! s  D; V0 P
{
! O5 Y+ @% c' _" J  irtime++;  //用于计数2个下降沿之
/ K4 o# }; u$ w- N* u% y: V' H2 v4 C) b+ O0 M* |& q+ S3 S
        count++;# o# F" [$ y: Y- B5 G9 v
        if(count==10)+ H& }& }( i/ X
        {9 U0 [: x! v, _; D9 V
                count=0;; e% |3 R1 T! ]' t* r7 g# B
        }
4 u' x( H* u/ V* K* a        if(count<WM); x1 S; ]7 Q" f& u; E* @: q
        {
8 j+ H2 X7 }: @) Q                LED=0;0 c* a- V" W' G4 p4 r/ T+ c
        }
, O! x) P" A7 l  U/ S# F        else LED=1;
! M2 B& K, r4 z& S% j* x7 m! q}
$ n! i0 e3 W9 A6 q# _+ u' q/*------------------------------------------------
! V* s+ v2 w( g) Z& l* R! U. C                  外部中断0中断处理
" W" _  N% b" G4 l------------------------------------------------*/- W& k; w) j5 a* }5 c7 q, s
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
; d: [1 i8 I0 G( {- p+ y( x{9 e( ?' e( p0 Y& a- p0 C
  static uchar  i;             //接收红外信号处理
: D. B3 J; D% b+ x3 Y  static bit startflag;                //是否开始处理标志位7 Q8 D3 _+ ]' o6 e% e4 t9 z& _
. a& f  q. N: Z9 d$ u) x1 F8 k
        if(startflag)                         6 r) J: i. n' x* P! _
          {
$ `/ l% H1 A% |  H. x                if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms
1 S3 s0 v/ t" v+ q4 f
4 Y+ _* P3 o1 y% t, |! z) Q. M            irdata[i]=irtime;              //存储每个电平的持续时间,用于以后判断是0还是1
) g* c* N) F. {; Q& q6 Y% f. R. M            irtime=0;6 @7 y$ ~2 v  }. A& S
            i++;6 B4 [( N: \( i  e/ j
                   if(i==33)$ e& h3 Y6 t/ o( a. y3 q! s4 Q
            {# I: n2 j4 a  H8 d- P$ x/ H8 k
                        irok=1;                //接收完成1 S& c8 ^' m2 ]5 G+ f- Y7 O1 O* o8 z
                        i=0;5 K  ]+ [7 X7 ?% ?* N$ |6 m
                  }
1 }, @6 v1 |, x4 Z* |, b          }
  m% r  B: F9 \) D5 {* J  else
4 o  @( H  }4 H: c        {
2 E1 Q1 `" |$ k, E                irtime=0;; J& T' F: A/ O% S& |
                startflag=1;
' f8 Z4 ]2 z0 G! c" B6 E& j& V; D        }# a5 `" H7 z4 n& Z8 G2 f
}1 B9 K' @/ |3 c. B
/*------------------------------------------------7 n* W' m+ @4 I" {$ ^
                  键值处理
3 M7 _3 f2 b% ]0 T9 e1 w3 {, Q* I------------------------------------------------*/
% {6 S6 y" ~0 u* D8 v/ r7 J9 j+ p/ o2 @$ v
void Ir_work(void)//红外键值散转程序
- {  Z6 R/ r# R{6 j: v: O$ n( w- x/ S' ]; W
        switch(IRcord[2])//判断第三个数码值  f2 q! q! r* d
        {
1 B$ s9 d6 O$ i+ G& a% U                case 0x0c:num=1;break;//1 显示相应的按键值8 h: s! K1 M. F6 Q
                case 0x18:num=2WM++;if(PWM==11){PWM=0;};break;//2
% @- q/ Q/ d, c) G/ {, [                case 0x5e:num=3;break;//3
! X, y/ y' J! G2 G: r                case 0x08:num=4;break;//47 ]& p! L/ r9 D! D" l
                case 0x1c:num=5;break;//5. ~0 g7 {* S2 h1 n+ O6 f
                case 0x5a:num=6;break;//6
5 L4 R' z$ C) w% Y* b$ ^9 m6 w3 U                case 0x42:num=7;break;//7, F+ `0 P6 W7 C) J3 @: [( K. N* X
                case 0x52:num=8WM--;if(PWM==-1){PWM=10;};break;//82 I; s8 s# _8 N5 p. B: o
                case 0x4a:num=9;break;//9
9 s# ^( ^6 Q) f7 i                default:break;
0 b& R5 P% |# P1 E' ~, W) |9 `) Z/ V' q        }
* g9 v( {- m( r" \- V        irpro_ok=0;//处理完成标志
& V5 c7 s  d+ |& N. ?}5 Q3 O8 H; [/ e; O
/*------------------------------------------------2 s9 F0 G& j" `  h* L
                红外码值处理# d: A: K! q! T& T/ e
------------------------------------------------*/
9 b! Q* s+ w' v/ `% n. G, Cvoid Ircordpro(void)//红外码值处理函数3 g% \, p. ~  \0 }8 ~
{
7 p( j9 ?4 R1 X2 m  unsigned char i, j, k;
4 O6 C6 B! k, F/ L% I, L  unsigned char cord,value;
/ W' ?9 D( N" j( h/ O0 b3 E& f! m8 D2 e! O/ B
  k=1;
, k4 |+ L  j3 O1 M5 C- f$ s3 Z- ]  for(i=0;i<4;i++)      //处理4个字节1 @; g2 j, s. i* O; p4 h& P. ?
        {) M: B; ^  Y8 e, Y
                for(j=1;j<=8;j++)   //处理1个字节8位. }/ l* i5 z+ L% @5 b
                {
; ~# N' I: a) n- A                        cord=irdata[k];$ X9 [% L* D1 G& o2 [2 f3 v
                        if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
0 |1 D0 Q2 l+ v" ?9 f                        if(j<8)8 D( A$ }& X, B8 W
                        {
3 g! ^2 y- ?' ?8 O5 x. {* ^                                value>>=1;
  `* m& A, D/ X; q. ?/ e                        }) `. x8 _- i, ~( N
                        k++;" D- w& T2 l/ U( b) _
                }* E$ \4 t' c- s, G. K5 Z
                IRcord[i]=value;8 ^3 Y( p7 R2 O8 S6 I& @8 c  g
                value=0;     
4 ?; e. y- U) N, W* ]& o5 B        } 0 \. o" L5 H% s# s# d+ @( Z& R
        irpro_ok=1;              //处理完毕标志位置1
) f' y5 }, y, }  l1 d! N/ c}. |0 y* R. j' \& g0 p2 {# j
* c* K4 @. D4 V% R1 c
/*------------------------------------------------: ]+ ], O; X# W4 H. v
                    主函数. R0 |" E9 f1 S$ m7 [) b5 n
------------------------------------------------*/" c$ K- U+ E$ B/ F2 I4 o- b
% ]! M: P% t/ f$ J4 I
void main()6 \' _1 _, X6 S* v! A9 V4 x
{4 f4 j) Q, t1 I2 s/ k, a% @$ j
        cmg88();                                                                                                                                                //关数码管
2 B! M- h3 @, x/ Z# S5 F        lcd_init();                                                                                                                                                        //初始化! |' C4 Y( e1 e$ L) P

6 a1 e1 M/ \9 v. [         EX0init();
0 ]. Q+ p: f  G9 A8 m6 ]         TIM0init();
. n8 ~7 D  L  Q. O) K/ G         DisplayListChar(1,0,"   ");$ F1 p$ S) J+ m. z5 u
     DisplayListChar(2,1,"num=");
3 k. L" _% \3 K7 O! q/ W) E              DisplayListChar(2,1,"PWM=");
& W& i; _7 x2 J) e' u9 C1 s! D1 n; s1 C  S  Y" o
         while(1)
: ~* F' O4 j/ L0 i) A         {7 S6 j$ J. ^3 c! }
                 DisplayOneChar(13,1,ASCII[PWM/10]);        DisplayOneChar(14,1,ASCII[PWM%10]);
! f9 D) }' u3 s: ^' Q: o/ {. ]2 Y6 _- |: }! F  T
                if(irok==1), U8 T; O0 b4 ~" z0 [
                {
6 m/ ?: k- S- M                        Ircordpro();
' F! B. `: D" n                        irok=0;7 W! G# ]. v; |+ T% r! ?
                        }" T& w9 c* `, r, I: X3 Z
                if(irpro_ok==1)
" e/ Z) q* p! ~2 J5 }7 A  k4 ]                {7 H6 n7 c7 z, d& N/ g- M, y% S# r' U
                        Ir_work();2 m" A$ i% ~3 Q
                }+ }( z* b6 U& T4 J$ G6 o: s& n3 i5 v* }3 {$ L
        }
  ~# n0 D( z, d2 B3 N' @, r}
+ T5 t7 u/ b: m; A
& l( c2 G4 t& g1 `: B" Z* E

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 13:09 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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