基于51单片机的步进电机调速系统设计

基于单片机的步进电机控制

摘 要

步进电机是一种将电脉冲信号转换成角位移的执行机构,其转子角位移与输入脉冲的频率成正比,通过改变脉冲频率可以实现大范围的调速;同时,步进电机易于与计算机和其他数字元件接口,因此被应用于各种数字控制系统中。

本设计所选的步进电机是四相步进电机,采用的方法是利用单片机控制步进电机的驱动。步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为"步距角"),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。本次毕业设计就是通过改变脉冲频率来调节步进电机的速度的,并且通过数码管显示其转速的级别。另外通过单片机实现它的正反转,步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。

本文设计的系统,操作简便,控制灵活,显示清晰,制作成本低,性价比较高。

关键词: STC单片机;STC89C52;步进电机控制;数码管;ULN2003

ABSTRACT

Stepper motor is an actuator that converts electrical pulse signal into angular displacement. The angular displacement of rotor is proportional to the frequency of input pulse. By changing the pulse frequency, it can realize wide range speed regulation. At the same time, stepping motor is easy to interface with computer and other digital components, so it is applied in various digital control systems.

The stepper motor selected in this design is a four phase stepping motor, and the method adopted is to control the driving of the stepping motor by using single chip microcomputer. Stepper motor is an actuator which converts electric pulse into angular displacement. When the stepper driver receives a pulse signal, it drives the stepper motor to rotate at a fixed angle (called "step angle") according to the set direction, and its rotation runs step by step at a fixed angle. The angular displacement can be controlled by controlling the number of pulses, so as to achieve the purpose of accurate positioning; at the same time, the speed and acceleration of motor rotation can be controlled by controlling the pulse frequency, so as to achieve the purpose of speed regulation. This graduation project is to adjust the speed of the stepping motor by changing the pulse frequency, and display the speed level through the digital tube. In addition, the positive and negative rotation of the stepping motor can be used as a special motor for control. It is widely used in various open-loop control because it has no accumulated error (accuracy is 100%).

The system designed in this paper has the advantages of simple operation, flexible control, clear display, low production cost and high cost performance.

Keywords: STC MCU; STC89C52; stepping motor control; nixie tube; ULN2003

目 录

