51单片机按键控制舵机

发布者:CelestialSoul最新更新时间:2019-10-15 来源: eefocus关键字:51单片机  按键控制  舵机 手机看文章 扫描二维码
随时随地手机看文章

#include

#define Stop 0    //宏定义,停止

#define Left 1      //宏定义,左转

#define Right 2      //宏定义,右转



sbit ControlPort = P1^0;  //舵机信号端口

sbit KeyLeft = P1^1;      //左转按键端口

sbit KeyRight = P1^2;      //右转按键端口

sbit KeyStop = P1^3;      //归位按键端口


unsigned char TimeOutCounter = 0,LeftOrRight = 0;  //TimeOutCounter:定时器溢出计数      LeftOrRight:舵机左右旋转标志


void InitialTimer ( void )     

{

    TMOD=0x10;   //定时/计数器1工作于方式1

    TH1 = ( 65535 - 500 ) / 256;      //0.25ms

    TL1 = ( 65535 - 500 ) % 256;

    EA=1;        //开总中断

    ET1=1;       //允许定时/计数器1 中断

    TR1=1;       //启动定时/计数器1 中断

}


void ControlLeftOrRight ( void )   //控制舵机函数

{

    if( KeyStop == 0 )

    {

        while ( !KeyStop );       //使标志等于Stop(0),在中断函数中将用到

        LeftOrRight = Stop;

    }


    if( KeyLeft == 0 )

    {

        while ( !KeyLeft );       //使标志等于Left(1),在中断函数中将用到

        LeftOrRight = Left;

    }


    if( KeyRight == 0 )

    {

        while ( !KeyRight );   //使标志等于Right(2),在中断函数中将用到

        LeftOrRight = Right;

    }


}


void main ( void )     //主函数

{

    InitialTimer();

    for(;;)

    {

        ControlLeftOrRight();

    }

}


void Timer1 ( void ) interrupt 3  //定时器中断函数

{

    TH1 = ( 65535 - 500 ) / 256;

    TL1 = ( 65535 - 500 ) % 256;

    TimeOutCounter ++;


    switch ( LeftOrRight )

    {

        case 0 :      //为0时,舵机归位,脉宽1.5ms

        {

            if( TimeOutCounter <= 6 )

            {

                ControlPort = 1;

            }

            else 

            {

                ControlPort = 0;

            }

            break;

        }

        case 1 :     //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出

        {

            if( TimeOutCounter <= 2 )

            {

                ControlPort = 1;

            }

            else 

            {

                ControlPort = 0;

            }

            break;

        }

        case 2 :   //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出

        {

            if( TimeOutCounter <= 10 )

            {

                ControlPort = 1;

            }

            else 

            {

                ControlPort = 0;

            }

            break;

        }

        default : break;

    }

    

    if( TimeOutCounter == 80 )     //周期20ms(理论值),比较可靠,最好不要修改

    {

        TimeOutCounter = 0;

    }

}


关键字:51单片机  按键控制  舵机 引用地址:51单片机按键控制舵机

上一篇:单片机国旗自动升降系统仿真及程序
下一篇:51单片机+74HC138驱动16*96点阵显示汉字的Proteus仿真+源代码

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved