|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控循迹超声波避障跟随光电码盘计数测速五个中断智能小车
6 @. w1 p1 K1 s, k8 n! D) F7 L# J7 y! ]4 k
! [5 j; G" S1 ?* v( d通过红外遥控,控制小车的方向,通过循迹前进,通过超声波跟随。通过光电码盘计数测速,把52单片机的五个中断用上了。。。
3 v1 [$ J9 S2 p$ E. l( ^, \, Hryz学习
" n r4 j6 F( y4 N3 W ]! a+ ^! ^% }! {. b2 N7 W& q% H# r
单片机源码:+ v* t5 Y- l( S. H7 P& D; {
#include <intrins.h>9 |/ |: i( D3 x" n3 h) v+ I
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
1 W1 p) y$ U: X3 [& V8 O: N; T* z! d#include "lcd.h" ' ~' ~: |5 {2 R/ \: h
#define uchar unsigned char$ F4 r* a, c, U4 k
#define uint unsigned int
$ Z4 o! ]' D; r3 I7 Rsfr T2MOD= 0xC9;
& U4 [ Z$ ?; {5 U7 A# @typedef unsigned int u16; //对数据类型进行声明定义. H+ A. Y# w4 \- V- [
typedef unsigned char u8;
3 X2 H$ n5 p( `9 W( R6 ounsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};& X% \& I: J. L Z1 n j- Z
//p0,25,26,27 lcd1602
2 @- b$ o4 X/ G3 G* B E+ bsbit P10=P1^0; //寻迹模块左
* X( v F- T+ }0 ~sbit P11=P1^1; //寻迹模块中
, H. _( R8 w: B/ `, Y) _/ ~sbit P12=P1^2; //寻迹模块右
/ I6 x( ^% Z9 W3 Z' p& Ssbit key1=P1^3; //无线端口+ c& a- Y$ x) Z+ r, `! x! h! K% j' K2 @
sbit key2=P1^4;
- `# A, q T- L9 e$ @sbit key3=P1^5;
9 L* |7 p2 x4 T2 l6 Fsbit key4=P1^6;
2 @& }* I+ Z2 P) R$ L6 U7 Msbit RX = P2^1; //超声波端口0 R' Y- P8 V4 F
sbit TX = P2^0;8 U' e! m* n- f J2 ~7 j
sbit IRIN=P3^2; //红外端口5 ]+ w, T2 ~6 C+ I
//p35测速端口9 U$ K2 p1 s. z* o8 R
" `: ], `% s5 H, \4 ~' C% A! |# x
sbit SER=P2^3; //8 电机驱动端口
3 \9 d3 a$ u `sbit SCK=P2^2; //4 en=0才工作0 ^% z' k% p: r2 ~+ |
sbit RCK=P2^4; //12/ k; J8 `, y! B1 ^4 l
//sbit PWM2A=P2^3; //未使用 低电平有效 124 u$ c [/ T5 Z
//sbit PWM2B=P2^0; //未使用 低电平有效 3
! p3 u0 _/ b; k0 c. B [" b0 f( s. u4 q% F; r1 Q4 g1 O8 z$ K. d
unsigned int time1=0,kop,mm=0,s20=0,s21=0; * g* u. p0 L/ Y8 D: {
bit flag =0,flag1=0,flag3=0;//flag 超声波超时标志,flag1,循迹标志,超声波控制就不循迹。 6 W6 N% |4 U7 x1 ^& ~8 O
u8 IrValue[6];
% x! ^5 X$ J9 au8 Time;# g X+ {$ ^7 C. f+ u! F) |) j
" D! E0 ?/ p0 T( e# M q! k2 p5 A! q8 A" T4 a8 J
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码
$ e% B% [; {/ J8 Echar num[16]="CODE: DIR: "; //第一行显示的数据$ l6 J! t; X& G8 ?+ y
char num1[16]="IR: . / . "; //第二行显示的数据
4 O* ~ f' {2 {% _4 N/ o h6 g/*******************************************************************************$ r4 N: d7 K1 t# m% J- r
* 函 数 名 : delay7 ^4 p4 I4 A, ?, E, {) t$ I
* 函数功能 : 延时函数,i=1时,大约延时10us& t+ o) T8 L9 h. e3 C
*******************************************************************************/' p2 q& ?8 a2 Y3 D
void delay(u16 i)1 \5 E+ ~# ?6 `5 A
{
2 `; S! B% p4 r; M. s. [ while(i--); 5 A; X$ s' q; V& x! D% V1 J
}2 o$ |. S7 |+ w5 o
void delayms(u16 i)//i=1时,时间为1ms2 r! C0 J1 s% n/ e
{ int q;
- h, m3 ^; E @! Z9 m% } for(q=0;q<i;q++)
+ V6 G# B0 P" t4 q2 Z* _ {0 y6 _) Z1 r: M) E
delay(100);+ \ u0 z. z$ x6 W A
} & y1 t& S' I O% h& v
}! D! X, g6 f$ }5 I1 F2 p
9 |. h7 [8 J R. x
# S6 m/ [8 ?6 }' h& ^' x+ ^8 R+ s$ L) dvoid delays(u16 i) //i=1时,时间为1s, E, f) y t4 [' ]" y- s
{ int q;
$ A- j6 W* R- q$ s& j) j for(q=0;q<i;q++)
3 M+ Z5 J/ _$ H2 V {# I8 T" b5 }! n/ f0 B" q
delayms(1000);; b7 d* _$ \2 C5 I0 p$ H+ ?. ^# E
}+ l: ~5 g! F- ^! D5 r
}
, u, b' p# y/ I1 Y B
: @/ j1 j6 x7 C; L5 v6 p6 v0 v' I/ f6 z
C; G/ c- B7 L" w. x! e
+ Q4 Z3 ?4 N" p; V" D% v! A6 C' Y. d% j6 Q* T4 y9 N8 Y( y7 {
/*******************************************************************************% F$ u8 Q5 J" C4 a& w
* 函数名 igDisplay()+ _# _" ~) ?/ k$ b+ Q+ o1 {- s
* 函数功能 :数码管显示函数
6 A5 P# @6 ]% J& X, k* E* 输入 : 无0 E2 r, W. l6 g& Z/ T
* 输出 : 无
$ i+ J( [( [, p. [3 g% }*******************************************************************************/
* r, g" B8 ]. Z% P8 u+ s1 H$ z7 @8 ^' u1 Z( b
void HC595SendData(unsigned char SendVal)//发一字节
, r& d% [" }: B1 v{ 7 L9 _: {! M$ W4 c6 Z
unsigned char i;4 s! Q% y4 j B; h
for(;i<8;i++)
7 C+ j" x# P. L# Z) `% T {
% x8 V0 G E; X* e3 T! S SER = SendVal>>7;
, H9 }# n& T/ J/ b( r9 T0 g SendVal= SendVal<<1; ' _$ c u+ a9 d9 j8 f
) h9 o7 v2 ~/ M) i* t* _- ^; ] SCK = 1;
) F. w4 X- U/ S _nop_();' Y) K+ |- |! Y+ H9 L- y/ p
_nop_();
) N4 p% E2 P2 |4 Q3 n
7 A* U( t% o5 ^# l, c9 S SCK = 0; 7 P$ \0 D$ @( ^& I( V
RCK=1; ( I* Z/ `3 l+ L
_nop_();; L0 G4 k: n/ v" r7 g3 m& R
_nop_();. U- j6 k- T9 ?$ L% U
RCK=0; ^0 ^% j9 w' C" V' j7 S
}" T5 o0 ~* D; |9 ?3 `
}
& T |% R( Z0 s6 H2 E; m; `2 I& m; H! n) Z* P' _
( K1 f3 [0 j) L
0 P: g" N9 Y+ E! n) i8 w( p" L- i9 n
8 m; T2 { w) X! E" O& U/*******************************************************************************% f- w9 S$ c+ ~3 a8 a* n# R# y
* 函数名 : IrInit()8 |% |& F9 ]* a4 ]- n" e8 q
* 函数功能 : 初始化红外线接收8 y. W6 B2 |- z6 ], Y
* 输入 : 无
* [. Y& w7 e- T5 T5 J1 O/ F1 _* 输出 : 无
! b9 l% Y, ~4 ~2 Q' c; E% N+ n*******************************************************************************/
' q; D& F$ P l) w. `) p( V: Y7 s% R W/ j- l% u4 d- J
void IrInit()" B2 U; D W2 ^- M3 a9 g3 Y( ?
{# C5 b B3 T4 Q: X5 G) n" @5 m7 a
IT0=1;//下降沿触发
% Q& Y/ E7 D) v) `4 ]5 |" ^ EX0=1;//打开中断0允许; D3 k5 q& P- d1 ]& t
EA=1; //打开总中断
3 U$ A, f9 x6 @0 j
+ n( @4 Q0 ?+ l* y2 d/ H IRIN=1;//初始化端口 y, @( @( u8 } j8 ?
}. X# \ Q6 [1 W: V/ b! r$ _8 k
void Chaoshengbo()
! U! B! o: M! d{ TMOD |=0x01; //设T0为方式1,GATE=1;
e1 G/ ^) q+ q. Y( d TH0=0;
' W+ n# P& ^* W TL0=0; 6 B) q! M' ]- x' r* w6 Y4 H
ET0=1; //允许T0中断 H+ Q* P0 K& L2 j" i) V
EA=1; //开启总中断 2 E d9 ?+ r. @0 E) w& G
}3 |% _) E+ I& c& N, b G! Q, z
void cesu() //测速初始化7 v& L. V) |/ B9 l, P; c; P' i, E
{
. L9 F# Q; V1 x8 F6 BTH1=0x00;4 f. B3 o9 I% D
TL1=0x00;% t9 E& D+ Y5 r: C; a: I9 o0 V
ET1=1;
% s: g# M" H% c; t; x//ET2=1;8 g: M& D# C+ ^4 T% t' B
TMOD |= 0x50;// 打开定时器和计数器T1,因此矩形脉冲输入端接P3.57 T$ z& c c6 f& W6 F0 u
: o0 Y- G1 F4 ]6 MRCAP2H=0x3C;
4 L3 {. ?/ o) dRCAP2L=0xb0;( U# P9 J+ ]4 e6 J$ n0 k; Y
- U, J9 D# O/ Q: H9 d' A5 M+ O! v$ H
T2CON=0;
) T1 B7 I. |- lT2MOD=0;
/ u! Q3 m1 m& B/ t1 w* ^IE=0XA0;
8 C* }) P& i! F( }( F( nTR1 = 1;1 ^ a9 l5 I+ e. |/ t8 w' k5 E
TR2 = 1;6 m" v3 Y; r& M) Q8 v
} 9 s2 T3 [) [% s8 d$ E2 c) D
K5 C* v/ W: y) P' j4 Z( nchar scan()% {2 \. [" W# t% T$ g
{ int key;
3 }. L6 R% l# N0 X$ d7 s% h if(key1==1)& K/ g' ? C' x6 m( T2 S
{ delayms(10);+ s* Q9 e% M! C% ^0 Z1 j8 I/ Y
if(key1==1){key=1;HC595SendData(0x66);num[12]= 'q';}2 H! K$ S2 n% K3 r8 ^1 _- B# M
}& ]* _# U, X$ O' |' W) I0 \
if(key2==1)2 b$ ~2 u5 D6 H. v, i4 f
{ delayms(10);' [% ~- y2 }, |0 N1 x5 R
if(key2==1){key=2;HC595SendData(0x99);num[12]= 'h';}
1 o9 G" S% b5 v* f$ Y' K/ @. ], p& y }
" Z, C; M+ v" X3 N if(key3==1)
; v& p; r2 P# n) a" F. h { delayms(10);
2 I+ ?1 ]6 S! \. } if(key3==1){key=3;HC595SendData(0x78);num[12]= 'z';}
( r5 d) M1 b( t0 B }
7 v3 j: ~7 s4 X- D* t if(key4==1)
) }9 ^; L2 q$ o { delayms(10);4 F( h% C4 e6 K. k7 z+ E
if(key4==1){key=4;HC595SendData(0x87);num[12]= 'y';}" a6 Z" T& Y6 k; i: a, z
}( l7 b6 L) }4 w$ o
return key;
0 k5 b4 [1 ]% `) R: x. e; U}5 h/ [9 [, Y. i4 X
char Judge()
# \5 y1 [ ^1 X2 c' {{( Y' \, d( C9 r/ s+ m H( \5 R7 Z& D# }
char num=-1;
* }+ j% ~- Q, ?8 ` % A2 s& H, f6 n# }5 w3 R+ @" r2 [( O
switch(IrValue[2])# W+ w* v9 r8 p" d
{
3 R8 E& A) ]% b: ~+ V case 0x47:num=19;break;. r; ?& M7 b( v
case 0x46:num=18;break;
( q7 p1 {/ q6 b% Q: C' I/ | case 0x45:num=17;break;6 G. ~" {8 N# H+ Z0 \
case 0x43:num=16;break;
2 f) V. A$ a% S0 X! U case 0x40:num=15;break;
' t$ T6 |& D0 _) i# S2 M case 0x44:num=14;break;
$ x4 I( U$ ? f4 m9 @) L" {' x case 0x07:num=13;break;; @1 c( g# M- ?7 b4 t
case 0x15:num=12;break;
) ^8 q. \* m9 K2 n" o case 0x09:num=11;break;8 K9 M, k2 [/ Q& h9 O* i
case 0x19:num=20;break;
6 F5 t/ D6 {6 r" f) o$ n: S" l4 g case 0x0D:num=10;break;
: |' W. V5 t& h8 D1 h. u1 Y case 0x16:num=0;break;
) p$ M, ?/ J1 w case 0x0C:num=1;break;
6 y5 J: S0 o) C+ ? case 0x18:num=2;break;
) M$ U# u) ?8 H: R1 G. `) G$ M case 0x5E:num=3;break;
$ \- l/ l) O' o case 0x08:num=4;break;* Z8 Z! t! s% D, z+ n2 G
case 0x1C:num=5;break;# C) I- o- p8 ~
case 0x5A:num=6;break;
- i) _1 D" b3 h8 ~: N% u9 P6 M" { case 0x42:num=7;break;, j& e8 c3 b0 ~+ u, w
case 0x52:num=8;break;8 o" |& X: ?$ a) R \/ R: R; ]
case 0x4A:num=9;break;
2 d F8 t, o4 H, c3 g2 Z9 n default :num=16;break; //1 L2 Y7 [& d5 e: @. D
}
: X+ X8 `+ j$ ^. R$ I + {7 ~" c. o' B% i9 T3 ~
return num;3 T0 t+ A( s4 {( [) Z& Q, L1 t3 d. K& w
$ L" Z& e, M; e- a* y5 B8 y}
# }# r5 }% U9 k3 nint Conut()" O3 o2 U% ^& j1 F
{ unsigned long S=0;
+ }( H" g, \8 s& s ; m4 {; G9 b! Y7 @& N% N
while(!RX); //当RX为零时等待
& W7 U$ [6 D) [3 \) W TR0=1; //开启计数0 r. I* d8 v7 \
while(RX); //当RX为1计数并等待
. r7 K$ X; w8 D8 q; f( n0 S; i/ e TR0=0; //关闭计数 t1 I5 @1 ]* M
3 ]9 p0 }. s5 F& _/ q2 V6 h" G time1=TH0*256+TL0;
- n0 _9 ?4 y! Y! T. j TH0=0;2 Y, z" D6 O! x! R
TL0=0;* ~, m% D$ b1 e: ^" E/ F* C0 ?
" T v) @1 L4 m% Z& g# R
S=(time1*1.7)/100; //算出来是CM* q$ p3 z. i2 U
7 G) \ t8 q. F* `" f" Y
return S;) H! D# t( T) O
}
- S" s7 ^. f3 {' Z7 T3 `+ c4 i
" y! U" t5 r( m' t2 i& J: P# g& G4 `$ ^& @& e
下载:
/ M5 R7 l7 j8 P2 S
' \+ ?. t2 E% R2 B q, |" ~$ V& I |
|