找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机舵机驱动源程序

[复制链接]
跳转到指定楼层
楼主
ID:74868 发表于 2018-8-3 17:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机控制舵机源程序如下:
  1. #include <reg52.h>

  2. unsigned char count;      //0.5ms次数标识

  3. sbit pwm =P1^0 ;          //PWM信号输出

  4. sbit jia =P2^4;           //角度增加按键检测IO口

  5. sbit jian =P2^5;           //角度减少按键检测IO口

  6. unsigned char jd;         //角度标识



  7. sbit pwm1 =P0^0 ;          //PWM信号输出给示波器,检测PWM波用

  8. void delay(unsigned char i)//延时

  9. {

  10.   unsigned char j,k;

  11.   for(j=i;j>0;j--)

  12.     for(k=125;k>0;k--);

  13. }

  14. void Time0_Init()          //定时器0初始化

  15. {

  16. //定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下

  17. TH0  = (65536-445)/256;

  18. TL0  = (65536-445)%256;


  19. TMOD = 0x01;    //定时器0工作在方式1   

  20. IE = 0x82;        //IE=0x82=1000 0010 等价于 EA=1 开总中断  ET0=1 开定时器0中断

  21.   TR0=1;          //开定时器0

  22. }

  23. void Time0_Int() interrupt 1 //中断程序

  24. {

  25. //重装初值

  26. TH0  = (65536-445)/256;

  27. TL0  = (65536-445)%256;



  28.     if(count< jd)
  29. {
  30. pwm=1;                  //确实小于,PWM输出高电平
  31. pwm1=pwm;              //接示波器用的io口,观测PWM波形用            }        //判断0.5ms次数是否小于角度标识
  32. //pwm=1;                  //确实小于,PWM输出高电平
  33.     else
  34. {
  35. pwm=0;                  //确实小于,PWM输出高电平
  36. pwm1=pwm;             //接示波器用的io口,观测PWM波形用        }
  37.     //  pwm=0;                  //大于则输出低电平
  38.     count=(count+1);          //0.5ms次数加1
  39.     count=count%40;     //次数始终保持为40 即保持周期为20ms
  40. }

  41. //此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
  42. //通过jian按键控制反转
  43. /*void keyscan()              //按键扫描
  44. {
  45.    if(jia==0)               //角度增加按键是否按下
  46.   {
  47.     delay(10);              //按下延时,消抖
  48.     if(jia==0)              //确实按下
  49.      {
  50.       jd++;                 //角度标识加1
  51.       count=0;              //按键按下 则20ms周期从新开始
  52.       if(jd==6)
  53.         jd=5;               //已经是180度,则保持
  54.       while(jia==0);        //等待按键放开
  55.      }
  56.   }
  57.   if(jian==0)                //角度减小按键是否按下
  58.   {
  59.     delay(10);
  60.     if(jian==0)
  61.      {
  62.       jd--;                 //角度标识减1
  63.       count=0;
  64.       if(jd==0)
  65.         jd=1;               //已经是0度,则保持
  66.       while(jan==0);
  67.      }
  68.   }
  69. }*/

  70. void main()
  71. {
  72. //上电,舵机自动正反转   
  73. //应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想   
  74. while(1)
  75. {
  76.   for(jd=1;jd<6;jd++)
  77. {
  78. count=0;
  79. Time0_Init();
  80. delay(50000000);
  81. }
  82. delay(50000000);
  83. for(jd=6;jd>0;jd--)

  84. {

  85. count=0;

  86. Time0_Init();

  87. delay(50000000);

  88. }

复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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