找回密码
 立即注册

QQ登录

只需一步,快速开始

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

控制舵机的程序,不知为什么不对。

[复制链接]
跳转到指定楼层
楼主
ID:63808 发表于 2014-7-9 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
unsigned int i,j;
void delay(unsigned char xms);
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;  
//引脚定义:
sbit PWM1 = P2^0; //舵机的控制引脚(PWM输出)

//引脚定义:
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
sbit key1 = P3^7; //定义按键1
sbit key2 = P3^6; //定义按键2
sbit key3 = P3^5; //定义按键3
sbit key4 = P3^4; //定义按键4
sbit key5 = P3^3; //定义按键5
sbit key6 = P3^2; //定义按键6
//变量定义:
unsigned char fe=100; //转角变量,值控制在100-250

void delayMS(void)   //误差 0us 延时1ms 此处可以修改高电平周期
//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试
{
    unsigned char a,c;
c=fe;
    for(;c>0;c--){
  a++;
  a++;
}
}
//延时子函数
void delay(unsigned int time)
{
while(time--);
}
//初始化函数
void init()
{
TMOD=0X01;   //设置定时器0为模式一,即16位计算模式
    TH0 = 0x0B1;
    TL0 = 0x0E0;
EA=1;  //开启总中断
ET0=1;  //开启定时器0中断
TR0=1;  //启动定时器0
}
//中断函数,定地器0
void timer() interrupt 1
{
    //20ms中断
    TH0 = 0x0B1;
    TL0 = 0x0E0;
//0.1ms中断,200次中断为一个周期20MS,转角控制是0.5MS-2.5MS即5-25,180度分辨率20格为9度(CPU速度越快,分辨率可以做到更高)

    PWM1=1;
    delayMS();
    PWM1=0;
}
//主函数,C语言的入口函数
void main(void)  
{
unsigned char ldat;
init();     //初始化中断控制寄存器
TMOD=0X20;    //设置定时器1为模式2,做为波特率发生器
TL1=0xF3;    //2400波特率的初值,板子使用12M晶振,初值=256-12000000/32/12/2400
TH1=0xF3;    //
TR1=1;     //启动波特率发生
SCON=0x50;    //设置串口方式2
ES=1;
P0=0xc0;    //数码管显示0
SMG_g=0;    //使用数码管个位来显示键值

while(1)
{
    if(RI){    //查询是否有数据接收
   ldat=SBUF;  //数据暂存于变量中
   RI=0;   //重新清0等待接收
   SBUF=ldat;  //将接收到的数据发送出去
   if(ldat==0x10)
   {       //PWM出1.0ms,灯亮
   LED1=0;
   P0=0xf9;  //数码管显示1
   fe=100;    //0.5MS,定0度位置
   delay(50000);  //延时
   delay(50000);
}
   else if(ldat==0x20)  //继电器通电,锁开启,灯灭
   {
   LED2=0;
   P0=0xa4;  //数码管显示2
   fe=150;    //1.5MS,定90度位置
   delay(50000);
   delay(50000);
  
   }
   else if(ldat==0x30)
   {
   LED3=0;
   P0=0xb0;  //数码管显示3
   fe=200;    //2.0MS,定135度位置
   delay(50000);
   delay(50000);
   
   }
   else if(ldat==0x40)
   {
   LED4=0;
   P0=0x99;  //数码管显示4
   fe=250;    //2.0MS,定135度位置
   delay(50000);
   delay(50000);
   
   }
   
   
   
   while(!TI);  //等待发送完成
   TI=0;
  }
}
}


应该是控制一定角度 ,但通电后无穷循环转动,不知哪里有错、、求教大家了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-7-9 21:52 | 只看该作者
while(1)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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