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

发布时间:2024年01月19日

步进电机控制

  • 设计思路

电路设计:

  1. 选用AT89C51单片机作为电路核心部件,外加LM016L液晶显示屏作为显示,显示步进电机的Fast,Slow,Stop的三个状态
  2. 将AT89C51单片机所选引脚与LM016L控制引脚相连,再将数据通过引脚与LCD接收引脚相连。
  3. 通过AT89C51单片机P0^0和P0^2两个引脚引出两个按钮,作为Fast和Slow。通过AT89C51单片机P3^0连接一个4N25光耦,以光为媒介来传递电信号,进而对步进电机的速度进行控制。

代码设计:

  1. 将AT89C51单片机所用引脚进行定义,例Fast、Slow按钮,LM016L数据和控制引脚等
  2. 构造基本的功能函数:延时函数、LCD控制函数、LCD数据函数、显示函数。
  3. 主函数:先将芯片的引脚和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;
    		}
    		
    	}
    }

文章来源:https://blog.csdn.net/m0_51956878/article/details/135705415
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。