基于51单片机开发的步进电机远程控制系统

news2024/11/25 10:57:44

摘  要

 

电机是日常生活中必不可少的一部分,同时也是一种常用的机电元件。步进电机是一种特殊的电机,相较于其他类型的电机,步进电机的优点更加突出、应用优势更加明显,广泛应用于各个领域。

本设计是基于单片机开发的步进电机远程控制系统。首先,本设计对步进电机的国内外技术现状进行了简单阐述,并对步进电机相关内容进行了简单介绍。其次,根据系统设计需求,对步进电机控制系统的硬件部分与软件部分进行了设计,经过程序调试仿真和实物调试之后,最终实现了使用红外遥控器远程控制步进电机的正转、反转、转动特定角度等运动情况。最后,对设计内容进行总结,并对单片机、步进电机的未来发展做简单展望。

本设计避免了市面上电机控制系统复杂且开发使用成本高的弊端,是一款简单的、控制效率高且开发应用成本低的电机控制系统。

 

关键词

单片机;步进电机;电机控制;控制系统;系统设计

 

 

   

 

第1章 绪论

1.1 研究背景意义

1.2 国内外现状分析

1.3 研究内容

第2章 步进电机远程控制系统概述

2.1 步进电机简介

2.2 步进电机性能特点与优缺点

2.3 步进电机的分类

2.4 常见的步进电机

2.5 步进电机远程控制系统组成

2.6 单片机控制步进电机远程控制系统

第3章 电机控制系统的硬件系统设计

3.1 系统原理图

3.2 单片机最小系统

3.3 系统驱动电路设计

3.4 系统工作原理

第4章 电机控制系统的软件系统设计

4.1 电机转速与时间的关系

4.2 系统软件设计流程图

4.3 软件设计源程序分析

第5章 系统调试

5.1 程序调试仿真

5.2 硬件调试

第6章 总结

致谢

参考文献

附录

 

 

第1章 绪论

1.1 研究背景及意义

电机是日常生活中常用的元器件,社会的正常运行无时无刻都需要电机的协助来完成。步进电机是电机中的一种,该类型电机是一种具有控制功能的执行元件,主要使用该元件实现对不同仪器与设备的精确控制。在实际的运行过程中,步进电机能够将脉冲信号转换为驱动力,驱动步进电机进行相应的操作,例如转动与停止等。目前为止,单片机是最常用的用来对步进电机进行控制与设计的芯片结构。随着计算机技术水平对不断提升,越来越多的单片机类型出现在人们的视野中,将性能优良的单片机应用进来后,能够从根本上提升步进电机控制系统的整体性能。

在互联网技术发展迅速的今天,传统采用分立元件的电机控制系统具有工作稳定性低、元器件消耗大以及开发成本高等缺点,为解决这些问题,有必要将单片机等先进的芯片应用进来,对步进电机等进行精准控制。

在各类科学技术的推动作用下,单片机与步进电机的研发水平得到了很明显的提升。将结构简单、性能良好的单片机作为电机控制的核心,能够实现从根本上提升控制系统的整体性能。加大对单片机电机控制系统的研究与设计,不仅能够推动相关技术理论体系的进一步完善,还能从根本上提升自身的实践能力,为后人电机控制研究工作的顺利进行建立良好的基础。

综上所述,本文主要以STC89C52型号单片机为基础,对基于单片机的步进电机远程控制系统进行设计与实现。

1.2 国内外现状分析

1.2.1 国内技术现状

我国对单片机以及步进电机的研究起步比较晚,原因是改革开放之前,我国的经济发展水平一直处于比较落后的情况,国家并没有太多的经费对相关技术进行研究。因此,对于单片机以及电机控制的研究,我国不具备丰富的实践经验。

改革开放以后,我国的经济实力在短期内得到了比较明显的提升。在此背景下,我国加强了对单片机以及电机控制等方面的技术研究,这使得我国的单片机以及电机控制技术水平在短期内得到了很明显的提高。如今,我国主要将单片机以及步进电机等应用到化工领域以及其他领域中,并取得了良好的成效。

改革开放初期,我国主要研究步进电机的细分驱动技术。随着科学研发的不断投入,如今我国已经实现了对基于单片机斩波恒流驱动、基于单片机的直流电压驱动等常见驱动方式的设计。除此之外,在众多科研人员努力下,我国已经能够使用汇编语言进行软件开发,通过这种方式实现了电机控制精确度的进一步提升。

