找回密码
 立即注册

QQ登录

只需一步,快速开始

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

舵机控制程序

[复制链接]
跳转到指定楼层
楼主
ID:275069 发表于 2018-1-12 08:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //
  2. //  dji.c
  3. //  
  4. //
  5. //  Created by 倪刚 on 2018/1/12.
  6. //

  7. #include <reg52.h>
  8. #define Stop 0    //宏定义,停止
  9. #define Left 1   //宏定义,左转
  10. #define Right 2   //宏定义,右转

  11. sbit ControlPort = P2^0;  //舵机信号端口
  12. sbit KeyLeft = P1^0;   //左转按键端口
  13. sbit KeyRight = P1^1;   //右转按键端口
  14. sbit KeyStop = P1^2;   //归位按键端口

  15. unsigned char TimeOutCounter = 0,LeftOrRight = 0;  //TimeOutCounter:定时器溢出计数   LeftOrRight:舵机左右旋转标志
  16. void InitialTimer (void)
  17. {
  18.     TMOD=0x10;   //定时/计数器1工作于方式1
  19.     TH1 = ( 65535 - 500 ) / 256;   //0.25ms
  20.     TL1 = ( 65535 - 500 ) % 256;
  21.     EA=1;        //开总中断
  22.     ET1=1;       //允许定时/计数器1 中断
  23.     TR1=1;       //启动定时/计数器1 中断
  24.    
  25. }

  26. void ControlLeftOrRight ( void )   //控制舵机函数
  27. {
  28.     if( KeyStop == 0 )
  29.     {
  30.         //while ( !KeyStop );    //使标志等于Stop(0),在中断函数中将用到
  31.         LeftOrRight = Stop;
  32.     }
  33.     if( KeyLeft == 0 )
  34.     {
  35.         //while ( !KeyLeft );    //使标志等于Left(1),在中断函数中将用到
  36.         LeftOrRight = Left;
  37.     }
  38.     if( KeyRight == 0 )
  39.     {
  40.         //while ( !KeyRight );   //使标志等于Right(2),在中断函数中将用到
  41.         LeftOrRight = Right;
  42.     }

  43. }

  44. void main ( void )  //主函数
  45. {
  46.     InitialTimer();
  47.     for(;;)
  48.     {
  49.         ControlLeftOrRight();
  50.         
  51.     }
  52. }

  53. void Timer1 ( void ) interrupt 3  //定时器中断函数
  54. {
  55.     TH1 = ( 65535 - 500 ) / 256;
  56.     TL1 = ( 65535 - 500 ) % 256;
  57.     TimeOutCounter ++;
  58.     switch ( LeftOrRight )
  59.     {
  60.         case 0 :   //为0时,舵机归位,脉宽1.5ms
  61.         {
  62.             if( TimeOutCounter <= 6 )
  63.             {
  64.                 ControlPort = 1;
  65.                
  66.             } else {
  67.                 ControlPort = 0;
  68.             }
  69.             break;
  70.             
  71.         }   case 1 :     //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出
  72.         {
  73.             if( TimeOutCounter <= 2 )
  74.             {
  75.                 ControlPort = 1;
  76.                
  77.             } else {
  78.                 ControlPort = 0;
  79.             }
  80.             break;
  81.             
  82.         }   case 2 :   //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
  83.         {
  84.             if( TimeOutCounter <= 10 )
  85.                  {
  86.                     ControlPort = 1;
  87.                     
  88.                 }    else     {
  89.                     ControlPort = 0;
  90.                     
  91.                      }    break;
  92.         }
  93.          default : break;
  94.     }
  95.      if( TimeOutCounter == 80 )  //周期20ms(理论值),比较可靠,最好不要修改
  96.     {
  97.         TimeOutCounter = 0;
  98.     }
  99.    
  100. }}
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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