基于51单片机的步进电机控制(L298,L297,正反转,加减速)原理图、流程图、物料清单、仿真图、源代码

基于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;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值