1.2.2 国外技术现状

关于单片机以及电机控制的研究,国外具有比较丰富的实践经验,根本原因是国外对这些领域的研究起步比较早,且在资金充足的情况下,国外科研人员更能够安心的开展科研工作。就目前来看,美国、日本等发达国家的研究方向主要为步进电机控制与驱动方向。国外研究人员表示,缩小驱动器的体积,能够有效提升步进电机控制系统的控制精确性。对于美国等发达国家而言,比较典型的芯片有两类,一类主要用来实现电机加速与减速功能以及正反转功能,另外一种主要用来减少电机失步与过冲现象的发生,例如日本近几年研发出了一种名为ppmclOlb的芯片,经实践证明该芯片具有降低电机失步率以及过冲率的功能。

1.3 研究内容

本设计的主要内容如下:

(1)对步进电机现状进行总结

对步进电机进行介绍,分析其具有的优缺点,并对步进电机进行分类介绍,确保在充分了解步进电机的基础上对步进电机远程控制系统进行设计与实现。介绍步进电机远程控制系统的组成、单片机控制步进电机远程控制系统以及驱动系统的组成,并对单片机及其系统开发工具进行深入了解,为系统的设计与实现建立基础。

(2)电机控制系统的硬件系统设计

对步进电机控远程控制系统的硬件部分进行设计,主要包括对单片机最小系统以及系统驱动电路设计,完成电机控制系统的硬件系统设计。

(3)电机控制系统的软件系统设计

对步进电机远程控制系统的软件部分进行设计,首先分析系统软件设计需求,完成对控制系统软件设计流程的设计。其次根据系统软件设计需求,编写系统软件源程序,并对软件源程序进行进一步的分析。最后对软件程序进行调试仿真,完成对步进电机远程控制系统的最终设计与实现。

 

 

第2章 步进电机远程控制系统概述

2.1 步进电机简介

学术界将步进电机定义为一种数字转换器与角度转换器,同时也是一个具有串行特点的数/模转换器。步进电机的作用意义巨大,常被用作过程控制以及电器仪表中的起系统控制作用的主要控制元件。步进电机具有错齿结构,是步进电机能够进行旋转的主要原因。将步进电机应用进来,能够实现系统的精确控制与定位,因此步进电机主要被广泛应用于精确定位系统中。

2.2 步进电机性能特点与优缺点

2.2.1 性能特点

步进电机的主要性能特点为:(1)步进电机对工作环境温度的要求较高,温度达不到要求将无法保证磁性材料能够达到退磁点。为保证步进电机的稳定运行,一般需要将步进电机置于较高温度的环境中。(2)在高速的情况下,步进电机启动难,启动概率较小(3)步进电机的控制精度较高,为其步进角的3%到5%之间且不存在累积误差。(4)转速持续的升高,步进电机的力矩急速下降。

2.2.2 优缺点

步进电机的优点为:步进电机的控制比较简单方便,有明显的数字特征,通过数字信号的方式就可以实现对电机的开环控制。步进电机本身的部件比较少,可靠性很高,而且使用寿命与轴承寿命一脉相承。步进电机能在很大的范围内选择步距角,在小步距的情况下仍然可以以高转矩的方式运行。步进电机的结构非常简单,使用与开发的成本较低,是一种经济型电机。

步进电机的缺点为:如果出现控制不当,容易产生共振现象,给系统带来一定的影响。步进电机的体积、重量优势不明显,且能源利用效率相对较低。在超过负载的情况下,步进电机的同步控制情况会受到影响,不能使用普通的交流电源对步进电机进行驱动。

2.3 步进电机的分类

步进电机的类型多种多样,从不同的角度出发可将步进电机分类称为很多种类型。广义上可以将步进电机分为电磁式步进电机、机械式步进电机、组合式步进电机。根据电机结构特点进行区分,又可以将步进电机分为永磁式步进电机、混合式步进电机、反应式步进电机。

2.4 常见的步进电机

2.4.1 反应式步进电机

如下图2.1所示为反应式电机内部结构示意图:

 

5bddf47d693543f787192b3d46f94ade.png

 

图2.1 反应式电机内部结构示意图

反应式步进电机是一种常用类型的步进电机,该类型电机的工作原理是通过磁通使路径磁阻最小所产生的磁阻转矩,迫使电机转动,从而实现对电机的远程控制。

