|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机控制舵机左右转源码* }( Y; [4 Q) j0 u7 T' q
! J, c. R# ^: `7 h3 U; D& M5 f& b) e
/ w3 |0 |1 h8 S6 z+ X下载:
u2 u% f4 u. G7 _% x8 j6 |8 n! R$ p; _9 g& e d6 V
& J5 x* Y+ ^8 z. [2 o- c* s* @& C) \
. j8 _$ W: c# Z3 Z预览:- I+ ?2 P! o( b, C
/***********************************************************7 @9 {) A( \; \$ A
版权所有 :河池学院创新实训中心(2/3),刘欢(1/3)
/ w( b( B K# k1 A: Y N9 H程序功能 :舵机控制
$ `& u) K( I& V. ~8 B. O9 f4 y. h: ~生成日期 :2009年10月30日 星期五. G4 `$ d/ N% b3 `6 E2 I' s5 f
作 者 :刘欢
; l, k) G( n/ A' d7 p: Z联系方式 :(QQ)281638360 (MSN)sundayboy@live.cn
* J1 U! I- b" n" [: x3 i& c说 明 :51单片机控制舵机,按键实现左转、右转及归位
6 R J4 y+ p4 q 占用定时/计数器1, i* F' \4 z3 U0 |. N9 O
************************************************************/
6 }2 }- f8 @% x( ]4 U
) V8 R; S1 E8 v, j2 x#include <reg52.h>. i( K) o, {% ^1 j( z' S
#define Stop 0 //宏定义,停止
3 E: q- n) w/ Q#define Left 1 //宏定义,左转
, S; V9 T3 y7 [1 V; K#define Right 2 //宏定义,右转
5 t: ]/ d6 B1 `6 e8 N
. f+ N$ Q i& b# {7 Z5 m/ E4 h. j U% U( g' u2 r7 C, c, B2 X
sbit ControlPort = P1^0; //舵机信号端口7 \6 B! ^6 K4 ^" h1 @3 @
sbit KeyLeft = P1^1; //左转按键端口9 ?+ |7 g- |9 m1 M X4 f
sbit KeyRight = P1^2; //右转按键端口
/ C' J4 ~% o% p& J' ~% T- k2 Msbit KeyStop = P1^3; //归位按键端口
& n% B5 Q4 x. H( Y: Q, }9 V! l1 e
1 K2 a* B& V$ E+ l4 e$ A- ^3 e, zunsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志
) W/ @ _/ O$ ^9 }. B" p7 \) X8 N& M+ F6 I/ U
void InitialTimer ( void ) 9 L# [' I" \ W& {. m
{
5 x$ y% T4 I& {! I1 p$ ] TMOD=0x10; //定时/计数器1工作于方式1
' n, q! x: U0 w7 C TH1 = ( 65535 - 500 ) / 256; //0.25ms
' {' p' c; u$ C- Q M# ?3 E TL1 = ( 65535 - 500 ) % 256;
/ q' z; M- O% Y6 {9 A EA=1; //开总中断
6 }+ ]+ x( ~' X3 O. E ET1=1; //允许定时/计数器1 中断2 ^, h5 V ~2 K& ]& b
TR1=1; //启动定时/计数器1 中断
9 U4 |9 {$ F* c2 ~. E. L5 B}1 C" }% i7 q5 w, f
* d3 W5 x7 k' z# f/ u1 Pvoid ControlLeftOrRight ( void ) //控制舵机函数
0 ~& ^& N4 N- ]5 K# ^- w5 j. ?' n0 M6 L{% z( @( `' ]4 J& `( R; T. G
if( KeyStop == 0 )0 m p. [' r1 h' b) t# D7 h
{7 y4 K- |( \5 `
while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到8 c4 s9 d9 Z% e& R
LeftOrRight = Stop;& b3 B2 w! N# i! R3 H7 Y
}
3 [2 M) ^1 ~; B- g* b8 I2 U3 ]" C+ \- L/ R( f5 f
if( KeyLeft == 0 )9 v1 P d* A$ E
{& t- M9 z) w9 Z
while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到
, f+ m, C% k! R+ A1 u3 H LeftOrRight = Left;1 N! S% [1 Y8 X* b& Y
}
4 C, I1 F+ `! \! h/ }7 M% i4 H
: ?8 h$ i" t+ z$ H9 W5 X if( KeyRight == 0 )
3 a2 ^$ @4 L4 z+ o {1 u3 [5 W# L ?/ I! O* S1 b% x) p+ E
while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到
1 |/ c' d* ]& g$ }& ~( | LeftOrRight = Right;
8 ~' {8 L' s: D" A7 o; m }6 `: O8 p1 g5 ?6 R3 a+ Q
9 E* J$ j- J, z0 H# M4 C
}' l1 W! S W! m
! C. t0 h" X; {0 tvoid main ( void ) //主函数
% Z+ N, h4 I6 i, I5 \. U! {% A. `+ w{
. x5 R% E7 o1 d$ h: q- Q InitialTimer();
3 {0 `8 S+ o* e for(;;)
6 l5 s5 h! u; F) Y: N O {% {+ J( A: E. M5 Y; Z& S
ControlLeftOrRight();
" G3 W- [. T# ^+ U* ]3 x8 j h }
- A5 V* F9 `$ t. g8 N}
" f0 s6 p$ r/ D) w0 X% C$ K P4 c: d. P7 g7 X: T
void Timer1 ( void ) interrupt 3 //定时器中断函数
8 `$ {3 N; h* z: v{9 U" W+ s Q/ z8 N) M/ y& ]' ^
TH1 = ( 65535 - 500 ) / 256;: f. a4 H1 z" _" r( U
TL1 = ( 65535 - 500 ) % 256;
+ f' j1 U& I# j$ F1 j: K TimeOutCounter ++;1 }: x3 n* Z/ n/ T" l$ Z1 `
2 p' G, [, x& T9 Z9 x$ q) D switch ( LeftOrRight )
: A8 U" b: h0 Y& P: r {/ U# W2 Q: w2 ?6 E. F+ Q/ Z! ~
case 0 : //为0时,舵机归位,脉宽1.5ms
' L& B9 u6 p2 m3 H {# F. U+ x+ l7 Z; w
if( TimeOutCounter <= 6 )' \8 d7 n$ q& R6 j3 t
{
5 }, D- p4 l0 e; E: Z5 t7 q0 v ControlPort = 1;
0 Y' x% M$ m6 E* M: N7 y9 l! Z1 B& j }
) X9 B Q4 |- w( P else
1 O1 p: e+ ^; s/ R, t' t {
1 ?7 T6 H- c/ L1 C6 S7 j" | ControlPort = 0;: e. _. `; f! r, ]& b+ u4 I: C
}: `1 Y* d( N" Q S+ a' c8 M
break;6 j# W+ H; \6 q1 L2 L
}; P$ C8 G' Z/ _& m
case 1 : //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出! D. C/ P; g4 d: i
{+ s! K4 t, I @" K
if( TimeOutCounter <= 2 )+ S, \8 |, U& n
{
3 ^( C# `7 D4 j5 f ControlPort = 1;) I6 E: T$ T9 T0 y, \5 @
}4 V. U( s% {- T! E$ P
else 7 Y: c/ K; g! H, r
{9 z$ @8 c, |' O4 w: v4 h
ControlPort = 0;5 h8 U8 ?- S% j& U, D8 ?3 u
}
q( Q6 j$ r- z) a/ v$ ?& z8 e break;! E3 {7 j6 q; J9 N
}
6 Q$ L( {0 W8 P& @- M5 } case 2 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
. E( l/ M. m5 t5 { {
% c/ C7 W" l, C( t- d% |8 o: l8 d+ R& a if( TimeOutCounter <= 10 )
. Q' k! \& ~, w: m {8 P# `$ y/ K! a+ l
ControlPort = 1;8 f6 ]" N* ^# D6 x
}
/ u W4 ? {6 a else . W3 J" o1 ?. L! h. o" Z/ l' {
{+ U n; o! O1 l0 }5 S
ControlPort = 0;7 {1 B2 I' C2 ^) I; D6 U5 x0 ?
}
$ E8 U- t; Z) B2 w/ t+ M2 N break;
' A/ H; [ R( F- T: A) j; I }
( j( B: N9 z% ?$ Z e7 V! ?! t5 r default : break;" \2 e( }6 c- B: z8 W
}9 A% {8 F: b9 @/ l( V" c
1 i* ?" s3 S$ r1 N5 O
if( TimeOutCounter == 80 ) //周期20ms(理论值),比较可靠,最好不要修改
9 [3 b' G# i. w: b {1 c) F$ o% s; g: c0 ~+ K0 b4 S
TimeOutCounter = 0;
0 S# X+ x% n% _4 e8 z) R H, N }7 K" B( q& d2 H. t U
} A) @! z B+ b4 D# K$ Q. J
( x! P4 }2 ]+ s4 C7 `
|
|