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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
红外遥控按键PWM控制小车前进后退
4 @5 G9 m5 ?0 L% _. U# G. U/*-----------------------------------------------7 P1 j4 j& e! A" k; j* Y6 d
  名称:遥控器红外解码液晶显示
2 b$ m, ~) u4 o8 ]- i1 w8 d  内容:按配套遥控器上1-9会在液晶上显示
4 w, |4 Z# ?, ]5 K/ g4 }------------------------------------------------*/
# j- b  ?+ A: D5 g5 p#include<reg51.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义5 e# O9 W$ \1 A8 K4 ?: b" w
#include "lcd1602.h"
/ Q- k) S9 p- H#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换0 P/ d, b! c+ Z" ?! N4 v; a
4 ^* y$ m5 V2 r' n8 Q
sbit IR=P3^2;  //红外接口标志! e0 x& p2 X- A# m' z  Q2 [  ?" H

# ^3 I. b  n  S8 Zsbit DU = P2^6;
1 u* c: W# u/ |$ {' a9 Asbit WE = P2^7;        : l+ o2 q; c* }

9 T2 h7 D$ B" |' d! F, e/*------------------------------------------------
- n9 o6 x: F/ u# t. P                全局变量声明
( N# ]1 c9 V& e: [* g& A; W------------------------------------------------*/   \& }! \. {* ^! Y( i. s4 {) D
uchar  irtime;//红外用全局变量
4 t5 `( W& j# N; t' D0 U! Nuchar  num;   //遥控器按键0 z6 o8 \; h6 ]2 o
uchar PWM,count,kk,a;* x3 X# {- j5 P
sbit LED=P1^3;
" d4 M' ]/ _6 C0 P* n+ q. M* k( bbit irpro_ok,irok;% Z3 v# J, _1 J2 ?) a7 y$ U/ ]
uchar code ASCII[] = "0123456789";
" A2 M# f% {- z( U+ _% vuchar IRcord[4];( Q- G7 g+ D! W+ z. _/ @+ Y
uchar irdata[33];. v9 g2 c  S' R+ ~
6 s2 N9 y4 L8 u: y
void cmg88()//关数码管* i# Z$ l* W+ [/ @0 ]; y. e
{0 @; ?; ^0 S. p' {/ o1 f$ K
        DU=1;  / @6 L. ?- `' `- w' J* }5 Y9 h: O
        P0=0X00;( L; m7 n/ g$ K4 r
        DU=0;
; Z* i3 ~, ~1 b5 O( m}
, U. l" K$ |% a1 K* b+ ?3 n* c1 h/*------------------------------------------------- {; ~9 }: C6 [( M: g
                  函数声明" B/ W$ b( u2 n8 H  c
------------------------------------------------*/3 ~0 a; O7 j6 U1 T: n4 k

4 V3 O) f5 v0 B9 V/ N# z: lvoid Ir_work(void);
  l1 L4 b( p( B" F4 vvoid Ircordpro(void);  L( f" X9 n! z3 o/ d

, \0 A; o# H, R/ z, w/*------------------------------------------------
$ ^# z2 c4 x& E/ |' `+ Y                定时器0初始化
, ~8 U1 X2 P" Q: y& @! R1 N------------------------------------------------*/
* |9 r" S. i; h8 I" Svoid TIM0init(void)//定时器0初始化% q$ R9 Q" }1 U" c, j
{
4 f3 ]1 m5 G# p: e' v
- K% a2 d& |+ Q/ t1 [: d  TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值; N% A& ?0 B1 b
  TH0=0x00; //重载值
2 k* }7 Z8 |/ k3 K: Q  TL0=0x00; //初始化值
  I; b9 G4 R6 L+ u  ~  ET0=1;    //开中断
( J" d* G1 C  s' R( B7 B  TR0=1;   
) U% C7 Z1 V/ l1 V& w4 Z}& ?$ o/ r7 D% `7 D. N; _* U+ [
/*------------------------------------------------
- j& F$ z- \( Q" ?5 r( z                  外部中断0初始化
2 p# b) W% o. n6 o& R------------------------------------------------*/& \/ b$ I7 O( w* x" {; _
void EX0init(void)
( H8 c& j- |8 V0 L{
/ O3 [/ |$ Q, @  z! Q2 b5 f IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)% I1 p3 [5 K( }% y2 S. w
EX0 = 1;   //使能外部中断
6 _' T! n6 G5 `9 C( E: i EA = 1;    //开总中断
0 z0 j! p/ {: V}
6 w# _+ w. a* f/*------------------------------------------------( V( \( _' {! I6 ^7 e( |
                  定时器0中断处理% K6 o9 f) H1 S; c
------------------------------------------------*/
9 M! f& J) Q+ u* U# A3 N* ]; q7 O( ^2 l- G
void tim0_isr (void) interrupt 1 using 1# Y: `* T1 I, F+ f% I) {: r! u
{2 J' \8 Q) B/ L+ @( ~) s* X# m' Q
  irtime++;  //用于计数2个下降沿之
- ]0 O- B$ ?; G6 S5 m4 |0 ~4 _9 w5 w! F3 Y! I  D
        count++;3 j! c) {% v4 J2 Q3 X1 e
        if(count==10)
# P+ }6 E/ w- V        {7 B5 W$ C+ M" c; {- l+ B' u
                count=0;
- i3 f" Y/ M5 _7 ^' v        }
0 k; N6 i% z- M5 R( P9 g        if(count<WM), D2 @6 ]- J/ L" Q+ _
        {
4 L; A2 s. _7 m. A                LED=0;' |( t2 a9 p& O
        }
; E$ B% D# K. n) v5 z# B! C        else LED=1;' y+ V- M, r+ B6 F/ z) ?6 r
}" @6 t! S8 `4 p! B' L- |: S
/*------------------------------------------------" L, h0 F! @! E) a/ r( x' d
                  外部中断0中断处理$ n; S. \. n" J. v* |3 l& n! K( h( `
------------------------------------------------*/
, n2 u, X) x* V: v  H. P' W# rvoid EX0_ISR (void) interrupt 0 //外部中断0服务函数6 U* `8 x/ Z3 X' p3 R! l4 i" ^' M. z
{
# a+ w/ p* j. L$ R. I  static uchar  i;             //接收红外信号处理
# ~1 L" k0 ], d; w9 X  static bit startflag;                //是否开始处理标志位! I. W' `; i: Q6 q) I0 p4 A$ O( o

, ]1 P' \/ |. r# L2 Z        if(startflag)                         * P2 a, S+ @% Z  x0 b0 ~# w2 T
          {& ?" a# g9 ~* B3 E7 N
                if(irtime<63&&irtime>=33) i=0; //引导码 TC9012的头码,9ms+4.5ms0 e# A+ b; [; n9 T8 v
  J7 b3 v- o3 }, H
            irdata[i]=irtime;              //存储每个电平的持续时间,用于以后判断是0还是16 A7 q# r3 o9 U1 `, ]
            irtime=0;- h6 G( a5 ]  i* `- r
            i++;
% N0 m" O5 J: c: j1 L                   if(i==33)
6 F4 _  K" V2 T. H) R3 x9 L            {
% T: y+ [8 p0 _; q1 h4 Z  F                        irok=1;                //接收完成' E+ l. d, q( j1 i1 \
                        i=0;
  Y2 L9 `" Q7 d& l2 p: q! l                  }
