|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机控制舵机左右转源码* O% E5 ?5 f6 [4 ?8 G; i
+ `7 m2 K2 M( \7 L: i/ H
# j: g; ^! a9 r. h* u; }下载:
6 C& b P- M; c1 w. c8 b0 s; ~, _- q/ H( x# T
2 Q- e, e* l! P F8 E
5 ?1 `9 A8 I, ^) [; C- N+ M6 v$ M
预览:
5 e' W2 |! @; ~5 p- @+ n3 `/***********************************************************
% h# A; L% b% N4 B4 g1 g" q版权所有 :河池学院创新实训中心(2/3),刘欢(1/3); z$ Q, O0 D: p6 i/ e
程序功能 :舵机控制0 c; Z s# A3 o: A4 E' A: E
生成日期 :2009年10月30日 星期五 J0 E, c% Y; ~7 F( v- W# i
作 者 :刘欢
6 }! n0 M& T7 c7 s0 _联系方式 :(QQ)281638360 (MSN)sundayboy@live.cn8 @0 |4 E6 h7 l5 a/ c" y8 o8 p* f
说 明 :51单片机控制舵机,按键实现左转、右转及归位
" _; D8 |6 v6 Y' W/ b/ `1 o 占用定时/计数器1
: A% s; n5 P! y************************************************************/4 ~ d. M* U3 z# Z; m2 F
& Z- [) p7 U( t#include <reg52.h>
7 ?8 j A/ q% b6 D; b$ M#define Stop 0 //宏定义,停止
2 L' Y* Y; E( u& N+ w) i#define Left 1 //宏定义,左转
+ M: ~9 s; {/ j6 ]6 U( k& x3 `3 Q f#define Right 2 //宏定义,右转
: U3 G6 a: K: T% E! }1 r' ^9 x9 [9 `
: b* G1 G2 Z( C( A1 a7 W/ b; n! T9 Q" m" X% c7 x4 _
sbit ControlPort = P1^0; //舵机信号端口
+ R0 D( h7 p k# T$ b) r& Lsbit KeyLeft = P1^1; //左转按键端口
5 p' t w) L/ v4 U+ L: G- Usbit KeyRight = P1^2; //右转按键端口, L& S7 b2 _3 i# C+ v) E& c Q
sbit KeyStop = P1^3; //归位按键端口
( u. F4 M1 ?% B1 l6 H' a3 V. E& o: s! i6 H0 S% W# P
unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志4 O8 p: Y p& J" ?$ }0 n* }
7 Z; L: g9 S( Evoid InitialTimer ( void )
# \: k/ n% Q9 ?; |) q) j- f{& x& l6 p4 F$ L$ t
TMOD=0x10; //定时/计数器1工作于方式1, z) g& w. A7 N) H1 S2 Y
TH1 = ( 65535 - 500 ) / 256; //0.25ms) e {* X3 p, R
TL1 = ( 65535 - 500 ) % 256;
) ]9 c: ^: ?- l2 A( S0 p EA=1; //开总中断
2 K% O8 _6 v8 l, u$ U$ d ET1=1; //允许定时/计数器1 中断# J A! ^) V8 X$ ]# \5 O
TR1=1; //启动定时/计数器1 中断# m9 \! H9 b) O9 |4 \
} A3 G/ T- M) K
, L2 r- O3 [1 X2 Y8 I7 uvoid ControlLeftOrRight ( void ) //控制舵机函数9 V" S$ K2 C, w5 o( R) `7 q
{; T: F/ Q, b( _1 l2 ^ R
if( KeyStop == 0 )# D* k) z1 ~+ p" i; W$ J/ o
{" i. n( @1 d* i; t$ J% k
while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到( z* ]0 z- K& [' W0 k
LeftOrRight = Stop;" f( t! u+ ] @5 O; ]& I0 U* ~
}
- h, v* |+ [+ O- l' H( M9 }
! ]: [0 h s3 u5 N2 q0 e" f if( KeyLeft == 0 )+ c: _! x) x9 x
{# N$ T3 E: y' M2 r. ]: V
while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到1 v1 a: q( e' b
LeftOrRight = Left;
3 c/ L2 T$ S6 ?- O1 Q/ D; V: a4 d. M }
" e7 @# H3 k5 w" F
S/ s2 S! }0 x' M4 g$ T0 ` if( KeyRight == 0 )" W$ @0 u! y: V* ?3 `$ [: p5 s
{
' D- a2 ^( a, O6 |4 B1 R% k while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到8 G, \; @' v, S# ]8 y# {
LeftOrRight = Right;
2 ?2 G. ^$ }$ @: J3 w4 V, Y! E }
8 D0 t8 t0 B8 j5 W; z2 j7 r: Q1 R6 M9 o* \9 V9 V
}
1 d% ?) H1 z# W& r0 t, K& n6 ?0 r+ m( r
void main ( void ) //主函数) l7 s9 O2 j# l
{
2 _0 o8 p4 ^+ p InitialTimer();9 j% O6 H6 ?! \( U2 v2 ^4 O
for(;;)5 w0 e! P& ]: {0 Z# p. F
{6 z$ @/ ]: X' M
ControlLeftOrRight();
; E' z- @+ P: m1 G* H- j }1 J) s( ?: K! N. U3 t0 r
}
' o7 T! y0 b ^5 s4 |
# Q4 j2 x8 I& P2 c4 }5 Rvoid Timer1 ( void ) interrupt 3 //定时器中断函数
2 r* W0 `$ E, s3 w) P{' W' m j# A) p; G4 u8 y
TH1 = ( 65535 - 500 ) / 256;6 M- q5 \8 x' e% T% ~
TL1 = ( 65535 - 500 ) % 256;
5 j* |1 Z0 V# d( ] w6 d: D TimeOutCounter ++;
+ ^# s9 l8 Y, n0 L$ m F8 ~
+ x O v ?+ O& \9 b: ~9 x4 P+ ^ switch ( LeftOrRight )
( k# R3 e0 i6 h* M$ a {& M$ x, ^' @: j5 f( f
case 0 : //为0时,舵机归位,脉宽1.5ms
3 S9 D5 k; E& t& D7 ~ {7 v( u; F; }, r6 M
if( TimeOutCounter <= 6 )1 G+ l t! f7 i2 U0 c7 [
{- w" ^8 S+ j! d
ControlPort = 1;
+ b; W P- x9 ^+ v }' Y" W; \' N6 s7 f3 ~( k: j% L
else
" Q% x4 v# [! A; a1 ^2 l3 z/ M {$ n) j# G/ U: D8 I9 v
ControlPort = 0;
- n! w- ~! u# ?, \+ V! B }4 K0 m* D( I3 n6 W; X$ f) F. @
break;4 O g1 n2 g7 p0 E
}
2 V6 }, U; Q1 _3 C case 1 : //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出9 J! T) t- i9 p- F
{- A, O: K, W( S. f9 x$ A2 b$ r
if( TimeOutCounter <= 2 )) X9 ?& v6 w2 Q! I/ i2 ^8 }! ?& V
{* m, @& z3 H, B* r: {
ControlPort = 1;
; e; F8 R% o+ w9 F }
# s/ J% Z/ N) i3 r- {1 R4 W else ' s: o$ q% [0 b9 N1 T0 {) K
{
/ Q5 |& {% e; U9 b ControlPort = 0;* _$ J0 P2 \7 o4 K; f
}
" |1 ~. ?' ` h: K. J7 J* t break;$ g6 Z" h* X0 C P+ o
}- s0 L3 i5 {9 c2 y/ c
case 2 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
- c* V: b4 b9 o5 o {2 L+ V( C4 Y3 I; V& ^
if( TimeOutCounter <= 10 )
$ n2 }. z" x; m6 r& ~" x; q {& _9 i& S0 _6 D* j
ControlPort = 1;
& R: d+ N. P9 c( q+ e/ }* m" t }, w; L+ O3 q$ O* S2 T
else 9 n1 g, {! T2 T! j) t; |; b8 U
{$ y& b, C4 p5 d, ~
ControlPort = 0;3 V$ Z5 z* ^; x
}9 r2 I9 W) m6 W8 F* d; y
break;
: b4 }2 p8 F0 H- G9 T W# Z }
4 i8 X5 L- Z; x4 J" y default : break;! U0 ?/ r1 \* e; W) R
}8 S8 L! }( P" E2 j& X/ H, P
, C" }: ^7 c+ Y/ `' L- t5 D if( TimeOutCounter == 80 ) //周期20ms(理论值),比较可靠,最好不要修改
, L( l% y) s O8 W {4 F, k% A; Y3 @/ Q
TimeOutCounter = 0;$ V* P+ u; F+ l9 T7 S
}
$ B+ x5 Q6 x/ o3 b2 h. @( P$ ?}
+ k+ n3 e" p _+ Y) L7 `7 {9 [/ w" N. t# M" T4 q' p0 {5 f
|
|