基于51单片机的步进电机控制(L298,L297,正反转,加减速)原理图、流程图、物料清单、仿真图、源代码
基于51单片机的步进电机控制(L298,L297,正反转,加减速)
1、实现步进电机正反转
2、可以对电机进行调速
3、使用L297和L298控制步进电机
4、显示系统状态:速度、方向、其启停状态。
5、按键采用外部中断触发检测
#include<reg51.h>
#include "intrins.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
uchar keyval=0;
uchar flag=0;//显示标志
sbit S1=P2^2;//按钮
sbit S2=P2^3;
sbit S3=P2^4;
sbit S4=P2^5;
sbit S5=P2^6;
sbit S6=P2^7;
sbit out2=P3^7;//电机控制
sbit out1=P2^0;
uint sudu=200;//速度
uint time=0;//系统定时
uchar start=0;//启停
uchar disp1[]="Speed:000/min";
void motor_delay(uint j)//延时
{
uint i;
for(i=0;i<j;i++);
}
void forward()//正转
{
out1=1;
out2=!out2;
motor_delay((800-sudu)*10);
}
void backward()//反转
{
out1=0;
out2=!out2;
motor_delay((800-sudu)*10);
}
void stop(void)//停止
{
out1=0;
out2=0;
}
void main()//主函数
{
init_1602();
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
//设置INT1
IT1=1;//跳变沿出发方式(下降沿)
EX1=1;//打开INT1的中断允许。
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
keyval=1;
while(1)
{
switch(keyval)
{
case 1:
if(start==1)
forward();//正转
break;
case 2:
if(start==1)
backward();//反转
break;
case 3:stop();//停止
break;
}
}
}
//定时器0中断
void Time0_serve(void) interrupt 1
{
if(time<10)//定时0.5s
time++;
else
{
time=0;
//显示
disp1[6]=sudu/100+0x30;
disp1[7]=sudu%100/10+0x30;
disp1[8]=sudu%10+0x30;
write_string(1,0,disp1);
if(keyval==1)//正转
write_string(2,0,"right");
if(keyval==2)//反转
write_string(2,0,"left ");
if(start==0)//停止
write_string(2,8,"stop");
else //启动
write_string(2,8,"run ");
}
TH0=(65536-50000)/256;//50ms
TL0=(65536-50000)%256;
}
void Int0() interrupt 0 //外部中断0的中断函数
{
if(!S1)
{
keyval=3;
start=0;
}
if(!S2)
{
keyval=1;
}
if(!S3)
{
keyval=2;
}
}
void Int1() interrupt 2 //外部中断1的中断函数
{
if(!S4)
{
if(sudu<800)
sudu+=10;
}
if(!S5)
{
if(sudu>1)
sudu-=10;
}
if(!S6)
{
start=1;
}
}