找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1596|回复: 1
收起左侧

单片机控制舵机的程序源码

[复制链接]
ID:371690 发表于 2018-7-14 20:53 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include <reg52.h>
  2. sbit ControlPort = P1^0; //舵机信号端口
  3. sbit Key = P3^4; //按键端口
  4. unsigned int TimeOutCounter = 0 //TimeOutCounter:定时器溢出计数
  5. unsigned char flag=1,num=2;

  6. void InitTimer (void)
  7. {
  8. TMOD=0x10; //定时/计数器1工作于方式1
  9. TH1 = ( 65535 - 50 ) / 256; //0.25ms
  10. TL1 = ( 65535 - 50 ) % 256;
  11. EA=1; //开总中断
  12. ET1=1; //允许定时/计数器1 中断
  13. TR1=1; //启动定时/计数器1 中断
  14. }

  15. void delay(unsigned int z)
  16. {
  17. unsigned int x,y;
  18. for(x=z;x>0;x--)
  19. for(y=110;y>0;y--);
  20. }
  21. void ControlLeftOrRight (void) //控制舵机函数
  22. {
  23. if(flag==1)
  24. {
  25. if(Key == 0)
  26. {
  27. delay(30);
  28. if(Key == 0)
  29. {
  30. while(!Key);
  31. num=num+1;
  32. if(num==4) flag=0;
  33. }
  34. }
  35. }//使标志等于Stop(0), 在中断函数中将用到
  36. else
  37. {
  38. if( Key == 0 )
  39. {
  40. delay(30);
  41. if(Key==0)
  42. {
  43. while(!Key);
  44. num=num-1;
  45. if(num==0) flag=1;
  46. }
  47. }
  48. }
  49. }
  50. void main (void) //主函数
  51. {
  52. InitTimer();
  53. for(;;)
  54. {
  55. ControlLeftOrRight();
  56. }
  57. }
  58. void Timer1 (void) interrupt 3 //定时器中断函数
  59. {
  60. TH1 = ( 65535 - 50 ) / 256;
  61. TL1 = ( 65535 - 50 ) % 256;
  62. TimeOutCounter ++;
  63. switch ( num)
  64. {
  65. case 0 : //为0时,舵机归位,脉宽1.5ms
  66. {
  67. if( TimeOutCounter <= 8 )ControlPort = 1;
  68. else ControlPort = 0;
  69. break;
  70. }
  71. case 1 :
  72. {
  73. if( TimeOutCounter <= 15 )ControlPort = 1;
  74. else ControlPort = 0;
  75. break;
  76. }
  77. case 2 :
  78. {
  79. if( TimeOutCounter <= 22 )ControlPort = 1;
  80. else ControlPort = 0;
  81. break;
  82. }
  83. case 3 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
  84. {
  85. if( TimeOutCounter <=29 ) ControlPort = 1;
  86. else ControlPort = 0;
  87. break;
  88. }
  89. case 4 :
  90. {
  91. if( TimeOutCounter <= 36 )ControlPort = 1;
  92. else ControlPort = 0;
  93. break;
  94. }
  95. default : break;
  96. }
  97. if( TimeOutCounter == 400 )TimeOutCounter = 0;
  98. }
复制代码


回复

使用道具 举报

ID:229361 发表于 2018-7-15 08:00 | 显示全部楼层
受教了~~~谢谢大神
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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