找回密码
 注册
关于网站域名变更的通知
查看: 343|回复: 1
打印 上一主题 下一主题

51单片机舵机驱动源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-10-29 11:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
51单片机舵机驱动源程序

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+ |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-16 20:27 , Processed in 0.078125 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表