找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2110|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机如何控制舵机啊 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:314625 发表于 2018-4-23 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求各位大楼帮忙  最好有编程解释
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:511588 发表于 2019-8-5 14:48 | 只看该作者
//采用24.5MHZ的51单片机驱动舵机转动程序如下:(上电自动转动 )
#include <C8051F410.H>

unsigned char count;      //0.5ms次数标识

sbit pwm =P1^0 ;          //PWM信号输出

sbit jia =P2^4;           //角度增加按键检测IO口

sbit jian =P2^5;           //角度减少按键检测IO口

unsigned char jd;         //角度标识



sbit pwm1 =P0^0 ;          //PWM信号输出给示波器,检测PWM波用

void delay(unsigned char i)//延时
{

  unsigned char j,k;

  for(j=i;j>0;j--)

    for(k=125;k>0;k--);

}

void Time0_Init()          //定时器0初始化
{


  TH0  = 0xfc;        //定时器0装初值 定时0.5ms进入中断

  TL0  = 0x03;


  TMOD = 0x01;       //定时器0工作在方式1   

  IE = 0x82;              //IE=0x82=1000 0010 等价于 EA=1 开总中断  ET0=1 开定时器0中断

  TR0=1;             //开定时器0
       
  CKCON = 0x04;      //定时器0使用系统时钟22.1184mhz
}

void Time0_Int() interrupt 1         //中断程序
{

     //重装初值

  TH0  = 0xfc;
  TL0  = 0x03;

    if(count<jd)

      {

                        pwm=1;                  //确实小于,PWM输出高电平
                        pwm1=pwm;              //接示波器用的io口,观测PWM波形用            }        //判断0.5ms次数是否小于角度标识
       //pwm=1;                  //确实小于,PWM输出高电平
                       
                }
    else

                {

                        pwm=0;                  //大于则输出低电平

                        pwm1=pwm;             //接示波器用的io口,观测PWM波形用        }

                        //  pwm=0;                  //大于则输出低电平

                        count=(count+1);          //0.5ms次数加1

                        count=count%40;     //次数始终保持为40 即保持周期为20ms

                }
}


//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,

//通过jian按键控制反转

/*void keyscan()              //按键扫描
{
   if(jia==0)               //角度增加按键是否按下
  {
    delay(10);              //按下延时,消抖
    if(jia==0)              //确实按下
     {
      jd++;                 //角度标识加1
      count=0;              //按键按下 则20ms周期从新开始
      if(jd==6)
        jd=5;               //已经是180度,则保持
      while(jia==0);        //等待按键放开
     }
  }
  if(jian==0)                //角度减小按键是否按下
  {
    delay(10);
    if(jian==0)
     {
      jd--;                 //角度标识减1
      count=0;
      if(jd==0)
        jd=1;               //已经是0度,则保持
      while(jan==0);
     }
  }
}*/


void Port_IO_Init()
{
    P1SKIP    = 0x0F;
    XBR0      = 0x08;
    XBR1      = 0x50;
}

void Oscillator_Init()
{
    OSCICN    = 0x87;
}
void Init_Device(void)
{
         PCA0MD    &= ~0x40;
    PCA0MD    = 0x00;
    Port_IO_Init();
    Oscillator_Init();
}



void main()

{

//上电,舵机自动正反转   

//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想   
  Init_Device();
       
while(1)

{

  for(jd=1;jd<6;jd++)
                 
                {
                 
                        count=0;
                       
                        Time0_Init();
                 
                        delay(50000000);
                 
                }

                delay(50000000);

        for(jd=6;jd>0;jd--)
         
                {
                 
                        count=0;
                         
                        Time0_Init();
                         
                        delay(50000000);
                 
                }
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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