|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机控制舵机左右转源码
/ k! p( R; Y$ y1 L" P, k
8 v' F- Y, L+ S; g% E6 }0 B" s3 p/ q% S5 ^) [7 I
下载:% J) Q* j1 {: ^1 M" |
( a& Z4 X7 `. [' E
8 y( F4 l8 ]- l" ]$ A; {1 @; l
c" N( R( [6 z+ |
预览:
# R/ t( c2 ~' [2 s& ?" E/***********************************************************8 Q4 Y* { Z6 }9 v
版权所有 :河池学院创新实训中心(2/3),刘欢(1/3)+ P. e8 t- [: P' S$ |; T2 T% T
程序功能 :舵机控制
7 o! ]( O) K( `# J- S生成日期 :2009年10月30日 星期五
$ x e1 f7 _1 i4 {2 y7 r) \9 Z5 A作 者 :刘欢
% P) X7 L* k8 [) ?8 Z( ^/ c联系方式 :(QQ)281638360 (MSN)sundayboy@live.cn
4 c/ f3 W2 F! J( G4 j9 f说 明 :51单片机控制舵机,按键实现左转、右转及归位; e$ O- `) O0 d, A
占用定时/计数器1
( O2 h2 h. K i$ p$ q$ Z$ A9 @************************************************************/7 Q b: r& s; o- d3 @& |
( m- V4 z/ ~7 T* @0 \
#include <reg52.h>
+ n+ M6 s) X" k- x) N( ^1 @#define Stop 0 //宏定义,停止6 s1 G! W2 S1 n% }
#define Left 1 //宏定义,左转3 `# P, L) e. o1 c
#define Right 2 //宏定义,右转, p, g9 P) A4 d1 D8 p. ]
, W" o$ u7 `# V
L% z9 t' _% h2 Ksbit ControlPort = P1^0; //舵机信号端口6 Y5 h; Q7 [2 n! \
sbit KeyLeft = P1^1; //左转按键端口
5 p* A6 a2 M# g' g+ a) y2 j7 A# Xsbit KeyRight = P1^2; //右转按键端口
( K' ^7 @ d0 p, xsbit KeyStop = P1^3; //归位按键端口
% ^' \! U J7 M% N, `* {; }. c
unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志. b' i8 S5 o+ S5 f+ U7 {7 j
7 p% J8 l. C! E+ R8 r
void InitialTimer ( void )
' f% |5 e# Y2 s2 v7 ^7 Q{
: z( V6 ^6 |! c1 I TMOD=0x10; //定时/计数器1工作于方式1# m7 @7 {0 B5 M4 X* s
TH1 = ( 65535 - 500 ) / 256; //0.25ms+ |3 C0 d+ `. v. b$ I; d( a( s
TL1 = ( 65535 - 500 ) % 256;
3 G* m M& J; ^% I" f3 E3 g2 f& q9 ^/ I EA=1; //开总中断
7 Z# Y) f8 L: t: t5 w ET1=1; //允许定时/计数器1 中断/ D7 ~" c+ D/ I7 {( R* D
TR1=1; //启动定时/计数器1 中断
9 [6 F* k* e0 r5 v0 J" ? c' \6 a}; m3 u" p. h' t# X
" H! Y& W4 N: \3 S" c2 avoid ControlLeftOrRight ( void ) //控制舵机函数7 y8 ~; ~ X. i8 \0 Z
{
z9 e( L. H4 v3 p ~/ A8 v if( KeyStop == 0 )
# C+ \6 S. `0 Z7 i4 b9 y5 r( o {
& a7 w: Z. v" z, `$ N7 s while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到" l5 n1 q" z) [6 w4 n9 q9 N( H
LeftOrRight = Stop;, S# x( S3 h; Q( V) d' e' Q# T
}, h. n0 G. L7 Y; V! l, ?$ y: o
6 N* Q1 f9 M3 W7 Y/ C8 n if( KeyLeft == 0 )
, K1 \& N/ t! M/ i9 r- `1 k" n {
+ w" H- v1 ^! E- O) \) Q* X while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到 A: E1 c' _% {7 ?5 f% J5 c% z: a
LeftOrRight = Left;
2 E# B; t" Z& Q2 a }
. Q! G. E! Q: h; |+ B
* ~! I5 p9 j% L4 g& \ if( KeyRight == 0 )/ T! M: _% Y9 P& T- G# Y
{' Y6 V6 F7 E2 ~. H/ R% x
while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到
) u" I9 Q9 V1 z& M. C LeftOrRight = Right;
) f& M3 `' c9 i$ V' x }
, I8 @8 } ?0 B+ e2 ~7 S0 D8 N; [
; r3 M" N$ J! ` y& q" E}+ E6 c5 u* ]" e
0 }* ^% I/ S# f( Rvoid main ( void ) //主函数
' k# A* R* G3 I; |{$ Y3 i1 C, X9 N" Q
InitialTimer();
1 Q( X) }0 K3 u7 P5 Y for(;;)# Z. T5 h; ~, @4 L9 E# G
{: {- k; ~7 b& M' a0 \2 S& [
ControlLeftOrRight();
1 D- _$ _ I+ ?9 H }1 V) @6 {' S8 w# P& Q* l
}8 w- }, n- C3 C# g# Q6 z
) O1 E+ O7 l; \7 K$ ivoid Timer1 ( void ) interrupt 3 //定时器中断函数% J8 Q, C* p" H7 e$ D! z
{
3 Y& c7 h+ ~7 x' A3 q/ Q, p TH1 = ( 65535 - 500 ) / 256;
2 R/ N ]. H4 y6 x, [ TL1 = ( 65535 - 500 ) % 256;
4 w4 A" r( v9 S r TimeOutCounter ++;/ K) j/ W* C4 @3 K8 U" ?
4 f. k; c4 k5 U/ x
switch ( LeftOrRight )
: n# `9 K7 U, {1 a# }. v {
D# K3 F) W+ P# n; n; J case 0 : //为0时,舵机归位,脉宽1.5ms! E, w+ f6 s7 {' o
{
9 `+ P' d8 Z" H |; X3 S; v3 x if( TimeOutCounter <= 6 )( V: M. \5 U/ ~- m5 B
{0 i2 p4 h& {$ U8 e
ControlPort = 1;
0 L5 w2 m4 z$ ^/ E* C }% t; Z/ p1 ^5 @0 p+ H3 C' m
else 1 ]/ [( k3 C7 [8 t' B
{
7 X9 ~3 c4 T( V; h) k0 E V ControlPort = 0;
! N& Q+ m" p9 m) ]9 {. u$ B m4 T }
. S/ J) P! `' m' _+ p break;
" b: H/ z- |" W5 i. L+ z" I }
% N# n2 x8 E! `7 e8 ?- f case 1 : //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出
7 I5 a& @: S$ [& @/ u7 f { m: N$ w- s, Y7 Y
if( TimeOutCounter <= 2 )
3 q: S0 f7 c8 p4 E& w9 e {
( n+ s4 n1 B/ A$ W ControlPort = 1;
& x5 ~$ c L5 |6 S }
`4 |; `: p, @( ]6 y' S3 z! M else 2 r1 Q8 k% V2 [5 F! M! H
{
* P3 @- G3 o! {+ W# O ControlPort = 0;4 U! f$ W7 [$ W
}
' S0 ~5 m9 e; I/ e6 v( c break;
V$ C. r% H6 M9 m) G: L }
! {2 _, A7 K7 M/ o" Y case 2 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
& A' D% t$ e! B3 _! o! }% p3 z { X7 ]' W* r' U4 D
if( TimeOutCounter <= 10 )9 F* b5 B+ h- _: I& Z
{$ P+ r9 E. W% p9 A. d" ~ ^+ ^
ControlPort = 1;
1 r% t7 F6 j" s }2 b' b, X; O- W. M( |1 R7 g
else
; \# o: Y3 r3 h. g) W' q {
! G/ @5 L' m7 f0 L ^" q, G6 B& f6 U ControlPort = 0;( Q' w9 q8 O" t. ]4 I4 P
}% O0 `. Q* _( T5 x# ]- F
break; K7 D' G/ v5 U' K# f U9 v
}
' M/ L: m6 _* j1 P# G2 C" {5 n default : break;+ i! \3 b+ u+ @
}8 z9 t' t0 X* E
3 l1 z$ w) P: X% b if( TimeOutCounter == 80 ) //周期20ms(理论值),比较可靠,最好不要修改
6 ]/ E9 _0 p' m: Z6 E0 p {
6 y8 j/ k7 q# m: K- d. z+ s l TimeOutCounter = 0;
# {( P( N2 S: s$ z }
6 G* N& n% M/ Y& _4 T2 R' J+ w}
, s) h4 u) @& F- T# S: F C. S% s; C; H. b: m7 J
|
|