51单片机——步进电机模块
直流电机没有正负之分,在两端加上直流电就能工作
P1.0-P1.3都可以控制电机,例如:使用P1.0,则需要把线接在J47的1(VCC)和2(OUT1)上
1、直流电机实验
要实现的功能是:直流电机工作约5s后停止
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
//输入1表示10us
void delay(u16 time){
while(time--);
}
//毫秒的延时函数,输入1表示1毫秒
void delay_ms(u16 ms){
u16 i=0,j=0;
for(i=ms;i>0;i--){
for(j=110;j>0;j--);
}
}
//P1.0口控制电机(P1.0-P1.3都可以控制电机)
sbit DC_MOTOR=P1^0;
//定义一个时间,5s
//不分正负极
void main(){
DC_MOTOR=1;
delay_ms(5000);
DC_MOTOR=0;
while(1){
}
}
2、步进电机实验
要实现的功能是:通过ULN2003驱动模块控制28BYJ48步进电机运行方向及速度,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;当按下KEY3键,电机减速
#include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 us){
while(us--);
}
//定义延时函数,ms=1时,大约延时1ms
void delay_ms(u16 ms){
u16 i=0,j=0;
for(i=ms;i>0;i--){
for(j=110;j>0;j--);
}
}
//定义控制步进电机的管脚
//8个节拍控制:A->AB->B->BC->C->CD->D->DA
sbit IN1_A=P1^0; //橙线
sbit IN2_B=P1^1; //黄线
sbit IN3_C=P1^2; //粉线
sbit IN4_D=P1^3; //蓝线
//独立按键
//使用宏定义的方法定义独立按键的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
//定义按键对应的管脚口
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
//封装一个函数,按键返回一个键值
u8 key_scan(u16 mode){ //mode:模式,有0和1操作,如果操作0,单次扫描;如果操作1,连续扫描
//打一个标志
static u16 key=1;
if(mode==1){
key=1;
}
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){
//消抖处理,需要延时5ms-10ms
delay_10us(1000);
key=0;
//如果仍是按下,信号稳定
if(KEY1==0){
return KEY1_PRESS;
}else if(KEY2==0){
return KEY2_PRESS;
}else if(KEY3==0){
return KEY3_PRESS;
}else if(KEY4==0){
return KEY4_PRESS;
}
}else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
key=1;
return KEY_UNPRESS;
}
}//步进电机 step(拍数):0-7;dir(电机方向):0(逆时针),1(顺时针)
void step_motor_28BYJ48C_send_pulse(u8 step,u8 dir){
u8 temp=step;
if(dir==1){
temp=7-step;
}
switch(temp){
case 0:
IN1_A=1,IN2_B=0,IN3_C=0,IN4_D=0;
break;
case 1:
IN1_A=1,IN2_B=1,IN3_C=0,IN4_D=0;
break;
case 2:
IN1_A=0,IN2_B=1,IN3_C=0,IN4_D=0;
break;
case 3:
IN1_A=0,IN2_B=1,IN3_C=1,IN4_D=0;
break;
case 4:
IN1_A=0,IN2_B=0,IN3_C=1,IN4_D=0;
break;
case 5:
IN1_A=0,IN2_B=0,IN3_C=1,IN4_D=1;
break;
case 6:
IN1_A=0,IN2_B=0,IN3_C=0,IN4_D=1;
break;
case 7:
IN1_A=1,IN2_B=0,IN3_C=0,IN4_D=1;
break;
}
}
//定义转速1-5区间(最小不能小于1),步进电机的速度的值越小,速度越快;值越大,速度越慢
#define STEPMOTOR_MAXSPEED 1 //可以改
#define STEPMOTOR_MINSPEED 5
void main(){
u8 key=0; //按键的返回值
u8 dir=0; //默认逆时针
u8 step=0; //拍数
u8 speed=STEPMOTOR_MAXSPEED; //默认最大转速
while(1){
u16 key=key_scan(0);
if(key==KEY1_PRESS){
//换方向
dir=!dir;
}else if(key==KEY2_PRESS){
//加速
if(speed>STEPMOTOR_MAXSPEED){
speed-=1;
}
}else if(key==KEY3_PRESS){
//减速
if(speed<STEPMOTOR_MINSPEED){
speed+=1;
}
}
//电机工作
step_motor_28BYJ48C_send_pulse(step++,dir);
if(step==8){
step=0;
}
delay_ms(speed); //脉冲频率
}
}