找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机6自由度机械臂调试程序,带LCD1602PWM显示

[复制链接]
跳转到指定楼层
楼主
ID:527441 发表于 2019-5-5 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前学习51的时候为了调试机械臂角度编写的程序,用在开发板上也比较方便,但是由于是普通的舵机,不是总线的,所以需要自己洞洞板焊一个供电带电路。

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <lcd1602.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit duoji0=P2^0;          //PWM输出
  6. sbit duoji1=P2^1;
  7. sbit duoji2=P2^2;
  8. sbit duoji3=P2^3;
  9. sbit duoji4=P3^1;
  10. sbit duoji5=P3^0;

  11. #define GPIO_KEY P1

  12. unsigned int k0;   
  13. unsigned int k1;
  14. unsigned int k2;
  15. unsigned int k4;
  16. unsigned int k3;
  17. unsigned int k5;         //定义下降沿节点

  18. uint dsip[8]={0};
  19. uint j=0;
  20. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','D',' '};

  21. void delayms(uint xms)
  22. {
  23.   uchar j;
  24.         uint i;
  25.         for(i=xms;i>0;i--)
  26.         for(j=112;j>0;j--);
  27. }

  28. void time0() interrupt 1   
  29. {
  30.         static uint ii0=0;
  31.   TH0=(65536-100)/256;      //以20ms为一个周期,以0.1ms为一个脉冲宽度
  32.   TL0=(65536-100)%256;
  33.   ii0++;
  34.   
  35.         if(ii0<=k0)                     
  36.     duoji0=1;    //0号舵机pwm输出
  37.   else
  38.     duoji0=0;   
  39.        
  40.         if(ii0<=k1)    //1号舵机pwm输出                     
  41.     duoji1=1;
  42.   else
  43.     duoji1=0;

  44.   if(ii0<=k2)    //2号舵机pwm输出                       
  45.     duoji2=1;
  46.   else
  47.     duoji2=0;  

  48. if(ii0<=k3)     //3号舵机pwm输出                    
  49.     duoji3=1;
  50.   else
  51.     duoji3=0;
  52.        
  53.          if(ii0<=k4)   //4号舵机pwm输出                     
  54.     duoji4=1;
  55.   else
  56.     duoji4=0;
  57.        
  58.          if(ii0<=k5)   //5号舵机pwm输出                     
  59.     duoji5=1;
  60.   else
  61.     duoji5=0;
  62.        
  63.         if(ii0==200)
  64.     ii0=0;
  65. }

  66. void time0init()
  67. {
  68.   TMOD=0x01;
  69.   TH0=(65536-100)/256;
  70.   TL0=(65536-100)%256;
  71.   TR0=1;
  72.   ET0=1;
  73.   EA=1;
  74. }


  75. char KeyDown()
  76. {
  77.         uchar KeyValue=20;
  78.         uchar a=0;
  79.         GPIO_KEY=0x0f;
  80.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  81.         {
  82.                 delayms(10);//延时10ms进行消抖
  83.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  84.                 {       
  85.                         //测试列
  86.                         GPIO_KEY=0X0F;
  87.                         switch(GPIO_KEY)
  88.                         {
  89.                                 case(0X07):        KeyValue=0;break;
  90.                                 case(0X0b):        KeyValue=1;break;
  91.                                 case(0X0d): KeyValue=2;break;
  92.                                 case(0X0e):        KeyValue=3;break;
  93.                         }
  94.                         //测试行
  95.                         GPIO_KEY=0XF0;
  96.                         switch(GPIO_KEY)
  97.                         {
  98.                                 case(0X70):        KeyValue=KeyValue;break;
  99.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  100.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  101.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  102.                         }
  103.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测,当按键等于0xf时候跳出循环
  104.                         {
  105.                                 delayms(100);
  106.                                 a++;
  107.                         }
  108.                 }
  109.         }
  110.         return KeyValue;
  111. }

  112. void count()
  113. {
  114.        
  115.           LcdWriteData(ASCII[0]);
  116.           LcdWriteData(ASCII[11]);
  117.     LcdWriteData(ASCII[k0/10]);       
  118.                 LcdWriteData(ASCII[k0%10]);       
  119.           LcdWriteData(ASCII[12]);
  120.        
  121.           LcdWriteData(ASCII[1]);       
  122.           LcdWriteData(ASCII[11]);
  123.                 LcdWriteData(ASCII[k1/10]);       
  124.                 LcdWriteData(ASCII[k1%10]);       
  125.           LcdWriteCom(0x80+0x40);
  126.        
  127.           LcdWriteData(ASCII[2]);       
  128.           LcdWriteData(ASCII[11]);
  129.                 LcdWriteData(ASCII[k2/10]);       
  130.                 LcdWriteData(ASCII[k2%10]);       
  131.     LcdWriteData(ASCII[12]);
  132.        
  133.           LcdWriteData(ASCII[3]);
  134.           LcdWriteData(ASCII[11]);
  135.                 LcdWriteData(ASCII[k3/10]);       
  136.                 LcdWriteData(ASCII[k3%10]);
  137.                
  138. }

  139. void main()
  140. {         
  141.   time0init();
  142.         k0=15;
  143.         k1=9;
  144.         k2=16;
  145.         k3=14;
  146.         k4=8;
  147.         k5=8;
  148.         LcdInit();
  149.         count();
  150.        
  151.         while(1)
  152.   {
  153.                 uchar KeyValue1=20;
  154.           KeyValue1=KeyDown();
  155.                
  156.        
  157.        
  158.        
  159.                        
  160.        
  161.                
  162.                 if(KeyValue1==0&&k0<=20&&k0>=8)        //0号舵机高电平时间增加
  163.           {
  164.                      k0++;       
  165.                      if(k0==21)
  166.                                          k0=20;
  167.                                  KeyValue1=20;LcdWriteCom(0x01);        count();
  168.     }               
  169.        
  170.     if(KeyValue1==4&&k0<=20&&k0>=8)         //0号舵机高电平时间减少
  171.           {
  172.       
  173.                      k0--;       
  174.                      if(k0==7)
  175.                                          k0=8;
  176.               KeyValue1=20;        LcdWriteCom(0x01);count();
  177.     }       
  178.                
  179.                 if(KeyValue1==1&&k1<=20&&k1>=8)        //1号舵机高电平时间增加
  180.           {
  181.       
  182.                      k1++;       
  183.                      if(k1==21)
  184.                                          k1=20;
  185.       KeyValue1=20;        LcdWriteCom(0x01);count();
  186.     }               
  187.        
  188.     if(KeyValue1==5&&k1<=20&&k1>=8)
  189.           {
  190.       
  191.                      k1--;       
  192.                      if(k1==7)
  193.                                          k1=8;
  194.               KeyValue1=20;        LcdWriteCom(0x01);count();
  195.     }       
  196.                
  197.                 if(KeyValue1==2&&k2<=20&&k2>=8)       //2号舵机高电平时间增加
  198.           {
  199.       
  200.                      k2++;       
  201.                      if(k2==21)
  202.                                          k2=20;
  203.       KeyValue1=20;        LcdWriteCom(0x01);count();
  204.     }               
  205.        
  206.     if(KeyValue1==6&&k2<=20&&k2>=8)
  207.           {
  208.       
  209.                      k2--;       
  210.                      if(k2==7)
  211.                                          k2=8;
  212.               KeyValue1=20;        LcdWriteCom(0x01);count();
  213.     }       
  214.                
  215.                 if(KeyValue1==3&&k3<=20&&k3>=8)       //3号舵机高电平时间增加
  216.           {
  217.       
  218.                      k3++;       
  219.                      if(k3==21)
  220.                                          k3=20;
  221.               KeyValue1=20;        LcdWriteCom(0x01);count();
  222.     }               
  223.        
  224.     if(KeyValue1==7&&k3<=20&&k3>=8)
  225.           {
  226.       
  227.                      k3--;       
  228.                      if(k3==7)
  229.                                          k3=8;
  230.               KeyValue1=20;        LcdWriteCom(0x01);count();
  231.     }       
  232.                
  233.                 if(KeyValue1==8&&k4<=20&&k4>=8)       //4号舵机高电平时间增加
  234.           {
  235.       
  236.                      k4++;       
  237.                      if(k4==21)
  238.                                          k4=20;
  239.               KeyValue1=20;LcdWriteCom(0x01);        count();
  240.     }               
  241.        
  242.     if(KeyValue1==12&&k4<=20&&k4>=8)
  243.           {
  244.       
  245.                      k4--;       
  246.                      if(k4==7)
  247.                                          k4=8;
  248.               KeyValue1=20;        LcdWriteCom(0x01);count();
  249.     }       
  250.                
  251.                 if(KeyValue1==9&&k5<=20&&k5>=8)       //5号舵机高电平时间增加
  252.           {
  253.       
  254.                      k5++;       
  255.                      if(k5==21)
  256.                                          k5=20;
  257.               KeyValue1=20;LcdWriteCom(0x01);        count();
  258.     }               
  259.        
  260.     if(KeyValue1==13&&k5<=20&&k5>=8)
  261.           {
  262.       
  263.                      k5--;       
  264.                      if(k5==7)
  265.                                          k5=8;
  266.               KeyValue1=20;        LcdWriteCom(0x01);count();
  267.     }       
  268.                
  269.   }       
  270. }               
  271.        
