功能
通过按钮控制电机顺时针或逆时针旋转
电动机所设置的参数
效果图
k1 —> 正转3圈 ----> 对应上面的D1正 ----> 转完后自动跳到D3停
k2 —> 反转3圈 ----> 对应上面的D2反 ----> 转完后自动跳到D3停
图中的U2用来增大电压驱动电动机,COM是接地,STEP是指步距角为18度,即单拍时360度转20次,但转太多了,因此用单双拍即一圈转5次。
特点与原理
工作方式
工作流程
A、B同时带电时转到在A和B之间
六拍指6个状态
步距角
分析
用单双拍一圈转5次即可
代码
steppermoter.c
#include<reg51.h>
#include<string.h> //字符串
#include<stdio.h> //标准输入输出
#include<intrins.h> //延时
#include<stdlib.h> //标准库
#define INT8U unsigned char //8位的
#define INT16U unsigned int //16位的
//按钮管脚
sbit FFW_KEY=P3^0;
sbit REV_KEY=P3^1;
sbit STOP_KEY=P3^2;
//0000_0001 A->AB->B->BC->C->CD->D->AD (正转)
INT8U code FFW_ARR[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
//0000_1001 AD->D->CD->C->BC->B->AB->A (反转)
INT8U code REV_ARR[]={0x09,0x08,0x0C,0x04,0x06,0x02,0x03,0x01};
/**
*延时
*
*@param x 延时时间
*@return
*/
void delay_ms(INT16U x)
{
INT8U t=120;
while(x--)
while(t--);
}
/**
*顺时针旋转 (正转)
*
*@param n 旋转圈数
*@return
*/
void STEP_FFW(INT8U n)
{
INT8U i,j;
for(i=0; i<5*n; i++) //一圈转5次
{
for(j=0; j<8; j++) //8*9=72 一次转72度
{
P1=FFW_ARR[j]; //给U2的管脚P1,U2有8个管脚对应8个状态
delay_ms(60);
if(STOP_KEY==0) //按暂停按钮时退出循环,没电压自然就不转了
return;
}
}
}
/**
*逆时针旋转
*
*@param n 旋转圈数
*@return
*/
void STEP_REV(INT8U n)
{
INT8U i,j;
for(i=0; i<5*n; i++)
{
for(j=0; j<8; j++)
{
P1=REV_ARR[j]; //写法和正转一样就改了个数组
delay_ms(60);
if(STOP_KEY==0)
return;
}
}
}
void main()
{
INT8U n = 1;
while(1)
{
if(FFW_KEY==0) //当按下正转按钮时
{
P0=0xFE; // 1111_1110 因为从后面读,且右端接了高电压5v,因此这里D1为低电压即为0时,发光二极管变亮
STEP_FFW(n);
}
else if(REV_KEY==0)
{
P0=0xFD; // 1111_1101
STEP_REV(n);
}
else
{
P0=0xFB; // 1111_1011
}
}
}
喜欢的朋友可以关注我的个人公众号,后台回复java资料可免费领取资源。