|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 Y8 j' i, s" g8 S& P; ^
单片机控制舵机源程序如下:
+ X7 G; y2 F4 W! ~9 Y4 c! `+ i, V. l1 R: U& f8 K4 }
#include <reg52.h>
: u4 H; v9 O: ]9 [. c. c C/ V) f- ^+ Q, m
unsigned char count; //0.5ms次数标识7 X0 A6 c* D2 I3 n/ `2 E
/ H. n5 _) U: e& R9 ~) z( Hsbit pwm =P1^0 ; //PWM信号输出
( @% ?" ~$ P( d
5 Q+ h7 W: d B( \sbit jia =P2^4; //角度增加按键检测IO口0 h# X, V" T9 b! V1 i9 }/ Q
- ]5 D; J w2 a; b: L/ x3 n7 Y
sbit jian =P2^5; //角度减少按键检测IO口+ C- i- [# L( U i
0 _6 F6 y0 {# j" k) A+ qunsigned char jd; //角度标识4 X" Q, h- X" d# ^
# {* A3 c, U' l7 o, R @
% w8 \/ Q. i0 W7 [5 P4 o; ]% g( S* r* `
sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用
* w; _* q& g: R4 p* X" x0 A8 {- G
void delay(unsigned char i)//延时
7 d: g- `4 a. R$ X9 O2 r: f+ B5 L6 |4 m: F
{7 g1 \ ]( n8 [
$ P( K9 I3 r5 q# G5 a" c; G# N
unsigned char j,k; L. u& |3 e% j$ ]7 v
- f l/ b9 g" n& K8 o
for(j=i;j>0;j--)# t& H/ X) s7 i5 f0 X
6 ]" ^" N7 r5 `* l5 X) w+ X for(k=125;k>0;k--);
- d3 y8 h+ S/ I) k1 |1 s
& R7 G1 D* ?/ m3 b7 Q- E( K4 {, E( m5 v}
6 z: A1 [1 c6 H9 P/ n9 J9 B
: W0 V5 E8 _5 a6 [void Time0_Init() //定时器0初始化7 C; W/ m) n* s/ P$ T0 J9 r
2 h6 l* }8 T, W8 e% C{* p+ A2 W, |; f( O: w v
/ M% H' F w* H4 `. Z5 g
//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下/ f7 b B% U" @ K/ ^( v3 E
" e0 z0 [$ B9 F8 M% [) z
TH0 = (65536-445)/256; q2 l. W- \, b, \, m7 O+ E2 \
+ }; `( C" O% t9 I" @
TL0 = (65536-445)%256;
8 D8 U# p/ {5 |$ e L( P$ `/ p5 c5 R u
- a* u# e9 W* H% s" P1 j: C
TMOD = 0x01; //定时器0工作在方式1 9 E' F' f% V6 B% C& L" X
4 p# i9 {% T4 k# z
IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断+ e& @9 J2 `, T6 F9 r8 l
9 w5 Q- @( A/ m4 z' c
TR0=1; //开定时器0
3 z2 Y8 W. L* c8 t. ^' ]; }( O& P% Q9 w _8 p
}( c: V( f' T4 p* i4 X3 Z) A7 a
3 N6 j- F4 R5 [' i# dvoid Time0_Int() interrupt 1 //中断程序; K* F/ B1 P/ v
9 \' ^ C# O& T3 y0 l
{6 c0 d( C* P8 w' V7 j
7 b6 G3 Z/ x& i0 u& o9 {//重装初值; k0 \& m* ]7 D( t" b5 @
7 u7 ]0 [0 n4 ~/ Z0 O$ Q
TH0 = (65536-445)/256;
5 b$ \: i* H* D9 w1 I
9 P6 M' {2 g: o" Q/ Y qTL0 = (65536-445)%256;
5 @" i5 B& T3 x8 b3 j. P0 |2 Q" b# a( b7 S# b+ j+ l: a
0 g2 q; o5 ^) X: n/ D* H
& u( z3 L+ [, ~2 V( Y
if(count< jd)! l: E0 z! `3 ?
{
3 j9 y& L" i2 r3 R5 F7 ~' }pwm=1; //确实小于,PWM输出高电平
4 u. f; Z/ S: \2 V' J6 S# R0 mpwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识0 B4 B2 F+ Y6 v3 Y- m5 P
//pwm=1; //确实小于,PWM输出高电平; W* a- A4 e) |/ E% T
else' |: ~: H5 n' r+ Y1 p7 Z/ b2 R
{
- v$ w' `7 f! P mpwm=0; //确实小于,PWM输出高电平
2 J7 r; `9 f0 u( e9 a5 r" Lpwm1=pwm; //接示波器用的io口,观测PWM波形用 }
_/ ^! y3 k9 L J8 C // pwm=0; //大于则输出低电平
5 _* L0 s4 l# n) E8 F4 D7 u! q$ F Y0 Q count=(count+1); //0.5ms次数加1: _( Q4 l* r* n0 M+ v: [
count=count%40; //次数始终保持为40 即保持周期为20ms) M9 ~) ^0 [( Q- ?" u3 m
}" O+ q8 a( x' M' K: f& D
5 D$ Y# }, A- C0 C
//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
" M: K3 L/ N( Q( Z8 b* T//通过jian按键控制反转
8 a$ s# w0 I7 ]$ S6 n @8 H2 k- Z/*void keyscan() //按键扫描) h: Q a0 i- m
{
1 Z! p" C$ b0 H L: A# T if(jia==0) //角度增加按键是否按下/ E: R: z1 v6 i
{
1 k- a3 K6 P! ]7 c delay(10); //按下延时,消抖* m: E6 A9 [ V/ }
if(jia==0) //确实按下
4 e" H5 }& o; ?2 H! O {) Q# L3 t* B4 D6 b4 f6 I/ F
jd++; //角度标识加19 [5 ]- I0 |! T' g
count=0; //按键按下 则20ms周期从新开始
( v; N1 s0 d3 f5 M) h* e) s: m! ]3 r if(jd==6)
* {0 B, c( l w! D jd=5; //已经是180度,则保持: o: |* X3 |* J: ^* g$ D
while(jia==0); //等待按键放开5 N7 R& |( ^2 j( `" M- K! W, r& q
}; n) I) ~$ j, S4 ?
} |3 M; S0 ^* d( @9 P. b
if(jian==0) //角度减小按键是否按下
2 C5 p2 H* h: r+ G) Q# a. k8 ^ {( Y! w5 P: G {) Q [
delay(10);
) F8 E3 W; B! r% T, i if(jian==0); V5 x, ]# j# m7 A7 U# O j! @, ~
{
3 @+ U! A* ?3 j- h/ Q: X; | jd--; //角度标识减1
: I- ^# J$ Q8 R" H5 j( i count=0;8 J8 D7 }) n( X. C1 t6 Q8 x- m
if(jd==0)
V$ z: n2 r9 o7 ?1 ?- P jd=1; //已经是0度,则保持
2 u& D4 o. `9 k$ W" l8 d6 h- _ while(jan==0);
( o6 J5 L3 H; R3 f% K' V+ w+ M }. _% W* u5 d: w$ z5 T% g& Z
}9 q8 M* X5 r p
}*/3 W' s* r( b# c& Z7 D0 h# p
4 {& E# |; `5 L0 @
void main()( W" k0 o6 a5 D; a$ w; S8 f) y* I
{, s" G, i n1 H; k; f
//上电,舵机自动正反转 6 ~# }2 C5 |) F0 G/ ]
//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
* A7 m4 W; q+ T8 Q3 B3 I8 h: Owhile(1)
) {, r& y' K, z; f{% a2 q9 _8 u6 k1 Q7 ?- h
for(jd=1;jd<6;jd++)' l8 f2 Z7 ^ J' I
{
! m# q9 z" p) \9 o5 ]+ Ocount=0;- E8 k* I1 ~( J
Time0_Init();( `; V: V8 H" f/ ~8 G; z3 G8 M
delay(50000000);3 j5 H* {+ m# U: v! ?
}
4 B$ C" U4 T: E* G0 t& l, D: Q( [delay(50000000);
: c4 g, B9 y4 a* }0 Y- ffor(jd=6;jd>0;jd--)* B( R$ s$ ~& p" H. x( m6 |9 q! u1 R
4 c+ f3 w. E, V8 u% q{7 l. q/ @- p: L7 _9 B
8 Z* U% U: Q9 i. n) i' Z
count=0;$ I% N" N) N- v! r7 p+ i$ N* M
3 _5 a4 @/ s1 u
Time0_Init();1 c5 r9 v) `: B1 w n( J2 ^
, f; B' \5 v$ i6 y( ?
delay(50000000);$ L% `* I0 N( Z. U( H$ v
- v* I) p; ~5 r5 L
}7 J6 N- d9 @: }& z
9 T# K: `! m' `/ M. R1 \# h
3 K5 s7 C( ?8 L' I' O4 [5 z. a" n
$ o2 ]1 `1 o1 g: ~, `- R' Q |
|