2.4.2 四相步进电机

四相步进电机是一种常用类型的步进电机,该类型步进电机的结构和普通电机类似,都包含了定子、转子以及定子绕组等结构。区别在于四相步进电机的定子绕组被划分成了四个部分,这也是该类型电机名称的来源。按照A-B-C-D的方向对电机进行通电,四相步进电机就会出现正转的情况,反之四相步进电机则出现反转的情况。四相步进电机的内部结构示意图如下图2.2所示:

 

373ec7bc5fdf4db6b7540bd22f4e5ee8.png

 

图2.2 四相步进电机内部结构示意图

2.5 步进电机远程控制系统组成

一般情况下,步进电机远程控制系统主要由运动控制部件、驱动部件以及运动执行部件组成,步进电机远程控制系统的组成如下图2.3所示:

c70dcf4fa9474f8796ae5e2c6ab8cbb3.png

图2.3 步进电机远程控制系统组成

 

 

 

 

 

 

 

 

步进电机为一个常用的控制元件,而步进电机控制系统就是一个完整的有机整体。其中,操作系统与运动控制系统是步进电机控制系统的主要组成部分。操作系统的作用是将操作者执行的操作转换为电信号,电信号作用到运动控制系统上后,运动系统随之作出相应的反应。运动控制的重点在于对物体位置以及速度的控制,控制部分、驱动部分以及执行部分是运动控制系统的主要组成部分。

2.6 单片机控制步进电机远程控制系统

单片机常被用到对步进电机远程控制系统的设计中,基于单片机的步进电机远程控制系统主要包含单片机系统、驱动电路、步进电机与外围电路。单片机控制的步进电机远程控制系统如下图3.2所示:

 

 

 

8aacce0d845c47739d82e42d1ae47466.png

 

图3.2 单片机控制的步进电机远程控制系统

电机控制系统的硬件结构组成很复杂,需要耗费较高的成本进行设计。将单片机应用进来后,可实现对驱动电机的软件形式控制,且还可以通过编程的方法对步进电机的转速、转动角度以及转动次数等进行精确控制。与此同时,将单片机应用进来后,还能实现对步进电机运行状态的准确控制,因此可满足不同用户的不同使用需求。而且单片机的应用使步进电机远程控制系统的电路变得更加简单,降低了系统设计的成本。

 

 

第3章 电机控制系统的硬件系统设计

根据步进电机远程控制系统的设计要求,进行步进电机远程控制系统框图的设计,如下图3.1所示:

d689eba4d8db44cfbf6943a061d0df33.png

 

 

图3.1 步进电机远程控制系统框图

步进电机远程控制系统框图的设计完成后,本章将依次对系统的结构与功能、单片机最小系统、系统驱动电路设计、系统的工作原理进行阐述。

3.1 系统原理图

步进电机主要被应用于自动化工控制系统中,在单片机的作用下,步进电机的运转会得到有效控制。将单片机最小系统与少量外围器应用进来,即可组成一个工作稳定性高、整体性能可靠的步进电机控制器。系统总体设计电路图如下图3.2所示。将控制器应用进来后,就可以实现对步进电机正转、反转与停止等运动情况的精确控制。

对步进电机控制器电路通电后,即可实现电机电路复位,或者通过开关按钮,也能实现电路复位。与此同时,通过操作亲触按键以及独立按键,能够实现步进电机的正转、反转以及停机等功能。另外,通过设计单片机软件程序的方式,能够实现对步进电机步距角的改变。对电机设置延时时间常数后,根据延时常数的不同可控制电机的转速。一般而言,延时时间常数越小,电机转速越快,反之越慢。

 

13a2dbd0919b42948302bb11175b2141.png

 

图3.2 步进电机控制器整体电路图

3.2 单片机最小系统

 

ffa9c74240c5475b85c6913b37585ef7.png

 

图3.3 单片机最小系统电路

将STC89C52单片机最小系统与少量外围器进行组合,可对基于单片机的步进电机远程控制系统完成设计与实现。系统中,单片机主要发挥控制作用,因此单片机是控制系统的核心部分。将能够使单片机运行起来的相关最小硬件进行连接,即可形成实现对单片机最小系统电路图的设计。本文设计的单片机最小系统主要由时钟晶振电路、复位电路以及单片机组成,单片机最小系统电路如下图3.3所示:

单片机最小系统中,产生时钟信号的电路为时钟晶振电路,晶振频率为12MHz,该类型单片机主要有两个外接晶振引脚,名为XTAL1与XTAL2。单片机的时钟晶振电路如下图3.4所示:

 

299c328a67e8413386cd69be2ef749be.png

 

图3.4 单片机时钟晶振电路

 

baf2c211016e493487013253d58ce0cd.png

 

图3.5 单片机复位电路

除此之外,复位电路是单片机电路中的重要组成部分,主要实现单片机的初始化操作功能。通过在复位电路引脚上连续保持两个周期以上的高电平的方式,即可实现单片机的复位。单片机复位电路如下图3.5所示:

将单片机芯片、复位电路与晶振电路进行连接,即可完成对单片机最系统电路板的制作与实现。

3.3 系统驱动电路设计

步进电机驱动控制系统一般由五个部分组成,分别为脉冲信号部分、信号分配部分、功率放大部分、步进电机部分和负载部分。如下图3.6所示为驱动控制系统的组成情况:

 

 

b4a389227d7a4b8cbd9ad88287265e9f.png

 

 

图3.6 ULN2003型芯片与步进电机的连接示意图

电机控制系统中,单片机主要负责产生脉冲信号。脉冲信号产生后,可通过软件编程法以及使用专门的脉冲分配器实现对脉冲信号的分配与控制。增加功率放大电路后,即可将单片机与步进电机进行直接连接。

一般情况下,单片机直接输出的脉冲信号比较小,较小的脉冲信号无法驱动电机的正常工作。因此在实际的控制系统设计过程中,不能将单片机直接输出的信号与步进电机进行直接相连,需要在驱动电路的协助下,完成对步进电机的控制。本文主要使用ULN2003型高耐压、大电流达林顿系列系芯片对单片机进行驱动设计。ULN2003型芯片工作电压比较高且灌电流最高可达到0.5A,能够承受最高50V的电压。将ULN2003型芯片应用进来,能够实现单片机、步进电机之间的良好连接,形成步进电机驱动板。如图3.7驱动电路所示。

 

1d0276bce8cc4a30ab41834e435416be.png

 

图3.7 驱动电路

3.4 系统工作原理

一般而言,控制电路中的步进电机均属于四相步进电机,为提升步进电机的带负载能力,保证步进电机远程控制系统的稳定与高效运行,本文将八拍驱动方式应用了进来,对电机控制系统进行了设计。

步进电机四相八拍通电方式的控制字可使用下表3.1进行表示:

表3.1 步进电机四相八拍通电方式的控制字

通电状态

P1.3

P1.2

P1.1

P1.0

控制字

A

1

1

1

0

E

AB

1

1

0

0

C

B

BC

1

1

C

CD

1

1

D

DA

1

1

四相八拍方式步进电机的通电书序为:

首先,对A相线圈进行通电,之后进行通电转换,使A、B两相线圈同时通电。

其次,对B相线圈进行通电。

最后,对B、C两相线圈进行同时通电,其余步骤省略。通电方式与流程可描述为A-AB-B-BC-C-CD-D-DA。步进电机中的定子绕组按照一定的顺序进行通电后,电机转子就会按照设定的程序沿着一定的方向进行转动。

 

 

 

第4章 电机控制系统的软件系统设计

4.1 电机转速与时间的关系

 

根据步进电机远程控制系统的设计要求,得到如下图4.1所示的反应步进电机转速与时间之间关系的图:

 

 

942b5aa8dc1848c8a6cabe8f1465ec4b.png

 

 

 

 

 

图4.1 步进电机转速—时间的关系

驱动步进电机后,随着时间的变化,步进电机中转子的转速逐渐提高。转子转速达到最大值后,随机进行匀速运动。关掉电源后,步进电机停止,此时转子并不会立马停止,而是需要经过一段的时间,才能处于完全停止的状态。

4.2 系统软件设计流程图

 

 

 

 

 

345c693225e140bba26b0b87fb01e956.png

图4.2 单片机控制步进电机的软件设计流程图

单片机控制步进电机的软件控制流程如图4.2所示,由此给出单片机控制步进电机进行变速运动的流程如图4.3所示。

 

 

 

 

 

 

 

 

 

 

 

 

6f214257b8ee4acbba16265ef4fe975e.png

 

 

 

 