! j* R3 j8 z$ _. O          }
: I1 z* `* }8 C/ a8 b6 }8 A2 r% t  else
. z' z5 r% w3 k0 W9 ]% }6 _7 Q/ l        {
  S: A4 Z3 H8 }/ M6 y                irtime=0;+ A: c# K5 Y' {6 J" @+ i; g  h
                startflag=1;
9 I& B4 o; a0 J. L6 j        }
4 V/ t3 P% d" W9 m" m( j2 I}7 `+ `  _/ A6 k6 ?- T+ a; X
/*------------------------------------------------
; {( Z' F& `$ @                  键值处理# [- l( |& s- `) a% Q2 k* A
------------------------------------------------*/
( g: O" r" I8 v& ^* ~* V) e% [5 Z+ i1 E! r6 M" g3 s
void Ir_work(void)//红外键值散转程序- \/ k1 Q8 R& p+ F- W5 U. f
{; t- \7 ]+ p1 c4 W2 o9 E
        switch(IRcord[2])//判断第三个数码值
' G( P8 x* q2 n4 E( d1 O        {
5 P& R: K3 e% @% b5 W7 N2 |* t                case 0x0c:num=1;break;//1 显示相应的按键值
2 V& E0 i/ \' n; {$ d                case 0x18:num=2WM++;if(PWM==11){PWM=0;};break;//2  Q  P0 i, R' {1 M9 {3 g
                case 0x5e:num=3;break;//39 }) V/ w' u7 h4 }7 l/ F; p" V2 {
                case 0x08:num=4;break;//46 y1 O: v, z( ~) h+ S
                case 0x1c:num=5;break;//5' z/ E9 P: }2 E" y9 l
                case 0x5a:num=6;break;//6
. @# M  v+ N9 P; b$ z* |                case 0x42:num=7;break;//77 ]7 ^5 w, t$ e
                case 0x52:num=8WM--;if(PWM==-1){PWM=10;};break;//84 {. z" D, R" l. O! p
                case 0x4a:num=9;break;//9
* \. G; H' x1 ]) N: k7 K$ z+ a                default:break;' m* E/ x+ p3 C8 N
        }* D9 ]6 m6 [" J. s' W/ A
        irpro_ok=0;//处理完成标志8 C5 P2 Z3 j$ N+ N
}) I( L( E( Y- T: y( B8 Y1 j
/*------------------------------------------------
( T1 M  O0 ]# K" b4 P                红外码值处理
/ u- N' R/ U. I! C6 L0 Y------------------------------------------------*/
/ a5 y) g" Y) g* V0 Fvoid Ircordpro(void)//红外码值处理函数
$ |) M/ Q7 K9 W" `% ?& Z, C; y{
4 r5 {% u7 `- Z. z8 Q, X7 V- W  unsigned char i, j, k;
$ {  }1 H( U1 C" I: d  unsigned char cord,value;; }, S2 l2 t% ]! i7 ^. Z

# C0 O' S. V. q4 d! c, W  k=1;
' X( l3 e+ n. Y& _7 I  for(i=0;i<4;i++)      //处理4个字节
+ }: U1 i/ ~6 Q  [0 G1 [$ w        {
6 v8 r0 R/ W6 p- Q* o1 X- B                for(j=1;j<=8;j++)   //处理1个字节8位
; }1 _/ Y5 V) b; z$ e& j) n' O3 H/ e                {
, [/ t) I+ F, d( X  p. z/ b                        cord=irdata[k];
8 _2 F* m9 U9 b+ H9 _. r0 d                        if(cord>7) value|=0x80; //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
3 ~% B- Q* O8 _6 C4 C, f                        if(j<8)$ z% {  ]$ i' W- N# k. o8 _# l
                        {% _* J0 U* F' ]- m4 S2 L4 U  @
                                value>>=1;
9 [  W4 z) N5 A% @$ y                        }" `$ m  z6 Y% Z  \& D  K
                        k++;
" M4 c- j7 E& e' @4 K: h                }
* b2 o' p4 r" B* W. l" n                IRcord[i]=value;
. h. f9 ~8 ]! q                value=0;     ! R$ V3 x! u6 S  N1 q$ X8 U* N" I
        }
) q7 g7 X7 Y6 x" A8 I        irpro_ok=1;              //处理完毕标志位置1
7 A2 @$ I4 F# v4 S) m% w5 e}% R* i% N& O& _
. R. \% Y* B1 _- e3 y9 I
/*------------------------------------------------
0 z# ]5 K" l  N% U: g9 P                    主函数
5 s5 E- ^- F% E  q, H2 K% q7 {------------------------------------------------*/! {! d7 \6 X6 r6 T; P0 |0 f* ]/ K
; b, N8 U# `* _2 K* R1 a
void main()
8 a' m. _/ d! |6 R{
4 w: }% [2 y3 ?- E. c9 Q2 j        cmg88();                                                                                                                                                //关数码管2 v, x2 ?" Z# l- k; F3 X( t! z- V( C
        lcd_init();                                                                                                                                                        //初始化
$ x' A7 V  s; a7 c6 J
* J4 e$ c. F* e. a8 D         EX0init();& p6 m  T( W: z/ N
         TIM0init();" o7 X- G. O9 f% s1 M5 ?
         DisplayListChar(1,0,"   ");6 E9 n% _+ r2 b% g# S, ?0 ?
     DisplayListChar(2,1,"num=");
4 Y7 T* g, ]9 F; w* p- G1 p% N( @              DisplayListChar(2,1,"PWM=");
5 p; r( h* \7 @! Y6 g/ Y4 L6 r5 @# V' h# K
         while(1)# \! {7 O/ W2 B' K3 t5 u5 m3 F
         {
6 j' q4 ~$ E' q0 S2 q4 x                 DisplayOneChar(13,1,ASCII[PWM/10]);        DisplayOneChar(14,1,ASCII[PWM%10]);! g9 W' e( V8 P% F8 d
" x1 I! H7 o! \8 L* v
                if(irok==1)+ d) s/ _: U7 U8 u0 h9 a
                {; Y/ F  l& {: |/ s: ?+ G& J
                        Ircordpro();
3 N+ T3 c( {7 f5 _                        irok=0;
' v/ f0 e- D6 Y1 e                        }3 `  T# A! R4 t8 Q& l8 |1 S
                if(irpro_ok==1), @, Y& A& a: m# U# W
                {1 v0 p" G4 F; w+ p8 s
                        Ir_work();
1 W' o, E, e$ t+ [$ u6 ?1 Y                }
) h  K- b  B  O. ?* q6 j        }6 |0 `9 R2 v. X" {- T/ _
}
/ `. n3 A' T& S. D# ^; @' H5 X) B, a8 s/ @$ F

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 07:15 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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