实验内容: 使用按键控制步进电机正反转。
元器件
元器件 | 名称 |
---|---|
电阻 | RES |
51单片机 | AT89C51 |
电容 | CAP |
晶振 | CRYSTAL |
电机驱动 | ULN200A |
电机 | MOTOR-STEPPER |
原理图部分
ULN2003A引脚连接
引脚 | 作用 |
---|---|
1B-7B | 单片机输入 |
1C-7C | 输出,接电机 |
COM | 电源 |
电机激励方式:
名称 | 使用方法 |
---|---|
1相激励法 | A-B-C-D-A |
2相激励法 | AB-BC-CD-DA-AB |
1-2相激励法 | A-AB-B-BC-C-CD-D-DA-A |
中间要加入延迟
拿1相激励法举例:
假设P20-P23四个引脚接到了ULN2003A输入,ULN2003A输出接到了电机,那么驱动方式就是
P20=1>delayms(5)>P21=1>delayms(5)>P22=1>delayms(5)>P23=1>delayms(5)
现象就是电机正转一定角度
代码
main.c
代码如下:
#include <reg51.h>//头文件
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit B4=P2^0;
sbit B5=P2^1;
sbit B6=P2^2;
sbit B7=P2^3;
#define u8 unsigned char //宏定义
#define u16 unsigned int
u8 get_key(void);
void motor_right(void);//正
void motor_left(void);//反
void motor_stop(void);
void delay_ms(u16 ms);
void main(void)
{
u8 key=0;
char var=0;
while(1)
{
key=get_key();
if(key==0)
{
motor_stop();
}
else if(key==1)
{
motor_right();
}
else if(key==2)
{
motor_left();
}
}
}
void motor_stop(void)
{
B7=0;B6=0;B5=0;B4=0;
delay_ms(5);
}
void motor_left(void)
{
B7=1;B6=0;B5=0;B4=0;
delay_ms(5);
B7=0;B6=1;B5=0;B4=0;
delay_ms(5);
B7=0;B6=0;B5=1;B4=0;
delay_ms(5);
B7=0;B6=0;B5=0;B4=1;
delay_ms(5);
}
void motor_right(void)
{
B7=0;B6=0;B5=0;B4=1;
delay_ms(5);
B7=0;B6=0;B5=1;B4=0;
delay_ms(5);
B7=0;B6=1;B5=0;B4=0;
delay_ms(5);
B7=1;B6=0;B5=0;B4=0;
delay_ms(5);
}
u8 get_key(void)
{
u8 key=0;
if(KEY1==0) return 1;
else if(KEY2==0) return 2;
else return 0;
}
//延时函数
void delay_ms(u16 ms)
{
u16 i,j;
for(i=0;i<ms;i++)
for(j=71;j>0;j--);
}