图4.3 单片机控制步进电机的具体流程图

该流程图显示,接通电源后,通过设定的功能按键即可实现对控制电机的正转、反转、停止以及速度转换等控制。

4.3 软件设计源程序分析

单片机步进电机远程控制系统软件设计源程序展示于附录中。源程序对单片机的P2口设置了堆栈,最开始时步进电机处于停转的状态。此时源程序会对按键进行扫描,扫描的目的主要是为了判断是否有按键按下。如果存在按键按下的情况,按键往往需要在断开与闭合两个状态之间进行转换,且需要经过一定的时间后才能处于稳定闭合的状态,该过程称为按键抖动。与此同时,用户按下按键经过10ms的时间后,按键抖动情况就会消失。用户按下不同的按键后,相应的按键会跳动到不同的模块,此时系统会对转动程序进行调用,最终完成对步进电机运动状态的精准控制。对于单片机控制的步进电机远程控制系统软件程序,主要使用C语言进行编写。

 

 

第5章 系统调试

5.1 程序调试仿真

为保证系统软件编程效果,达到实现精准控制电机运动的目的,通常需要对设计完毕的软件程序进行调试与仿真。软件程序调试与仿真主要通过一系列仿真软件相互配合的方式来完成。将各种仿真软件应用进来后,能够实现对步进电机与运行状态的模拟,且还能对单片机的运行进行线上调试。本文使用proteus仿真软件,完成了对单片机控制的步进电机远程控制系统的仿真设计,仿真结果图如下图4.4所示:

 

cc034d7be7de424c9f955c5383a6d68d.png

 

图5.1 控制系统的仿真效果图

 

 

 

 

 

5.2 硬件调试

(1)硬件实物如图5.2所示:

 

74e34b7da82f4f6b8e414835aa20c1b4.png

 

图5.2 硬件实物

(2)使用USB插上电源的初始状态如图5.3所示。此时用万用表测得输入电源电压为5.1V,为单片机正常工作电压,可进行下一步操作。

 

5bbec1ba0a61465fb12ef969d2e391b5.png

 

图5.3 初始状态

 

(3)在红外遥控器上按下正转一圈的指令,步进电机按照设定的转速正向转动一圈,转动情况在屏幕上显示如图5.4所示:

 

9812d216ebf54a139c8d2562a964f77e.png

 

图5.4 正转情况

(4)在红外遥控器上按下反转一圈的指令,步进电机按照设定的转速反向转动一圈,转动情况在屏幕上显示如图5.5所示:

 

a546d95be3e54450ae45b20537d5f05c.png

 

图5.5 反转情况

(5)上述示例的两种转动情况实现了使用红外遥控远程控制步进电机基本的运动情况,实物调试基本完成。

 

第6章 总结

步进电机作为远程控制中最常用的控制元件,应用非常广泛,将步进电机应用进来,能够实现对不同仪器以及设备运动状态的精确控制。本设计将STC89C52单片机应用进来后,完成了对步进电机远程控制系统的设计与实现。将单片机应用进来后,本设计实现了对步进电机运动状态的精准控制,通过仿真调试,实现了步进电机反转、正转、速度转换以及停止等功能。本设计的电机控制系统具有一定的实用价值与参考价值,希望能够对相关人员的研究工作有帮助。

步进电机对化工行业以及制造行业的作用意义巨大,因此受到这些行业的极力喜欢。随着科学技术水平的不断提升,在众多技术的协助下,步进电机的应用范围将越来越广泛。步进电机的发展前景良好,未来步进电机以及单片机等的应用价值将越来越高。

 

 

全部代码

 

#include<reg52.h>

#include<stdio.h>

#include<intrins.h>



#define uchar unsigned char

#define uint unsigned int



sbit RS = P2^4;//1602数据/命令选择端(H:数据寄存器L:指令寄存器)

sbit RW = P2^5;//1602读/写选择端

sbit E  = P2^6;//1602使能信号端



sbit key1=P3^0;//用户按键

sbit key2=P3^1;

sbit key3=P3^2;

sbit key4=P3^3;

sbit key5=P3^4;



uchar code B_Rotation[8]={0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef,0x6f}; //反转表格

uchar code F_Rotation[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f}; //正转表格





uchar table1[]="dir: +  spe:005";

uchar table2[]="cir:000 ang:000";



uchar num;

