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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
红外遥控按键PWM控制小车前进后退
8 E/ c, ~" E9 H7 k+ G, y* P2 g/*-----------------------------------------------5 y) {! p: n! m6 J5 L$ K! x
  名称:遥控器红外解码液晶显示
. r% b! m; `+ G2 n" `  内容:按配套遥控器上1-9会在液晶上显示
" M* T4 w" O5 B  t------------------------------------------------*/
; E' l: Y: \/ P#include<reg51.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义: M& S$ I$ W' H. ^4 X
#include "lcd1602.h"
1 t5 l  J/ A7 w- _9 r1 e#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
# r3 R. m- L9 [+ t' p2 i2 A
7 H  P/ u3 o0 _. G$ wsbit IR=P3^2;  //红外接口标志
8 T1 J7 N0 p/ K4 C# Y: B2 `+ g4 J! z3 i# R# j
sbit DU = P2^6;* G- V, ^6 t' u7 X
sbit WE = P2^7;        
5 K. H) ]- y' w9 [0 ]# L+ S! L
2 u# k' i. J6 c/ E( q% B; E' f/*------------------------------------------------
, D% U/ Q, @4 ~5 W( J9 P                全局变量声明
+ M6 ^; \3 c& k2 n+ ^( d/ K------------------------------------------------*/ 4 ?! L; E7 g9 `# g  }1 P* b  w
uchar  irtime;//红外用全局变量$ Y" x4 [5 o0 b/ \
uchar  num;   //遥控器按键  q1 ?- T8 J8 h
uchar PWM,count,kk,a;3 P. r$ i. @9 t! H% g; G
sbit LED=P1^3;+ u) T, \5 v4 d
bit irpro_ok,irok;  L: }4 W' o( e9 h" @
uchar code ASCII[] = "0123456789";
$ }6 S" r6 F5 U/ t% U! Guchar IRcord[4];
& ^8 t5 S/ ~6 M) kuchar irdata[33];
5 ^- W  W+ i/ W( I, K* [3 v/ P( o/ o. ?( S' D; i* o3 L
void cmg88()//关数码管
7 T3 s( g2 X! C9 o{
2 B! L* A& l. l) j; I: t  C3 [        DU=1;  ; W3 k& P: z3 r3 g
        P0=0X00;
/ ]! `4 `& C$ ~; D- c8 @& y  V        DU=0;
3 D1 U) T9 _4 |: k}
5 j5 S! E, r/ s. P; l/*------------------------------------------------9 p% V% F0 e1 V' W9 _
                  函数声明* ?0 a2 ~  S8 l8 r% f/ w. v. t  ?0 k
------------------------------------------------*/9 \, l+ h7 U& y$ ]% M& ]

0 N2 Z% m0 h$ y" ivoid Ir_work(void);
& `1 M* s1 k, n4 @7 R6 j$ ?void Ircordpro(void);
! A4 \% z. [; J9 ?
$ _1 X- C' F5 x- P  s5 t/*------------------------------------------------- d; M( N5 X7 z% ?# D
                定时器0初始化: r; G6 I9 Z) S7 q
------------------------------------------------*/
3 k$ S# ]9 J1 L2 {, hvoid TIM0init(void)//定时器0初始化
* O( n# Q7 `& p, D. a- y: W{& c6 J: s" `( \7 h
3 a. ~( {8 L: B) j' @4 J
  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  Y/ K; B! P1 F0 l  TH0=0x00; //重载值
0 k1 i" |+ l6 [  TL0=0x00; //初始化值
. \. p4 O  I, ?1 q% A9 K  ET0=1;    //开中断8 M( j* P* c4 t5 w+ c& ?0 X
  TR0=1;    4 G% X6 N: I5 ]8 s+ {
}! b6 Q9 f% F2 O) a6 ], m
/*------------------------------------------------  g: N" L4 v( G3 D# X* ^  ^  R; r
                  外部中断0初始化% p" |$ T3 P# x  F$ r+ `" h+ k
------------------------------------------------*/
: H3 d1 ^1 U* Vvoid EX0init(void)7 o4 j8 z' B4 p1 d1 ^' I, e
{# x# W1 }) Z$ D( O3 I
IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)9 O; O7 b3 |" X" V
EX0 = 1;   //使能外部中断
- Y  `; w3 }" k+ D EA = 1;    //开总中断5 x9 |  X: }. \! Z9 G
}
  z1 b) {, x! a, O: P; c/*------------------------------------------------
3 l( r4 f6 G' D4 |                  定时器0中断处理, y/ {. m; c. s: D9 R3 c4 Y" k' b4 Q
------------------------------------------------*/
& W7 [! O2 r- M- m6 Y" q! A0 C4 }& o7 C9 y
void tim0_isr (void) interrupt 1 using 1- o5 t# e# z. c: M, O( O
{
+ c% \- N) ^/ l$ L0 d3 P) Q1 t  irtime++;  //用于计数2个下降沿之
9 q, u) z; x8 `& V$ C5 @: A7 C  h, S6 y# s9 \
        count++;
* K3 U5 w' O5 u( ~' Y/ ]% g0 e$ Y! W        if(count==10)# X7 N' e3 h/ v5 [% D
        {
4 g' y3 k, N% W  }, K6 l                count=0;  Y1 {: q. W1 `" ?# N3 q
        }
