热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单片机控制步进电机

单片机控制步进电机简介:用单片机控制步进电机正转反转加速减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大;仿真原理图如下:MCU和LCD1602

简介:
用单片机控制步进电机正转 反转 加速 减速;
由LCD1602实时显示步进电机的状态;F-正转 B-反转;数字越大,转速越大;
仿真原理图如下:
MCU和LCD1602显示模块:
在这里插入图片描述
ULN2803驱动和步进电机模块:
在这里插入图片描述
C语言代码如下:

/*-----------------------------
FileName: StepperMotor.h
Function: 函数头文件
Author: Zhang Kaizhou
Date: 2019-6-6 17:59:39
------------------------------*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Factor 5 // 转速控制常数
/*LCD1602端口设置*/
sbit lcdrs = P1^0;
sbit lcdrw = P1^1;
sbit lcden = P1^2;
/*步进电机驱动器端口设置*/
sbit direcChange = P1^3; // 方向翻转
sbit speedUp = P1^4; // 加速
sbit slowDown = P1^5; // 减速
/*主函数声明*/
void keyScan();
void execute();
/*LCD1602显示相关函数声明*/
void LCDInit();
void displayInit();
void display(uchar oper, uchar dat);
void writeCommand(uchar command);
void writeData(uchar dat);
void delay(uchar xms);

/*-------------------------------------------
FileName:main.c
Function: MCU控制步进电机
Description:控制步进电机正转 反转 加速 减速;
由LCD1602实时显示步进电机的状态;
F-正转 B-反转;数字越大,转速越大;
---------------------------------------------
Author: Zhang Kaizhou
Date: 2019-6-6 17:56:41
-------------------------------------------*/
#include "StepperMotor.h"
uchar code pulseTable0[] = {0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08}; // 一相励磁(同一时刻只有一个线圈通电,旋转角1.8度)
uchar code pulseTable1[] = {0x0c, 0x06, 0x03, 0x09, 0x09, 0x03, 0x06, 0x0c}; // 二相励磁(同一时刻有两个线圈通电,旋转角1.8度)
uchar code pulseTable2[] = {0x08, 0x0c, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09,
0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08}; // 一-二相励磁场(一二相交替励磁,旋转角0.9度)
uchar speed = 0, startPos = 0; // 默认正转
bit oper = 0/*操作数*/, direcFlag = 0; // 初始状态为正向
void main(){
LCDInit(); // LCD1602显示初始化
displayInit();
while(1){
keyScan(); // 按键扫描
display(0, direcFlag);
display(1, speed);
execute();
}
}
/*按键扫描*/
void keyScan(){
if(!speedUp){ // 加速
delay(5);
if(!speedUp){
if(speed <4){
while(!speedUp);
speed++;
}else{
while(!speedUp);
speed = 3;
}
}
}
if(!slowDown){ // 减速
delay(5);
if(!slowDown){
if(speed != 0){
speed--;
}else{
while(!slowDown);
speed = 0;
}
}
}
if(!direcChange){ // 方向翻转
delay(5);
if(!direcChange){
while(!direcChange);
direcFlag = ~direcFlag;
}
}
}
/*步进电机控制执行函数*/
void execute(){
uchar i, j;
startPos = (direcFlag == 0) ? 0 : 4; // 方向控制
for(i = startPos; i <= (startPos + 4); i++){
P2 = pulseTable0[i];
for(j = 0; j <(speed + 1) * Factor; j++){ // 用延时来控制脉冲输出的频率,从而控制步进电机转速
delay(10);
}
}
}

/*-----------------------------
FileName:display.c
Function: LCD1602显示函数
Author: Zhang Kaizhou
Date: 2019-6-6 17:58:42
------------------------------*/
#include "StepperMotor.h"
uchar code table0[] = {"Direction:"}; // 每行的字符数据
uchar code table1[] = {"Speed:"};
uchar code table2[] = {"1234"};
uchar code table3[] = {"FB"}; // F-正向 B-反向
/*初始化LCD1602的设置*/
void LCDInit(){
lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
writeCommand(0x0c); // 开显示,不显示光标
writeCommand(0x06); // 写一个字符后地址指针自动加1
writeCommand(0x01); // 显示清零,数据指针清零
}
/*LCD上电界面*/
void displayInit(){
uchar i;
writeCommand(0x80); // 将数据指针定位到第一行首
for(i = 0; i writeData(table0[i]);
delay(5);
}

writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
for(i = 0; i writeData(table1[i]);
delay(5);
}
}
/*LCD显示函数*/
void display(uchar oper, uchar dat){
if(oper == 0){ // 方向显示
if(dat == 0){ // 正向
writeCommand(0x80 + strlen(table0)); // 数据指针定位到第一行空闲处
writeData(table3[0]);
}else if(dat == 1){ // 反向
writeCommand(0x80 + strlen(table0)); // 数据指针定位到第一行空闲处
writeData(table3[1]);
}
}
if(oper == 1){ // 速度显示
writeCommand(0x80 + 0x40 + strlen(table1)); // 数据指针定位到第二行空闲处
writeData(table2[dat]);
}
}
/*写指令函数*/
void writeCommand(uchar command){
lcdrs = 0; // 命令选择
lcdrw = 0;
P0 = command;
delay(5);

lcden = 1; // 产生一个正脉冲使能信号
delay(5);
lcden = 0;
}
/*写数据函数*/
void writeData(uchar dat){
lcdrs = 1; // 数据选择
lcdrw = 0;
P0 = dat;
delay(5);

lcden = 1;
delay(5);
lcden = 0;
}
/*延时函数*/
void delay(uchar xms){
uint i, j;
for(i = xms; i > 0; i--)
for(j = 110; j > 0; j--);
}


推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
手机用户2502859545
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有