[摘 要... I](#摘 要... I)

[ABSTRACT.. II](#ABSTRACT.. II)

[1 绪论... 1](#1 绪论... 1)

[1.1 设计背景与意义... 1](#1.1 设计背景与意义... 1)

[1.2 设计目的... 1](#1.2 设计目的... 1)

[1.3 设计要求及内容... 2](#1.3 设计要求及内容... 2)

[1.4 本文结构安排... 2](#1.4 本文结构安排... 2)

[2 总体设计方案... 3](#2 总体设计方案... 3)

[2.1 系统需求及方案设计... 3](#2.1 系统需求及方案设计... 3)

[2.2 硬件器件介绍... 3](#2.2 硬件器件介绍... 3)

[2.2.1 STC89C52单片机... 3](#2.2.1 STC89C52单片机... 3)

[2.2.2数码管... 4](#2.2.2数码管... 4)

[2.2.3 ULN2003. 5](#2.2.3 ULN2003. 5)

[2.2.4 步进电机... 5](#2.2.4 步进电机... 5)

[2.3 所用软件介绍... 6](#2.3 所用软件介绍... 6)

[2.3.1 Altium Designer电路设计软件... 6](#2.3.1 Altium Designer电路设计软件... 6)

[2.3.2 Keil软件及C语言设计... 6](#2.3.2 Keil软件及C语言设计... 6)

[2.3.3 proteus仿真设计软件... 6](#2.3.3 proteus仿真设计软件... 6)

[2.4 本章小结... 6](#2.4 本章小结... 6)

[3 硬件设计... 7](#3 硬件设计... 7)

[3.1 硬件电路组成... 7](#3.1 硬件电路组成... 7)

[3.2 单片机最小系统电路... 7](#3.2 单片机最小系统电路... 7)

[3.3数码管显示电路... 8](#3.3数码管显示电路... 8)

[3.4 按键电路... 9](#3.4 按键电路... 9)

[3.5 电机及驱动电路... 9](#3.5 电机及驱动电路... 9)

[3.6 本章小结... 10](#3.6 本章小结... 10)

[4 软件设计... 11](#4 软件设计... 11)

[4.1 软件设计需求及设计思路... 11](#4.1 软件设计需求及设计思路... 11)

[4.2 主程序截图... 11](#4.2 主程序截图... 11)

[4.3 本章小结... 12](#4.3 本章小结... 12)

[5 仿真演示... 13](#5 仿真演示... 13)

[5.1 仿真实现... 13](#5.1 仿真实现... 13)

[5.1.1 仿真电路图... 13](#5.1.1 仿真电路图... 13)

[5.1.2 仿真结果... 14](#5.1.2 仿真结果... 14)

[5.2 测试情况分析... 14](#5.2 测试情况分析... 14)

[5.3 本章小结... 14](#5.3 本章小结... 14)

[结论... 16](#结论... 16)

[参考文献... 17](#参考文献... 17)

[附录一 硬件原理图... 18](#附录一 硬件原理图... 18)

[附录二 仿真原理图... 19](#附录二 仿真原理图... 19)

[附录三 程序... 20](#附录三 程序... 20)

1 绪论

1.1 设计背景与意义

步进电动机是数字控制系统中一种十分重要的自动化执行元件,在工业自动化装备,办公自动化设备中有着广泛的运用,近年来,控制技术、计算机技术以及微电子技术的迅速发展,有力地推动了步进电动机控制技术的进步,提高了步进电动机运动控制装置的应用水平。过去电动机的控制多用模拟法,随着计算机应用技术的迅速发展,电动机的控制也发生了深刻的变化,步进电机常常和计算机一起组成高精度的数字控制系统。模拟控制已经逐渐被使用单片机为主的混合控制和全数字控制所取代。

步进电机是一种将电脉冲信号转换成角位移的执行机构,其转子角位移与输入脉冲的频率成正比,通过改变脉冲频率可以实现大范围的调速;同时,步进电机易于与计算机和其他数字元件接口,因此被应用于各种数字控制系统中[2],本设计的步进电动机控制系统由单片机(控制电路),脉冲分配电路、功率放大电路(驱动电路)、步进电动机及电源系统组成组成。

步进电动机是用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机,它最突出的优点是可以在宽广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,并且用其组成的开环系统既简单、廉价,又非常可行,因此在打印机等办公自动化设备以及各种控制装置等众多领域有着极其广泛的应用。随着微电子和计算机技术的发展,步进电动机的需求量与日俱增,研制步进电机驱动器及其控制系统具有十分重要的意义。

1.2 设计目的

(1)巩固和加深对单片机原理和接口技术知识的理解;

(2)培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;

(3)学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;

(4)掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;

(5) 能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图、仿真图和流程图。

1.3 设计要求及内容

(1)实现按键控制步进电机正转、反转、加速、减速、停止;

(2)2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位);

(3)4个红色LED,指示电机的转速。

1.4 本文结构安排

本文围绕着基于51单片机的步进电机控制展开设计,首先明确了研究背景与意义,介绍了设计目的,并论述了设计要求及设计内容,接下来的几章将具体展开相关设计与研究:

第二章介绍系统总体方案及相关理论知识,重点阐述了系统功能需求和系统方案论证,接着简要介绍了系统硬件及软件基本知识。

第三章重点展开硬件系统设计,首先明确硬件电路设计的思路及框架。接着依次介绍了:单片机最小系统、按键电路、数码管显示电路、步进电机控制电路、正转反转指示电路、电源电路等。通过对以上重点电路的介绍,强化了硬件电路设计的细节和重点。

第四章展开软件系统设计,通过对软件设计进行需求分析,明确软件设计的目的与需求,进一步通过程序流程图展示设计思路及框架。接着依次介绍了主函数流程、步进电机控制流程图、按键控制程序流程图。

第五章介绍仿真实现步骤,特别是仿真电路实现的流程和仿真测试,完美实现了设计需求及目标。

第六章总结全文,总结本文所做的工作及贡献,并根据存在的问题展望此课题今后的研究方向。

2 总体设计方案

2.1 系统需求及方案设计

为了实现基于51单片机的步进电机控制的设计,本文将实现以下设计需求:

(1)实现按键控制步进电机正转、反转、加速、减速、停止;

(2)2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位);

(3)4个红色LED,指示电机的转速;

(4)操作简单、功能完善、精确度高。

基于以上列出的几点,具体的设计框图如图2.1所示。

图2.1 总体设计框图

2.2 硬件器件介绍

2.2.1 STC89C52单片机

如图2.2所示的STC89C52单片机是在单片机设计中最常用的单片机芯片之一,其功能完善,易于设计。STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统的51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。主要具备以下外设功能:

8k字节Flash;

512字节RAM;

32 位I/O口;

4KB EEPROM;

MAX810复位电路;

3个16 位定时器/计数器;

4个外部中断;

全双工串行接口。

图2.2 STC89C52单片机引脚图

2.2.2数码管

如图2.2所示是1位7段共阳数码管的引脚图,a、b、c、d、e、f、g为段引脚,用于具体控制每个数码管的显示。如数码管要显示数字"4",则需要点亮"f、g、c"三个段引脚。

图2.3 L数码管引脚图

2.2.3 ULN2003

ULN2003A是一个7路反向器电路,即当输入端为高电平时ULN2003A输出端为低电平,当输入端为低电平时ULN2003A输出端为高电平。由于ULN2003A是集电极开路输出,为了让这个二极管起到续流作用,必须将COM引脚(pin9)接在负载的供电电源上,只有这样才能够形成续流回路。也可以作为一些器件,如步进电机的驱动电路。

2.2.4 步进电机

步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。

2.3 所用软件介绍

2.3.1 Altium Designer电路设计软件

在本科单片机设计中,设计电路使用的软件一般是Altium Designer或proteus,由于Altium Designer功能强大,可以设计硬件电路的原理图、PCB图,且界面简单,易操作,上手快。Altium Designer19是一款专业的整的端到端电子印刷电路板设计环境,用于电子印刷电路板设计。它结合了原理图设计、PCB设计、多种管理及仿真技术,能够很好的满足本次毕设的需求。

2.3.2 Keil软件及C语言设计

作为本科期间学习的第一门编程语言,C语言是我们最熟悉的编程语言之一。当然,由于其功能强大,C语言是当前世界上使用最广泛、最受欢迎的编程语言。在单片机设计中,C语言已经逐步完全取代汇编语言,因为相比于汇编语言,C语言编译与运行、调试十分方便,且可移植性高,可读性好,便于烧录与写入硬件系统,因此C语言被广泛应用在单片机设计中。keil软件由于其兼容单片机的设计,能够实现快速调试,并生成烧录文件,被广泛应用于C语言的编写和单片机的设计。

2.3.3 proteus仿真设计软件

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

2.4 本章小结

本章首先明确了本文整体的系统需求,并根据需求设计了系统总体框图,并以此为设计思路。接着,简要介绍了本文将用到的硬件器件,特别是每一个器件的原理图和引脚图,为下一章进行进一步的硬件电路设计奠定基础。最后,对本设计需要使用到的软件系统和编程语言进行了大概的介绍,以便进行接下来的软硬件设计。

3 硬件设计

3.1 硬件电路组成

硬件电路由以下模块构成:

(1)单片机最小系统。用于驱动和控制其他模块,以实现整体功能,其以STC89C52单片机为核心芯片,并辅以复位电路和晶振电路。

(2)按键模块。实现按键控制步进电机正转、反转、加速、减速、停止。

(3)显示模块。1位7段LED数码管显示当前转速档位(共9个档位)。

(4)步进电机模块。

(5)转数指示模块及正反转指示模块。

3.2 单片机最小系统电路

单片机最小系统是单片机扩展开发应用中最基础和最主要的部分,一般由以下的电路构成,是整个设计的核心其保证了基于单片机的其他功能的扩展与实现。如图3.2所示。

复位电路: 复位电路是单片机应用中的最基本和最重要的电路,用于处理单片机工作失灵等紧急问题。当单片机复位端口为高电平时,单片机中的代码将不会被执行。一开始上电时,电容还未充满电,复位端口为高电平,避免了直接上电就运行程序导致的程序错误等问题。当电容充满电后,复位端口变为低电平,程序开始运行。

晶振电路:晶振电路也是的单片机设计中必备的电路,为系统提供工作时序。本毕设晶振电路提供11.0592MHZ时钟频率,以此构成整个稳定的振荡电路,为

单片机的正常工作提供保障。

图3.2 单片机最小系统

3.3数码管显示电路

数码管显示电路由1位7段LED数码管显示当前转速档位(共9个档位),具体如图3.3所示。

图3.3显示电路

3.4 按键电路

按键电路需要实现按键控制步进电机正转、反转、加速、减速、停止,总共有5个按键,具体如图3.4所示。

图3.4 按键电路

3.5 电机及驱动电路

电机及驱动电路由ULN2003驱动芯片、DC-5V步进电机、转数指示灯等构成,具体如图3.5所示。

图3.5 蜂鸣器电路

3.6 本章小结

本章以硬件电路设计为核心,首先介绍了硬件电路的设计框图及组成模块。接着依次介绍了单片机最小系统、显示电路、按键电路、电机及驱动电路等各个硬件的模块,以实现整体硬件电路的设计。

4 软件设计

4.1 软件设计需求及设计思路

根据本文设计需求,在第三章硬件电路设计的基础上,需要通过软件编程实现的具体功能:

(1)驱动各个模块工作,实现数码管的清晰显示,实现电机驱动;

(2)实现按键控制步进电机正转、反转、加速、减速、停止;

(3)2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位);

(4)4个红色LED,指示电机的转速;

4.2 主程序截图

主程序截图如图4.2所示。

图4.2 主程序截图

4.3 本章小结

本章以软件设计为核心,首先重点论述了软件设计框架及设计思路,介绍了主程序的设计截图,最终实现软件的整体设计。

5 仿真演示

5.1 仿真实现

5.1.1 仿真电路图

本系统用protues8.7设计的仿真原理图如图5.1所示。

图5.1 仿真原理图

根据第四章软件设计的思路,结合仿真需求,我们将仿真设计的C代码利用KEIL5编写好,并进行详细地注释。接着,我们点击"create HEX file",并再次编译程序,这样就会生成HEX烧录文件,具体如图5.2所示。

图5.2 调试及HEX文件生成截图

接着,我们打开仿真原理图,并将生产的"HEX"文件烧录到单片机芯片中,点击开始仿真,就可以实现相关仿真了,我们将在下一节中具体展示仿真的结果。

5.1.2 仿真结果

仿真主要实现:转数显示、正转与反转指示、转数指示,具体如图5.3所示。

图5.3 仿真截图

5.2 测试情况分析

经过以上一系列的仿真测试,本文设计的"基于51单片机的步进电机控制系统"能够完成了2.1节的系统需求,具体仿真实现了以下功能:

(1)实现按键控制步进电机正转、反转、加速、减速、停止;

(2)2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位);

(3)4个红色LED,指示电机的转速;

5.3 本章小结

本章结合第三章的电路设计和第四章的软件设计,利用protues软件设计了本文的仿真电路图,并通过代码编写与调试,将生成的"HEX"文件写入到仿真芯片中,实现了电路的仿真。接着,我们对仿真进行了测试,证明了本系统运行稳定,能够实现所有的既定功能。最后,我们对仿真测试进行了总结,具体列出了仿真实现的功能。

结论

本文围绕着基于51单片机的步进电机控制系统设计,通过广泛查阅文献和仿真设计,完成了以下工作:

(1)绘制了电路原理图和仿真原理图,编写了本系统实现的程序代码。

(2)实现按键控制步进电机正转、反转、加速、减速、停止;

(3)2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位);

(4)4个红色LED,指示电机的转速;综上所述,本文的设计达到了预期设计目标,具有一定的的实用价值。

本文虽然较好的实现了系统的设计,但由于本人水平有限,还存在着不少有待改进的地方,在未来的工作中,可以从以下几点展开相关设计:

(1)由于时间限制,本文的设计只做了相关仿真,在下一步工作中,将结合原理图设计出PCB图,并做出硬件;

(2)在接下来的设计中,还可以增加语音提示等功能,使得系统更加智能化、人性化。

(3)可以增加更多的档位,提升档位显示的精度。

参考文献

  1. 楼然苗, 李光飞. MCS-51系列单片机设计实例[J]. 单片机与嵌入式系统应用(02):84
  2. 刘文涛. 单片机应用开发实例[M]. 北京:清华大学出版社,2005,18-25
  3. 徐向民. Altium Designer快速入门[M]. 北京:北京航空航天大学出版社,2011,20-29
  4. 王艳艳, 张荣国, 罗晓锋. Proteus与Keil软件在"C语言"教学过程中的应用[J]. 科技视界, 000(23):191-192,311
  5. 曾燕, 贾振国. Proteus仿真技术在单片机教学中的应用[J]. 长春工程学院学报(社会科学版)(1):135-138
  6. 周航慈. 单片机应用程序设计技术[M]. 北京:北京航空航天大学出版社,2002,21-25

附录一 硬件原理图

附录二 仿真原理图

//完整资料

//微信公众号:木子单片机

附录三 程序

#include "reg52.h"

/*

按键控制步进电机:正转、反转、加1档、减1档、停止

数码管显示步进电机档位,总共有9档

LED灯显示正转、反转、转速

*/

/*宏定义*/

#define SpeedShow P0 //数码管显示接口

#define MotorDriver P2 //步进电机驱动接口

typedef unsigned char uchar; // 8位有符号整数

typedef unsigned int uint; //16位有符号整数

typedef unsigned long ulong; //32位有符号整数

#define KEY_TIME_SHORT 20 //短按的按键去抖动延时的时间

//---加入全局变量--//

extern uchar KeyCode;

extern uint KeyTimeCnt[5]; //按键去抖动延时计数器,分别对应KEY1/2/3/4/5

extern uchar KeyLock[5]; //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5

//-----------------------------------------------------------------

// 相关函数声明

//-----------------------------------------------------------------

void KeyScan(); //按键扫描函数 放在定时中断里

void Delay10ms(); //延时函数

//0~9 的共阳数码管段码,最后一个是黑屏

const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};

//输出励磁序列的频率参数{TH1,TL1}

const uchar Timer[9][2]={{0xDE,0xE4},{0xE1,0xEC},{0xE5,0xD4},{0xE9,0xBC}, //8.476 ~ 1ms

{0xEd,0xA4},{0xF1,0x8C},{0xF5,0x74},{0xF9,0x5C},{0xFC,0x18}};

//步进电机正转的励磁序列

const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX

//步进电机反转的励磁序列

const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX

//枚举变量--正反转标志

typedef enum

{FwdRun, RevRun} RunFlag;

RunFlag flag1 = FwdRun;

uchar speed = 0;

uchar KeyCode = 0; //按键编码值

//共5个独立机械按键,通过短按实现5种按键编码值

uint KeyTimeCnt[5] = {0,0,0,0,0}; //按键去抖动延时计数器,分别对应KEY1/2/3/4/5

uchar KeyLock[5] = {0,0,0,0,0}; //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5

/* IO引脚分配*/

sbit KEY1 = P1^2; //按键1

sbit KEY2 = P1^3; //按键2

sbit KEY3 = P1^4; //按键3

sbit KEY4 = P3^5; //按键4

sbit KEY5 = P3^6; //按键5

sbit FWD_LED = P1^0; //正转指示灯

sbit REV_LED = P1^1; //反转指示灯

//函数声明

void T0_Init(); //定时器0初始化函数声明

void T1_Init(); //定时器1初始化函数声明

void KeyService(); //按键服务函数声明

void delay_ms(uint t); //毫秒延时函数声明

//-----------------------------------------------------------------

// 主程序

//-----------------------------------------------------------------

void main()

{

T0_Init(); //定时器0初始化

T1_Init(); //定时器1初始化

FWD_LED = 0; //正转指示灯亮,默认初始化是正转

delay_ms(500); //延时500ms,待各个模块上电稳定

EA = 1; //开启中断

while(1)

{

KeyService(); //按键服务程序

}

}

//-----------------------------------------------------------------

// Timer0 初始化,模式1,允许中断,1ms定时

// Timer0 用于按键扫描

//-----------------------------------------------------------------

void T0_Init()

{

TMOD &= 0xF0;

TMOD |= 0x01; //T0工作于模式1,16位定时器

TH0 = (65536 - 1000) >> 8; //1ms定时

TL0 = (65536 - 1000) & 0xFF;

ET0 = 1; //允许T0中断

TR0 = 1; //启动T0

}

//-----------------------------------------------------------------

// Timer1 初始化,模式1,允许中断

// Timer1 用于改变步进电机转速

//-----------------------------------------------------------------

void T1_Init()

{

TMOD &= 0x0F;

TMOD |= 0x10; //定时器1工作于模式1,16位定时器

TH1 = Timer[speed][0];

TL1 = Timer[speed][1]; //定时器1,定时用于步进电机转速控制

ET1 = 1; //允许T1中断

PT1 = 1; //定时器1优先级高

TR1 = 0; //关闭定时器1

}

//-----------------------------------------------------------------

// Timer0 中断服务程序

//-----------------------------------------------------------------

void InterruptTime0() interrupt 1

{

TH0 = (65536 - 1000) >> 8; //1ms

TL0 = (65536 - 1000) & 0xFF;

KeyScan(); //按键扫描

}

//-----------------------------------------------------------------

// Timer1 中断服务程序

//-----------------------------------------------------------------

void InterruptTime1() interrupt 3

{

static step1 = 0;

static step2 = 0;

TH1 = Timer[speed - 1][0]; //根据不同的转速档位,给定时器1赋定时器值

TL1 = Timer[speed - 1][1];

//按照定时器1的频率循环发送正转励磁序列的脉冲给步进电机,使其不停地转动

if(flag1 == FwdRun)//正转

{

MotorDriver = FFW[step1++];

if(step1 == 8) step1 = 0;

}

//按照定时器1的频率循环发送反转励磁序列的脉冲给步进电机,使其不停地转动

else if(flag1 == RevRun)

{

MotorDriver = REV[step2++];

if(step2 == 8) step2 = 0;

}

}

//-----------------------------------------------------------------

// 按键服务程序

//-----------------------------------------------------------------

void KeyService()

{

switch (KeyCode)

{

case 1: flag1 = FwdRun; //正转

FWD_LED = 0; REV_LED = 1; //正转指示灯亮

KeyCode = 0;

break;

case 2: flag1 = RevRun; //反转

FWD_LED = 1; REV_LED = 0; //反转指示灯亮

KeyCode = 0;

break;

case 3: speed++; //速度加

if(speed == 10) speed = 1;

SpeedShow = SEG_CODE[speed];

if(TR1 == 0) TR1 = 1;

KeyCode = 0;

break;

case 4: speed--; //速度减

if(speed == 0 || speed == -1 ) speed = 9;

SpeedShow = SEG_CODE[speed];

if(TR1 == 0) TR1 = 1;

KeyCode = 0;

break;

case 5: TR1 = 0; //停止

SpeedShow = 0xFF;

MotorDriver = 0x00;

KeyCode = 0;

break;

default: ;

}

}

//-----------------------------------------------------------------

//函数名称: void KeyScan()

//函数功能: 按键扫描程序,放在定时中断里,可较快实现按键响应

//调用子函数: 无

//输入参数: 无

//返回值: 无,说明:返回的按键编码值保存在KeyCode变量里

//-----------------------------------------------------------------

void KeyScan()

{

//------KEY1实现-------------------------------------------------

if(KEY1 == 1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位

{ KeyLock[0] = 0; //按键自锁变量标志清零

KeyTimeCnt[0] = 0; //按键去抖动延时计数器清零

}

else if(KeyLock[0] == 0)

{

KeyTimeCnt[0]++;

if(KeyTimeCnt[0] > KEY_TIME_SHORT)

{

KeyTimeCnt[0] = 0;

KeyLock[0] = 1; //自锁按键置位,避免一直触发

KeyCode = 1;

}

}

//------KEY2实现-----------------------------------

if(KEY2 == 1)

{ KeyLock[1] = 0;

KeyTimeCnt[1] = 0;

}

else if(KeyLock[1] == 0)

{

KeyTimeCnt[1]++;

if(KeyTimeCnt[1] > KEY_TIME_SHORT) //消抖

{

KeyTimeCnt[1] = 0; //按键去抖动延时计数器清零

KeyLock[1] = 1; //自锁按键置位,避免一直触发

KeyCode = 2;

}

}

//------KEY3实现-----------------------------------

if(KEY3 == 1)

{ KeyLock[2] = 0;

KeyTimeCnt[2] = 0;

}

else if(KeyLock[2] == 0)

{

KeyTimeCnt[2]++;

if(KeyTimeCnt[2] > KEY_TIME_SHORT)

{

KeyTimeCnt[2] = 0;

KeyLock[2] = 1;

KeyCode = 3;

}

}

//------KEY4实现-----------------------------------

if(KEY4 == 1)

{ KeyLock[3] = 0;

KeyTimeCnt[3] = 0;

}

else if(KeyLock[3] == 0)

{

KeyTimeCnt[3]++;

if(KeyTimeCnt[3] > KEY_TIME_SHORT)

{

KeyTimeCnt[3] = 0;

KeyLock[3] = 1;

KeyCode = 4;

}

}

相关推荐
三易串口屏4 小时前
实验10 物理按键实验
单片机·51单片机·串口屏·串口协议·uart 通信·嵌入式 ui
深圳光特通信豆子4 小时前
10Mb/s TTL单模双纤光收发模块技术规格手册
单片机·嵌入式硬件
潜创微科技4 小时前
IT6635+USB 芯片:4 进 1 出 4K@60Hz 高性能 KVM 切换器一站式方案
嵌入式硬件·音视频
一路往蓝-Anbo4 小时前
第六章:RTOS 任务 —— 任务逻辑与并发的 TDD 路径
网络·stm32·单片机·嵌入式硬件·tdd
星夜夏空994 小时前
STM32单片机学习(20) —— 利用中断实现串口通信(填前面的坑)
stm32·单片机·学习
wengqidaifeng4 小时前
2026年电赛校赛备战MSPM0G3507+keil讲解(上)-----2025年电赛E题小车篇
单片机·嵌入式硬件·电赛
三易串口屏4 小时前
实验1 实时显示单片机的参数(整数、小数、中文 系统指令方式)
c语言·单片机·嵌入式硬件·mongodb·串口屏·三易串口屏
学不懂飞行器6 小时前
【2024电赛H题硬核解析】自动行驶小车满分对策:多路灰度循迹与陀螺仪“交替盲走”融合算法(附源码)
stm32·单片机·嵌入式硬件·算法·电赛
╰ㄣ浮华若梦︶ _6 小时前
51单片机驱动DHT11
51单片机·dht11·stc89c52