找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机 9G舵机 0-180自动转动的程序

  [复制链接]
跳转到指定楼层
楼主
单片机:stc12c5a60s2
晶振:12M
功能:舵机自动从0至180度来回摆动
  1. /*********************************************************************************************
  2. 单片机:stc12c5a60s2
  3. 晶振:12M
  4. 功能:舵机自动从0至180度来回摆动

  5. /*********************************************************************************************/

  6. /*********************************************************************************************
  7. 说明:
  8. 高电平值0.5到2.5mS 对应 舵机的 -90度到+90度。
  9. 一个高、低电平的总长是20mS

  10. /*********************************************************************************************/


  11. #include <STC12C5A60S2.H> //STC12Cx052或STC12Cx052AD系列单片机头文件
  12. sbit R_Key = P3 ^ 4;//右转键
  13. sbit L_Key = P3 ^ 5;//左转键
  14. sbit PWM_OUT = P3 ^ 6;//PWM输出接口
  15. bit OUT;//高低电平切换标志位
  16. unsigned char SG1;//舵机角度设置

  17. /*********************************************************************************************
  18. 函数名:毫秒级CPU延时函数
  19. 调  用:DELAY_MS (?);
  20. 参  数:1~65535(参数不可为0)
  21. 返回值:无
  22. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  23. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  24. /*********************************************************************************************/
  25. void DELAY_MS (unsigned int a){
  26.         unsigned int i;
  27.         while( a-- != 0){
  28.                 for(i = 0; i < 600; i++);
  29.         }
  30. }
  31. /*********************************************************************************************/

  32. /*********************************************************************************************
  33. 函数名:定时/计数器初始化函数
  34. 调  用:T_C_init();
  35. 参  数:无
  36. 返回值:无
  37. 结  果:设置SFR中T/C1和(或)T/C0相关参数
  38. 备  注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽
  39. /**********************************************************************************************/
  40. void T_C_init (void){
  41.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  42.         EA = 1;        //中断总开关

  43.         TH0 = 0xFF; //16位计数寄存器T0高8位
  44.         TL0 = 0xF5; //16位计数寄存器T0低8位
  45.         ET0 = 1; //T/C0中断开关
  46.         //TR0 = 1; //T/C0启动开关
  47. }
  48. /**********************************************************************************************/

  49. /*********************************************************************************************
  50. 函数名:定时/计数器0中断处理函数
  51. 调  用:[T/C0溢出后中断处理]
  52. 参  数:无
  53. 返回值:无
  54. 结  果:重新写入16位计数寄存器初始值,处理用户程序
  55. 备  注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致
  56. /**********************************************************************************************/
  57. void T_C0 (void) interrupt 1  using 1{ //切换寄存器组到1
  58.         unsigned int a;
  59.         if(OUT==0){//判断高低脉冲标志//
  60.                 a= 0x0A*SG1+0x01F3;//0x0A是1度的时间长,0x01F3是0.5mS时间长。
  61.                 a= 0xFFFF - a;//算出定时开始值
  62.                 TH0 = a/0xFF; //16位计数寄存器T0高8位
  63.                 TL0 = a%0xFF; //16位计数寄存器T0低8位
  64.                 OUT = 1;//标志切换
  65.                 PWM_OUT=1;//PWM输出高电平
  66.         }else{
  67.                 a= 0x4E1F - (0x0A*SG1+0x01F3);//0x4E1F是20mS的时间长
  68.                 a= 0xFFFF - a;//算出定时开始值
  69.                 TH0 = a/0xFF;
  70.                 TL0 = a%0xFF;
  71.                 OUT = 0;
  72.                 PWM_OUT=0;//PWM输出低电平
  73.         }
  74. }
  75. /**********************************************************************************************/

  76. /*********************************************************************************************
  77. 函数名:主函数
  78. 调  用:无
  79. 参  数:无
  80. 返回值:无
  81. 结  果:程序开始处,无限循环
  82. 备  注:
  83. /**********************************************************************************************/
  84. void main (void){
  85.         P3M0 = 0x60;        //
  86.         P3M1 = 0x00;        //设置推挽输出
  87.         DELAY_MS (500);
  88.         

  89. …………余下代码请下载附件…………
复制代码



下载:
自动0~180度回来摆动.rar (1.38 KB, 下载次数: 202)

评分

参与人数 4黑币 +61 收起 理由
xiou + 1 赞一个!
奇点zy + 5 赞一个!
左手阳光右手沙 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-3-14 22:17 | 只看该作者
好资料,51黑有你更精彩

回复

使用道具 举报

板凳
ID:164988 发表于 2017-3-14 23:34 | 只看该作者
已买了两个9G舵机 ,正好用上,感谢楼主分享,谢谢!
回复

使用道具 举报

地板
ID:267919 发表于 2017-12-27 19:02 | 只看该作者
在做舵机SG90的课设
回复

使用道具 举报

5#
ID:315120 发表于 2018-5-21 17:37 | 只看该作者
楼主好人,刚好需要
回复

使用道具 举报

6#
ID:404498 发表于 2018-9-30 20:26 | 只看该作者
89c52rc能用吗
回复

使用道具 举报

7#
ID:404498 发表于 2018-9-30 23:25 | 只看该作者
        共享资料的黑币奖励!
回复

使用道具 举报

8#
ID:405273 发表于 2018-10-19 09:30 | 只看该作者
能精确控制舵机转角吗?比如按键一下 5度
回复

使用道具 举报

9#
ID:58240 发表于 2018-10-21 22:22 | 只看该作者
感谢分享     
回复

使用道具 举报

10#
ID:374198 发表于 2018-12-27 08:20 | 只看该作者
想问一下,9g舵机回中原理是什么???
回复

使用道具 举报

11#
ID:973173 发表于 2021-10-18 23:41 | 只看该作者
不知道一开始通电的时候会不会自动转?
回复

使用道具 举报

12#
ID:969161 发表于 2021-11-10 23:20 | 只看该作者
谢谢楼主,这个不错,正需要看舵机的。
回复

使用道具 举报

13#
ID:969161 发表于 2021-11-10 23:28 | 只看该作者
我以前抄了一个程序,但舵机就是不能正常转动起来,到现在都不知道是什么原因。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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