单片机控制步进电机

单片机控制步进电机简介:用单片机控制步进电机正转反转加速减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大;仿真原理图如下:MCU和LCD1602显示模块:ULN2803驱动和步进电机模块:C语言代码如下:/*—————————–FileName:StepperMotor.hFunction:函数头文件Autho…

大家好,又见面了,我是你们的朋友全栈君。

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

/*-----------------------------
FileName: StepperMotor.h
Function: 函数头文件
Author: Zhang Kaizhou
Date: 2019-6-6 17:59:39
------------------------------*/
#include <reg52.h>
#include <string.h>
#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 < strlen(table0); i++){
		writeData(table0[i]);
		delay(5);
	}
	
	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
	for(i = 0; i < strlen(table1); 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--);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137986.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用户黏性分析_客户粘性是指什么

    用户黏性分析_客户粘性是指什么DAU/MAU值越大,说明app用户黏性越高!1.基本概念DAU和MAUDAU(DailyActiveUser),日活跃用户数MAU(MonthlyActiveUser),月活

    2022年8月5日
    3
  • 如何盗微信号 除了验证码_微信2个好友验证码破解

    如何盗微信号 除了验证码_微信2个好友验证码破解光凭验证码就可以盗号!微信盗号新手段揭秘91.com移动互联网第一平台时间:2014-06-30[网站合作]快速评论分享到QQ好友新浪微博91娱乐目前有一种新型盗号方式即骗取用户手机验证码来盗取用户微信QQ等帐号,从而进一步盗取其中的微信银行账户、密码以及账单明细,所以平时疏忽大意的童鞋一定要小心谨慎噢。话说有一天,小编的微信忽然就收到了朋

    2022年4月19日
    102
  • wireshark抓取arp包分析_dns协议抓包分析

    wireshark抓取arp包分析_dns协议抓包分析使用Wireshark工具抓取ARP协议的数据包,分析ARP协议的地址解析过程、自主学习逻辑以及初次访问和多次访问的区别。

    2022年9月7日
    0
  • 对不起,学会这些 Linux 知识后,我有点飘

    对不起,学会这些 Linux 知识后,我有点飘Linux简介UNIX是一个交互式系统,用于同时处理多进程和多用户同时在线。为什么要说UNIX,那是因为Linux是由UNIX发展而来的,UNIX是由程序员设计,它的主要服务对象也是程序员。Linux继承了UNIX的设计目标。从智能手机到汽车,超级计算机和家用电器,从家用台式机到企业服务器,Linux操作系统无处不在。大多数程序员都喜欢让系统尽量简单,优雅并具有一致性。举个例子,从最底层的角度来讲,一个文件应该只是一个字节集合。为了实现顺序存取、随机存取、按键存取、远程存取只能是

    2022年5月31日
    20
  • MANIFEST.MF文件(PDB文件)

    打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内 容,先来看struts.jar中包含的MANIFEST.MF文件内容:Manifest-Version:1.0Created-By:ApacheAnt 1.5.1…

    2022年4月15日
    41
  • 音视频传输基本知识[通俗易懂]

    音视频传输基本知识[通俗易懂]音视频传输时的基本步骤:1.发起会话(Sip协议)2.编码(硬件编码、软件编码)3.传输(RTP)4.解码(硬件解码、软件解码)5结束会话(Sip协议)视频格式视频格式可以分为适合本地播放的本地影像视频和适合在网络中播放的网络流媒体影像视频两大类。尽管后者在播放的稳定性和播放画面质量上可能没有前者优秀,但网络流媒体影像视频的广泛传播性使之正被广泛应用于视频点播、网络演示

    2022年10月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号