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