|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 j5 i/ {1 f. w/ S) `, N: G. {单片机控制舵机源程序如下:- M6 o+ z5 X) R$ u
# j/ b( r$ t7 g#include <reg52.h>; j& u2 \, e2 e( v4 U/ f/ h
$ d# `) X |( T3 x% }6 ]; k
unsigned char count; //0.5ms次数标识
2 g+ H2 Y' Y% v W% X$ h! f) v
% I X0 ^ A; |7 {. I2 ?2 N. D/ ]sbit pwm =P1^0 ; //PWM信号输出
" P; t/ E" U# t2 d( i$ L6 T
& y7 n: i, ]2 O; ~- Tsbit jia =P2^4; //角度增加按键检测IO口
2 Y$ b( d5 y" h: F# E0 @. q$ e9 Q0 q2 d2 K
sbit jian =P2^5; //角度减少按键检测IO口
; h0 `1 g& N% y S& K; x& c
+ S( p9 A' a& m$ n' c- u5 l1 Kunsigned char jd; //角度标识2 R! [$ ]- ?/ k" {* F0 V6 k6 ^+ N
" H) Z% t! u+ m s
' d$ K* u( v% N' J+ d8 G; V& W
8 N! B A5 T* W# ?5 P
sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用
m7 M: R9 k. j! _7 l* |6 P$ J4 i6 ]3 r' P" x e4 M/ W F! e/ y
void delay(unsigned char i)//延时& j3 B0 W9 P: U% e% s% Y( y6 K
: w0 f' k6 d$ P+ k2 u* t3 k, x# c{6 w. C. a' h. b+ R* j
, ?# n, h1 ~. r; h
unsigned char j,k;
. ^8 M/ r7 u8 c3 Z0 V3 G {; d& t5 A! D
for(j=i;j>0;j--)
/ i9 l0 n/ @% c1 { W c% H1 ` Z! y& B' `# R
for(k=125;k>0;k--);
5 h5 y/ j% I& S g+ e) L6 Q7 I/ V' d" `7 `
}
% A o% \5 y2 f9 m+ z6 D5 T, i
! x$ s9 n8 N# O& c- y% Evoid Time0_Init() //定时器0初始化7 ~$ T& g, O: V0 t% J
1 R6 U* ^% P: M5 J{+ s2 P( \8 {2 h7 w
3 N+ I9 h8 _& X" b) h
//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下
) z$ `9 \. y) z4 f, b: `# r5 l3 b7 v8 b0 X* }0 s
TH0 = (65536-445)/256;" A; z4 k' c3 u8 a
- s( D/ {) _1 @$ H$ n3 c' x2 zTL0 = (65536-445)%256;7 I3 T3 C6 z, p C: |* _8 S
0 W* a+ G6 f- c' F3 d: n
2 W# K- |& ?+ |# cTMOD = 0x01; //定时器0工作在方式1 $ H) A7 g! K& K! P3 S" i
5 d7 N; \: u2 p9 sIE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断9 U& F5 S) j' [1 u7 e
. m0 y" r7 j7 j- H; f* r! C+ s TR0=1; //开定时器0/ C; }9 f/ K l; i
* s8 N; m+ z2 Q4 X- S4 x7 V, D
}
" Q1 D6 i; h" m
) u$ Q' m& s3 xvoid Time0_Int() interrupt 1 //中断程序
/ I5 }+ W9 w2 B( J9 X) s% H( ^# q7 S i$ x' ^# y0 ?) y
{
/ ~6 S! S# g4 U4 ]* Y
, u: s# _* k0 M0 x//重装初值! p4 x- P6 N+ k9 w2 H. }
/ a" X1 }5 a, S" Y$ g; p2 N9 e
TH0 = (65536-445)/256;3 j" v' ]) g3 i& \: [! c5 G
5 z2 G5 B& f/ b4 V3 G0 v( eTL0 = (65536-445)%256;1 l8 N/ Y# a. l2 T7 J! a3 d! p" D5 G
F8 O1 k" E4 d) H' B
3 g0 ?) T4 ]( m1 o4 H
0 b3 e% j' B* r; F4 s$ y if(count< jd)
! r2 X {0 {& r2 y& v3 J{$ R$ F7 S: o2 x3 D& S
pwm=1; //确实小于,PWM输出高电平* K1 F }* P6 C
pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识' _( R) p" w3 Q
//pwm=1; //确实小于,PWM输出高电平
: D! n; `# [- n3 {- S: Q; L6 h else
4 W2 d/ ?1 h0 j: \) ?1 b{ |' y0 D: G) a( o; e7 ]
pwm=0; //确实小于,PWM输出高电平
8 R+ _5 O& v9 r9 {pwm1=pwm; //接示波器用的io口,观测PWM波形用 }
8 L. b. r0 [3 i0 B: p; h // pwm=0; //大于则输出低电平0 \; ^/ v3 ?# D+ {3 x' Q
count=(count+1); //0.5ms次数加1) O! @" s. u' l3 O: B
count=count%40; //次数始终保持为40 即保持周期为20ms s) u/ \! V0 `! }6 ~
}
+ |0 t; x5 R* V z8 h" v/ |+ [- L' j
. o- U& Z3 K0 w) Y//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
5 q, O' P% D# D) Z//通过jian按键控制反转: q3 l( ]4 |0 Q+ _
/*void keyscan() //按键扫描9 e g% ?8 o4 z+ E# V
{3 \+ k6 y: l+ ?! m& J
if(jia==0) //角度增加按键是否按下
S$ M& [. B' p! m+ S {
# L( W+ { Y" P) S# G7 o, ]$ a' v. s delay(10); //按下延时,消抖
% { [. O4 a( D- o# A8 f- y if(jia==0) //确实按下
' S2 C0 Y1 v/ V" } {
5 |& s! _7 D M( ^2 j9 r& I jd++; //角度标识加1; M+ N2 A7 S0 P3 B4 V# Y! H; S# V
count=0; //按键按下 则20ms周期从新开始) w2 a- Q* F/ b" v" W
if(jd==6)8 P* j* W& o+ `5 u
jd=5; //已经是180度,则保持
/ Y! O% Q2 v( M while(jia==0); //等待按键放开, N4 A+ p& i9 c5 }0 T; ]
}8 k# ~9 A/ e" C3 K G1 Y
}9 C* c0 d0 [9 V0 N6 H/ L' ?5 [
if(jian==0) //角度减小按键是否按下* F7 e9 k1 q$ p D, w! j. p
{
) }$ J+ z, N. G$ ]0 p4 r delay(10);
: }6 z$ [, a" P' D$ r8 a9 ]6 v if(jian==0)0 p" e$ Y7 O4 J+ d
{
4 B- d O# {' v3 a9 v1 v jd--; //角度标识减12 o8 |- e5 Y0 K E
count=0;$ f' `3 m( s+ X* z
if(jd==0)/ |7 S3 k+ O* `2 L8 j
jd=1; //已经是0度,则保持
8 k* e/ |) L2 U4 I+ d& L3 ^2 m while(jan==0);4 w) i8 h# n _- W& N& Z H+ d4 t, i3 M
}
& ?# p c A; X1 {$ A) l }# k7 R5 M8 j: z' v( W2 F
}*/
1 C' I9 L# |3 N( ~2 n9 X, J, D# x w& a' T
void main()
+ z% {+ o- e2 P# `; t0 U{4 G: {: Q! S- t+ y* F; O2 `3 w/ S
//上电,舵机自动正反转
+ a+ {6 F' H$ J* U//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
2 U1 H# e( o$ Xwhile(1) x& W% l" Z) i
{, r6 c' i1 O7 |' G. t
for(jd=1;jd<6;jd++)
5 x- t+ D- Z8 k{: |1 n, ?) i$ K0 j+ ~$ f& B% M
count=0;
% _1 J6 A8 i* W% ]0 |( aTime0_Init();+ A# k, }/ _" |0 c& `6 M2 t6 u
delay(50000000);( G' _9 x: S) F2 v) S& E
}
; K# u# e4 K. S% Udelay(50000000);8 |/ g: n6 p: l" p- G) o) I* v: `& ?
for(jd=6;jd>0;jd--)6 ]5 b( c" N9 r$ |; |7 H
' u* R8 E6 |0 a ?* S I{0 D$ t! M7 i/ P# h) m
, M. ^# d0 p4 A1 g q' G9 f
count=0;: b4 o J- L! k2 `# J6 w
$ ~9 w1 q# | z" t, w5 H; G
Time0_Init();8 P8 A. P) ~3 s/ _, @/ `* j
R! b( l$ ^2 j' l( ~0 c0 Ddelay(50000000);
+ n1 j2 K( ~6 z8 l: E
. }* y x- T% C% C s0 Q* ]; Y) u}& y3 T( ]& G6 U% f+ W2 g2 w
6 ~9 g* ^1 H" V/ @- n' w% x2 |5 X# j
, S& b) i: @$ E$ g! Z) k6 B7 v+ | |
|