|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
( Y$ K/ A8 h4 C8 R: @单片机控制舵机源程序如下:
) x" j K1 }- d3 V9 H6 b) `4 y: p, z3 N6 a
#include <reg52.h>
3 C8 U! Q4 N* I, U) X0 l/ s
& d% T# z0 l. v" xunsigned char count; //0.5ms次数标识9 `$ v: x1 Q8 d& F; z% f% |+ D
" K& a' Q" B$ E7 gsbit pwm =P1^0 ; //PWM信号输出
4 J, R# n4 ^! g6 a$ P. ^, b n% J5 s' m% N
' \1 i# E4 N8 Qsbit jia =P2^4; //角度增加按键检测IO口
% b( G0 C3 I) o
4 j9 S$ ]) G5 Z, O! S, G& bsbit jian =P2^5; //角度减少按键检测IO口
% Z7 J! ?/ H c" }- H# X& |8 x4 S2 i# ]0 J( i9 M
unsigned char jd; //角度标识
* Z O$ |+ p% O1 S2 X$ w. y% ]) h7 f& z6 f; B2 a
9 U6 m z7 z/ b. {- w: G6 A3 J
j' i9 L& Z$ a' P# a) f
sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用0 ~/ \* e# t0 B9 L' t
& }% ?5 b! o$ T( X# u0 Cvoid delay(unsigned char i)//延时5 q; `& u8 S$ K" A/ V
6 p& G! o3 h' U{
( U7 u- c! ] M1 A, F1 K
. p# m. Q9 S G) z unsigned char j,k;- d9 G% M9 T9 N$ r
! \. ?$ L: \1 v* q for(j=i;j>0;j--)0 M! _( J* p2 [$ G* H! l& o9 U
- p- H' Q( E% c0 G( V- y e n' ~ for(k=125;k>0;k--);7 J: R o2 s" I0 _0 l
5 U, T( m7 Q6 h t" r& L}
) F8 s- W A5 n- k' I3 B7 l$ h7 P
% x D+ r- W; R" tvoid Time0_Init() //定时器0初始化
! F; z1 `7 z3 a0 s) d2 H
$ s5 v) T7 ^% m: o{' ?! }) Z3 L9 V: E& I- N
# k, O% L2 |. j5 q+ j1 j6 O//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下+ z$ |9 d" Z. h. x: o. f
& z% |- }9 G! y: V
TH0 = (65536-445)/256;
* j2 ^3 T) B* H- y2 b& ^
& @0 E8 U+ i1 M! MTL0 = (65536-445)%256;
# r! h# [: G. i+ ^ i3 z5 m0 `! l; _3 e# w) f3 l. D# O
/ D" w' ^! @. a9 O! X9 Z8 z/ `
TMOD = 0x01; //定时器0工作在方式1 # v9 n; o ~ m7 t3 I& \
" |, k( [- s& F7 E8 F- C) G2 D
IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断
" e! O6 ^' T6 g" e# n! `
# ^2 F3 ~$ H/ n/ _; q TR0=1; //开定时器0
6 L; i: u; X/ K5 z/ h9 Y( A6 _7 d* x% p
}& R4 D+ R. \6 i; S ^% C
8 t$ m& v* ?# g6 Xvoid Time0_Int() interrupt 1 //中断程序8 K% S4 W5 z+ }; `; q$ v
' z% A- p) Y" F8 z4 \( Q{- w* l, j5 `0 q$ s- T* p
# o# u9 P7 R, z) E- M4 a
//重装初值
/ }( n' Z. X7 T1 T, d: [+ a. J8 F1 [) Q( N. J0 f. f
TH0 = (65536-445)/256;; a# I2 C$ F4 a4 J
6 S5 a2 y! h* o9 lTL0 = (65536-445)%256;
m8 @/ n% J9 u) U" }( H# a' f8 d# k, D
8 S/ h$ n: y9 u, T' K& _* t8 _
" z+ R6 P0 w) t, ~; i if(count< jd)6 f+ g& w; j: O
{ {( M! Z# @8 F; A1 `
pwm=1; //确实小于,PWM输出高电平/ C8 W% D) q9 j3 d- ?: ]
pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识+ ~' [( P% a _4 _; P. [& ^
//pwm=1; //确实小于,PWM输出高电平
q" c, b& C: a% E3 n$ H else5 u$ L% R) n. i# m
{3 e' o& J' C5 ?3 u. s& m* e- P
pwm=0; //确实小于,PWM输出高电平$ l& G% r$ s* y# y/ Q' P- h# L
pwm1=pwm; //接示波器用的io口,观测PWM波形用 }
0 @' Q% T. n! ]* t // pwm=0; //大于则输出低电平
& \1 B- v! s7 Z5 a count=(count+1); //0.5ms次数加1! }! z* _ I8 k) e7 I* L! a
count=count%40; //次数始终保持为40 即保持周期为20ms6 D' h0 R3 ^7 ?/ d
}
+ L; ~- ~0 G7 v% x' w* J7 z' p* H% @' n+ L
//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,9 R8 c( p; \; a
//通过jian按键控制反转$ J1 f% i7 v6 G$ Y# u
/*void keyscan() //按键扫描& V. m, l' ?' B
{
: R- q$ u) |4 Q* A# x if(jia==0) //角度增加按键是否按下
# K/ r9 @# f9 { G3 _ {7 C" ]8 B' b B3 i" k/ ^* u
delay(10); //按下延时,消抖
; f! J9 _2 B# W4 p if(jia==0) //确实按下
- t C- }1 t5 J4 E' n ~5 R8 j {
A1 N e: T; l" t& w/ J jd++; //角度标识加1. ~- M9 L( ^9 j) h! Z) w6 R
count=0; //按键按下 则20ms周期从新开始
+ M7 L3 \% }" A2 J if(jd==6)* \: b' x0 Z: I2 s
jd=5; //已经是180度,则保持
# T1 M3 H/ M) {: Q while(jia==0); //等待按键放开
+ [( c) `2 S4 M- x }5 C# d" o9 }, o2 U' c
}
, ^$ e/ m$ \. f4 P$ Z T) f' } if(jian==0) //角度减小按键是否按下' o9 U& R9 ~: L; ]
{
) r% G9 u$ s' ~: ~7 Y delay(10);' Q2 q0 V2 J3 Q& T
if(jian==0)
% |+ b3 A+ h/ e, k+ ` {4 ~! F' F0 h/ W$ _1 x P0 O
jd--; //角度标识减1
- O0 R% o3 y1 L count=0;
) t$ h( H# ]0 G# a if(jd==0)
7 c6 K, S7 k' @- d9 g jd=1; //已经是0度,则保持' I& ]3 c H6 `
while(jan==0);
3 D% B6 k, P8 v0 U. M l+ e }
& g6 p7 d5 S% {$ e6 h0 ?$ h }
% r( ]6 W J0 p4 g}*/
4 h( a* S5 z/ J4 X; p+ i! p- P" M( c) _7 w9 k \- ?3 T
void main(): M7 G4 C! W# e! u3 Z0 T- N' {
{ ~% N% }; m9 L1 k7 P6 |+ N) }% A
//上电,舵机自动正反转
4 C G3 I: i2 m' S R2 a+ O//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
( l9 o5 l6 T2 K3 q! Lwhile(1)0 p9 h g4 ?+ I
{
, D9 {; U, {/ B4 U" D6 Q) L for(jd=1;jd<6;jd++)
& _5 \5 G# q5 M8 \{
7 m7 g" E! u0 O. X- v }: t& A+ j- icount=0;$ C Z3 K; O$ c
Time0_Init();3 q" g$ i0 C7 h+ j6 o
delay(50000000);$ P5 \; g7 B2 W# k8 B5 Q1 M8 u# d
}
: q( o9 d' X* {* \* m4 W9 rdelay(50000000);# n" B9 B8 ^/ c/ z' c
for(jd=6;jd>0;jd--)2 E3 f {6 N& F+ ^
. h/ _! p( J* F. Y9 E) e{
2 d# F; ]: V* J7 B3 D0 D
, K# d2 b* w9 b9 f- d( Bcount=0;8 B; W% H9 Q( o) S( a5 v
& _& _2 D$ k( P) n+ E2 c
Time0_Init(); z. |4 P; n+ T
# C, V0 p) t- }, h9 a- L5 [delay(50000000);) [' y8 N% v" j- }3 m$ ~. g
& v ^8 }" C2 M# H' a' H
}8 H1 F$ M$ a5 c" C$ q" F
5 R2 M6 k7 K. c' Q) T! ~" t+ ?# O
9 ?- [1 J, a0 F- j; k
' J2 s( _' u# s5 p4 S4 o7 f- I5 } |
|