小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 3492|回复: 0

360度舵机控制 顺时针 逆时针 停止 无法停止 求高手解决

[复制链接]
发表于 2013-12-3 16:08:30 | 显示全部楼层 |阅读模式
单片机:STC89C52RC
晶振:11.0592M
创想:P0口控制舵机 脚位使用高低电位定义 不使用sbit 定义  因为舵机接在固定的端口会抖动  运行时想控制哪个就控制哪个对别的不产生作用 这样就解决了抖动 停不下来的问题 但是由于本人的编程是那么的菜 只能套用他人的程序 也只能做到FF010100FF顺时针运动 FF010200FF逆时针运动 FF010000FF短暂的停顿   PS:90度 1382 停止是行不通的 要的是没P0除去定义 谢谢
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
int buffer[3];
int rec_flag=0;

uint pwm[]={1382,1382,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)
uint pwm_flag=0;
uint code ms0_5Con=461; //0.5ms计数 (实际是460.8,取整得461)
uint code ms2_5Con=2304; //2.5ms计数

/*-----------------------串口初始化----------------------------*/
void UART_Init(void)
{
    TMOD = 0x21;
    PCON = 0x00;
    SCON = 0x50;
    TH1 = 0xFd; //设置波特率 9600
    TL1 = 0xFd;
    TR1 = 1; //启动定时器1

    ES = 1; //开串口中断
    EA = 1; //开总中断
    IT0=0;
    EX0=1;
}

/*------------------------舵机定时器--------------------------*/
void Timer0Init()
{
    //0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
        //2.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
        TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
        TH0=-ms2_5Con>>8; //给定初值,2.5ms中断
        TL0=-ms2_5Con;
        EA=1; //总中断打开
        ET0=1; //定时器0中断打开
        TR0=1; //定时器0开关打开
}

/*-------------------------主函数---------------------------*/
void main(void)
{

        UART_Init(); //初始化串口
        Timer0Init();//舵机定时初始化
        while(1)
        {
            
        }
}

/*--------------------串口解析执行-------------------------*/
void Communication_Decode(void)
{
    if(buffer[0]==0x01)
    {
        switch(buffer[1])
        {
            case 0x00:P0=0x00;return;
                        case 0x01:pwm[0]=400;return;
            case 0x02:pwm[0]=2222;return;

            default : P0=0xff;return;
        }
     }
}

/*------------------------舵机中断函数--------------------------*/
void SteeringGear() interrupt 1
{
    switch(pwm_flag)
    {
        case 1: P0=0x01;TH0=-pwm[0]>>8; TL0=-pwm[0];break;
        case 2: P0=0x02;break;
        default:TH0=0xff; TL0=0x80; pwm_flag=0;
    }
    pwm_flag++;
}

/*------------------------串口中断函数--------------------------*/
void INT_UartRcv(void) interrupt 4
{
    static int i;
       
        if(RI==1)
    {
            RI = 0;
            if(rec_flag==0)
            {
                if(SBUF==0xff)
                    {
                        rec_flag=1;
                            i=0;
            }
            }
        else
            {
                if(SBUF==0xff)
                    {
                        rec_flag=0;
                            if(i==3)
                            {
                                Communication_Decode();
                            }
                i=0;
                    }
            else
                    {
                        buffer[i]=SBUF;
                            i++;
                    }
            }
    }
    else
    {
        TI = 0;
    }
}

回复

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-5-18 17:09 , Processed in 1.152339 second(s), 18 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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