|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
红外遥控循迹超声波避障跟随光电码盘计数测速五个中断智能小车; F& ] w3 c+ E+ N
) Z! Q o/ W# O* C
+ n/ k) _5 R& _. i通过红外遥控,控制小车的方向,通过循迹前进,通过超声波跟随。通过光电码盘计数测速,把52单片机的五个中断用上了。。。
) l5 s* Z, T4 ?ryz学习! I5 e4 z4 K; U* }# A- `$ i
( d( j- z0 P N9 U1 B) R
单片机源码:, [0 d, C. P" l# p( `
#include <intrins.h>" Y# |6 }/ g- L; {
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器. L8 V2 L; M4 A1 v. k4 J
#include "lcd.h"
. y) C5 h! Y- `0 ]4 }1 d: o3 ?#define uchar unsigned char
! ^- e: g# H& B2 _7 k#define uint unsigned int
( p9 z) O( P7 a2 |sfr T2MOD= 0xC9;
8 g! L$ b' n$ G5 z8 j8 y+ \typedef unsigned int u16; //对数据类型进行声明定义
9 @9 f- c# u+ ~, B9 b( \- \( N5 _6 ytypedef unsigned char u8;: v, b: S" Q3 {
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};" a. S2 z8 ~& l& }6 i
//p0,25,26,27 lcd16026 e1 q% H1 Z# ^/ d! N! U) G% ^
sbit P10=P1^0; //寻迹模块左
8 @3 C% r9 U9 f( Osbit P11=P1^1; //寻迹模块中% o: w9 R; p/ H+ s7 z
sbit P12=P1^2; //寻迹模块右
7 O( S# j( h: ~- Usbit key1=P1^3; //无线端口
0 O5 R; W$ q* Z3 T: Nsbit key2=P1^4;
g- o( o# e. U; O! `) Ksbit key3=P1^5;
4 a% F+ i& u4 I/ F6 L$ A! Bsbit key4=P1^6;* c) i3 Z; F" {* T p; u( x7 G
sbit RX = P2^1; //超声波端口8 G* [/ ~4 y+ O/ X2 v8 u+ a5 h
sbit TX = P2^0;
, A* @( J! e9 o% J" Q; {* |0 T( Q+ Ssbit IRIN=P3^2; //红外端口
v7 Y$ x. v* D: s' k$ y* s //p35测速端口
/ Y- i4 ?, P: c! O
; \6 [/ X; f1 S6 z/ k' qsbit SER=P2^3; //8 电机驱动端口7 ~- K5 z" K0 ]
sbit SCK=P2^2; //4 en=0才工作
; D- W! f. }8 O" Tsbit RCK=P2^4; //12
1 T$ G* q: m+ ?( n. H" {% Y//sbit PWM2A=P2^3; //未使用 低电平有效 12
' K. n9 H1 K4 f+ b0 h3 z! z/ G//sbit PWM2B=P2^0; //未使用 低电平有效 32 j6 }+ Z* O% G9 d
5 z4 h, v0 j7 ]/ |$ o0 @+ \) O6 j
unsigned int time1=0,kop,mm=0,s20=0,s21=0; 8 d( W1 V: L, J+ l R5 p6 b
bit flag =0,flag1=0,flag3=0;//flag 超声波超时标志,flag1,循迹标志,超声波控制就不循迹。 : f3 ^9 h: k( [3 B) _
u8 IrValue[6];
; Y% E8 e) ]- p+ P; s- v) ~2 \u8 Time;
" S- B7 _2 ~4 ^. u2 @, p: Z
8 M+ Z" C% r C7 P3 ]- F5 b& l4 v# x3 s7 K0 w# h+ O
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码& r3 G& b( }( n) ~
char num[16]="CODE: DIR: "; //第一行显示的数据
; f# j4 Z7 X9 t' v2 `# v9 O% \) V% fchar num1[16]="IR: . / . "; //第二行显示的数据
; U8 K: T2 g4 B* s1 U/*******************************************************************************- X0 r6 `! O5 o
* 函 数 名 : delay! I9 O6 B" |0 a' y
* 函数功能 : 延时函数,i=1时,大约延时10us! u3 j' H' G# G( \/ O3 e7 @
*******************************************************************************/9 }! M6 d2 G9 y2 o, E
void delay(u16 i)
7 @9 O) \' X5 I. Z; \/ N4 a{9 b2 }3 \4 U7 x. B. g+ `
while(i--); 8 X, C4 o: M+ T- u6 r6 ?/ H
}
8 T0 a- z0 C. R evoid delayms(u16 i)//i=1时,时间为1ms
" \$ L8 B4 P7 \" o0 o8 d+ g4 m{ int q;
7 Y- U" K- S- E for(q=0;q<i;q++)
7 m3 t6 s+ {0 J {
9 K6 v9 k; ^% l& f5 W5 u delay(100);
9 C3 d- y% i! |+ ? u* ?7 L0 ^ } 4 U8 V/ I/ s2 K: R! x# p0 e
}
; G r0 D d3 @. K3 O# {. @" ]) m+ v
4 h+ ]- \, q' {( w) R) ?
void delays(u16 i) //i=1时,时间为1s
4 t. }. |) O% J2 s3 F# ~{ int q;0 m3 }. t8 S( `' j
for(q=0;q<i;q++)
' }2 h, t! R, A( l1 b {
# y' o3 z, i) w1 V/ }" Z. B [; ~- U delayms(1000);/ L- \& ^ ? @) o" ]
}
# d' P/ M8 J) g# C* i2 y7 D& ]}- v9 z; m; `3 |& {% o: p& F
2 L/ W$ k0 | q# ~; H3 ?
0 P: S& P, h j6 M3 M, w& T) y( r
8 z: [& D% H, B; p4 d) |! N* j( P! ~# G- t }% W
0 G& J4 i( I) \/ T% t
/*******************************************************************************8 J5 J" c4 R3 ~* P. I3 M" C
* 函数名 igDisplay(): [+ g' k3 i2 E" [! W. A
* 函数功能 :数码管显示函数( |- g4 R6 \# j! I1 B$ y. ^9 W) ?/ G/ W* _
* 输入 : 无$ z7 j2 s& I! {7 M% M4 A
* 输出 : 无
+ K$ X4 I3 D9 [; ~! n1 q7 f- n*******************************************************************************/
6 K9 k% _7 j# [5 a& s% ]8 _
1 ]2 Y& c5 j- h6 ^3 i5 \/ P4 kvoid HC595SendData(unsigned char SendVal)//发一字节6 q# P2 }7 y) M# R" A9 C
{ % I8 _! {" o* v4 j# \( f
unsigned char i;* H& M Z; D; a: w; {# O
for(;i<8;i++)5 |2 C, B" j% s1 J% w
{
$ I& P5 j. ?' d: d, ?% g( H' J SER = SendVal>>7; * z: u+ F1 h& ^' x$ M. q
SendVal= SendVal<<1;
* R7 B Y P& ^9 R2 B. N% f) g, y8 u2 a
SCK = 1;
( u* K, r1 l8 g4 J4 _2 B _nop_();3 S- o* G! Y! v$ \- ?/ g
_nop_();
) u+ |# t1 i$ J/ v2 q, u$ Q, }+ ]% K
SCK = 0;
* O- z1 ^4 b5 z9 Y9 x RCK=1; ! l4 ^% Q: y+ [, u- ^# L3 Z7 l
_nop_();
- k0 k. @+ U# L3 P% v7 l6 _! E _nop_();7 W1 F8 s( E2 E' A/ \3 j8 G
RCK=0;. B* S- Q7 V! Y I
}- x3 \# E, c8 @. X4 C
} 4 E! ]& O- X: ?3 L/ k4 b
! F0 x) V0 [& W) B
& w9 z: z- c1 s) v- v9 V# ~
3 a: s5 T" _% W3 Q; V( F
! k" A4 L- f3 p/*******************************************************************************
2 o$ K( Z2 u5 Y( N+ h' p* 函数名 : IrInit()5 k2 I) P9 o- e1 x
* 函数功能 : 初始化红外线接收
# X" g5 s* K! r# J; L* `6 ]; P0 u6 Q* 输入 : 无1 e: x9 k. z8 i: ^3 L
* 输出 : 无
. ?) L! K+ D4 R" z5 {/ d; h*******************************************************************************/( m' ?8 }/ x% {/ c5 \5 n0 O" ?
' ]4 l- H! K8 ~0 X9 i
void IrInit()4 d0 h* `* H) G0 `0 `- ^: |, v; T
{! h p4 c! e! U+ N4 L# D
IT0=1;//下降沿触发' _ y- K- E& @+ b6 {
EX0=1;//打开中断0允许 `- v/ _$ N) Q
EA=1; //打开总中断/ d, ]0 \5 [& E) ?' P/ o: _
A# A8 p3 A2 y; [3 X/ M IRIN=1;//初始化端口# H2 Y: G( V9 |: ^) j# J
}5 {5 H9 S: t: l# [2 Q
void Chaoshengbo()
W1 N* f3 j* r) {8 N{ TMOD |=0x01; //设T0为方式1,GATE=1;
" E. K! O2 B; H% |: |. X3 F/ h/ U9 c TH0=0;" N1 m& A) t1 G6 L
TL0=0; 3 P3 v2 [1 o8 D! B0 x
ET0=1; //允许T0中断! d" Q" U2 p- `+ x9 C; x3 |* g
EA=1; //开启总中断 . d D* T/ n P+ f0 k9 c- v
}4 J% J, z; A* T% j( \
void cesu() //测速初始化
% Y: ?' l5 V, y. }2 v{* r+ G8 u+ }+ T, Y$ F& G
TH1=0x00;
5 |1 ?6 H7 _' L$ x- @TL1=0x00;, d! j5 `7 T& q, K4 Z. B
ET1=1;4 i0 O. P* M0 F/ x% S9 Y* w
//ET2=1;
! } g9 O. J0 v8 c8 _8 l- kTMOD |= 0x50;// 打开定时器和计数器T1,因此矩形脉冲输入端接P3.5$ w: ?. U1 q) f3 @' J& t. N
# Y/ W/ G/ v* P+ Q9 M; p7 bRCAP2H=0x3C; 3 E1 W+ |+ S( N4 N
RCAP2L=0xb0;' N6 f, X, @- A$ U1 ^9 E
0 p0 n1 h) ~* i+ k/ N
T2CON=0;
# [! h* G+ l$ f4 zT2MOD=0;
) u5 Z( b8 ]# l2 v" G( H K3 S. tIE=0XA0; 2 k7 O6 Q2 L) S
TR1 = 1;. @" ]; m1 N/ R( `1 D
TR2 = 1;; P7 g7 G$ p0 G0 R0 {& ]
} , c: h! p1 J4 e9 k7 p4 P6 ~+ P, p
1 `' a) d/ S4 y; h+ y6 {' z- b2 D
char scan()
0 }5 ~) d% ]# C3 t! m{ int key;
; p. j# q$ a* j7 A1 T5 I if(key1==1); [1 W, X5 q; y* O: |) }$ s; x
{ delayms(10);
7 X! m& Q0 E( }5 {) E$ s% U, t if(key1==1){key=1;HC595SendData(0x66);num[12]= 'q';}
M5 [6 j& h, T; ~$ I }
+ W m6 Y2 Z2 I. V" k. m3 Y if(key2==1)
& v' M3 q P3 a: v. a6 | z { delayms(10);$ g% ?! A& V( _7 P" h2 |! F- ]8 ?
if(key2==1){key=2;HC595SendData(0x99);num[12]= 'h';}
5 B1 a" o0 e7 H! N9 } }
1 g) {0 e; z: r, E7 s; [! d G" [4 | if(key3==1), ^1 p( w8 Z- A6 Q2 S# k
{ delayms(10);7 l3 u. x8 ~3 _" {! F0 V/ U7 V1 n
if(key3==1){key=3;HC595SendData(0x78);num[12]= 'z';}# ^3 y# @/ v# \( b: D
}
4 d' |" I, s7 R* x. v1 M if(key4==1)
9 c0 ?4 d& j0 ~) X( s { delayms(10);' [; Y3 F2 R+ @, N: x: x
if(key4==1){key=4;HC595SendData(0x87);num[12]= 'y';}
. c/ E( X- g* [# x7 ]4 Y/ X/ T. ` }2 G Z" B3 q8 X5 y) l! y7 T
return key;
# }* v3 X5 k4 R1 v+ b" N* L* S& s" v}
! f4 h5 t _; d5 |! o, Hchar Judge()
, x( F: b5 K0 C8 U# w: \3 y{
+ |$ t* u# _ h# W- x& k char num=-1;
1 c, J6 |3 q' z. ]
$ _$ u8 c6 P3 H. R# k# j switch(IrValue[2])
8 w& t( _, X8 m: P {
' ]- [; }" V/ k case 0x47:num=19;break;
; C2 M6 \+ r0 k. N3 g case 0x46:num=18;break;2 H' F7 j7 E0 a5 `$ z; z% C; z
case 0x45:num=17;break;6 q+ O5 H* S- Z4 z. z: `/ n
case 0x43:num=16;break;
/ ^; V9 F+ U& O$ p case 0x40:num=15;break;: N1 P; q6 J1 Y- b; h
case 0x44:num=14;break;: n+ V0 t) y8 P9 q
case 0x07:num=13;break;5 q x- C7 B- |1 X
case 0x15:num=12;break;2 U6 c! i5 z! n# k) t
case 0x09:num=11;break;
. x9 R5 y: `* F/ p case 0x19:num=20;break;
4 M1 C. s8 [6 C) A" B: S case 0x0D:num=10;break;) _! Z& Z2 a% _4 o9 s; v1 @
case 0x16:num=0;break;5 Y2 F: t$ E) P
case 0x0C:num=1;break;) [, Z# } v! ~- u
case 0x18:num=2;break;
+ A v5 s0 A- Y% G# n case 0x5E:num=3;break;
, x" D1 R8 _3 b case 0x08:num=4;break;
% L2 b. R$ c. Q6 j case 0x1C:num=5;break;. }5 X, a) \; L
case 0x5A:num=6;break;
" H) c, I1 a& q case 0x42:num=7;break;6 y J; ?) V/ r1 L+ C- p) E
case 0x52:num=8;break;
$ Y( q% T# \5 @8 v4 r case 0x4A:num=9;break;
5 v9 e# J: u z: U; M default :num=16;break; //
3 V7 v. y. S: J4 F% v( z, B }- G5 p9 Y! X$ B. @4 V/ |
& w; B T; E1 S6 c, `: q7 q$ [
return num;
! `& T7 e) |' D5 E; ?
( {( ^5 s, ~! v6 h, i; D}- `0 C+ Q0 \4 U# j! {% u& y: U: h
int Conut()
/ p& N8 c) R3 x) z { unsigned long S=0;8 |2 j0 V! l K& y! K4 ?
! K* v4 y, a8 ~1 u3 \ while(!RX); //当RX为零时等待' L7 E' U1 c( N% f, o
TR0=1; //开启计数% M# S2 T7 r) v# @
while(RX); //当RX为1计数并等待
0 r ?8 Z, g! } TR0=0; //关闭计数' u; I2 k b/ M4 z* M
( d6 U6 {% k- |" a9 X5 Y2 T
time1=TH0*256+TL0;9 w7 E4 `# ?$ Q" R: B
TH0=0;2 J% B: j. h( `
TL0=0;7 d i% [. O/ k9 k3 [9 S
" b( i$ k* T" i4 p. p! U X5 D S=(time1*1.7)/100; //算出来是CM. h, o/ x& X0 x2 g6 H
) Q5 V2 k, p8 n) @8 M
return S;2 C# H# D0 J9 n; m
}
7 M& ?0 d1 M. r& |$ b6 a7 [( |) [; c* h6 h
$ A7 v3 {' s* A3 B( N6 v下载:5 r$ W5 Z" n( }) V. q! h* G) l- N O, T* F
: G' }% d1 }/ U+ [! ^- ], j* r
|
|