找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2508|回复: 2
收起左侧

42步进电机蓝牙控制模块化编程

[复制链接]
ID:247810 发表于 2019-8-1 16:47 | 显示全部楼层 |阅读模式
  感谢51黑论坛给予我的帮助,我自己总结了前辈们的代码,写了一个42步进电机蓝牙控制的代码,能实现前后左右控制;寻迹,避障lcd1602显示功能还不齐全。

170ABB2975F0D0AC8A842E1B78957C1D.png

单片机源程序如下:
  1. #include "42moto.h"
  2. #include "lcd1602.h"
  3. /**********************************************
  4. *              IO设置
  5. *
  6. *
  7. *************************************************/
  8. /**************红外引脚定义*******************/

  9. sbit HY_R = P1^4;   //右边红外传感器定义
  10. sbit HY_Z = P1^5;   //中间红外传感器定义
  11. sbit HY_L = P1^6;   //左边红外传感器定义
  12. /*************寻迹引脚定义*******************/
  13. sbit XJ_R = P1^0;   //右边寻迹传感器定义
  14. sbit XJ_Z = P1^1;   //中间寻迹传感器定义
  15. sbit XJ_L = P1^2;   //左边寻迹传感器定义
  16. /************电机控制引脚定义*****************/
  17. //sbit ENA_R   = P1^2;   // 右电机使能
  18. sbit PUL_L   = P2^0;     // 左电机脉冲
  19. sbit DIR_L   = P2^2;     // 左电机方向
  20. sbit PUL_R   = P2^3;     // 右电机脉冲
  21. sbit DIR_R   = P2^4;     // 右电机方向
  22. //sbit ENA_L = P2^2;     // 左电机使能
  23. #define MotorTabNum 5
  24. unsigned char T0_NUM;
  25. signed char g_MotorNum = 0;
  26. unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};
  27. void T0_Init();//中断定义
  28. void delay(xms);
  29. void hongwai(void);
  30. void xunji(void);

  31. /********************************延时函数***********************************************************/
  32. void delay(xms)
  33. {
  34.          unsigned int x,y;
  35.          for(x=xms;x>0;x--)
  36.                  for(y=110;y>0;y--);
  37. }
  38. /*************定时器初始化***********************************************************/
  39. void T0_Init()
  40. {
  41.         TMOD = 0x01;
  42.         TH0 = (65535-100)/256;  // 1ms
  43.         TL0 = (65535-100)%256;
  44.         EA = 1;
  45.         ET0 = 1;

  46. }
  47. ////延时n毫秒
  48. //void delay_ms(unsigned int n)
  49. //{
  50. //    unsigned int i=0,j=0;
  51. //    for(i=0;i<n;i++)
  52. //        for(j=0;j<123;j++);
  53. //}

  54. /*************定时器中断************************/
  55. void T0_time() interrupt 1
  56. {
  57. //       TR0 = 0;
  58.         TH0 = (65535-100)/256;   
  59.         TL0 = (65535-100)%256;
  60.                 T0_NUM++;
  61.         if(T0_NUM >= MotorTab[g_MotorNum])        // 增加按键g_MotorNum++   减小按键g_MotorNum--
  62.         {
  63.                 T0_NUM = 0;
  64. //          PUL_R =PUL_R^0x01;          //   输出脉冲
  65. //      PUL_L =PUL_L^0x01;          //   输出脉冲
  66.         }

  67.         
  68. }   
  69. /******42步进电机运动函数*******************************
  70. DIR_R  ^= 1;   //=1后退
  71. DIR_R  ^= 1;   
  72. DIR_L  ^= 0;   //=0前进
  73. DIR_L  ^= 0;
  74. 因为两边电机的安装是一样的,所以DIR的方向有所不同
  75. 可以根据该电机接线的方式改变电机的方向
  76. ***********************************************/
  77. void RUN(void)   //前进
  78. {

  79.         DIR_R ^= 0;     //右前进
  80.     DIR_L ^= 0;     //左后退就是前进
  81.     PUL_R =PUL_R^0x01;          //   输出脉冲
  82.     PUL_L =PUL_L^0x01;          //   输出脉冲
  83.        
  84. }
  85. void RIGHT(void)//右转
  86. {
  87.   
  88.     DIR_L ^= 1;    //右转,就让左边的电机前进,右边后退
  89.     DIR_R ^= 0;     //右前进       
  90.     PUL_R =PUL_R^0x01;          //   输出脉冲
  91.     PUL_L =PUL_L^0x01;          //   输出脉冲
  92.   
  93. }
  94. void LEFT(void)  //左转
  95. {
  96.   DIR_L ^= 0;     //左后退就是前进  
  97.    DIR_R ^= 1;  //左转,就让右边前进,左边后退
  98.    PUL_R =PUL_R^0x01;          //   输出脉冲
  99.    PUL_L =PUL_L^0x01;          //   输出脉冲
  100. }

  101. void BACK(void) //后退
  102. {
  103.        
  104.         DIR_R ^= 1;    //这里就和前进相反就可以了
  105.     DIR_L ^= 1;
  106.     PUL_R =PUL_R^0x01;          //   输出脉冲
  107.     PUL_L =PUL_L^0x01;          //   输出脉冲
  108. }
  109. void STOP(void) //停止
  110. {
  111.   EA=0;  //让所有中断都关闭,
  112.   PUL_R =PUL_R^0x00;          //   输出脉冲
  113.   PUL_L =PUL_L^0x00;          //   输出脉冲       
  114. }
  115. /********************按键控制*********************/
  116. //void anjian()
  117. //{
  118. //       
  119. //}

  120. /********************寻迹传感控制*********************/

  121. void hongwai(void)
  122. {       
  123.          //有信号为0  没有信号为1
  124.         //if(HY_R==1&&HY_Z==1&&HY_L==1)//都没有信号就前进
  125.                 if(HY_R==1&&HY_Z==1&&HY_L==1)//都没有信号就前进
  126.            {
  127.                 EA=1;
  128.                 //lcd_init1(); //显示RUN运行
  129.      DIR_R ^= 0;     //右前进
  130.     DIR_L ^= 0;     //左后退就是前进
  131.     PUL_R =PUL_R^0x01;          //   输出脉冲
  132.     PUL_L =PUL_L^0x01;          //   输出脉冲       
  133.                 TR0 = 1;
  134.         }
  135.        
  136.         else
  137.                   {
  138. //有信号为0  没有信号为1
  139.         if(HY_R==0&&HY_Z==1&&HY_L==1)//右边有信号说明右障碍物,所以电机停止1S,然后后退1S,左电机后退,右电机转动
  140.      {         
  141.          // lcd_init2();
  142.           DIR_L ^= 1;    //右转,就让左边的电机前进,右边后退
  143.     DIR_R ^= 0;     //右前进       
  144.     PUL_R =PUL_R^0x01;          //   输出脉冲
  145.     PUL_L =PUL_L^0x01;          //   输出脉冲         
  146.      }
  147. //有信号为0  没有信号为1
  148.         if(HY_R==1&&HY_Z==1&&HY_L==0)//左边有信号说明左障碍物,所以电机停止1S,然后后退1S,右电机后退,左电机转动
  149.      {
  150.                  
  151.                 // lcd_init3();                        
  152.         DIR_L ^= 0;    //右转,就让左边的电机前进,右边后退
  153.        DIR_R ^= 1;     //右前进       
  154.        PUL_R =PUL_R^0x01;          //   输出脉冲
  155.        PUL_L =PUL_L^0x01;          //   输出脉冲
  156.                  
  157.      }
  158.           //有信号为0  没有信号为1
  159.         if(HY_R==1&&HY_Z==0&&HY_L==1)//中间有信号就后退
  160.      {         
  161.                 // lcd_init4();       
  162.                DIR_R ^= 1;    //这里就和前进相反就可以了
  163.     DIR_L ^= 1;
  164.     PUL_R =PUL_R^0x01;          //   输出脉冲
  165.     PUL_L =PUL_L^0x01;          //   输出脉冲
  166.        
  167.      }
  168. //有信号为0  没有信号为1
  169.         if(HY_R==0&&HY_Z==0&&HY_L==0)//当然全部有信号就停止
  170.      {
  171.                  //lcd_init5();          
  172.                  EA=0;                         
  173.      }
  174.    }  
  175. }

  176. /*************************寻迹传感控制**********************/

  177. void xunji(void)
  178. {       
  179.          //有信号为0  没有信号为1
  180.         //if(HY_R==1&&HY_Z==1&&HY_L==1)//都没有信号就前进
  181.                 if(XJ_R==1&&XJ_Z==1&&XJ_L==1)//都没有信号就前进
  182.            {
  183.                 EA=1;
  184.                 lcd_init1(); //显示RUN运行
  185.         delay(10);   // 软件延时消抖
  186.                 RUN();       
  187.                 TR0 = 1;
  188.         }
  189.        
  190.         else
  191.          {
  192. //有信号为0  没有信号为1
  193.         if(XJ_R==0&&XJ_Z==1&&XJ_L==1)//右边有信号说明右障碍物,所以电机停止1S,然后后退1S,左电机后退,右电机转动
  194.      {   
  195.           lcd_init2();
  196.         delay(10);   // 软件延时消抖                 
  197.                  RIGHT();
  198.                  
  199.      }
  200. ……………………

  201. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
42步进电机模块化2LY.rar (55.16 KB, 下载次数: 22)

评分

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

查看全部评分

回复

使用道具 举报

ID:247810 发表于 2019-8-1 17:00 | 显示全部楼层
小车的 照片
回复

使用道具 举报

ID:282021 发表于 2019-8-2 00:09 来自手机 | 显示全部楼层
好用,学习蓝牙的好方法。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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