uint key,flag,speed=5,zflag,znum,fflag,fnum,select,pp,qq;

//1键值2键值标志3速度4正转标志5正转圈数6反转标志7反转圈数8正转角度9反转角度10选择

float zang,fang;

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

/*                    延时函数 Xms                                   */

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

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

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

/*                   LCD1602写命令操作                            */

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

void WriteCommand(uchar com)

{

delay(5);//操作前短暂延时,保证信号稳定

E=0;

RS=0;

RW=0;

P0=com;

E=1;

delay(5);

E=0;

}

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

/*                   LCD1602写数据操作                            */

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

void WriteData(uchar dat)

{

delay(5);  //操作前短暂延时,保证信号稳定

E=0;

RS=1;

RW=0;

P0=dat;

E=1;

delay(5);

E=0;

}

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

/*                           1602初始化程序                       */

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

void InitLcd()//1602初始化程序

{

delay(15);

WriteCommand(0x38); //display mode

WriteCommand(0x38); //display mode

WriteCommand(0x38); //display mode

WriteCommand(0x06); //当读或写一个字符后地址指针加一,且光标加一

WriteCommand(0x0c); //显示开及光标不显示

WriteCommand(0x01); //清屏



WriteCommand(0x80);

for(num=0;num<15;num++)//第一行的显示

{

WriteData(table1[num]);

delay(15);

}

WriteCommand(0x80+0x40);//第二行的显示

for(num=0;num<15;num++)

{

WriteData(table2[num]);

delay(15);

}



}

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

/*              独立键盘扫描函数                                  */

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

void keyscan()  

{



P3=0xff;//拉高P3口,以读取P3口的值

if(key1==0)//键1被按下

{

delay(5);//延时消抖

if(key1==0)

{

flag=1;

}

while(!key1);

delay(5);//延时消抖

while(!key1);//松手检测

}

if(key2==0)

{

delay(5);

if(key2==0)

{

flag=2;

}

while(!key2);

delay(5);

while(!key2);

}

if(key3==0)//键1被按下

{

delay(5);//延时消抖

if(key3==0)

{

flag=3;

}

while(!key3);

delay(5);//延时消抖

while(!key3);//松手检测

}

if(key4==0)

{

delay(5);

if(key4==0)

{

flag=4;

}

while(!key4);

delay(5);

while(!key4);

}

if(key5==0)

{

delay(5);

if(key5==0)

{

flag=5;

}

while(!key5);

delay(5);

while(!key5);

}

}

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

/*                           1602显示3位数                       */

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

void write_sfm(uchar add,uint date)//1602显示

{

uchar bai,shi,ge;

bai=date/100;

shi=date%100/10;

ge=date%10;

WriteCommand(0x80+add);//设置数据地址指针

WriteData(0x30+bai);

WriteData(0x30+shi);

WriteData(0x30+ge);

WriteData(0x20);

}

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

/*                           键值处理                             */

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

void handle_flag()

{



uchar select1;

if(TR0==0&&TR1==0)

{

if(flag==1) //正转

{

WriteCommand(0x80+0x05);

WriteData('+');

delay(20);

select=0;

}

if(flag==2) //反转

{

WriteCommand(0x80+0x05);

WriteData('-');

delay(20);

select=1;

}

if(flag==3)//转速加

{

     speed++;

if(speed>=12)

speed=12;

write_sfm(0x0c,speed);//显示速度

delay(20);

     }

if(flag==4) //转速减

{

speed--;

if(speed<=1)

speed=1;

write_sfm(0x0c,speed);//显示速度

delay(20);

}

}

if(flag==5)关闭中断,停止电机

{

select1++;

select1%=2;

if( select1==0)

{

TR0=0;

TR1=0;

if(select==0)//显示转动的角度

write_sfm(0x40+0x0c,zang);

else

write_sfm(0x40+0x0c,fang);

      }

else

{if(select==0)

{

TR0=1;//开定时器0,产生正转相序

TR1=0;//关定时器1

}

else

{

TR1=1;//开定时器1,产生反转相序

TR0=0;//关定时器0

}

}

}

flag=0;

}





void main()

{



pp=0;

qq=0;

    

InitLcd();

TMOD=0x11;

    EA=1;

ET0=1;

ET1=1;



TH0=(65536-(14648/speed))/256;

TL0=(65536-(14648/speed))%256;

TH1=(65536-(14648/speed))/256;

TL1=(65536-(14648/speed))%256;



TR0=0;

TR1=0;



while(1)

{

keyscan();

handle_flag();

}



}



void time0() interrupt 1

{

uint zz;

TH0=(65536-(14648/speed))/256; // 360/(5.625/64)=4096    

                                   //假设60秒转一圈,即60秒中断4096次,

   //那么一次中断需要60000000/4096=14648个时钟

   //60000000/(4096*speed)   zflag=4096时一圈

TL0=(65536-(14648/speed))%256;

zz%=8;

P1=F_Rotation[zz];  //输出对应的相

zz++;

zflag++;

if(zflag==4096) //正转了一圈

{

zflag=0;

znum++;

write_sfm(0x40+0x04,znum);

}

if(zflag%64==0)//计算正转动的角度

{

pp++;

zang=(uint)(pp*5.625);

if(zang==360)

pp=0;

write_sfm(0x40+0x0c,zang);

}

//zang=0.088*zflag;

//write_sfm(0x40+0x0c,zang);

}

void time1() interrupt 3

{



uint ff;

TH1=(65536-(14648/speed))/256;

TL1=(65536-(14648/speed))%256;

    ff%=8;

P1=B_Rotation[ff]; //输出对应的相

ff++;

fflag++;

if(fflag==4096) //反转了一圈

{

fflag=0;

fnum++;

write_sfm(0x40+0x04,fnum);

}

if(fflag%64==0)//计算反转动的角度

{

qq++;

fang=(uint)(qq*5.625);

if(fang==360)

qq=0;

write_sfm(0x40+0x0c,fang);

}

}

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣算法刷题Day47|休息日总结:动态规划之背包问题

背包问题 〉题型分类 解题套路 〉动规五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 解题技巧 〉递推公式 问背包装满后的最大价值&#xff1a;dp[j] max(dp[j], dp[j - weight[i]] value[i]) …

JMeter之简单控制线程组(Thread Group)组件的执行顺序

jmeter的线程类型一共有3种分别是setUp线程组、tearDown线程组和线程组 他们的执行优先级为 setUp线程组 > 线程组(Thread Group) > tearDown线程组 当存在多个线程组(Thread Group)&#xff0c;jmeter默认是同时执行的&#xff0c;也就是说是无序的&#xff0c;此时如果…

蓝桥杯单片机赛点数据包模块文件使用的注意事项

目录 蓝桥杯单片机赛点数据包模块文件使用的注意事项 前言&#xff1a; 正文&#xff1a; DS1302 IIC onewire 2023年赛点资源包数据包下载地址&#xff1a;https://download.csdn.net/download/qq_25218501/87965408?spm1001.2014.3001.5503 蓝桥杯单片机赛点数据包模块…

redis---基础(部署及常用命令)

目录 前言一、关系型数据库与非关系型数据库1. 关系型数据库2. 非关系型数据库3. 关系型数据库和非关系型数据库区别4. 非关系型数据库产生背景小结&#xff1a; 二、Redis简介1. 单进程快速的原因&#xff1a;2.epoll 机制优势&#xff1a; 三、Redis 具有以下几个优点四、red…

全国农信银CTF流量分析(凯撒会分析流量吗)

总的来说这题还是挺简单的。先分析流量过滤http 发现有f?ag提示&#xff0c;然后分析url 解析得到 &#xff1a;[Request URI: http://192.168.0.111/?codeif [ $(head f?ag | cut -c 1) G ] then sleep 1 echo success 发现是时间盲注 然后过滤 http.time > 1 对过滤…

《移动互联网技术》第三章 无线定位技术:掌握位置服务和室内定位的基本概念和工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

无线路由器解决方案 MR500E工业级4G路由器可实时监控4G信号强度

近年来&#xff0c;随着物联网技术的快速发展&#xff0c;越来越多的制造企业开始加速推进工业互联网的建设和应用。作为工业互联网的重要基础设施之一&#xff0c;工业级4G路由器也不断迭代升级&#xff0c;以满足企业多样化的应用需求。 无线路由器解决方案MR500E工业4G路由…

矩阵通引入AIGC,帮助企业挖掘用户线索

