步进电机控制
- 设计思路
电路设计:
- 选用AT89C51单片机作为电路核心部件,外加LM016L液晶显示屏作为显示,显示步进电机的Fast,Slow,Stop的三个状态
- 将AT89C51单片机所选引脚与LM016L控制引脚相连,再将数据通过引脚与LCD接收引脚相连。
- 通过AT89C51单片机P0^0和P0^2两个引脚引出两个按钮,作为Fast和Slow。通过AT89C51单片机P3^0连接一个4N25光耦,以光为媒介来传递电信号,进而对步进电机的速度进行控制。
代码设计:
- 将AT89C51单片机所用引脚进行定义,例Fast、Slow按钮,LM016L数据和控制引脚等
- 构造基本的功能函数:延时函数、LCD控制函数、LCD数据函数、显示函数。
- 主函数:先将芯片的引脚和LCD屏幕进行初始化,然后循环执行以下操作:实时监测P0^0和P0^2两个引脚的高低电平(即外部两个按钮是否有操作),如果P0^0为低电平,说明fast按钮被按下,通过LCD控制函数在液晶显示屏上显示“fast”,P0^2同理。如果两个电平都为高电平,则步进电机保持“stop”状态。
- 原理图
- 测试过程及结果说明
- 在keil端进行代码编写,将实验代码进行编译,结果正确无任何错误。
- 打开Proteus软件,绘制原理图,放置元件,双击AT89C51单片机芯片,将keil端编译之后生成的HEX文件加载到芯片内。
- 进行Proteus仿真
-
启动仿真,当两个按钮均未被按下时,LM016L液晶显示屏屏幕显示“stop”字样
-
4.当上面的按钮(与P0^0相连)被按下时,发现步进电机开始运转,同时LM016L液晶显示屏屏幕显示“fast”字样
-
5.当下面的按钮(与P0^2相连)被按下时,发现步进电机减速运转直至停止,同时LM016L液晶显示屏屏幕显示“slow”字样
-
C语言代码:
#include<reg51.h>
sbit F = P0^0; // Button for Fast Speed
sbit S = P0^2; // Button for Slow Speed
sbit RS = P3^1;// Register Select Pin of LCD
sbit EN = P3^2;// Enable Pin of LCD
#define LCD P2 // LCD Data pins
sbit Motor = P3^0;
void MSdelay(int n)
{
int i,j;
for(i=0;i<1275;i++)
for(j=0;j<n;j++);
}
void lcd_cmd(char a)
{
LCD = a;
RS = 0;
EN = 1;
MSdelay(1);
EN = 0;
}
void lcd_data(char b)
{
LCD = b;
RS = 1;
EN = 1;
MSdelay(1);
EN = 0;
}
void lcd_display(char *lcd)
{
while(*lcd!='\0')
{
lcd_data(*lcd);
lcd++;
}
}
void main()
{
lcd_cmd(0x01);
lcd_cmd(0x0E);
lcd_cmd(0x38);
lcd_display("DC Motor Speed");
while(1)
{
if(F==0)
{
lcd_cmd(0xC0);
lcd_display("Fast");
while(F==0)
{
Motor = 0;
MSdelay(100);
Motor = 1;
MSdelay(0);
}
}
if(S==0)
{
lcd_cmd(0xC0);
lcd_display("Slow");
while(S==0)
{
Motor = 0;
MSdelay(50);
Motor = 1;
MSdelay(50);
}
}
else
{
lcd_cmd(0xC0);
lcd_display("Stop");
Motor = 1;
}
}
}
C语言代码: #include<reg51.h> sbit F = P0^0; // Button for Fast Speed sbit S = P0^2; // Button for Slow Speed sbit RS = P3^1;// Register Select Pin of LCD sbit EN = P3^2;// Enable Pin of LCD #define LCD P2 // LCD Data pins sbit Motor = P3^0;void MSdelay(int n) {int i,j;for(i=0;i<1275;i++)for(j=0;j<n;j++); }void lcd_cmd(char a) {LCD = a;RS = 0;EN = 1;MSdelay(1);EN = 0; }void lcd_data(char b) {LCD = b;RS = 1;EN = 1;MSdelay(1);EN = 0; }void lcd_display(char *lcd) {while(*lcd!='\0'){lcd_data(*lcd);lcd++;} }void main() {lcd_cmd(0x01);lcd_cmd(0x0E);lcd_cmd(0x38);lcd_display("DC Motor Speed");while(1){if(F==0){lcd_cmd(0xC0);lcd_display("Fast");while(F==0){Motor = 0;MSdelay(100);Motor = 1;MSdelay(0);}}if(S==0){lcd_cmd(0xC0);lcd_display("Slow");while(S==0){Motor = 0;MSdelay(50);Motor = 1;MSdelay(50);}}else{lcd_cmd(0xC0);lcd_display("Stop");Motor = 1;}} }