|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
' r) U% {2 C* e* p( [' v& X单片机控制舵机源程序如下:/ G$ ~3 d5 |7 a$ G4 l8 G- t% i
" ~: u6 X+ E4 @3 x* i7 L3 X#include <reg52.h>
0 r# Z' z8 R* |" k, z* C5 _/ L5 P
, E, k' t4 B* q$ w$ S* R; Lunsigned char count; //0.5ms次数标识
" D2 c% Y1 Z- _. Y2 `0 t! [- Z/ p, d* o/ {, \; S
sbit pwm =P1^0 ; //PWM信号输出
5 X1 k0 C0 J2 g3 A! s- \& U
{- d8 B5 S4 _/ d0 C9 B+ Usbit jia =P2^4; //角度增加按键检测IO口
: S5 c7 V8 D5 |6 z$ a. ?0 h6 {+ y* a, b: k% c+ o* ?
sbit jian =P2^5; //角度减少按键检测IO口6 ?6 r5 u' T2 K# z( U# {2 I7 {0 k
8 W, B( ^9 G7 d ~& m
unsigned char jd; //角度标识
- |. G* |) I1 m% q% }1 G7 A6 O9 V$ n1 m8 }9 Z4 \4 x X: z; ~! c
8 l' w0 B, `6 ]1 ~1 r
2 n2 d$ F6 _5 e X1 H8 x
sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用- q9 X K0 o7 z. X3 P( P. `/ J* ?
1 d& G7 A2 @6 o4 Q! zvoid delay(unsigned char i)//延时
: d4 w) w8 @+ h7 d* E6 Z. }7 n3 P/ G: K0 i& f* D
{
# o8 I' p" W" }; Q+ D1 m
r4 C2 q: c$ U: u unsigned char j,k;
" O& u2 _9 ]; u, Z3 E
, ?: b3 S: X {8 R+ W' e for(j=i;j>0;j--)
: m! x r) L1 d+ Q4 L0 j9 x: \, F, I% p& o1 V" N" g u
for(k=125;k>0;k--); w$ W6 z _; a- v; f
. ]/ O% Y% R1 z4 b" V& m$ y" O
}8 _; H/ P9 S0 v" \; D
" R% }' m3 D* @, x$ h$ n5 L
void Time0_Init() //定时器0初始化
2 H) r' Z& |& r/ p0 z$ V- g F+ x. Z$ d/ F
{: v6 K! p3 g% X0 J
' ^* P6 K0 k5 |% J% |) u4 H//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下4 h7 b2 y D% T( A F8 U* G
) M% E4 Y( @$ D3 J4 }
TH0 = (65536-445)/256;& m& i. ^" ~0 g. H
: s, m, Z+ o6 z/ \4 g, W
TL0 = (65536-445)%256;7 V' N5 W* x8 V
+ g) g9 l I% g2 }5 H; [. }2 s* C! o3 K1 U7 x! K2 @9 w) [7 {
TMOD = 0x01; //定时器0工作在方式1
4 m7 S7 W1 S# D4 D0 p, g- n: |' G8 U0 k2 _3 d: T6 Q
IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断9 S) l. ]( _: W6 o2 R
" E4 ^ v* e# m" m
TR0=1; //开定时器0
8 d5 G% f/ }) x( T
( H% d8 ?- ^/ c* _" g( H}% p' N2 H1 E' W. u0 z
$ l6 A! v; K2 }8 F U
void Time0_Int() interrupt 1 //中断程序2 P! l6 ]1 a! e5 d' V- C" S
! C: ?4 D- h$ t{& L' N" A% H6 S; S+ ?7 u+ r* A
/ O4 K6 Y3 a1 ?! ^* m
//重装初值 H/ n/ y* ?, e; D
+ B7 v+ Y9 ^( U) [
TH0 = (65536-445)/256;+ M. K) G7 e" k y3 e
0 ]/ ^/ L1 z! z7 `1 E+ T& _
TL0 = (65536-445)%256;" X/ |! ~$ T" L+ u3 Y) r
! `2 e: H0 b, P$ N* d- C9 N3 K/ r# A) o7 s
$ {: F+ ]5 L1 B8 | if(count< jd)
1 K8 r( u2 |6 N# y: q. Z$ C{( c- y" r- |; f6 J
pwm=1; //确实小于,PWM输出高电平
+ O: c9 O) t* y. j6 |pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识* v3 h) R& w+ w% Q
//pwm=1; //确实小于,PWM输出高电平8 s/ m& ] ?2 m3 ~8 m9 k8 S
else
$ K8 _6 O# U7 r$ X% T{
7 q" g5 _4 q; ], N5 d" ppwm=0; //确实小于,PWM输出高电平! B; Y; Z/ {4 g; z
pwm1=pwm; //接示波器用的io口,观测PWM波形用 }0 ]8 T$ R: k# Z' B3 m. J
// pwm=0; //大于则输出低电平
7 Z1 k# ]9 t2 @8 W1 V u count=(count+1); //0.5ms次数加1
( ~$ V) l1 F5 O- T count=count%40; //次数始终保持为40 即保持周期为20ms( i$ d8 M8 E: T& Y
} T: A$ H" R3 Q4 |" j
\. T5 r! t$ o//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
1 {7 S1 Z) c" T$ ?& ^2 d o$ [//通过jian按键控制反转, R0 W& j1 H6 O0 @8 U) y, ^4 b7 ]- z
/*void keyscan() //按键扫描
2 Z, {# |% H( y" C{/ \$ C: i6 x& W/ P- C
if(jia==0) //角度增加按键是否按下% s. }8 M) k" _0 y! C+ L+ l3 r
{
& o" H; W$ ~! T delay(10); //按下延时,消抖
/ L: \( ?" A1 Y if(jia==0) //确实按下3 E5 Y1 @" W7 U( U
{! f& o3 @* ?- I) Y3 s
jd++; //角度标识加1
4 f2 q' J; f ` d4 M) b count=0; //按键按下 则20ms周期从新开始( p& l% g' J, r# j0 k
if(jd==6)
\$ M. D" u9 u O& [% @ jd=5; //已经是180度,则保持1 C$ f1 V) O% ~: _8 `& Q! H
while(jia==0); //等待按键放开
+ s2 W' t) K% \ }
" O; J: c+ a4 b) |& E& R$ a }
/ e0 _8 R3 [; \( F if(jian==0) //角度减小按键是否按下$ ~) U" x9 c, p$ J8 a
{& P' U0 o7 E2 Z' o' N
delay(10);. X+ [8 Z3 z$ H. x8 }( y
if(jian==0)7 Z" r7 {4 f. i8 }; w
{
, C( Z2 T9 b+ v8 w jd--; //角度标识减1
. C) } Z+ ?4 A" M: U" o/ s7 y6 r count=0;( W: ?3 v) U" ?3 r
if(jd==0)$ h1 U1 z5 z" r3 F
jd=1; //已经是0度,则保持
: g) K, [5 U$ V5 B: B2 q6 o while(jan==0);
$ E* Z8 D& {0 |" h3 k* r" `+ P4 M }" R6 ~( x' z9 p) h- p2 P
}9 _1 ]* r* d0 X+ e
}*/( f' z3 }4 e( v; M. m2 {9 S
" k+ p: M D5 I0 T3 [* evoid main()
9 W* [+ X& o$ `( {3 [+ j{
5 T: j$ |1 z- W5 D! _) n6 T0 c0 [. q//上电,舵机自动正反转
( b- a& G. ^4 J4 Q$ w//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想 ! b9 k m8 |/ r- R
while(1)
! B5 E. [' M* E5 }7 ]( a' f3 T4 f{+ a+ G' \3 C+ e2 t; y6 _5 o
for(jd=1;jd<6;jd++)1 a9 S) j9 O' k" X8 K
{, D% b" i' t) f, \
count=0;( F! Y+ J: G" M* n l, f" t1 o
Time0_Init();
; ~+ p' @1 X# Kdelay(50000000);
+ H. e, G1 Q: n/ I( X$ I}
/ @* T. Z! K* i7 J" ^$ V2 xdelay(50000000);1 [/ D* a' c% b" p3 }: C9 C
for(jd=6;jd>0;jd--)
2 O6 o( e6 i' c. N4 M5 O) {8 r# |) O( ?% ^# ^ E4 A
{
& {. W- e; q( M
5 V2 d1 v/ Y6 A, Vcount=0;& [0 n( {/ Q# @$ b1 @9 x0 b
6 C& D7 d0 } W; ?- ^: \% \
Time0_Init();
1 x! l- y6 _& K( R, z% U. H6 R& X, Q. i' Y
delay(50000000);
( ~" I& B% h8 u2 V( b4 M; W: Z/ i1 y% F0 ?4 p; v) k; }5 S3 @
}
% ^ u9 n0 g9 ?4 k5 k0 Y4 y( [( ^- P; w4 [
5 T- f2 ]6 f4 z5 C! i: h [0 r. p
/ V* z: j3 F& n$ N( | |
|