主页 > 软件开发  > 

【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态


步进电机控制

设计思路

电路设计:

选用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; } } }

标签:

【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态