基于51单片机的两相步进电机控制系统

发布者:心愿达成最新更新时间:2022-01-13 来源: eefocus关键字:51单片机  两相  步进电机  控制系统 手机看文章 扫描二维码
随时随地手机看文章

硬件设计

在这里插入图片描述

代码设计

#include "MAIN.H"

#include "LCD1602.h"

#include "PCF8591.h"


unsigned char code FFW_X[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //X反转顺序


unsigned char code FFZ_X[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //X正转顺序


unsigned char code FFW_Y[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //Y反转顺序


unsigned char code FFZ_Y[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; //Y正转顺序


unsigned char Speed = 30,Direction = 1,X_Y = 0,stop = 1,mode = 0;  

unsigned int k, temp;

int Angle = 0;


/*******************************************************************************


* 函 数 名 : main

* 函数功能 : 主函数

* 输    入 : 无

* 输    出 : 无

*******************************************************************************/

void main(void)

{

System_Init();

while(1)

{

temp = Read_PCF(); // 读取AD转换后的数字量

PCF_Output(temp); // DA转换,模拟量输出

//将数字量转换为十进制,*100 + 0.5将小数转换为整数,便于显示和存储

k = (float)temp * 5 / 256 * 100 + 0.5; // 将得到的结果存入数组


Key_Scan();

if(mode == 0)Motor();

if(mode == 1)

{

Angle = k/61*45;

if(Angle >= 0)

{

LCD1602_Location(2,7);

LCD1602_Write_Num(Angle);

if(X_Y==0)

GPIO_MOTOR = FFW_Y[k/62];

else

GPIO_MOTOR = FFW_X[k/62];

}

Delay(20);

}


}

}


void System_Init(void)

{

Init_PCF();

Init_LCD1602();

LCD1602_Location(1,1);

LCD1602_write_word("Welcome To Use!");

Delay(1000);

LCD1602_Clear();

LCD1602_Location(1,1);

LCD1602_write_word("Speed:");

LCD1602_Write_Num(Speed);

LCD1602_Location(2,1);

LCD1602_write_word("Angle:");

LCD1602_write_word("Null");

LCD1602_Location(1,11);

LCD1602_write_word("Stop");

LCD1602_Location(2,12);

LCD1602_write_word("X+");

LCD1602_Location(2,15);

LCD1602_write_word("O");

}

/*******************************************************************************

* 函 数 名: Motor

* 函数功能: 电机旋转函数

* 输    入: 无

* 输    出: 无

*******************************************************************************/

void Motor()

{

unsigned char i;

if(Speed>0)

for(i=0;i<8;i++)

{

if(Direction==1&&X_Y==0&&stop==0) //正转&Y电机&电机没按下停止

GPIO_MOTOR = FFW_Y[i];

if(Direction==2&&X_Y==0&&stop==0) //反转&Y电机&电机没按下停止

GPIO_MOTOR = FFZ_Y[i];

if(Direction==1&&X_Y!=0&&stop==0) //正转&X电机&电机没按下停止

GPIO_MOTOR = FFW_X[i];

if(Direction==2&&X_Y!=0&&stop==0) //反转&X电机&电机没按下停止

GPIO_MOTOR = FFZ_X[i];

Delay(1000/Speed); //调节转速

}

}

/*******************************************************************************

* 函 数 名  : Delay

* 函数功能  : 延时

* 输    入  : t

* 输    出  : 无

*******************************************************************************/

void Delay(unsigned int t)

{

 unsigned int k;

 while(t--)

 {

for(k=0; k<80; k++);

 }

}

/*******************************************************************************

* 函 数 名  : Key_Scan

* 函数功能  : 按键

* 输    入  : 无

* 输    出  : 无

*******************************************************************************/

void Key_Scan(void)

{

unsigned int i,j; 

if(K1==0) //检测按键K1是否按下

{

Delay(1); //消除抖动

if(K1==0)

{

if(stop == 1)

{

stop=0;   

LCD1602_Location(1,11);

LCD1602_write_word("Move");

LCD1602_Location(2,7);

LCD1602_write_word("Null");

}


else

{

stop=1;    //stop为控制电机停止的标志位,但它为1时,电机停止

LCD1602_Location(1,11);

LCD1602_write_word("Stop");

}

}

while((i<300)&&(K1==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

}

 if(K2==0) //检测按键K1是否按下

 {

Delay(1); //消除抖动

if(K2==0)

{

Direction=1; //Direction 转向标志位,为2时为正转

LCD1602_Location(2,13);

LCD1602_write_word("+");

}

while((i<200)&&(K2==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

 }

/********************检测按键K2是否按下***********************/

 if(K3==0) //检测按键K2是否按下

 {

Delay(1); //消除抖动

if(K3==0)

{

Direction=2;   //Direction 转向标志位,为2时为反转

LCD1602_Location(2,13);

LCD1602_write_word("-");

}

while((i<200)&&(K3==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

 }

/********************检测按键K3是否按下***********************/

if(K4==0)//检测按键K3是否按下

{

Delay(1);//消除抖动

if(K4==0)

{

if(Speed < 100)

Speed += 5;

LCD1602_Location(1,7);

LCD1602_Write_Num(Speed);

}

while((i<200)&&(K4==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

 }

 /********************检测按键K3是否按下***********************/

 if(K5==0) //检测按键K4是否按下

 {

Delay(1); //消除抖动

if(K5==0)

{

if(Speed > 0)

Speed -= 5;

LCD1602_Location(1,7);

LCD1602_Write_Num(Speed);

}

while((i<200)&&(K5==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

 }

 if(K6==0)//检测按键K1是否按下

 {

Delay(1);//消除抖动

if(K6==0)

//    Direction=0;    //X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机

if(X_Y==0)    //当切换电机时,对Direction=0;对标志位清零,防止上个电机的转向影响本次所控电机

{

X_Y=1;

LCD1602_Location(2,12);

LCD1602_write_word("Y");

}

else

{

X_Y=0;

LCD1602_Location(2,12);

LCD1602_write_word("X");

}

}

while((i<400)&&(K6==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

}

if(K7==0)//检测按键K1是否按下

{

Delay(1);//消除抖动

if(K7==0)

if(Angle >= 0)

{

if(Direction==1&&stop==1) //正转&Y电机&电机没按下停止

{

if(j >= 8)j -= 8;

Angle += 45;

if(Angle >= 360)Angle -= 360;

j++;

LCD1602_Location(2,7);

LCD1602_Write_Num(Angle);

if(X_Y==0)

GPIO_MOTOR = FFW_Y[j];

else

GPIO_MOTOR = FFW_X[j];

}

if(Direction==2&&stop==1) //反转&Y电机&电机没按下停止

{

if(j > 0)

{

Angle -= 45;

if(Angle <= 0)Angle = 0;

j--;

LCD1602_Location(2,7);

LCD1602_Write_Num(Angle);

if(X_Y==0)

GPIO_MOTOR = FFW_Y[j];

else

GPIO_MOTOR = FFW_X[j];

}

else

j = 0;

}

}

Delay(20);

}

while((i<2000)&&(K7==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

}

if(K8==0)//检测按键K1是否按下

{

Delay(1);//消除抖动

if(K8==0)

mode = 1;

LCD1602_Location(2,15);

LCD1602_write_word("C");

}

while((i<500)&&(K8==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

}

if(K9==0)//检测按键K1是否按下

{

Delay(1);//消除抖动

if(K9==0)

mode = 0;

LCD1602_Location(2,15);

LCD1602_write_word("O");

}

while((i<500)&&(K9==0))//检测按键是否松开

{

Delay(1);

i++;

}

i=0;

}

}


链接:https://pan.baidu.com/s/19qBroJVEvd2DRPwfSVv80Q

提取码:kxoc

关键字:51单片机  两相  步进电机  控制系统 引用地址:基于51单片机的两相步进电机控制系统

上一篇:基于51单片机的智能家居控制温度光照气体检测
下一篇:基于AT89c51单片机的流水灯,中断定时,按钮控制

推荐阅读最新更新时间:2024-11-12 11:48

51单片机60s倒计时动态显示仿真图和程序
51单片机60s动态显示程序 #include reg52.h #define uint unsigned int #define uchar unsigned char uchar code table ={0xc0,0xf9,0xa4, 0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; sbit gew=P2^1; sbit shiw=P2^0; sbit k2=P1^0; uchar num,num1=60,num2,shi,ge; void Init() //初始化子函数 { TMOD=0X01;
[单片机]
<font color='red'>51单片机</font>60s倒计时动态显示仿真图和程序
基于stc89c52单片机控制步进电机
51单片机是许多单片机初学者的入门开发板,今天给大家做一个基于51内核的stc89c52板子来控制步进电机,可以实现步进电机的正反转、加减速。另外,使用板子自带的Ds18b20模块进行环境测温,并将测得的数据用lcd液晶屏进行显示。并在温度达到设定值时蜂鸣器报警。 第一步,硬件 1 stc89c52开发板,这个板子就不多讲了,网上有很多 2 步进电机,用的是网上非常便宜的4相5线步进电机 28BYJ-48,电压为5v 第二,程序 1 步进电机程序,定义步进电机的IO口以及方向以便调速和转向 2 LCD程序,主要是三个函数,一个初始化函数,一个写函数,一个显示函数 3 温度传感器Ds18b20,主要是这个读函
[单片机]
基于stc89c52单片机控制<font color='red'>步进电机</font>
51单片机驱动点阵16*16左移
这个点阵左移,曾经让我......如今在朋友指导下.........主要部分在红色部分,请大家理解那里就行了!会了也没有什么!硬件:行采用74HC154+S8550,列采用74HC595! #include reg52.h #define uchar unsigned char #define uint unsigned int #define LINE P0//定义行线IO口,即74HC154控制端 #define shudu 20//字移动的速度 sbit DATA=P1^4;//74HC595数据端 sbit CLK=P1^5;//74HC595移位脉冲端 sbit CLKR=P1^6;//74HC595数据锁存端 u
[单片机]
<font color='red'>51单片机</font>驱动点阵16*16左移
基于51单片机控制的O01多功能电话答录机
  采用89CI051/2051控制的O01多功能电话答录机, 电路 简洁、性能稳定,可广泛用于程控电话机自动留言值班、监听、监录等场合。其工作原理、程序流程、控制电路介绍如下。      001电话录音机的原理框图和程序流程图如图l、图2、图3所示,其功能如下:      1.自动应答功能 实现自动应答功能需插上电话线,按下录音键,将自动/监听开关置于自动位置(录放开关、自动/监听开关置高 电平 ,机器处于自动待机状态)。来电时, 单片机 检测振铃次数达到设置值,送摘机控制信号和提示音播放信号,自动接通电话并送出自录的提示音。提示音播放结束,单片机检测到一个提示音结束信号时,输出电机控制信号,开始录音。对方挂机后,单片机检测到三
[单片机]
基于<font color='red'>51单片机</font>控制的O01多功能电话答录机
基于89C51单片机的485总线接口的软硬件设计提高可靠性和稳定性
引言 近年来,由于人们防火意识的不断增强以及有关法律、法规的不断完善,火灾自动报警系统得到迅猛发展和广泛应用,已成为预防火灾、保障人民生命和财产安全的最重要手段。这就要求火灾自动报警系统必须具有很高的可靠性和稳定性。 目前,国内火灾报警系统多采用RS485半双工异步通信总线进行联网,实现火灾报警控制器之间,以及火灾报警控制器与火灾显示盘之间的通信。但在实际使用中,往往由于设备数量多、通信线路远以及现场的各种干扰等,造成通信可靠性、稳定性不高,致使联网系统的质量得不到保证。 在火灾自动报警系统的联网设计中,经大量试验,发现在使用RS485总线时,如果简单地按常规方式设计电路,那么在实际工程中可能存在以下两个问题:一是通信数据
[单片机]
基于89C<font color='red'>51单片机</font>的485总线接口的软硬件设计提高可靠性和稳定性
51单片机逻辑运算指令表与示例
1.逻辑运算 指令 的一般性说明 与、或、异或的逻辑运算指令可以Acc或direct为目标。但是以direct为目标时,另一操作数只能是Acc或立即数。 与、或、异或是对位逻辑运算。 其他逻辑运算指令只对Acc操作。 小循环不影响Cy,大循环Cy在循环圈内。 除了RLC和RRC,逻辑运算指令不影响P以外的标志位。 2.与、或、异或的特殊用途 用ANL指令屏蔽指定位 例:ANL A,#0FH ;屏蔽高4位 用ORL指令将指定位置1 例:ORL A,#0FH ;将低4位置1 用ORL指令拼接一个字节 例:ANL A,#0FH ANL B,#0F0H ORL A,B 用XRL指令将指定位取反
[单片机]
<font color='red'>51单片机</font>逻辑运算指令表与示例
51单片机-定时中断与LED闪烁
这次说定时与中断,有人说,掌握了定时与中断,就掌握了一个单片机80%的功能;也有人说,中断是一个单片机的灵魂。这两句话无一不在强调中断的重要性,就让我们认识一下,中断到底是什么。 根据百度百科的定义:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 举个例子,我正在吃饭呢,忽然老婆大人发话了,说在网上看上一个包,挺好的,让我帮着付款,于是我停下吃饭说好,去帮着付款,付完款,继续吃饭。 这个过程中,我是CPU;吃饭是主程序;老婆大人说话,触发了中断;我说好,安慰
[单片机]
新能源汽车三大控制系统核心技术
新能源汽车的核心技术依旧是“三电”系统,包括电池、电机、电控系统。除此之外,由于智能网联的快速发展,围绕汽车产生的数据进行加工、算法等技术形成的软件技术,也同样是新能源汽车的核心技术。赵福全教授指出:“数据是汽车能够不断进化的DNA。相对于硬件来说,软件使车更具个性特征;没有硬件不行,但只有硬件不够,需要软件来升华硬件,通过数据让汽车进化。 在新能源汽车的整个平台架构中,VCU(Vehicle Control Unit 整车控制器)、MCU (Moter Control Unit 电机控制器)和 BMS (BATTERY MANAGEMENT SYSTEM 电池管理系统)是最重要的核心技术,对整车的动力性、经济性、可靠性和安全性
[嵌入式]
新能源汽车三大<font color='red'>控制系统</font>核心技术

推荐帖子

三电阻电流采样与单电阻优越性比较
FOC方面,市场上也有三电阻电流采样或者单电阻电流采样的方案,那么这两种方案有各有怎样的优劣势呢?首先看三电阻电流采样,根据李方哲介绍,这种方案因为拥有均衡的PWM,有充足的时间去采样,这就使得他们在低速过程中表现比较好,并且没有太多的振动。这是单电阻方案所不能比拟的。据了解,后者在低速的时候,抖动情况非常明显。此外,在刹车控制方面,三电阻的方案也优于单电阻方案。再看单电阻采样,因为这个方案采用的是总线电流采集的方式,那就使得其成本比较低,能很容易地检测到总
alan000345 RF/无线
有没有人用过这个芯片啊,m62429
用stm32怎样去用这个芯片,求指导有没有人用过这个芯片啊,m62429m62429这个芯片怎么样,我现在也在用这个芯片,可以调节音量大小的时候会有录音,楼主,用这芯片有没有这个问题?
mguaj stm32/stm8
GSM教你理解verilog HDL语言的一些概念
一:基本Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。二:verilog语句结构到门级的映射1、连续性赋值:assign连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。2、过程性赋值:过程性赋值只出现在always语句中。阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。建议设计
北斗神猴 FPGA/CPLD
IO pad里面的high-volt tolerant 是什么意思?
是新手,刚刚接触PAD,我看有的IOpad介绍里面有“high-volttolerant”这个内容,“high-volttolerant”是什么意思?是说这个IOpad可以在PAD端的电压很高的情况下也能正常工作还是说PAD端的电压的变化范围可以很大?谢谢!!!IOpad里面的high-volttolerant是什么意思? 不知在哪写的,应该是指耐压吧。 比如通常IC的输入信号不允许超过电源电压,但有的3.3V电源的IC,注有“I/O5Vtolerant”
eeleader FPGA/CPLD
rs485多机通信
直接上位机pc通过串口小助手发送一串数据控制多个单片机执行相应功能如何实现最好能给个实例代码rs485多机通信485有地址的,执行之前判断一下地址先
逍遥居士 51单片机
拜托诸位帮帮忙!
430f149没有RD和WR引脚,扩展液晶时需要这两个信号应如何解决为好?拜托诸位帮帮忙!用别的管脚模拟WR和RD时序thankyouthankyou
well2003 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved