单片机四线步进电机驱动 PROTEUS 和51单片机教程(附仿真文件+源代码)

单片机四线步进电机驱动 程序功能:

当按下SW1时步进电机正转,按下SW2后步进电机反转,并可以根据源码任意调节旋转速度和每一个脉冲旋转角度

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
程序参考源代码如下:

/C语言程序:/
#include <reg52.h> //可用非常成功。
#define uchar unsigned char
#define uint unsigned int

uchar table_begin;
uint maichong; //脉冲
uchar zhuansu; //转速
uchar flag; //方向
sbit key_fuwei=P3^0; //复位键
sbit key_z=P3^1; //正转键
sbit key_f=P3^2; //反转键
sbit key_jia=P3^3; //加速键
sbit key_jian=P3^6; //减速键

sbit A1=P2^0;
sbit A2=P2^1;
sbit A3=P2^2;
sbit A4=P2^3;
void display();
void delayms(xms);

void delay(uchar x)
{
uchar i,j; //延时
for(i=0;i<x;i++)
for(j=100;j>0;j–);
}
void fuwei(void) //复位
{
flag=2;
zhuansu=0;
}
/*void Display(void) //显示
{
unsigned char b1, b2;
b1=zhuansu/10;
b2=zhuansu%10;
if(flag == 0) //0
P0=0x71;//显示F
else
P0=0x79;
A1=0;
delayms(3);
A1=1;

    P0=0x40;
    A2=0;         //显示--
    delayms(3);
    A2=1;

    P0=table2[b1];
    A3=0;         //显示十位
    delayms(3);
    A3=1;

    P0=table2[b2];
    A4=0;
    delayms(3);   //显示个位
    A4=1;

} */

void display()
{
uchar b1,b2,b3,b4;
if(flag0)
P0=0x71;//显示F
else
P0=0x79;
if(flag
1)
P0=0x7c;//显示b
else
P0=0x71;
b1=10;
b2=0x3f;
b3=zhuansu/10;
b4=zhuansu%10;
//P0=table2;
A1=0; //P2.0
delay(1);
A1=1;
P0=b2;
A2=0; //P2.1
delay(1);
A2=1;
P0=table2[b3];
A3=0; //P2.3
delay(1);
A3=1;
P0=table2[b4];
A4=0; //P2.4
delay(1);
A4=1;
}

void key() //按键扫描
{
if(key_fuwei0)
{
delay(5);
if(key_fuwei
0)
fuwei();
}
if(key_z0)
{
delay(5);
if(key_z
0)
{
flag=0;
zhuansu=10;
while(key_z0);
}
}
if(key_f
0)
{

delay(5);
if(key_f0)
{
flag=1;
zhuansu=10;
while(key_f
0);
}
}
if(key_jia0)
{
delay(5);
if(key_jia
0)
{
zhuansu++;
if(zhuansu21)
zhuansu=20;
while(key_jia
0);
}
}
if(key_jian0)
{
delay(5);
if(key_jian
0)
{
zhuansu–;
if(zhuansu<=0)
zhuansu=0;
while(key_jian==0);
}
}
}
void dispose() //脉冲函数
{
switch(zhuansu)
{

case 0: flag=2; break;
case 1: maichong=300; break;
case 2: maichong=295; break;
case 3: maichong=290; break;
case 4: maichong=280; break;
case 5: maichong=260; break;
case 6: maichong=240; break;
case 7: maichong=200; break;
case 8: maichong=180; break;
case 9: maichong=160; break;
case 10: maichong=120; break;
case 11: maichong=80; break;
case 12: maichong=70; break;
case 13: maichong=60; break;
case 14: maichong=40; break;
case 15: maichong=35; break;
case 16: maichong=30; break;
case 17: maichong=25; break;
case 18: maichong=20; break;
case 19: maichong=15; break;
case 20: maichong=10; break;

}
if(flag0)
table_begin=0;
else
if(flag
1)
table_begin=4;
}
void zhuandong(void)
{
uint i,j;
if(zhuansu>0&&zhuansu<=20)
{
for(j=0+table_begin;j<4+table_begin;j++)
{
P1=table1[j];
for(i=0;i<maichong;i++)
display();
}
}
}
……………………


最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 程序完整源代码和 设计文件,请在下方留言或者私信我,看到后会第一时间回复。

谢谢!

发布了64 篇原创文章 · 获赞 159 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44212493/article/details/104329555