步进电机按键控制

2024-01-02 20:34:12

/*-----------------------------------------------

? 内容:本程序用于测试4相步进电机常规驱动?
? ? ? ? 使用1-2相励磁
? ? ? ? 1-2相激励功率增倍,步进角度减半,抖动减少
? ? ? ? 顺序如下 a-ab-b-bc-c-cd-d-da ? 又称4相8拍
?------------------------------------------------*/

#include <reg52.h>

sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;


#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed;
bit Flag;
/*------------------------------------------------
?uS延时函数,含有输入参数 unsigned char t,无返回值
?unsigned char 是定义无符号字符变量,其值的范围是
?0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
?长度如下 T=tx2+5 uS?
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{ ??
?while(--t);
}
/*------------------------------------------------
?mS延时函数,含有输入参数 unsigned char t,无返回值
?unsigned char 是定义无符号字符变量,其值的范围是
?0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
? ? ?
?while(t--)
?{
? ? ?//大致延时1mS
? ? ?DelayUs2x(245);
?? ? DelayUs2x(245);
?}
}
/*------------------------------------------------
? ? ? ? ? ? ? ? ? ? 主函数
------------------------------------------------*/
main()
{
?unsigned int i=512;//旋转一周时间
?
?EA=1; ? ? ? ? ?//全局中断开
?EX0=1; ? ? ? ? //外部中断0开
?IT0=1; ? ? ? ? //1表示边沿触发

?Speed=10;
while(1){
?Coil_OFF
?while((i--)&&Flag) ?//正向
? { ?Coil_A1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_AB1 ? ? ? ? ? ? ? ?//遇到Coil_AB1 ?用{A1=1;B1=1;C1=0;D1=0;}代替
? ? ?DelayMs(Speed); ? ? ? ? //改变这个参数可以调整电机转速 ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//数字越小,转速越大,力矩越小
?? ? Coil_B1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_BC1
? ? ?DelayMs(Speed);
?? ? Coil_C1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_CD1
? ? ?DelayMs(Speed);
?? ? Coil_D1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_DA1
? ? ?DelayMs(Speed);
? }
? Coil_OFF
? i=512;
? while((i--)&&(!Flag))//反向
? { ?
? ? ?Coil_A1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_DA1 ? ? ? ? ? ? ? ?//遇到Coil_AB1 ?用{A1=1;B1=1;C1=0;D1=0;}代替
? ? ?DelayMs(Speed); ? ? ? ? //改变这个参数可以调整电机转速 ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//数字越小,转速越大,力矩越小
?? ? Coil_D1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_CD1
? ? ?DelayMs(Speed);
?? ? Coil_C1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_BC1
? ? ?DelayMs(Speed);
?? ? Coil_B1 ? ? ??
? ? ?DelayMs(Speed);
? ? ?Coil_AB1
? ? ?DelayMs(Speed);
? }
?}
}

/*------------------------------------------------
? ? ? ? ? ? ? ? ?外部中断程序
------------------------------------------------*/
void ISR_INT0(void) interrupt 0?
{
?
?if(!INT0)
? ?{
? ?DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
? ?if(!INT0)
? ?//while(!INT1);//等待按键释放
? ? ?{
? ? ?Flag=!Flag; ??
? ? ?}
? ?}
}

?

文章来源:https://blog.csdn.net/qq_46065313/article/details/131320678
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。