感谢51黑论坛给予我的帮助,我自己总结了前辈们的代码,写了一个42步进电机蓝牙控制的代码,能实现前后左右控制;寻迹,避障lcd1602显示功能还不齐全。
单片机源程序如下:
- #include "42moto.h"
- #include "lcd1602.h"
- /**********************************************
- * IO设置
- *
- *
- *************************************************/
- /**************红外引脚定义*******************/
- sbit HY_R = P1^4; //右边红外传感器定义
- sbit HY_Z = P1^5; //中间红外传感器定义
- sbit HY_L = P1^6; //左边红外传感器定义
- /*************寻迹引脚定义*******************/
- sbit XJ_R = P1^0; //右边寻迹传感器定义
- sbit XJ_Z = P1^1; //中间寻迹传感器定义
- sbit XJ_L = P1^2; //左边寻迹传感器定义
- /************电机控制引脚定义*****************/
- //sbit ENA_R = P1^2; // 右电机使能
- sbit PUL_L = P2^0; // 左电机脉冲
- sbit DIR_L = P2^2; // 左电机方向
- sbit PUL_R = P2^3; // 右电机脉冲
- sbit DIR_R = P2^4; // 右电机方向
- //sbit ENA_L = P2^2; // 左电机使能
- #define MotorTabNum 5
- unsigned char T0_NUM;
- signed char g_MotorNum = 0;
- unsigned char MotorTab[6] = {6, 5, 4, 3, 2, 1};
- void T0_Init();//中断定义
- void delay(xms);
- void hongwai(void);
- void xunji(void);
- /********************************延时函数***********************************************************/
- void delay(xms)
- {
- unsigned int x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*************定时器初始化***********************************************************/
- void T0_Init()
- {
- TMOD = 0x01;
- TH0 = (65535-100)/256; // 1ms
- TL0 = (65535-100)%256;
- EA = 1;
- ET0 = 1;
- }
- ////延时n毫秒
- //void delay_ms(unsigned int n)
- //{
- // unsigned int i=0,j=0;
- // for(i=0;i<n;i++)
- // for(j=0;j<123;j++);
- //}
- /*************定时器中断************************/
- void T0_time() interrupt 1
- {
- // TR0 = 0;
- TH0 = (65535-100)/256;
- TL0 = (65535-100)%256;
- T0_NUM++;
- if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按键g_MotorNum++ 减小按键g_MotorNum--
- {
- T0_NUM = 0;
- // PUL_R =PUL_R^0x01; // 输出脉冲
- // PUL_L =PUL_L^0x01; // 输出脉冲
- }
-
- }
- /******42步进电机运动函数*******************************
- DIR_R ^= 1; //=1后退
- DIR_R ^= 1;
- DIR_L ^= 0; //=0前进
- DIR_L ^= 0;
- 因为两边电机的安装是一样的,所以DIR的方向有所不同
- 可以根据该电机接线的方式改变电机的方向
- ***********************************************/
- void RUN(void) //前进
- {
- DIR_R ^= 0; //右前进
- DIR_L ^= 0; //左后退就是前进
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
-
- }
- void RIGHT(void)//右转
- {
-
- DIR_L ^= 1; //右转,就让左边的电机前进,右边后退
- DIR_R ^= 0; //右前进
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
-
- }
- void LEFT(void) //左转
- {
- DIR_L ^= 0; //左后退就是前进
- DIR_R ^= 1; //左转,就让右边前进,左边后退
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
- }
- void BACK(void) //后退
- {
-
- DIR_R ^= 1; //这里就和前进相反就可以了
- DIR_L ^= 1;
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
- }
- void STOP(void) //停止
- {
- EA=0; //让所有中断都关闭,
- PUL_R =PUL_R^0x00; // 输出脉冲
- PUL_L =PUL_L^0x00; // 输出脉冲
- }
- /********************按键控制*********************/
- //void anjian()
- //{
- //
- //}
- /********************寻迹传感控制*********************/
- void hongwai(void)
- {
- //有信号为0 没有信号为1
- //if(HY_R==1&&HY_Z==1&&HY_L==1)//都没有信号就前进
- if(HY_R==1&&HY_Z==1&&HY_L==1)//都没有信号就前进
- {
- EA=1;
- //lcd_init1(); //显示RUN运行
- DIR_R ^= 0; //右前进
- DIR_L ^= 0; //左后退就是前进
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
- TR0 = 1;
- }
-
- else
- {
- //有信号为0 没有信号为1
- if(HY_R==0&&HY_Z==1&&HY_L==1)//右边有信号说明右障碍物,所以电机停止1S,然后后退1S,左电机后退,右电机转动
- {
- // lcd_init2();
- DIR_L ^= 1; //右转,就让左边的电机前进,右边后退
- DIR_R ^= 0; //右前进
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
- }
- //有信号为0 没有信号为1
- if(HY_R==1&&HY_Z==1&&HY_L==0)//左边有信号说明左障碍物,所以电机停止1S,然后后退1S,右电机后退,左电机转动
- {
-
- // lcd_init3();
- DIR_L ^= 0; //右转,就让左边的电机前进,右边后退
- DIR_R ^= 1; //右前进
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
-
- }
- //有信号为0 没有信号为1
- if(HY_R==1&&HY_Z==0&&HY_L==1)//中间有信号就后退
- {
- // lcd_init4();
- DIR_R ^= 1; //这里就和前进相反就可以了
- DIR_L ^= 1;
- PUL_R =PUL_R^0x01; // 输出脉冲
- PUL_L =PUL_L^0x01; // 输出脉冲
-
- }
- //有信号为0 没有信号为1
- if(HY_R==0&&HY_Z==0&&HY_L==0)//当然全部有信号就停止
- {
- //lcd_init5();
- EA=0;
- }
- }
- }
- /*************************寻迹传感控制**********************/
- void xunji(void)
- {
- //有信号为0 没有信号为1
- //if(HY_R==1&&HY_Z==1&&HY_L==1)//都没有信号就前进
- if(XJ_R==1&&XJ_Z==1&&XJ_L==1)//都没有信号就前进
- {
- EA=1;
- lcd_init1(); //显示RUN运行
- delay(10); // 软件延时消抖
- RUN();
- TR0 = 1;
- }
-
- else
- {
- //有信号为0 没有信号为1
- if(XJ_R==0&&XJ_Z==1&&XJ_L==1)//右边有信号说明右障碍物,所以电机停止1S,然后后退1S,左电机后退,右电机转动
- {
- lcd_init2();
- delay(10); // 软件延时消抖
- RIGHT();
-
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
42步进电机模块化2LY.rar
(55.16 KB, 下载次数: 22)
|