【TB作品】步进电机控制器,ATMEGA16单片机,Proteus仿真

  • 硬件就是 步进电机和按键和lcd1602
  • lcd1602显示档位
  • 按键1 开始或者停止转动
  • 按键2 加档位
  • 按键3 减档位
  • 按键4 正反转切换


仿真和c程序

基于AVR单片机的步进电机控制系统

项目简介

本项目是基于AVR ATmega16单片机的步进电机控制系统,通过按键控制步进电机的启动、停止、档位调节和转动方向,并在LCD1602显示屏上显示当前系统状态。此系统主要用于学习和演示步进电机的基本控制方法。

硬件部分

  1. 步进电机:用于演示电机控制的基本操作。
  2. LCD1602显示屏:用于显示电机状态、转动方向和当前档位。
  3. 按键:四个按键分别用于控制电机的启动/停止、增加档位、减少档位和改变转动方向。
  4. AVR ATmega16单片机:控制核心,执行电机控制逻辑和按键处理。

软件部分

整个系统的软件逻辑由C语言编写,并通过AVR编译器进行编译。主要的功能模块包括电机控制、按键扫描和LCD显示。

主程序

主程序如下所示:

c 复制代码
#include <iom16v.h>
#include <macros.h>
#include "lcd1602.h"

void display(void) {
    unsigned char buffer[16];
    unsigned char cnt = 0;

    if (open == 1) {
        LCD_write_str(0, 0, "open ");
    } else {
        LCD_write_str(0, 0, "close");
    }
    if (dir == 0) {
        LCD_write_str(7, 0, "FFW");
    } else {
        LCD_write_str(7, 0, "REV");
    }
    LCD_write_str(0, 1, "dangwei:");
    cnt = 0;
    buffer[cnt++] = '0' + dangwei;
    buffer[cnt++] = ' ';
    buffer[cnt++] = 0;
    LCD_write_str(9, 1, buffer);
}

void main(void) {
    delay_nms(100);
    LCD_init();

    DDRB = 0xFF;
    DDRD &= 0xF0;

    display();
    while (1) {
        if (open == 1) {
            if (dir == 0) {
                j++;
                if (j >= 8) j = 0;
                PORTB = FFW[j];
                delay_nms(yanshi);
            } else {
                j++;
                if (j >= 8) j = 0;
                PORTB = REV[j];
                delay_nms(yanshi);
            }
        }

        if ((PIND & 0x01) == 0) {
            open = !open;
            if (open == 0) {
                dangwei = 0;
                yanshi = map[dangwei];
            } else {
                yanshi = map[dangwei];
            }
            display();
            while ((PIND & 0x01) == 0);
        }

        if ((PIND & 0x02) == 0) {
            if (dangwei < 7) dangwei++;
            yanshi = map[dangwei];
            display();
            while ((PIND & 0x02) == 0);
        }

        if ((PIND & 0x04) == 0) {
            if (dangwei > 0) dangwei--;
            yanshi = map[dangwei];
            if (dangwei == 0) open = 0;
            display();
            while ((PIND & 0x04) == 0);
        }

        if ((PIND & 0x08) == 0) {
            dir = !dir;
            display();
            while ((PIND & 0x08) == 0);
        }
    }
}

功能实现

电机控制

程序中通过定义两个数组 FFW[]REV[],分别存储了正转和反转的步进序列。在 main 循环中,根据电机的开关状态和方向,选择相应的序列输出到 PORTB,实现步进电机的控制。

按键扫描

按键连接到 PORTD 的低四位,通过读取 PIND 的状态检测按键是否按下。每个按键对应不同的功能:

  • 按键1:开关电机。
  • 按键2:增加档位。
  • 按键3:减少档位。
  • 按键4:切换方向。
显示模块

显示模块通过 LCD_write_str 函数将电机的状态、档位和方向显示在 LCD1602 屏幕上。

总结

本项目通过简单的硬件连接和基础的C语言编程,实现了步进电机的控制。对于学习单片机和步进电机控制的初学者,是一个很好的入门项目。通过这个项目,可以了解步进电机的工作原理、单片机的I/O控制和LCD1602的使用方法。

资源

复制代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2
相关推荐
JNX_SEMI3 小时前
OC5138T 8V~100V超宽输入降压恒流驱动:覆盖12V汽车至72V电动车全场景
单片机·嵌入式硬件
智购科技无人售货机工厂4 小时前
2026自动售货机AI智能体架构:从47个小模型到33.7亿Token的工程实践~YH
android·人工智能·驱动开发·单片机·pandas
单片机仿真设计5 小时前
【proteus仿真】基于 STM32 单片机太阳能双轴追踪系统 Proteus 仿真设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·课设
Lzh编程小栈6 小时前
STM32 DMA深度解析|原理、完整工作流程、寄存器、中断联动,嵌入式面试高频考点(F1系列)
c语言·stm32·单片机·mcu·面试
新晨单片机设计6 小时前
S016A-基于STM32单片机电子秤(LCD1602显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
辰域电子7 小时前
STM32项目开源:粮仓环境安防监测系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·毕业设计·proteus
深圳市尚想信息技术有限公司8 小时前
HITENX海速芯TM52F1363-SSOP24 8KB Flash存储+EEPROM,国产8位MCU单片机
单片机·mcu·flask·芯片·控制器·海速芯
m0_752753128 小时前
51单片机中的定时器和中断等
单片机·51单片机
充哥单片机设计8 小时前
【STM32开源项目】智能窗户控制器
stm32·单片机·嵌入式硬件·毕业设计·智能窗户
糖糖单片机设计21 小时前
基于 STM32 的公交车定位与报站系统
stm32·单片机·嵌入式硬件