复制代码

所有资料51hei提供下载:
51arm1602pwm.rar (44.41 KB, 下载次数: 94)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:527441 发表于 2019-5-5 10:57 | 只看该作者
如果大家需要使用机械臂的话,给大家推荐一个黑科技模块:PCA9685,iic总线通信的,很方便
回复

使用道具 举报

板凳
ID:165117 发表于 2019-5-5 16:55 | 只看该作者
谢谢楼主的共享,有没有电路图??  
回复

使用道具 举报

地板
ID:527441 发表于 2019-5-6 12:28 | 只看该作者
gdatgb 发表于 2019-5-5 16:55
谢谢楼主的共享,有没有电路图??

lcd1602地电路图可以参考普中的51开发板,是在那个上面实现的,舵机部分也就是供电线,共GND,然后信号线连接在51上面
回复

使用道具 举报

5#
ID:165117 发表于 2019-5-6 14:35 | 只看该作者
snorlaxcy 发表于 2019-5-6 12:28
lcd1602地电路图可以参考普中的51开发板,是在那个上面实现的,舵机部分也就是供电线,共GND,然后信号线 ...

好的,谢谢了!                        
回复

使用道具 举报

6#
ID:683198 发表于 2020-1-7 20:35 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

7#
ID:582255 发表于 2021-1-24 15:19 | 只看该作者
这个硬件实现了没
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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