据CNNIC报告数据&#xff0c;截止2022年6月&#xff0c;我国网民规模达10.51亿&#xff0c;其中短视频用户规模为9.62亿&#xff0c;网络直播用户规模达7.16亿&#xff0c;占网民整体的68.1%。 庞大的用户体量为直播带货奠定了基础&#xff0c;给品牌商家提供了新流量阵地&…

winDbg 分析dump

一、linux 部属.netcore生成dump #当然默认是不支持的&#xff0c;需要用 ulimit 开启&#xff0c;这个命令可以用来配置当前系统资源的使用额度 ulimit -a #core file size 就是用来指定生成 dump 文件的大小&#xff0c;默认为 0&#xff0c;即表示不生成&#xff0c;我们临…

使用gitlab 自带 CI/CD 构建部署项目

首先是处理网络问题 这里我用的是桥接模式 桥接模式方便局域网内的小伙伴一起使用 如果没有这个打算可跳过这步 # 使用ip addr 查看网络 ip addr编辑网络 vi /etc/sysconfig/network-scripts/ifcfg-你的网络名称 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改如下内容 B…

数据结构与算法:栈和队列

1 栈 栈是一种后入先出&#xff08;LIFO&#xff09;的线性逻辑存储结构。只允许在栈顶进行进出操作。 1.1 栈基本操作 基本操作包括&#xff1a;入栈&#xff08;push&#xff09;/出栈&#xff08;pop&#xff09;/获取栈顶元素&#xff08;peek&#xff09;。 栈的实现主…

CNN卷积类型总结(标准卷积、空洞卷积、反卷积、深度可分离卷积、分组卷积等)

目录 标准卷积 卷积的运算 conv2d conv1d 其他卷积类型 空洞卷积&#xff08;膨胀卷积&#xff09; 反卷积&#xff08;转置卷积&#xff09; 深度可分离卷积 分组卷积 参考文章 上学时&#xff0c;卷积常在各个课程中出现&#xff0c;现代、信号与系统这些&#xff…

第45步 深度学习图像识别:Nasnet建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Nasnet NASNet是由Google Brain团队在2017年提出的一种神经网络架构搜索&#xff08;Neural Architecture Search&#xff0c;简称NAS&#xff09;的结果。NAS是一种用于自动化设计深度学习模型的技术。在NA…

oracle字符集

1、查看oracle字符集 如果操作系统或者客户端的字符集设置和数据库设置不一样就会出现乱码 查询NLS_LANG即操作系统环境变量要设为 NLS_LANGUAGE_NLS_TERRITORY**.NLS_CHARACTERSET**&#xff0c;如&#xff1a; export NLS_LANG“AMERICAN_AMERICA.AL32UTF8”

Spring MVC处理响应附案例详解

目录 一、配置视图解析器 二、控制器方法的返回值 2.1 返回值为void 2.1.1 控制器方法 2.1.2 jsp页面 2.1.3 测试结果 2.2 返回值为String 2.2.1 控制器方法 2.2.2 测试结果 2.3 返回值为ModelAndView 2.3.1 控制器方法 2.3.2 JSP页面 2.3.3 测试结果 三、某些会…

基于蒙特卡罗法评估智能电网可靠性研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

python爬虫_django+vue+echarts可视化查询所有CSDN用户质量分

文章目录 ⭐前言⭐ 效果⭐django简介⭐vue3简介⭐vue引入echarts ⭐前后分离实现&#x1f496; django代码层&#x1f496; vue3代码层结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前后分离djangovueecharts可视化查询CSDN用户质量分。 该系列文章&#…

一种基于linux内核双向链表的移植

1.简介 双向链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;由一系列的节点组成&#xff0c;每个节点都包含两个指针&#xff0c;分别指向前一个节点和后一个节点。与单向链表不同&#xff0c;双向链表可以在 O(1) 的时间复杂度内向前或向后遍…

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

工具效果&#xff1a; 第一步&#xff0c;把psd图层转换为可编辑的节点树&#xff0c;并自动解析UI类型、自动绑定UI子元素&#xff1a; 第二步, 点击“生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单手动点选UI类型)&#xff1a; 验证一键生成UI效果: 书接上…

idea双击打不开怎么办?

今天在敲代码的时候&#xff0c;突然出现了一个bug&#xff0c;idea打不开了&#xff0c;这个问题怎么解决&#xff1f; 只要找到C:\Users\Administrator .IntelliJIdea2019.3这个文件把所有文件都给删了就可以重启了 哈哈&#xff0c;重启成功