|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控循迹超声波避障跟随光电码盘计数测速五个中断智能小车
, j0 P# V: J- ?* p- T# N) a) @' ?9 e( W: j0 F4 {9 h0 `
% d( s, a. o$ [' V* e
通过红外遥控,控制小车的方向,通过循迹前进,通过超声波跟随。通过光电码盘计数测速,把52单片机的五个中断用上了。。。
# e! _2 L5 P$ t+ A; I$ pryz学习2 U& ] ?0 k. z8 p% O' K
* J3 o2 p$ L3 X3 ?% R; ]4 Z单片机源码:# X: m- T* K! x6 |' s4 G3 d; H8 C
#include <intrins.h>
. g W6 j9 y# X. C* s& N: E#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器0 \- E3 M- e" [* D! s, M8 \4 j
#include "lcd.h" " ?/ S, s' ^2 K
#define uchar unsigned char
8 m$ m# ]; f) w! w, l#define uint unsigned int
8 l+ s/ x9 V) \% ]" g- Esfr T2MOD= 0xC9;. T, \( N, l9 w/ |
typedef unsigned int u16; //对数据类型进行声明定义
; C1 d: C4 w$ \- g; n! {( otypedef unsigned char u8;
( @& C1 b$ M; l- j8 y; xunsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
& V6 ~9 q$ Y/ ]1 E1 g% | //p0,25,26,27 lcd1602
5 [( x& ~+ X0 ~sbit P10=P1^0; //寻迹模块左0 u/ O- N! V; L0 d: z
sbit P11=P1^1; //寻迹模块中
0 a3 M7 f8 }+ h- U6 _( hsbit P12=P1^2; //寻迹模块右
+ V8 x- o. t' C/ i/ }sbit key1=P1^3; //无线端口4 G1 o$ B* A% K6 ?/ w$ @
sbit key2=P1^4;- F! X6 R3 l, r, G; o
sbit key3=P1^5;
" o0 T" g; J7 R/ Y Jsbit key4=P1^6;
7 m; O! ^! U0 [; |* q% f# O4 zsbit RX = P2^1; //超声波端口/ R9 ]9 s- {2 Q( n' k
sbit TX = P2^0;* F2 j2 i: e* A2 `4 o7 Y
sbit IRIN=P3^2; //红外端口3 P" R8 T" R7 u, e* s
//p35测速端口 [% [* H9 A$ v4 k2 Y+ i$ k$ i
$ c: J/ M! Y" `9 V6 ksbit SER=P2^3; //8 电机驱动端口7 K, u4 L. b8 e4 |/ Z r. M
sbit SCK=P2^2; //4 en=0才工作
S; [) o. t, C0 c; z1 Q4 n/ Csbit RCK=P2^4; //12* |2 T, H$ t8 p" Y c* P! l" a% x
//sbit PWM2A=P2^3; //未使用 低电平有效 12
# X- ~% O! P, d/ d4 p8 n//sbit PWM2B=P2^0; //未使用 低电平有效 3
1 F" A; h) \( [8 w% a v) B, Q* s- [
unsigned int time1=0,kop,mm=0,s20=0,s21=0; 1 L- F) I9 L$ Y3 h7 t) @
bit flag =0,flag1=0,flag3=0;//flag 超声波超时标志,flag1,循迹标志,超声波控制就不循迹。
0 I1 A" l+ C R$ @( u1 J# b Uu8 IrValue[6];, A3 y- z5 b* {( A1 ^4 S
u8 Time;. O0 T' [, j! u9 V# V
7 S" W: A$ ? s1 ]
9 E( X" |3 g+ Y4 n2 s6 ]//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码 }; j$ C5 c, y9 _/ r8 H* N. ~
char num[16]="CODE: DIR: "; //第一行显示的数据) |; b0 x4 p) p c8 }8 x: P* H
char num1[16]="IR: . / . "; //第二行显示的数据; f4 L6 J% t" [# ~$ b z: g* j
/*******************************************************************************5 ~- I- Y. Y, D B" G) ~
* 函 数 名 : delay& {* S1 Y2 v" b' g
* 函数功能 : 延时函数,i=1时,大约延时10us2 u9 v. O# z5 l* I4 ^1 w
*******************************************************************************/
$ y: `% |) r o! jvoid delay(u16 i)7 z% v# T7 o+ N( ~8 H7 r
{( S6 `& p/ {' a6 V; ^, X: Y
while(i--); 7 o; F2 c4 i) ]/ Y& O' Z
}
9 Y; B, M# F* zvoid delayms(u16 i)//i=1时,时间为1ms
; q; U3 A: z3 q) s{ int q;# G9 I( ` R( {
for(q=0;q<i;q++)/ z; {4 ~& C. [) s$ z6 E1 i4 M `/ Q6 E
{' ~. G- ~; B. s% S7 I
delay(100);; {4 d6 `; T& }& W$ Q* c
} 9 ^8 A3 m6 b4 H
}, g; W/ |2 v$ ]4 W j
) C$ M4 D9 y; Q( |* o% i9 U8 w" o
void delays(u16 i) //i=1时,时间为1s- z# |* `* u0 {5 D( _
{ int q;& {: e, u- l" o" k% u- S/ t
for(q=0;q<i;q++)0 o( C- \! e: d
{
! D8 w! V4 E' J3 f delayms(1000);: |9 ~- q+ L6 E/ N2 n. S
}
6 D t4 P( n1 d3 N% O}3 }5 t( w; W4 F" K* Q1 M
5 x1 [. u3 P$ h. q" l( \% e3 @4 H" N% Z" L
6 z* }# ~% v3 O x. S
1 E& q/ p0 e) w6 r8 ~
9 ~0 ]+ d2 M P7 l8 Z% u7 z1 `: V* y/ w
/*******************************************************************************
. H/ M k; D. C" ]. }- @* 函数名 igDisplay()" N7 S( |: p) z0 U: C( M
* 函数功能 :数码管显示函数! v V& Y3 n8 v
* 输入 : 无
! h$ S! `3 |9 s' b) j* 输出 : 无
4 c/ W2 S$ P( O, m*******************************************************************************/
* S) i% b M( }" Y+ V9 ^
9 ~+ d/ q' R2 o9 uvoid HC595SendData(unsigned char SendVal)//发一字节
# ?& K& ?0 ^) g{ & Y+ Q E K, F9 ]8 T
unsigned char i;/ P# {3 J6 u3 o8 |; l0 e
for(;i<8;i++)% a/ ] a( h* q
{3 F! ?) G0 k( g% k
SER = SendVal>>7; . m2 s. o2 `2 W8 [( p, k8 k) C
SendVal= SendVal<<1; ' N/ z2 V0 h- J& t9 ?
6 G( D0 P: g! H# f% r- O7 }% c- S3 M SCK = 1; . w: N, F6 V6 f* w
_nop_();1 z: J3 C5 H( J0 {: B4 v
_nop_();! w, G* ~9 j& u% x9 a
/ D9 J* S1 |% _5 Z; j4 N
SCK = 0; 5 J6 o7 V+ \# K2 d; `
RCK=1; 3 r" V+ P, v& I' W) z* c- l- e
_nop_();+ P5 i# [( s; W6 b
_nop_();
' f4 l( l& C0 l RCK=0;% X2 N4 F, A- B# E) G4 Y
}
7 n5 s! G% s6 b2 f }
( y' c3 o4 C! V# S$ R. K( i- |$ R1 \- |9 d" e
6 U, u0 l, }, v9 L5 G2 x
( P8 s5 t( G8 T' g( M
& |9 N8 u$ I& s/*******************************************************************************5 \2 L' n+ }) d
* 函数名 : IrInit()8 C! V6 o, c$ f+ O
* 函数功能 : 初始化红外线接收
/ i6 q' v0 U. W# }6 j" g4 {" z& y* 输入 : 无1 ^3 H$ C4 @3 w% `3 i# z& F
* 输出 : 无
. U+ `; ?/ r1 i*******************************************************************************/
2 x; f+ l o7 r9 U# n; u5 U/ A& Y" {% v5 k
void IrInit()
2 L% D8 H! p( v4 d& l) F4 a{
; P8 L1 z2 v) N/ P IT0=1;//下降沿触发
8 p6 ?& ?: `) E) c6 ^ EX0=1;//打开中断0允许
& v, w* g5 n5 X! ? EA=1; //打开总中断
: V3 E) { N) X3 |+ S7 O* V) U' F( Z/ n
IRIN=1;//初始化端口/ E2 b% o6 k8 E0 ^& T
}
: X5 R1 X0 k' E8 r7 mvoid Chaoshengbo()
! S, C; D( x7 T5 T6 x* O{ TMOD |=0x01; //设T0为方式1,GATE=1;
7 [9 j7 N8 b& f; h7 M9 c* X TH0=0;
2 R z' D8 i5 [; w- { TL0=0; ! ^7 D) m- `% h; v, ?; w
ET0=1; //允许T0中断& e# P b' {+ l% a* \& u2 y
EA=1; //开启总中断
/ E" M% F" T7 Z: h }
; Y( s6 |7 c4 r& { ^% l5 ]* Y2 jvoid cesu() //测速初始化* J4 K! }- e) C0 |& V7 T
{$ z# w J. a) i; ? s9 K0 ]+ L' p! j; Z
TH1=0x00;
4 Q @3 U' s4 D$ C- k) p& ^, A. ]TL1=0x00;
% S8 v p3 |! o' g# T- X- iET1=1;' b1 V* o1 p. b! i1 N) _1 T
//ET2=1;) L& |+ G7 q" R4 m
TMOD |= 0x50;// 打开定时器和计数器T1,因此矩形脉冲输入端接P3.5
$ s5 f. v D: {) t ]0 I& H7 k" C5 |, {( v8 W! y7 N
RCAP2H=0x3C;
$ |. ?1 l, ^: ?+ kRCAP2L=0xb0;; F# w# w _5 `% x
( p: T: e$ F% A$ _: T
T2CON=0;
) P3 k* x+ b4 t2 |: W- kT2MOD=0;
% n- }; x# b. E4 T! Z+ iIE=0XA0; ! l6 u( ~/ ~4 w7 a( |
TR1 = 1;
- B8 [+ S2 W. WTR2 = 1;
( s9 k/ R( Y0 Q7 d3 w' m$ e} 6 t u$ T) y; Q
+ g. t9 q# b; k
char scan()
4 u. R4 O" @" U v; N, M& r3 l7 P{ int key;# u( K& w2 |. }4 Q; B" N+ Q
if(key1==1)
3 N% v4 u3 p: x! g6 N* K ^% \/ K { delayms(10);6 K* r+ y% L; q5 V1 e! j+ A3 Q* V3 D
if(key1==1){key=1;HC595SendData(0x66);num[12]= 'q';}
1 ^: F% u, r$ {" t+ L( x# U }
/ {5 Y$ z" S9 o# Z# S9 m5 [$ U. D if(key2==1)
7 |0 c' [/ C# B0 k, ]) a. V# F { delayms(10);7 H4 `5 P5 g/ f6 g+ t& P0 M- r4 W
if(key2==1){key=2;HC595SendData(0x99);num[12]= 'h';}
4 Y% A7 E# I) r8 U2 H1 o3 A* ~4 P }
$ P* Z( S+ ~# p( K! l; B if(key3==1)$ e' |7 D* L; i3 d9 V5 J' v2 _
{ delayms(10);
& m$ _) b! T6 p6 [ if(key3==1){key=3;HC595SendData(0x78);num[12]= 'z';}
# W( G- {" {( G* `+ h }
. W/ ]" }6 I- f+ e if(key4==1)
- ~+ J5 x8 w, Z, b' i/ o { delayms(10);4 f/ T' L( b u, \3 z( n2 B6 G
if(key4==1){key=4;HC595SendData(0x87);num[12]= 'y';}
7 }8 ^/ u3 Q; d4 b* ^6 c }
6 I U' E7 _8 S. Y: d0 ?3 D return key;) U1 f* i7 y. Q2 b- x' n1 }( L( D
}
; Y: G4 s9 H5 o3 Z7 E; @char Judge()
8 P! Q+ V9 l7 p- N5 u$ s{. `) {9 _" D8 j3 Z0 e
char num=-1;( c0 B9 {6 b! D* i0 {0 E
$ h$ O7 l) H# O/ \/ n0 ]
switch(IrValue[2])& A8 i9 K' b& x9 x7 W
{5 B! \/ y; w0 e$ N N% w
case 0x47:num=19;break;
5 h, [3 s) F# V) _$ u1 G- @ case 0x46:num=18;break;; O9 y( \, N. V; n1 c$ W, s
case 0x45:num=17;break;$ v- ? r6 t) k
case 0x43:num=16;break;
8 }& m! {3 o7 \5 X* R# S" d( Z: o+ y case 0x40:num=15;break;& x/ ^" d6 T. }; m' Z( X
case 0x44:num=14;break;- v y Z1 O2 Z9 \, }/ J' c3 a
case 0x07:num=13;break;
6 Y' L1 l. ]; P. I {2 r% ?) l case 0x15:num=12;break;- k+ v4 C1 H, H( m) i1 P. Z" X
case 0x09:num=11;break;( k' N' X _/ @7 y7 h- n" M
case 0x19:num=20;break;/ p! ^ G. l' @
case 0x0D:num=10;break;
- W, D& [& Z2 ]( K; v( \ case 0x16:num=0;break;! O! U! K7 f6 M% E% I+ M
case 0x0C:num=1;break;
9 o" p# ~+ ?; ~/ A1 N case 0x18:num=2;break;
( N3 C6 C; I# X/ E5 T2 p- M- ^ case 0x5E:num=3;break;% |8 s" T M% J2 B
case 0x08:num=4;break;
/ v; ]4 ]# Q& [+ g case 0x1C:num=5;break;
. h/ A9 m& ]( z. [: \# Z- |. U7 } case 0x5A:num=6;break;
: {% K" q+ W' V. Z3 n, c9 A case 0x42:num=7;break;
4 A( ^- A; w: Y, P: |! ?; ]- W case 0x52:num=8;break;
3 A% |1 n+ u$ p! E8 u% O0 F* N0 U case 0x4A:num=9;break;
3 D3 m8 J$ \9 o; S7 \' v4 U default :num=16;break; //
+ @" ]! F* D' @" u; y& q0 [) \ }- U @) B6 U( u7 Y/ u8 }0 T
# h' p0 H3 X% Y0 R3 k
return num;
\" X3 D' I$ T/ j7 _$ C' h, N 7 M' d9 A# @3 Q( I! ]6 `- k
}
' H) V4 J) M. Q$ j/ }& v9 e; S$ ~int Conut()
3 U$ L$ E9 K8 C' q! Q { unsigned long S=0;
1 W6 c0 d9 l5 L( {5 g$ O) d, D7 i2 G7 t
8 k1 w& A: V2 ], I/ d% z1 ]& o while(!RX); //当RX为零时等待
3 o* }3 }" f$ i- J7 ?; V' O4 u/ j TR0=1; //开启计数
' G: m: Q4 Y6 K* ^+ Q$ l while(RX); //当RX为1计数并等待7 A y0 k7 N' N
TR0=0; //关闭计数
; J4 F4 q" R7 q1 l- E 5 t3 ]+ A9 _/ m/ L
time1=TH0*256+TL0;# F6 b% Q* w5 C2 D
TH0=0;
# a8 [( U5 o% g" T/ g0 i! z" i: H1 E/ B' Q TL0=0;
8 o$ H6 X+ n$ E3 V
+ B6 o' ?: o1 F9 u. O, q0 Z& v4 J S=(time1*1.7)/100; //算出来是CM
; R9 C5 `: e5 v' E1 E7 p0 S
- F# M+ t( D2 @. g, [ return S;
/ ~& R, [6 r- E0 Z }' n! w( |4 P3 J0 {: P! U+ x
9 r, x+ e8 Q& N# V7 O% q+ Q# ~3 f% L# k7 Y0 @7 L: B
下载:
( P( Q" X8 m4 v; {/ _% G
2 g; b! y3 P9 u |
|