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

51单片机舵机驱动源程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机舵机驱动源程序
# t$ W4 m+ p' I6 v1 E8 q
单片机控制舵机源程序如下:" u( C  B5 A9 ]3 h

* ]; M9 K8 L+ S& c. m#include <reg52.h>8 ]- _9 q+ n( Y; X

6 s  z1 n; h( I6 b9 d7 P, Dunsigned char count;      //0.5ms次数标识
2 \, h  L! }6 M9 `+ x8 w! g, L3 K8 j$ O) O0 Y. {6 D7 l; V5 }
sbit pwm =P1^0 ;          //PWM信号输出
& ?3 [# c9 S1 M% E! u( f( J& h" j1 ^% Z& `- h/ K% L) X0 b
sbit jia =P2^4;           //角度增加按键检测IO口
3 W, d, g; o) N6 j
! s$ a4 Z7 f6 Z' t; K' _sbit jian =P2^5;           //角度减少按键检测IO口0 m3 w7 \1 T4 S  x
! ^2 a) v3 g0 Q3 c
unsigned char jd;         //角度标识. o8 ?+ C' e; E& z2 w1 A

2 L! i! M# ]$ Y1 Y0 g: U) ^8 e6 u8 L+ C8 V3 d7 z# u

$ v2 S0 J& r6 |) x5 q8 A) N7 s9 S9 Tsbit pwm1 =P0^0 ;          //PWM信号输出给示波器,检测PWM波用: _( f7 Y# J$ Y5 s6 k& E
/ u* d6 f! f! {& M0 J: F
void delay(unsigned char i)//延时
" |9 N1 t% H, B* o6 U+ u4 F0 O/ _7 O  q/ J2 @
{
0 C! E4 k9 H: W+ n0 v7 A
( X6 N9 R. M! [" }  u. A( v- |  unsigned char j,k;1 N. m1 [9 \) |, g& I  G# I  \! Z

, h+ K: E- w; D  for(j=i;j>0;j--)
. T4 Y! m0 s% d  v0 @
9 \& }' k# l' T/ U, e7 e    for(k=125;k>0;k--);2 E  Y" O4 }! Z. {2 E% i7 @8 d
' a' W. \5 }6 l. z
}& {* r( v2 y8 F1 ^0 E+ s2 K
8 q) U) \% [5 q8 Z  \
void Time0_Init()          //定时器0初始化$ u- Z- {, @! r( v3 I1 _
2 o: e+ I/ p; w- e
{
6 k) h# _- c8 B2 q; h+ j3 U: V
! S8 L- M" @  o0 Y$ y' j$ }: }//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下8 H+ U* i; {4 I' R5 ?: O
2 e2 m# F8 J& {
TH0  = (65536-445)/256;9 j' ~8 y& S( e+ O

6 C1 {6 j. M2 o6 r8 d+ A  B% `5 P& VTL0  = (65536-445)%256;$ N: j6 O, U, V! T

+ G( i( B; x0 `$ h; l! o
' o4 F" N1 o% r7 q, S+ t' wTMOD = 0x01;    //定时器0工作在方式1   8 K- P. w9 F0 w6 t

0 J' F" E% i  B6 o* {" w% N' b8 PIE = 0x82;        //IE=0x82=1000 0010 等价于 EA=1 开总中断  ET0=1 开定时器0中断, i+ _5 A' P; t4 c
8 L: a/ X" [/ c
  TR0=1;          //开定时器06 z- P) L5 |) |# n. h
4 p! e' L: b' r) j- m0 e4 |) A, T
}# P4 I2 j8 r; E7 G! {
. M. e5 L* D( B- G5 t0 u# x
void Time0_Int() interrupt 1 //中断程序
, e. ?6 e4 q, ~4 f; Z# g/ |* y5 G9 @# O- J) h; R) z
{
3 \! z/ [) A& p3 u0 f! b3 |' a4 P; T# i  m$ _9 f- F( @
//重装初值
, D/ u* t! n7 _. z7 t3 F
6 A) n6 E6 d0 Q8 }) H4 b$ d5 ^TH0  = (65536-445)/256;
2 r' e* d% j0 ~  j/ W. r! k' ]4 @: _9 P' o9 h0 o  Z! W3 H) |
TL0  = (65536-445)%256;, n+ {" P5 q) |. J" [
( O1 [# u. ]: x* H3 v
7 M( U  @- V4 |# ~3 Q
0 S9 x/ q. Q" J4 M: x2 W- t+ _
    if(count< jd)0 J* Q. }$ o; o2 B) L
{
% s6 ?( _, H- J  U' c# [+ l4 |pwm=1;                  //确实小于,PWM输出高电平) Z8 X7 b* J+ A5 B% V
pwm1=pwm;              //接示波器用的io口,观测PWM波形用            }        //判断0.5ms次数是否小于角度标识
: \+ X3 j+ J$ C+ d% A8 E" S1 ^//pwm=1;                  //确实小于,PWM输出高电平
" ^5 U) |4 Z" `! R1 _* s9 V    else
) E6 A3 ?7 p9 i& s{
  ]2 R1 e! {$ J! X8 r+ o' o9 V+ dpwm=0;                  //确实小于,PWM输出高电平
$ W4 C6 c! r& Vpwm1=pwm;             //接示波器用的io口,观测PWM波形用        }0 l$ `' s  I7 u3 V& o
    //  pwm=0;                  //大于则输出低电平
- Y/ j* P, J/ P/ P  n5 j    count=(count+1);          //0.5ms次数加1
" m$ E( N& q7 h- H' T2 X9 N7 F    count=count%40;     //次数始终保持为40 即保持周期为20ms# y3 d0 a/ F9 |2 ^' ]2 K- C
}$ W& I0 b4 `7 b2 Y- |: C
1 j8 E" \. n# _( p9 x
//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
5 c& W( p0 Q5 t//通过jian按键控制反转
2 c8 S; V5 T  t) f0 T, d5 H/*void keyscan()              //按键扫描' g# @* K9 X2 q
{3 [! n/ f6 y/ X/ T
   if(jia==0)               //角度增加按键是否按下3 D- k& Q* K+ Q% n9 M
  {
8 k: j9 g  \$ Q$ q- m    delay(10);              //按下延时,消抖
/ ^: [  m% m% H/ O    if(jia==0)              //确实按下
2 k$ C6 [4 M0 e& y" s     {. a: y, Y2 i, G- \$ J
      jd++;                 //角度标识加13 _1 G6 A* ]' {3 b* K0 }) [0 Z
      count=0;              //按键按下 则20ms周期从新开始
$ U7 Z8 z# }% F4 j) J3 _, c! N      if(jd==6)* I8 x$ {  W7 G5 f
        jd=5;               //已经是180度,则保持5 x2 G* N! S7 T. T/ [; |3 q& a
      while(jia==0);        //等待按键放开
$ `& @  b+ ?8 \# m     }0 {2 z+ W+ J( g
  }
6 F5 s% q6 C. d# s! o. ]$ T  if(jian==0)                //角度减小按键是否按下# p% J' F8 c0 J. z  B. \0 f
  {
* u* V$ A& c4 w0 d: U    delay(10);- ?/ t: |4 k% t+ h) Z3 q; n% a( H- r
    if(jian==0)$ ^' I0 j# S/ w6 _* O
     {
& j3 G( p8 c8 _' K      jd--;                 //角度标识减1
7 b* r& _. r; s- a9 D" a6 a      count=0;
5 m7 _2 r* U# ^5 E& w; A      if(jd==0)! c3 S* t7 j# N- J" j. y
        jd=1;               //已经是0度,则保持
* `' f) p4 D- h: M* Y4 u4 `      while(jan==0);
* I3 _1 Y& z4 _8 p+ v: ~     }& b1 ]) b# a- k
  }1 ~& D2 k8 i% J1 [
}*/2 O  P% Y  ~  Z
/ c* m: D0 j4 h1 l
void main()
3 B! W5 V! C6 n6 G# D9 [3 g" z{
; \9 Q+ [7 t/ a: _//上电,舵机自动正反转   
7 E9 ]+ c! A; W6 M! `6 O5 }//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想   1 U+ m7 @1 p, l& X7 ~  ~3 w2 O
while(1)" [5 W/ ]: J& {+ R, b
{0 S& L5 ?/ M5 _8 N% B$ H4 i$ }
  for(jd=1;jd<6;jd++)
! [$ f+ t. t* D{
! E0 e4 K2 [! n! s& mcount=0;
9 j$ c1 E$ t- d0 ?Time0_Init();
& R' ?4 e9 x  l( N$ qdelay(50000000);
/ V. y* t4 @$ Z! p}+ h# D, `, Q" Y% T+ k/ A' r
delay(50000000);
' `1 \, v# ^' p% `for(jd=6;jd>0;jd--)
' y5 X% M5 r' Q8 n- M" q: v- c  A3 c! }  T. A2 k# @, ~8 I6 a
{2 }2 C4 ]7 T; S; g% `2 ?6 }

+ Q5 [; s6 o& icount=0;) b( _; Y* F' X( e0 E. L

% E6 T4 S3 F; V/ u* LTime0_Init();
1 }" h# B( ~; q  _. x! d* Y
# K3 J0 t- }4 p4 gdelay(50000000);
: ?; K* ~& v9 I- a
4 q" |$ E; M0 C4 O* O}4 F& k4 I1 n5 S
# U3 Z1 G0 y& k' d# P* C
/ i! z9 L0 y+ [9 c, ^

; L7 N; I, R1 O7 \7 f: Z" Z5 \' V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 20:37 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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