51单片机实现步进电机(39BYG316/28BYJ48)的启停,圈数设定,正反转,速率调整,LCD1602显示等调节

本文介绍了如何使用51单片机(如STC89C52)配合ULN2003驱动器控制39BYG316和28BYJ48步进电机,实现启停、圈数设定、正反转和速率调整。硬件设计包括MCU、LCD1602、按键和电源模块,软件设计采用四相八拍运行方式,通过定时器中断驱动电机,同时利用LCD显示参数。提供了硬件原理图、PCB设计及Keil4代码下载链接。

51单片机实现步进电机(39BYG316/28BYJ48)的启停,圈数设定,正反转,速率调整,LCD1602显示等调节

一、方案设计
方案1:采用89C51+ULN2003+28BYJ48,28BYJ48是一种常见的四相五线步进减速电机,其减速比为1/64,步进角1.8°,即如果采用四相四拍运行,若使步进电机转一周则需要64*(360/1.8)个脉冲;如果采用四相八拍运行,若使步进电机转一周则需要64*(360/0.9)个脉冲;
方案2:采用89C51+ULN2003+39BYG316,39BYG316是一种常见的四相五线步进电机,步进角1.8°,即如果采用四相四拍运行,若使步进电机转一周则需要6360/1.8个脉冲;如果采用四相八拍运行,若使步进电机转一周则需要360/0.9个脉冲;

二、硬件设计
硬件设计分为MCU模块、LCD和按键模块、电源模块、驱动模块共四大模块。
MCU模块采用较为常见的STC89C52RC,一般的淘宝店都能买到,设计时要特别注意P0口需要配置上拉电阻,晶振选取11.0592M的。
LCD和按键模块,四个按键的功能分别是K1启停,K2设定圈数,K3方向转换,K4速率调整,LCD选取LCD1602。
电源模块的设计比较简单,测试用的输入为7.2V电源,因此仅采用一稳压芯片AMS1117-5.0即可得到所需要的单片机供电电压,并添加了一个自锁开关方便及时断电,电源指示灯用于指示电源状态。
驱动模块采用最最常用的达林顿管驱动器ULN2003,并在输出端口设置四路LED显示当前驱动状态。
另外,步进电机的接线较为麻烦易错,28BYJ48在淘宝上有现成的解决办法,结合ULN2003驱动很容易接线;39BYG316电机也是在淘宝上买的,4.5元一个,接线仿照28BYJ48也很容易解决。

二、软件设计
首先,为了步进电机更好的运行,采用八拍的运行方式,给出四相八拍正反转表,如下:

//为了简便的宏定义
#define uchar unsigned char
#define uint  unsigned int
//四相八拍反转表
uchar code FFW[8]={
   
   0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
//四相八拍正转表
uchar code REV[8]={
   
   0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};

然后,按照硬件设计编写软件连接

sbit K1 = P3^2;   // 启停
sbit K2 = P3^3;   // 设定圈数
sbit K3 = P3^4;   // 方向调整
sbit K4 = P3^5;   // 速率调整

sbit LCD_RS = P2^6;   // LCD连接
sbit LCD_RW = P2^5;   // LCD连接
sbit LCD_EN = P2^7;   // LCD连接

设置必须用的延时函数,为后面按键消抖,LCD1602通信等所使用

//空指令延时函数
#define delayNOP(); {
   
   _nop_();_nop_();_nop_();_nop_();};

/********************************************************/
/*延时 t ms函数
/********************************************************/
void delay(uint t)
{
   
   
 uchar k;
 while(t--)
 {
   
   
  for(k=0; k<125; k++)
  {
   
   }
 }
}

再然后设置LCD1602的通信

/********************************************************/
/* 检查LCD状态
/* lcd_busy=1 忙,等待
/* lcd_busy=0 闲,可写指令与数据
/********************************************************/
bit lcd_busy()
{
   
   
  bit result;
  LCD_RS = 0;
  LCD_RW = 1;
  LCD_EN = 1;
  delayNOP();
  result = (bit)(P0&0x80);
  LCD_EN = 0;
  return(result);
}

/********************************************************/
/* 写指令到LCD
/* RS=L , RW=L, E=高脉冲, D0-D7= 指令码
/*
/********************************************************/
void lcd_wcmd(uchar cmd)
{
   
   
  while(lcd_busy());
	LCD_RS = 0;
  LCD_RW = 0;
  LCD_EN = 0;
	
  P0 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值