|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机控制舵机左右转源码
% \! h1 p8 V6 G( j9 u
C- e& K6 T( j; I, k3 n( K
( C& `$ k/ \9 r3 N y& g% Q下载:
: h% e6 S7 p0 ]$ s8 u3 X
5 C% {( C+ ^: B, e$ |. C7 z: m" z# v3 p4 Y J& X
. o) t v/ }% P
预览:
0 W/ g1 k( {( d9 f2 ?/***********************************************************
2 C1 z% S6 t; a# ]. G6 x版权所有 :河池学院创新实训中心(2/3),刘欢(1/3)% w0 _0 `9 k0 \3 Y/ o) _
程序功能 :舵机控制
4 w" K2 K: `0 g生成日期 :2009年10月30日 星期五
7 E% d9 g x+ `3 u: F" M) e作 者 :刘欢
1 R+ {0 X$ E5 w3 C, @& @联系方式 :(QQ)281638360 (MSN)sundayboy@live.cn% Y4 v) x/ k) c; L! j( A
说 明 :51单片机控制舵机,按键实现左转、右转及归位7 m8 n& C# h; p9 ~! C1 w2 S! j' A
占用定时/计数器1
0 D! R& C7 x M# V************************************************************/
0 n* D6 j6 j# Q9 {& x( n0 t& o% m$ }% n, u! M1 H; _4 u/ j# L; H
#include <reg52.h>
8 J9 f' c6 k' ]! ?& e% A. D#define Stop 0 //宏定义,停止3 J9 Y3 b( @5 S. d9 _) G m+ c4 R
#define Left 1 //宏定义,左转
' l5 w0 x- T! l! X/ t, ^#define Right 2 //宏定义,右转7 N- L2 b' O: ?( @1 W a9 H
. o- I7 O& s4 H) s4 V. ~
4 l5 b, I2 b. M+ k9 a( zsbit ControlPort = P1^0; //舵机信号端口* _! E# ?# j) a& ]4 Q' i5 T% }$ r
sbit KeyLeft = P1^1; //左转按键端口: ? X, ]( k" i
sbit KeyRight = P1^2; //右转按键端口
) r( z+ q0 t+ r- Zsbit KeyStop = P1^3; //归位按键端口. Z/ V- l- w" I5 q
5 d4 Q. z Z$ W7 l( Bunsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志, O2 a& ]& L- ]4 e* \$ b7 S$ Y
+ B# e# a$ {( w/ c0 X' N0 O# Vvoid InitialTimer ( void )
1 Y( w+ q+ s2 P3 Y: F2 [* Z{
2 D; a9 C% l7 p8 J TMOD=0x10; //定时/计数器1工作于方式1
; ]7 V: a0 f( ]. } TH1 = ( 65535 - 500 ) / 256; //0.25ms
3 D7 z: h* ~$ @0 P" E7 [0 W TL1 = ( 65535 - 500 ) % 256;/ K/ p* K$ q! |/ i
EA=1; //开总中断
4 ^3 t+ `3 M/ a ET1=1; //允许定时/计数器1 中断8 `: A- ^, u. H/ a, p
TR1=1; //启动定时/计数器1 中断
) q. w5 k+ w h. o}
. `7 G4 ?! m9 r7 o2 f5 O: w6 B) k: ~8 Y) t$ [% n
void ControlLeftOrRight ( void ) //控制舵机函数
5 S/ w' m" H0 t5 @. E4 n) v{+ k% O5 A. o# u( k( N) _
if( KeyStop == 0 )
/ r4 S" Y, J8 V: F7 F {
9 {3 V3 d' Z& \ while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到
! M$ P: O+ q9 V' F4 J; j LeftOrRight = Stop;
- i# }+ |& C( L" n1 _$ t7 m }
& X# @8 `) N8 G8 z3 K; D2 O
8 e9 ^9 _& g5 z! K: \! w: c6 W9 @ o4 ` if( KeyLeft == 0 )
, f/ B; r7 f5 W$ W4 D/ F {
0 r* P- \, T8 s: C* }3 ` while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到% Q7 \6 `5 t" O0 O
LeftOrRight = Left;
" |' L8 `8 H$ ~! R/ ~2 K6 l0 L d }
& M7 H& I: V: o/ \% k2 U" @+ q( F
if( KeyRight == 0 )! F# D. @8 } O" m/ I$ q
{
2 D' ~! c8 L6 `9 p while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到
1 E9 }9 B- k9 a! \ LeftOrRight = Right;
1 b7 Z. R1 \8 A }
' ]8 [/ r4 F. q' ~, r8 U6 U6 a6 G) |. g4 I
}
2 J5 O0 p# I; Y; q% `3 W$ ^! k G
void main ( void ) //主函数
, H* l0 `3 u) P& e ]{8 D5 s! z" ~5 {/ l% V1 l. d2 t0 c9 @& \
InitialTimer();3 @( T. J" G. i: g+ c
for(;;)
5 k: q8 D7 l8 r. u& a- N {
! n- N) W: Z& D' `, o' n% n7 y ControlLeftOrRight();& l9 U$ J2 Y: C0 V/ {3 |3 W
}
# F$ N. R2 o, c- M0 ~8 }}; ~) P5 `) \+ P9 h1 ~
7 k3 m0 |( B; P" q1 o, nvoid Timer1 ( void ) interrupt 3 //定时器中断函数
! z" X2 m" f/ l: T{5 @' n1 ` ?1 _# Y R \
TH1 = ( 65535 - 500 ) / 256;" h, I* K' u- h% ~$ ^& p
TL1 = ( 65535 - 500 ) % 256;
; k! j0 D: S7 k6 z TimeOutCounter ++;0 M5 r& Z0 W l% ]) E# Q
* z4 u: [6 ?6 v1 }: x9 { switch ( LeftOrRight )
0 ^; w, M* @8 J0 R. J7 [' K/ m {/ }4 c7 k, @2 ]: L2 W% z3 H0 [
case 0 : //为0时,舵机归位,脉宽1.5ms% o3 S) X& V* Z( W8 O8 E
{
* M1 [1 i6 Q) ?% ~* s; I if( TimeOutCounter <= 6 )) F W5 J! s2 { b8 M4 U+ S/ N
{. V% N+ w7 s7 U: K/ R
ControlPort = 1;( f, t3 Z/ N. k8 ?, A' C
}
- [' o8 n0 B9 j7 v: S else
! ]" |' W9 T4 Y- ?- F# p& | {0 F. u8 i2 ^$ k! Y4 p7 e
ControlPort = 0;
) t$ F/ f3 H, B$ m K$ ~& C }
; O) y6 ]; K7 D0 h$ k8 |, ]( R* c; H _ break;* f) ?( p+ _# u' b
}
7 W$ L3 r1 \8 l# K2 x case 1 : //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出3 G. z0 `; w1 x, V5 b2 K$ E
{' e6 m1 j8 i# F6 Q
if( TimeOutCounter <= 2 ): q' W9 Y2 T% Y
{
2 D+ w8 ]. l9 h( M$ x ControlPort = 1;
4 Z/ i9 x5 D) d- _: H- f( I }
: C' _4 a" t+ C else
0 @; f! T7 K6 I/ _7 U6 Y {) v s6 o3 Z6 o4 ~; r
ControlPort = 0;9 A; G3 B. `3 k2 @( h: d5 e
}; X1 _' ~6 R; D" b( W" g
break;8 U2 P$ A) o! n. D
}- m& G0 m0 k4 H+ f4 \' m t
case 2 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出& d' r$ V* h% |( g- p6 H* F2 O6 W
{
: f, ~/ Y/ |4 E. o+ W if( TimeOutCounter <= 10 )
6 X3 ^& y7 A0 E4 h8 D* k i( M; d1 p' q {. e% c( g5 K7 l0 b
ControlPort = 1;& m. |9 X5 {1 T! n7 L* E8 Z) G- Z
}
' ]" n+ m' F5 {) m: g( W else
9 Z% I2 \# |; s {
+ A- c# p7 H2 i5 E8 C ControlPort = 0;
* A+ n+ Q# X* Q( U0 R }
6 i9 v& w" D0 ^ I$ `4 I/ O break;. f% s* _9 W" Q
}) ^: |* T& y L( a
default : break;
/ p1 K5 N3 T) J Y }: F9 G$ ]0 O K/ j' M9 H! X0 @- s
1 z$ i% Z7 ?3 E if( TimeOutCounter == 80 ) //周期20ms(理论值),比较可靠,最好不要修改/ C9 U$ D/ c5 A8 T( j' l
{
$ v. ~4 t. D" ~; b# ?3 i6 b' q TimeOutCounter = 0;, K! W( y1 R$ H. V# `9 r9 o' C
}8 H* {: f' y; l/ W; z9 |
}
% u. k2 c3 X' N3 E: {$ M* z; E* C2 w) |& i2 P( n! b6 }; S
|
|