0 g' p& U. o6 E; s        if(count<WM)
+ R2 R1 z  c& f, L3 y        {
4 N3 f3 x4 ~  B                LED=0;
1 J* W. S: f5 K3 v- V        }- A5 Y% m0 ]+ r; n" P; l6 ?3 X
        else LED=1;
7 g9 F1 g6 L- h* E$ J}8 _8 p- J* r4 q
/*------------------------------------------------
: o) I+ U. D0 [) r( t                  外部中断0中断处理3 E$ d  Z( w9 c+ @. `0 x4 i
------------------------------------------------*/- Z( x5 V  G1 E1 v' h3 U7 y
void EX0_ISR (void) interrupt 0 //外部中断0服务函数1 u6 m' c2 V7 [  Q( T1 A5 {
{
3 S& m- n5 f/ p  static uchar  i;             //接收红外信号处理
! @, k, X9 v: K) F1 J8 D  static bit startflag;                //是否开始处理标志位3 f1 _" u  w/ U" v

( I/ E' h- S* S' [: W$ A3 E        if(startflag)                        
& f+ O! d- l) Q+ R# Q+ m          {
( G: }5 L1 x! j+ M% E2 R                if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms4 r  c! B' p( N8 h) y
, e9 F' o3 T' T* q
            irdata[i]=irtime;              //存储每个电平的持续时间,用于以后判断是0还是1
, a  [/ |% [7 f1 K. v            irtime=0;
, j4 ~8 I% A. Q# I* f+ F+ w            i++;  ?3 D7 |  @5 Y4 _5 h9 C% B
                   if(i==33)
- s& ^1 c) X$ H( u7 _% G, A5 G            {
( l% P* f& ?- p9 Z1 u                        irok=1;                //接收完成/ v0 H- s6 T1 A
                        i=0;, C) d- \1 m& s8 K1 l, ~
                  }
5 V' ], q$ Z) y* D) L" {          }& K7 k2 N( O" ?6 P: f
  else$ Q$ m6 G3 D5 ~. U" M9 D, Y% y% L+ u4 F
        {7 c* c0 |4 H: U2 _
                irtime=0;9 }! I7 x2 u$ B6 ^1 L0 A! B5 y
                startflag=1;( g) _+ z5 r3 h% O6 P; v( }
        }4 T6 G" [+ N0 A- T& y3 g/ A
}4 X7 p% [5 [+ \( y8 O% J
/*------------------------------------------------
, g. m: r5 s; A) I. O' T1 x- K( R' M                  键值处理
; M  j* o  D. i* g; |* Q------------------------------------------------*/
9 k7 h' F- \! H% y$ k* k* A4 Q. w& R" _3 e
void Ir_work(void)//红外键值散转程序
% {, }- H* `' S4 ^% b{
* p8 X6 F: p; g" z        switch(IRcord[2])//判断第三个数码值
6 t+ P$ ?# }' v1 L        {/ C+ f* u9 V% `
                case 0x0c:num=1;break;//1 显示相应的按键值! |# X8 X; G, b! @
                case 0x18:num=2WM++;if(PWM==11){PWM=0;};break;//2
# |9 e! E" U! v6 r( k1 X                case 0x5e:num=3;break;//3  x$ i0 x1 N+ Q/ m. P) t
                case 0x08:num=4;break;//4: V$ s. M) ?8 ^0 a* g/ g1 C% Q
                case 0x1c:num=5;break;//5
* M. T0 J2 q/ E3 @" ]( z                case 0x5a:num=6;break;//6
  {& O3 \5 e6 q1 O4 O: [                case 0x42:num=7;break;//7
: e, m, l8 ^3 O5 w5 R                case 0x52:num=8WM--;if(PWM==-1){PWM=10;};break;//8  {' i6 A. }, Y% H9 Q3 }
                case 0x4a:num=9;break;//9" T; Q/ ?6 m  L( H( k! L
                default:break;
) B5 S4 K1 d0 j1 E: i- g+ h        }
- D( \( {# e* t: Z4 z7 o+ j        irpro_ok=0;//处理完成标志0 ~9 \( J2 E$ S. R2 t' r
}, R2 @  v/ C( n( W
/*------------------------------------------------; [3 m& o4 n' _0 v" P
                红外码值处理
5 [/ o' b. G+ |& @' L! c) b4 ~------------------------------------------------*/
$ j7 h, P( Q7 U* Svoid Ircordpro(void)//红外码值处理函数
& k/ {- s1 i, E/ [{
9 I4 B1 c6 R' [, e  unsigned char i, j, k;
3 o4 n$ w3 G* O6 F# S' b. G9 q) A  unsigned char cord,value;
/ h/ ]3 U/ q- [: D3 n' k* K0 ^5 K, ^. ]
  k=1;3 _2 J: f* ^) V2 G2 Z4 |
  for(i=0;i<4;i++)      //处理4个字节
- L0 S# v$ z; ]% D        {
9 p, m4 D+ k9 [3 L$ {# q, r                for(j=1;j<=8;j++)   //处理1个字节8位
& l1 ^: H) C9 k: E                {
1 Y" M5 a: Z2 m% W8 `                        cord=irdata[k];
1 b" u) L% ], T, ]" j                        if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差! a2 k2 F7 @# M7 V/ ^) L% g( B
                        if(j<8)
) Z4 d$ k: ~+ M. }0 W& y                        {! c( p! ~8 R- C3 L
                                value>>=1;
' Z8 u. b! r. E( F( P% S, P6 n                        }, p5 m. }8 T5 t. I
                        k++;
+ {( e9 x: N& o" Y* A% W9 I- u                }  D; c3 e7 d% R0 a( z
                IRcord[i]=value;/ E6 p# [( e" \4 U8 N+ e2 M
                value=0;     / K/ C% ~/ v. ?( \8 {0 m
        } 5 a& |: S9 ~* P
        irpro_ok=1;              //处理完毕标志位置15 G/ {/ w3 S, b
}
9 R( t- E2 ]5 Z4 l. v  V
& J9 M9 O$ Y* q0 \) N- C/*------------------------------------------------
' @8 \3 ~8 _/ V! j. n- G) c4 w                    主函数+ r* [1 w' {! P% z8 [# M
------------------------------------------------*/
2 ~. k$ w) ~8 D5 Z; L+ }* {
; b: k/ Q% D  n5 P- ivoid main()
$ n- _/ i0 }* W- Z* h5 |{, [4 C. P; b1 I1 Z2 M& x2 E0 F
        cmg88();                                                                                                                                                //关数码管1 a7 I* r% N! h" `4 G
        lcd_init();                                                                                                                                                        //初始化$ N. q5 U7 I, R+ i" a7 T) n+ a
3 O9 l, u$ j( L( C! L
         EX0init();
& v5 L( y9 f* s, s6 I         TIM0init();4 d. Q  V' p, Q! R; x0 F" j0 }
         DisplayListChar(1,0,"   ");
/ e: n( f' g. x: _* D     DisplayListChar(2,1,"num=");# W' \: e& Y* ^/ S7 ^9 U
              DisplayListChar(2,1,"PWM=");
1 W- l( F3 ]) L; h( T8 z0 d. |8 N, W/ C  c! g
         while(1)  a% f3 \$ p) n, s
         {
( J: K! \% B8 X6 S" J6 Y                 DisplayOneChar(13,1,ASCII[PWM/10]);        DisplayOneChar(14,1,ASCII[PWM%10]);. \: g8 ^- {1 S; y5 j
' N6 d& B9 a8 ]" ~
                if(irok==1)
) ~/ V+ g& Q7 b# q& [# R5 R) c6 j                {
9 w1 i8 n# E9 f! ]9 J8 X                        Ircordpro();* b! _5 r% a) `5 w) \8 w
                        irok=0;7 G3 R- t4 b( i
                        }
" c) g9 V2 d  C5 r( i                if(irpro_ok==1)  C0 I$ p% S% `7 Y" L
                {
/ P/ R$ {' K  y                        Ir_work();
' U4 D+ v6 a( u                }6 k* F/ P7 ~$ t$ E/ ^# Q$ s
        }( a/ V* Q. v! g# ?: [
}! Q6 @9 H5 C* t5 k& n) [& t1 [, [& B

0 L& \1 w+ w' O# g$ F. j$ m

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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