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