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

51单片机舵机驱动源程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机舵机驱动源程序
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-9 19:44 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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