找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机按键控制舵机0-180度自由调节

  [复制链接]
跳转到指定楼层
楼主
ID:79544 发表于 2016-10-29 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键控制舵机0-180度自由调节

按键控制舵机0-180度.zip

13.06 KB, 下载次数: 120, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:105972 发表于 2016-10-30 13:37 | 只看该作者
不错的方法
  1. /************************************************************
  2.         芯    片:STC12C5A60S2
  3.         晶    振:11.0592MHz
  4.         功能描述:两个按键控制 舵机从0-180°变化?
  5.         在多功能试验板正确实现

  6.         遇到问题: 如果使用平常方法给TH0 TL0 赋值 ,那样定时误差比较大。。

  7.         平常方法: TH0=(65536-500)/256;
  8.            TL0=(65536-500)%256;
  9.         而如果使用这种方法:
  10.            TH0=-num/256; //高电平时间
  11.            TL0=-num%256;
  12.                 误差就比较小。
  13. *************************************************************/
  14. #include<stc12c5a60s2.h>
  15. #include<math.h>

  16. #define uchar unsigned char
  17. #define uint unsigned int

  18. #define Cycle   4000  //定义周期  180度
  19. #define Cycle1  500  //定义周期   0度
  20. #define juzhong 1500  //定义周期 归中
  21. uint PWM_Value[8];

  22. uchar order=0; //中断步长

  23. sbit key1=P3^7;
  24. sbit key2=P4^6;

  25. //PWM的输出端口
  26. sbit PWM_OUT0=P1^3;
  27. sbit PWM_OUT1=P0^1;
  28. sbit PWM_OUT2=P0^2;
  29. sbit PWM_OUT3=P0^3;



  30. void Init_Timer0()         //定时器0 初始化
  31. {
  32.     TMOD=0x01;

  33.     TH0=(65536-500)/256;
  34.     TL0=(65536-500)%256;

  35.     EA = 1;//打开总中断
  36.     ET0 = 1;//打开定时器0中断
  37.     TR0 = 1;//启动定时器0
  38.       
  39.     PT0=1;  //定时器0 设置为最高优先中断
  40.     PX0=0; // 外部中断0 设置最低中断
  41. }
  42. //延时
  43. void delay(void)
  44. {
  45.   uint i=250;
  46.   while(i--);

  47. }

  48. //按键检测
  49. void keyscan()
  50. {
  51.     if(key1==0)                 //高电平加
  52.         {
  53.                
  54.         if(PWM_Value[0]<Cycle)
  55.            PWM_Value[0]+=2;
  56.         if(PWM_Value[1]<Cycle)
  57.            PWM_Value[1]+=2;
  58.         if(PWM_Value[2]<Cycle)
  59.            PWM_Value[2]+=2;
  60.         if(PWM_Value[3]<Cycle)
  61.            PWM_Value[3]+=2;
  62.                
  63.                
  64.     }
  65.     if(key2==0)           //高电平减
  66.     {
  67.         if(PWM_Value[0]>Cycle1)
  68.            PWM_Value[0]-=2;
  69.         if(PWM_Value[1]>Cycle1)
  70.            PWM_Value[1]-=2;
  71.         if(PWM_Value[2]>Cycle1)
  72.            PWM_Value[2]-=2;
  73.         if(PWM_Value[3]>Cycle1)
  74.            PWM_Value[3]-=2;
  75.     }

  76.     delay();
  77. }
  78. //主函数
  79. void main(void)
  80. {
  81.     PWM_Value[0]=juzhong;//舵机归中
  82.     PWM_Value[1]=juzhong;
  83.     PWM_Value[2]=juzhong;
  84.     PWM_Value[3]=juzhong;
  85.     Init_Timer0();
  86.         P4SW=0X70;
  87.     while(1)
  88.     {
  89.         keyscan();      
  90.     }
  91. }
  92. //定时器0 中断子函数
  93. //这里输出几路波形 就应该为 20MS/N =X 那么X 就是N路平分时间
  94. //在用N-高电平时间  就为该路低电平时间咯。 就这么简单。。。
  95. void timer0(void) interrupt 1
  96. {         
  97.     switch(order)
  98.     {
  99.         case 1:PWM_OUT0=1;
  100.                TH0=-PWM_Value[0]/256;     //第一路输出高电平时长
  101.                TL0=-PWM_Value[0]%256;
  102.                break;
  103.         case 2:PWM_OUT0=0;
  104.                TH0=-(5000-PWM_Value[0])/256;   //第一路 输出低电平时长
  105.                TL0=-(5000-PWM_Value[0])%256;
  106.                break;
  107.         case 3:PWM_OUT1=1;
  108.                TH0=-PWM_Value[1]/256;
  109.                TL0=-PWM_Value[1]%256;
  110.                break;
  111.         case 4:PWM_OUT1=0;
  112.                TH0=-(5000-PWM_Value[1])/256;
  113.                TL0=-(5000-PWM_Value[1])%256;
  114.                break;
  115.         case 5:PWM_OUT2=1;
  116.                TH0=-PWM_Value[2]/256;
  117.                TL0=-PWM_Value[2]%256;
  118.                break;
  119.         case 6:PWM_OUT2=0;
  120.                TH0=-(5000-PWM_Value[2])/256;
  121.                TL0=-(5000-PWM_Value[2])%256;
  122.                break;
  123.         case 7:PWM_OUT3=1;
  124.                TH0=-PWM_Value[3]/256;
  125.                TL0=-PWM_Value[3]%256;
  126.                break;
  127.         case 8:PWM_OUT3=0;
  128.                TH0=-(5000-PWM_Value[3])/256;
  129.                TL0=-(5000-PWM_Value[3])%256;
  130.                   
  131.        order=0;
  132.        break;

  133.        default: order=0;
  134.     }
  135.     order++;
  136. }
复制代码


回复

使用道具 举报

板凳
ID:79544 发表于 2016-11-5 12:43 | 只看该作者
谢谢!相互学习进步
回复

使用道具 举报

地板
ID:120085 发表于 2016-11-7 22:30 | 只看该作者
谢谢!相互学习进步,我正要写
回复

使用道具 举报

5#
ID:162106 发表于 2017-2-12 15:08 | 只看该作者
漏洞百出,差评!!!!!
回复

使用道具 举报

6#
ID:177855 发表于 2017-4-28 09:40 | 只看该作者
前辈,我也想做个通过远程控制的WIFI带摄像头的小车…………。前后左右、摄像头上下左右(老的说法叫八通道)。驱动最好是无级变速的(是不是叫PWM),能实现吗?
回复

使用道具 举报

7#
ID:177855 发表于 2017-4-28 09:43 | 只看该作者
前辈,我也想做个带摄像头的小车。前后左右,摄像头上下左右(八通道),驱动最好是无级变速的(是不是叫PMW),有点基础,能不能指点下,能实现吗?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 赞一个!

查看全部评分

回复

使用道具 举报

8#
ID:194844 发表于 2017-5-1 06:30 | 只看该作者
谢谢!相互学习进步
回复

使用道具 举报

9#
ID:190720 发表于 2017-6-24 10:20 | 只看该作者
看一下,谢谢
回复

使用道具 举报

10#
ID:134810 发表于 2017-9-18 14:57 | 只看该作者
看一下
回复

使用道具 举报

11#
ID:263750 发表于 2018-4-18 16:51 | 只看该作者
楼主,厉害了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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