步进电机课程设计

单片机综合设计实验

题目:

步进电动机综合控制

计算机科学与信息工程学院

专业年级 实验组员 指导教师 日 期

2013 级自动化三班

职称 2013--12-30

目录

摘要.............................................................................. 一 概述..................................................................

1.1 实验目的................................................................... 1.2 实验内容与要求..................................................... 1.3 步进电机的介绍................................................ 1.4 研究的思路.........................................................

二 硬件设计..............................................

2.1 51 单片机介绍................................................... 2.2 LCD1602 液晶显示介绍 2.3 uln2003 步进电机驱动介绍

三 相关图像...................................................

3.1 总电路图................................................. 3.2 程序流程图.................................................. 3.2.1 控制框图 3.2.2 流程图

四 调试结果及分析.......................................... 五 设计总结及心得体会................................................ 附录【1】系统程序............................................... 附录【2】参考文献........................................................

【摘要】

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件 本实验利用 8051 单片机达到控制步进电机的启动、停止、正转、反转、点动、 转过指定角度、状态显示和数据指示的目的,使步进电机控制更加灵活。整个系 统有 80C51 单片机控制系统,由 uln2003 驱动电路驱动,键盘控制电路,LCD 液 晶显示电路。用 51 单片机控制两相四线步进电动机,在非超载情况下,电机的 转速,停止的位置只取决于脉冲信号的频率和个数,而不受负载的影响,给电机 一个脉冲信号,电机则转过一个步距角,通过控制脉冲个数可以控制角位移量, 从而达到控制位的作用, 同时通过控制脉冲的相序来改变步进电机的转向,从而 达到控制正反相的作用。本次采用 51 单片机为核心器件来控制步进电机,系统 的实用性较强。

关键字: 51 单片机;步进电动机;脉冲;LCD1602

1.1 实验目的:

1,单片机对步进电动机控制可以熟悉步进电机的控制与原理运用。 2,单片机对步进电动机控制可以熟悉步进电机结构及各种工作方式。 3,通过本次实验可以运用所学单片机理论知识,专业技能来对实际问题进行 分析,思考,解决,提高对专业知识的掌握和锻炼逻辑思维能力。

1.2 设计内容与要求:

1、任务介绍:实现步进电机按规定的速度正转、反转,转过指定的角度,要有 点动功能。 所有命令通过键盘输入, 步进电机在运行过程中要有状态和数据指示。 2、每套设计文档应包括: 系统原理说明、程序框图、电路原理图和程序清单。

1.3 步进电机的介绍

1.3.1 相关的技术指标: a、相数:指电机内部的线圈组数,目前常用的有二相、三相、四相、五相 步进电机,本实验用的是二相步进电机。电机相数不同,其步距角也不同。 b、步距角:表示控制系统每发一个步进脉冲信号,电机所转动的角度。本 实验程序运行前要先测量步进电机的步距角。 (本开发板上已测步进电机步距角 为 18 度) c、拍数:完成一个磁场周期性变化所需脉冲数或导电状态,或指电机转过 一个齿距角所需脉冲数。也就是说本步进电机每转一周需要 20 个脉冲。本实验 用 2 相 4 拍运行方式双四拍工作方式: * *; 正转:A/B AB AB/ A/B/ * * 反转:A/B/ AB/ AB A/B

该实验板上步进电机内部结构图如图一

1.3.2 工作原理: 步进电机是一种将电脉冲转化为角位移的执行机构。 当步进驱动器接收到一 个脉冲 信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”), 它的旋转是以固定的角度一步一步运行的, 可以通过控制脉冲个数来控制角位移 量, 从而达到准确定位的目的; 同时可以通过控制脉冲频率来控制电机转动的速 度和加速度,从而达到调速的目的。在非超载的情况下,电机的转速、停止的位 置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个 脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周 期性的误差而无累积误差等特点,使得在速度、位置等控制领域用步进电机来控 制变的非常的简单。 1.3.3 步进电机的驱动:

步进电机的驱动可以选用专用的电机驱动模块,比如 L298、FT5754 等,这类驱 动模块接口简单,操作方便,它们既可以驱动步进电机,同时也可以驱动直流电 机。但本实验使用 ULN2003 驱动电路驱动步进电机运转。 1.4 研究的思路 1 了解单片机本身内部应有的资源,如:中断,定时器,计数器,I\O 的使用。 2 了解步进电机的工作原理和作用。 3 根据步进电机的原理,分析并分配单片机内部资源,并根据单片机的资源, 来实现 硬件电路的设计以及软件程序的编写。 4 遇到自己所学知识不懂或不熟悉的东西,查阅资料探究明白。 5 在设计好单片机控制步进电动机时,要学会分析电路中出现的问题,并且好 好总结。

二 硬件设计 2.1 51 单片机介绍

AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能 CMOS8 位微 处理器,俗称单片机。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与 工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存 储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,为很多嵌入式 控制系统提供了一种灵活性高且价廉的方案 其引脚图如下所 示 。 1.主要特性: ·与 MCS-51 兼容 ·4K 字节可编程闪烁存储器 寿命:1000 写/擦循环 数据保留时间:10 年 ·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8 位内部 RAM ·32 可编程 I/O 线 ·两个 16 位定时器/计数器 ·5 个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路

2.2.管脚说明:

VCC:供电电压。 GND:接地。 P0 口: P0 口为一个 8 位漏级开路双向 I/O 口, 每脚可吸收 8TTL 门电流。 当 P1 口的管脚第一次写 1 时,被定义为高阻输入。P0 能够用于外部程序数据存 储器,它可以被定义为数据/地址的第八位。在 FIASH 编程时,P0 口作为原码输 入口,当 FIASH 进行校验时,P0 输出原码,此时 P0 外部必须被拉高。 P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器 能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部上拉为高,可用作输入, P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接 收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻拉高, 且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是 由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器 进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优 势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的 内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个 TTL 门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。 作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘 故。 P3 口也可作为 AT89C51 的一些特殊功能口,如下表所示: 口管脚 备选功能

P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断 0) P3.3 /INT1(外部中断 1) P3.4 T0(记时器 0 外部输入) P3.5 T1(记时器 1 外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3 口同时为闪烁编程和编程校验接收一些控制信号 RST:复位输入。当振荡器复 位器件时,要保持 RST 脚两个机器周期的高电平时间。 ALE/PROG: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位 字节。在 FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的 频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。因此它可用作对外部输 出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳 过一个 ALE 脉冲。如想禁止 ALE 的输出可在 SFR8EH 地址上置 0。此时, ALE 只 有在执行 MOVX,MOVC 指令是 ALE 才起作用。另外,该引脚被略微拉高。如果微 处理器在外部执行状态 ALE 禁止,置位无效。

51 单片机内部结构图

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每 个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。 /EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储器 (0000H-FFFFH),不管是否有内部程序存储器。注意加密方式 1 时,/EA 将内 部锁定为 RESET;当/EA 端保持高电平时,此间内部程序存储器。在 FLASH 编程 期间,此引脚也用于施加 12V 编程电源(VPP)。

4.芯片擦除: 整个 PEROM 阵列和三个锁定位的电擦除可通过正确的控制信号组合, 并 保持 ALE 管脚处于低电平 10ms 来完成。在芯片擦操作中,代码阵列全被写“1” 且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89C51 设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种 软件可选的掉电模式。在闲置模式下,CPU 停止工作。但 RAM,定时器,计数器, 串口和中断系统仍在工作。在掉电模式下,保存 RAM 的内容并且冻结振荡器,禁 止所用其他芯片功能,直到下一个硬件复位为止。 5.MCS-51 单片机是美国 INTE 公司于 1980 年推出的产品, 典型产品有 8031 (内 部没有程序存储器,实际使用方面已经被市场淘汰)、8051(芯片采用 HMOS, 功耗是 630mW,是 89C51 的 5 倍,实际使用方面已经被市场淘汰)和 8751 等通 用产品,一直到现在, MCS-51 内核系列兼容的单片机仍是应用的主流产品(比 如目前流行的 89S51、已经停产的 89C51 等),各高校及专业学校的培训教材仍 与 MCS-51 单片机作为代表进行理论基础学习。 有些文献甚至也将 8051 泛指 MCS-51 系列单片机,8051 是早期的最典型的 代表作,由于 MCS-51 单片机影响极深远,许多公司都推出了兼容系列单片机, 就是说 MCS-51 内核实际上已经成为一个 8 位单片机的标准。 其他的公司的 51 单片机产品都是和 MCS-51 内核兼容的产品而以。同样的 一段程序, 在各个单片机厂家的硬件上运行的结果都是一样的, 如 ATMEL 的 89C51 (已经停产)、89S51, PHILIPS(菲利浦),和 WINBOND(华邦)等,我们常 说的已经停产的 89C51 指的是 ATMEL 公司的 AT89C51 单片机,同时是在原基础 上增强了许多特性,如时钟,更优秀的是由 Flash(程序存储器的内容至少可以 改写 1000 次)存储器取带了原来的 ROM(一次性写入),AT89C51 的性能相对于 8051 已经算是非常优越的了。

2.2 LCD1602 液晶显示介绍

液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在

袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。 这里介绍的字符型液晶模块是一种用 5x7 点阵图形来显示字符的液晶 显示器, 根据显示的容量可以分为 1 行 16 个字、 2 行 16 个字、 2 行 20 个字等等, 这 里 以 常 用 的 2 行 16 个 字 的 DM-162 液 晶 模 块 来 介 绍 它 的 编 程 方 法

*

a. 1602LCD 主要技术参数: 显示容量:16×2 个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm b. 1602 液晶模块引脚功能 1602LCD 采用标准的 14 脚(无背光)或 16 脚(带背光)接口,各引脚接口说明如下表所示:

编号 1 2 3 4 5 6 7 8

符号 VSS VDD VL RS R/W E D0 D1

引脚说明 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据

编号 9 10 11 12 13 14 15 16

符号 D2 D3 D4 D5 D6 D7 BLA BLK

引脚说明 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极

1602 液晶模块引脚说明: 第 1 脚:VSS 为地电源。 第 2 脚:VDD 接 5V 正电源。 第 3 脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会 “鬼影”,使用时可以通过一个 10K 的电位器调整对比度。 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同 为低电平时可以写入指令或者显示地址, 当 RS 为低电平 R/W 为高电平时可以读忙信号, 当 RS 为高电平 R/W 为低电平时可以写入数据。 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 7~14 脚:D0~D7 为 8 位双向数据线。 第 15 脚:背光源正极。 第 16 脚:背光源负极。 3. 1602LCD 的指令说明及时序 1602 液晶模块内部的控制器共有 11 条控制指令,如下表所示: 序号 指令 1 2 3 4 5 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 RS R/W D7 D6 D5 D4 D3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 D2 D1 D0 0 0 1 D 0 1 1 *

I/D S C B *

S/C R/L *

6 7 8 9 10 11

置功能 置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 写数到 CGRAM 或 DDRAM) 从 CGRAM 或 DDRAM 读数

0 0 0 0 1 1

0 0 0 1 0 1

0 0 1

0 1

1

DL N

F

*

*

字符发生存贮器地址

显示数据存贮器地址

BF 计数器地址 要写的数据内容 读出的数据内容

1602 液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、 0 为低电平) 指令 1:清显示,指令码 01H,光标复位到地址 00H 位置。 指令 2:光标复位,光标返回到地址 00H。 指令 3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字 是否左移或者右移。高电平表示有效,低电平则无效。 指令 4: 显示开关控制。 D: 控制整体显示的开与关, 高电平表示开显示, 低电平表示关显示 C: 控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪 烁,低电平不闪烁。 指令 5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令 6:功能设置命令 DL:高电平时为 4 位总线,低电平时为 8 位总线 N:低电平时为单行显 示,高电平时双行显示 F: 低电平时显示 5x7 的点阵字符,高电平时显示 5x10 的点阵字符。 指令 7:字符发生器 RAM 地址设置。 指令 8:DDRAM 地址设置。 指令 9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数 据,如果为低电平表示不忙。 (注意每次输入指令前都要判断液晶模块是否处于忙的状态) 指令 10:写数据。 指令 11:读数据。

2.3 ULN2003步进电机驱动介绍 ULN是集成达林顿管IC ,内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN 晶体管矩阵, 最大驱动电压=50V,电流=500mA, 输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC, 内部还集成了一个消线圈反电动势的二极管, 它的输出端允许通过电流为200mA ,饱和压降VCE 约1V 左右,耐压BVCEO 约为36V 。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K 的电阻较为合适,同时,COM 引脚应该悬空或接电源。ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA. 资料的最后有引用电路,9脚可以悬空。 比如1脚输入,16脚输出,负载接在VCC 与16脚之间,不用9脚。

2.3.1 ULN2003的作用:

ULN2003是大电流驱动阵列, 多用于单片机、智能仪表、PLC 、数字量输出卡等控制电路中。可直接驱动继电器等负载。 输入5VTTL 电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿陈列, 由七个硅NPN 达林顿管组成。 ULN2003的每一对达林顿都串联一个2.7K 的基极电阻, 在5V 的工作电压下它能与TTL 和CMOS 电路 直接相连, 可以直接处理原先需要标准逻辑缓冲器。ULN2003 是高压大电流达林顿晶体管阵列系列产品, 具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点, 适应于各类要求高速大功率驱动的系统。

2.3.2 ULN2003A功能及引脚图:

功能:ULN2003 是高耐压、大电流、内部由七个硅NPN 达林顿管组成的驱动芯片。 经常在以下电路中使用,作为显示驱动、继电器驱动、照明灯驱动、电磁阀驱动、伺服电机、步进电机驱动等电路中。ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻, 在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA ,并且能够在关态时承受 50V 的电压,输出还可以在高负载电流并行运行。ULN2003 的封装采用DIP —16 或SOP —16 。ULN2003可以驱动7个继电器, 具有高电压输出特性,并带有共阴极的续流二极管使器件可用于开关型感性负载。每对达林顿管的额定集电极电流是500mA ,达林顿对管还可并联使用以达到更高的输出电流能力。

显示电路主要包括大型LED 数码管BSI20-1(共阳极,数字净高12 cm)和高电压大电流驱动器ULN2003,大型LED 数码管的每段是由多个LED 发光二极管串并联而成的,因此导通电流大、导通压降高。ULN2003是高压大电流达林顿晶体管阵列电路,他具有7个独立的反相驱动器,每个驱动器的输出灌电流可达500 mA,导通时输出电压约1 V,截止时输出电压可达50 V。ULN2003的1~7脚为信号输入脚,依次对应的输出端为16~10脚,8脚为接地端。当驱动电源电压为+12 V时,若要求数码管每段导通电流为40 mA,则每段的限流电阻为50Ω。则一块ULN2003恰好驱动一个LED 数码管的7段。大数码管采用共阳极接法,低电平

有效。锁存器输出的电平经NPN 三极管9014反相后,再由ULN2003放大后推动

大数码管显示

三 相关图像

3.1 总电路图

上图是protues 的电路图 ,由于我们开发板上没有74HD09和74HC21与门,于是我们在实际开发板上采用软件实现中断信号的产生及K1,K2,K3,K4,K5相与后赋值给P1.6输出口再于外部中断口INTO 的P3.2相连实现外部中断。

3.2.1 控制框图

四 调试结果及分析

1,打开文件,进行编译,确认无误后,点击工具栏中的运行工具。 2,准备调试

3,调入文件到硬件中,开始调试硬件电路,点击运行,电路正常连接。

4,从键盘输入,按正转电机正转运行。

5,从键盘输入,按反转电机反转运行。

6,从键盘输入,按点动,电机点一下转过一个步距角。 7,从键盘输入,按角度转变,电机转过设定角度。

调试完毕,通过键盘可以控制电机的按照预先设置的转速,转向,点动,转过一定角度等功能的运行。所得的结果与理论设计的运行结果相同。调试成功。

设计总结及心得体会 刚接触到设计的时候确实很难着手,不知道该重什么地方下手。主要是理论的学习是空洞的,而且并不是那么熟练。本次设计我们采用的是51单片机对两相四线步进电机进行控制,通过改变相序可以改变电机的转向,通过键盘的按键可以控制电机的正转,

反转,点动等动能。所运行的角度,速度通过LCD1602给以显示。通过调试和运行得到了正确的预期结果。

刚开始就像大海捞针一样,通过上网查阅资料,图书馆借阅文献查询。慢慢开始对我们的设计有了了解,逐步开始了进行,确实发现了很多问题 ,如怎样设置中断,慢慢的感觉懂了一些,问题也一步一步的解决。花了不少时间,有的时候困难来了,我们确实想放弃不管了,最后还是坚持了下来。实在不懂的请教了同学老师,相互探讨下最终解决了一些列问题。这过程让我们很有成就感,感悟到了学习的乐趣。当然还是有些问题需要进一步深究,做的也不是很好,但肯定会坚持学习下去。

通过这次课程设计,不但了解了怎样设计课程设计的方法,更是将书本的知识运用到现实中。深刻加深了对单片机的理解,以及端口的相应功能与接线。

最后次实验有我们六个人合作完成的,通过本次试验,我们收获了很多,懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。并且巩固以前所学过的知识,而且学到很多在书本上所没有学到过的知识。

附录【一】系统设计程序

#include

#define LCD1602_DB P0

#define MOTO P1

sbit K1 = P2^0;

sbit K2 = P2^1;

sbit K3 = P2^2;

sbit K4 = P2^3;

sbit K5 = P2^4;

sbit P1_6 = P1^6;

sbit LCD1602_RS = P2^6;

sbit LCD1602_RW = P2^5;

sbit LCD1602_EN = P2^7; //1602控制中线

unsigned char code str0[] = "Mode1:+zhuan";

unsigned char code str1[] = "Speed: 60r/min";

unsigned char code str2[] = "Mode2:+zhuan";

unsigned char code str3[] = "Speed:120r/min";

unsigned char code str4[] = "Mode3:-zhuan";

unsigned char code str5[] = "Speed:60r/min";

unsigned char code str6[] = "Mode4:Turn 90";

unsigned char code str7[] = "";

unsigned char code str8[] = "Mode5:dian dong";

unsigned char code str9[] = ""; //显示数据缓冲区

unsigned char code moto[]={0x0D,0x07,0x0E,0x0B};

unsigned char th,tl,status=1; // th ,tl 定时器T0初始值中间变量,status, 正反转标识变量

char j=0;

unsigned char *p,*t; //lcd显示数据的中间指针变量

unsigned char keyValue,keyNum=0; //键值变量

void InitLcd1602();

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);

void Read_Busy();

void Lcd1602_Write_Cmd(unsigned char cmd);

void Lcd1602_Write_Data(unsigned char dat);

void LcdSetCursor(unsigned char x,unsigned char y); //1602操作函数声明

void Delay10ms(unsigned int c); //延时子程序

unsigned char Key_Scan(); //键盘扫描

void main()

{

unsigned char n;

IP=0X01; //INT0中断优先

EA=1;

ET0=1;

EX0=1; //中断开关

IT0=1; //INT0中断方式,边缘触发方式,这种方式下中断请求标志位IE0可自动清零

TMOD=0X01; //T0按方式1定时

InitLcd1602(); //LCD初始化

while(1)

{

P1_6=K1&K2&K3&K4&K5; //产生外中断int0的中断信号(由于没有与门,中断信号由软件产生

if(keyNum==4)

{

for(n=0;n

{

MOTO=moto[j++];

if(j>3)

j=0;

Delay10ms(1);

}

keyNum=0;

}

if(keyNum==5)

{

MOTO=moto[j++];

j&=0x03; //等价于:j=4时,j=0

keyNum=0;

}

}

}

void t0() interrupt 1

{ TH0=th;TL0=tl;

if(status==1) //正传

{

MOTO=moto[j];

j++;

if(j>3)

j=0;

}

if(status==0) //反转

{

MOTO=moto[j];

j--;

if(j

j=3;

}

}

void int_0() interrupt 0

{

Key_Scan(); //扫描键盘

keyNum= keyValue;

switch(keyNum)

{

case 1:

{

TR0=1; //启动定时器T0 status=1; //正传

th=0x3C; tl=0xB0; p=str0; t=str1; break; }; case 2: { TR0=1; //同上 status=1; th=0x9E; tl=0x58; p=str2; t=str3; break; }; case 3: { TR0=1; //............ status=0; //反转 th=0x3C; tl=0xB0; p=str4; t=str5; K3=1; break; }; case 4: { TR0=0; //关闭定时器T0 p=str6; t=str7; break; }; case 5: { TR0=0; //............. p=str8; t=str9; break; } } TH0=th;TL0=tl;

Lcd1602_Write_Cmd(0x01); //清屏

LcdShowStr(0,0,p);

LcdShowStr(0,1,t);

}

unsigned char Key_Scan() //键盘扫描

{

unsigned char i;

if (K1==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 1;

i = 0;

while ((i

Delay10ms(1);

i++;

}

}

}

if (K2==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 2;

i = 0;

while ((i

Delay10ms(1);

i++;

}

}

}

if (K3==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 3;

i = 0;

while ((i

{

Delay10ms(1);

i++;

}

}

}

if (K4==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue=4;

i = 0;

while ((i

{

Delay10ms(1);

i++;

}

}

}

if (K5==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 5;

i = 0;

while ((i

{

Delay10ms(1);

i++;

}

}

}

return 0;

}

void Delay10ms(unsigned int c) //延时

{

unsigned char a, b;

for (;c>0;c--)

{

for (b=30;b>0;b--)

{

for (a=100;a>0;a--);

}

}

}

//1602看不懂的话对照PDF 文档

void Read_Busy() //忙检测函数,判断bit7是0,允许执行;1禁止 {

unsigned char sta; //

LCD1602_DB = 0xff;

LCD1602_RS = 0;

LCD1602_RW = 1;

do

{

LCD1602_EN = 1;

sta = LCD1602_DB;

LCD1602_EN = 0; //使能,用完就拉低,释放总线

}while(sta & 0x80);

}

void Lcd1602_Write_Cmd(unsigned char cmd) //写命令

{

Read_Busy();

LCD1602_RS = 0;

LCD1602_RW = 0;

LCD1602_DB = cmd;

LCD1602_EN = 1;

LCD1602_EN = 0;

}

void Lcd1602_Write_Data(unsigned char dat) //写数据

{

Read_Busy();

LCD1602_RS = 1;

LCD1602_RW = 0;

LCD1602_DB = dat;

LCD1602_EN = 1;

LCD1602_EN = 0;

}

void LcdSetCursor(unsigned char x,unsigned char y) //坐标显示

{

unsigned char addr;

if(y == 0)

addr = 0x00 + x;

else

addr = 0x40 + x;

Lcd1602_Write_Cmd(addr|0x80);

}

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str) //显示字符串

{

LcdSetCursor(x,y); //当前字符的坐标

while(*str != '\0')

{

Lcd1602_Write_Data(*str++);

}

}

void InitLcd1602() //1602初始化

{

Lcd1602_Write_Cmd(0x38); //打开,5*8,8位数据

Lcd1602_Write_Cmd(0x0c);

Lcd1602_Write_Cmd(0x06);

Lcd1602_Write_Cmd(0x01); //清屏

}

附录【二】参考文献

[1]段晨东,《单片机原理及接口技术[》[M].清华大学出版社 2008.7第一版

[2]刘宝延,程树康,《步进电机及其驱动控制系统》 [M].1997年11月第一版

[3]王守中,聂元铭 ,《51单片机开发入门与典型事例》. 人民邮电大学出版社2009.10第二版

[4]史敬灼,《步进电动机伺服控制技术》[M].2007年3月第二版

单片机综合设计实验

题目:

步进电动机综合控制

计算机科学与信息工程学院

专业年级 实验组员 指导教师 日 期

2013 级自动化三班

职称 2013--12-30

目录

摘要.............................................................................. 一 概述..................................................................

1.1 实验目的................................................................... 1.2 实验内容与要求..................................................... 1.3 步进电机的介绍................................................ 1.4 研究的思路.........................................................

二 硬件设计..............................................

2.1 51 单片机介绍................................................... 2.2 LCD1602 液晶显示介绍 2.3 uln2003 步进电机驱动介绍

三 相关图像...................................................

3.1 总电路图................................................. 3.2 程序流程图.................................................. 3.2.1 控制框图 3.2.2 流程图

四 调试结果及分析.......................................... 五 设计总结及心得体会................................................ 附录【1】系统程序............................................... 附录【2】参考文献........................................................

【摘要】

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件 本实验利用 8051 单片机达到控制步进电机的启动、停止、正转、反转、点动、 转过指定角度、状态显示和数据指示的目的,使步进电机控制更加灵活。整个系 统有 80C51 单片机控制系统,由 uln2003 驱动电路驱动,键盘控制电路,LCD 液 晶显示电路。用 51 单片机控制两相四线步进电动机,在非超载情况下,电机的 转速,停止的位置只取决于脉冲信号的频率和个数,而不受负载的影响,给电机 一个脉冲信号,电机则转过一个步距角,通过控制脉冲个数可以控制角位移量, 从而达到控制位的作用, 同时通过控制脉冲的相序来改变步进电机的转向,从而 达到控制正反相的作用。本次采用 51 单片机为核心器件来控制步进电机,系统 的实用性较强。

关键字: 51 单片机;步进电动机;脉冲;LCD1602

1.1 实验目的:

1,单片机对步进电动机控制可以熟悉步进电机的控制与原理运用。 2,单片机对步进电动机控制可以熟悉步进电机结构及各种工作方式。 3,通过本次实验可以运用所学单片机理论知识,专业技能来对实际问题进行 分析,思考,解决,提高对专业知识的掌握和锻炼逻辑思维能力。

1.2 设计内容与要求:

1、任务介绍:实现步进电机按规定的速度正转、反转,转过指定的角度,要有 点动功能。 所有命令通过键盘输入, 步进电机在运行过程中要有状态和数据指示。 2、每套设计文档应包括: 系统原理说明、程序框图、电路原理图和程序清单。

1.3 步进电机的介绍

1.3.1 相关的技术指标: a、相数:指电机内部的线圈组数,目前常用的有二相、三相、四相、五相 步进电机,本实验用的是二相步进电机。电机相数不同,其步距角也不同。 b、步距角:表示控制系统每发一个步进脉冲信号,电机所转动的角度。本 实验程序运行前要先测量步进电机的步距角。 (本开发板上已测步进电机步距角 为 18 度) c、拍数:完成一个磁场周期性变化所需脉冲数或导电状态,或指电机转过 一个齿距角所需脉冲数。也就是说本步进电机每转一周需要 20 个脉冲。本实验 用 2 相 4 拍运行方式双四拍工作方式: * *; 正转:A/B AB AB/ A/B/ * * 反转:A/B/ AB/ AB A/B

该实验板上步进电机内部结构图如图一

1.3.2 工作原理: 步进电机是一种将电脉冲转化为角位移的执行机构。 当步进驱动器接收到一 个脉冲 信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”), 它的旋转是以固定的角度一步一步运行的, 可以通过控制脉冲个数来控制角位移 量, 从而达到准确定位的目的; 同时可以通过控制脉冲频率来控制电机转动的速 度和加速度,从而达到调速的目的。在非超载的情况下,电机的转速、停止的位 置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个 脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周 期性的误差而无累积误差等特点,使得在速度、位置等控制领域用步进电机来控 制变的非常的简单。 1.3.3 步进电机的驱动:

步进电机的驱动可以选用专用的电机驱动模块,比如 L298、FT5754 等,这类驱 动模块接口简单,操作方便,它们既可以驱动步进电机,同时也可以驱动直流电 机。但本实验使用 ULN2003 驱动电路驱动步进电机运转。 1.4 研究的思路 1 了解单片机本身内部应有的资源,如:中断,定时器,计数器,I\O 的使用。 2 了解步进电机的工作原理和作用。 3 根据步进电机的原理,分析并分配单片机内部资源,并根据单片机的资源, 来实现 硬件电路的设计以及软件程序的编写。 4 遇到自己所学知识不懂或不熟悉的东西,查阅资料探究明白。 5 在设计好单片机控制步进电动机时,要学会分析电路中出现的问题,并且好 好总结。

二 硬件设计 2.1 51 单片机介绍

AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能 CMOS8 位微 处理器,俗称单片机。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与 工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存 储器组合在单个芯片中,ATMEL 的 AT89C51 是一种高效微控制器,为很多嵌入式 控制系统提供了一种灵活性高且价廉的方案 其引脚图如下所 示 。 1.主要特性: ·与 MCS-51 兼容 ·4K 字节可编程闪烁存储器 寿命:1000 写/擦循环 数据保留时间:10 年 ·全静态工作:0Hz-24Hz ·三级程序存储器锁定 ·128*8 位内部 RAM ·32 可编程 I/O 线 ·两个 16 位定时器/计数器 ·5 个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路

2.2.管脚说明:

VCC:供电电压。 GND:接地。 P0 口: P0 口为一个 8 位漏级开路双向 I/O 口, 每脚可吸收 8TTL 门电流。 当 P1 口的管脚第一次写 1 时,被定义为高阻输入。P0 能够用于外部程序数据存 储器,它可以被定义为数据/地址的第八位。在 FIASH 编程时,P0 口作为原码输 入口,当 FIASH 进行校验时,P0 输出原码,此时 P0 外部必须被拉高。 P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器 能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部上拉为高,可用作输入, P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接 收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻拉高, 且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是 由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器 进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优 势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的 内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个 TTL 门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。 作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘 故。 P3 口也可作为 AT89C51 的一些特殊功能口,如下表所示: 口管脚 备选功能

P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断 0) P3.3 /INT1(外部中断 1) P3.4 T0(记时器 0 外部输入) P3.5 T1(记时器 1 外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3 口同时为闪烁编程和编程校验接收一些控制信号 RST:复位输入。当振荡器复 位器件时,要保持 RST 脚两个机器周期的高电平时间。 ALE/PROG: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位 字节。在 FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的 频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。因此它可用作对外部输 出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳 过一个 ALE 脉冲。如想禁止 ALE 的输出可在 SFR8EH 地址上置 0。此时, ALE 只 有在执行 MOVX,MOVC 指令是 ALE 才起作用。另外,该引脚被略微拉高。如果微 处理器在外部执行状态 ALE 禁止,置位无效。

51 单片机内部结构图

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每 个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。 /EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储器 (0000H-FFFFH),不管是否有内部程序存储器。注意加密方式 1 时,/EA 将内 部锁定为 RESET;当/EA 端保持高电平时,此间内部程序存储器。在 FLASH 编程 期间,此引脚也用于施加 12V 编程电源(VPP)。

4.芯片擦除: 整个 PEROM 阵列和三个锁定位的电擦除可通过正确的控制信号组合, 并 保持 ALE 管脚处于低电平 10ms 来完成。在芯片擦操作中,代码阵列全被写“1” 且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,AT89C51 设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种 软件可选的掉电模式。在闲置模式下,CPU 停止工作。但 RAM,定时器,计数器, 串口和中断系统仍在工作。在掉电模式下,保存 RAM 的内容并且冻结振荡器,禁 止所用其他芯片功能,直到下一个硬件复位为止。 5.MCS-51 单片机是美国 INTE 公司于 1980 年推出的产品, 典型产品有 8031 (内 部没有程序存储器,实际使用方面已经被市场淘汰)、8051(芯片采用 HMOS, 功耗是 630mW,是 89C51 的 5 倍,实际使用方面已经被市场淘汰)和 8751 等通 用产品,一直到现在, MCS-51 内核系列兼容的单片机仍是应用的主流产品(比 如目前流行的 89S51、已经停产的 89C51 等),各高校及专业学校的培训教材仍 与 MCS-51 单片机作为代表进行理论基础学习。 有些文献甚至也将 8051 泛指 MCS-51 系列单片机,8051 是早期的最典型的 代表作,由于 MCS-51 单片机影响极深远,许多公司都推出了兼容系列单片机, 就是说 MCS-51 内核实际上已经成为一个 8 位单片机的标准。 其他的公司的 51 单片机产品都是和 MCS-51 内核兼容的产品而以。同样的 一段程序, 在各个单片机厂家的硬件上运行的结果都是一样的, 如 ATMEL 的 89C51 (已经停产)、89S51, PHILIPS(菲利浦),和 WINBOND(华邦)等,我们常 说的已经停产的 89C51 指的是 ATMEL 公司的 AT89C51 单片机,同时是在原基础 上增强了许多特性,如时钟,更优秀的是由 Flash(程序存储器的内容至少可以 改写 1000 次)存储器取带了原来的 ROM(一次性写入),AT89C51 的性能相对于 8051 已经算是非常优越的了。

2.2 LCD1602 液晶显示介绍

液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在

袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。 这里介绍的字符型液晶模块是一种用 5x7 点阵图形来显示字符的液晶 显示器, 根据显示的容量可以分为 1 行 16 个字、 2 行 16 个字、 2 行 20 个字等等, 这 里 以 常 用 的 2 行 16 个 字 的 DM-162 液 晶 模 块 来 介 绍 它 的 编 程 方 法

*

a. 1602LCD 主要技术参数: 显示容量:16×2 个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm b. 1602 液晶模块引脚功能 1602LCD 采用标准的 14 脚(无背光)或 16 脚(带背光)接口,各引脚接口说明如下表所示:

编号 1 2 3 4 5 6 7 8

符号 VSS VDD VL RS R/W E D0 D1

引脚说明 电源地 电源正极 液晶显示偏压 数据/命令选择 读/写选择 使能信号 数据 数据

编号 9 10 11 12 13 14 15 16

符号 D2 D3 D4 D5 D6 D7 BLA BLK

引脚说明 数据 数据 数据 数据 数据 数据 背光源正极 背光源负极

1602 液晶模块引脚说明: 第 1 脚:VSS 为地电源。 第 2 脚:VDD 接 5V 正电源。 第 3 脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度 过高时会 “鬼影”,使用时可以通过一个 10K 的电位器调整对比度。 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同 为低电平时可以写入指令或者显示地址, 当 RS 为低电平 R/W 为高电平时可以读忙信号, 当 RS 为高电平 R/W 为低电平时可以写入数据。 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 7~14 脚:D0~D7 为 8 位双向数据线。 第 15 脚:背光源正极。 第 16 脚:背光源负极。 3. 1602LCD 的指令说明及时序 1602 液晶模块内部的控制器共有 11 条控制指令,如下表所示: 序号 指令 1 2 3 4 5 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 RS R/W D7 D6 D5 D4 D3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 D2 D1 D0 0 0 1 D 0 1 1 *

I/D S C B *

S/C R/L *

6 7 8 9 10 11

置功能 置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 写数到 CGRAM 或 DDRAM) 从 CGRAM 或 DDRAM 读数

0 0 0 0 1 1

0 0 0 1 0 1

0 0 1

0 1

1

DL N

F

*

*

字符发生存贮器地址

显示数据存贮器地址

BF 计数器地址 要写的数据内容 读出的数据内容

1602 液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、 0 为低电平) 指令 1:清显示,指令码 01H,光标复位到地址 00H 位置。 指令 2:光标复位,光标返回到地址 00H。 指令 3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字 是否左移或者右移。高电平表示有效,低电平则无效。 指令 4: 显示开关控制。 D: 控制整体显示的开与关, 高电平表示开显示, 低电平表示关显示 C: 控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪 烁,低电平不闪烁。 指令 5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令 6:功能设置命令 DL:高电平时为 4 位总线,低电平时为 8 位总线 N:低电平时为单行显 示,高电平时双行显示 F: 低电平时显示 5x7 的点阵字符,高电平时显示 5x10 的点阵字符。 指令 7:字符发生器 RAM 地址设置。 指令 8:DDRAM 地址设置。 指令 9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数 据,如果为低电平表示不忙。 (注意每次输入指令前都要判断液晶模块是否处于忙的状态) 指令 10:写数据。 指令 11:读数据。

2.3 ULN2003步进电机驱动介绍 ULN是集成达林顿管IC ,内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN 晶体管矩阵, 最大驱动电压=50V,电流=500mA, 输入电压=5V,适用于TTL COMS,由达林顿管组成驱动电路。 ULN是集成达林顿管IC, 内部还集成了一个消线圈反电动势的二极管, 它的输出端允许通过电流为200mA ,饱和压降VCE 约1V 左右,耐压BVCEO 约为36V 。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K 的电阻较为合适,同时,COM 引脚应该悬空或接电源。ULN2003是一个非门电路,包含7个单元,但独每个单元驱动电流最大可达350mA. 资料的最后有引用电路,9脚可以悬空。 比如1脚输入,16脚输出,负载接在VCC 与16脚之间,不用9脚。

2.3.1 ULN2003的作用:

ULN2003是大电流驱动阵列, 多用于单片机、智能仪表、PLC 、数字量输出卡等控制电路中。可直接驱动继电器等负载。 输入5VTTL 电平,输出可达500mA/50V。ULN2003是高耐压、大电流达林顿陈列, 由七个硅NPN 达林顿管组成。 ULN2003的每一对达林顿都串联一个2.7K 的基极电阻, 在5V 的工作电压下它能与TTL 和CMOS 电路 直接相连, 可以直接处理原先需要标准逻辑缓冲器。ULN2003 是高压大电流达林顿晶体管阵列系列产品, 具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点, 适应于各类要求高速大功率驱动的系统。

2.3.2 ULN2003A功能及引脚图:

功能:ULN2003 是高耐压、大电流、内部由七个硅NPN 达林顿管组成的驱动芯片。 经常在以下电路中使用,作为显示驱动、继电器驱动、照明灯驱动、电磁阀驱动、伺服电机、步进电机驱动等电路中。ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻, 在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003 工作电压高,工作电流大,灌电流可达500mA ,并且能够在关态时承受 50V 的电压,输出还可以在高负载电流并行运行。ULN2003 的封装采用DIP —16 或SOP —16 。ULN2003可以驱动7个继电器, 具有高电压输出特性,并带有共阴极的续流二极管使器件可用于开关型感性负载。每对达林顿管的额定集电极电流是500mA ,达林顿对管还可并联使用以达到更高的输出电流能力。

显示电路主要包括大型LED 数码管BSI20-1(共阳极,数字净高12 cm)和高电压大电流驱动器ULN2003,大型LED 数码管的每段是由多个LED 发光二极管串并联而成的,因此导通电流大、导通压降高。ULN2003是高压大电流达林顿晶体管阵列电路,他具有7个独立的反相驱动器,每个驱动器的输出灌电流可达500 mA,导通时输出电压约1 V,截止时输出电压可达50 V。ULN2003的1~7脚为信号输入脚,依次对应的输出端为16~10脚,8脚为接地端。当驱动电源电压为+12 V时,若要求数码管每段导通电流为40 mA,则每段的限流电阻为50Ω。则一块ULN2003恰好驱动一个LED 数码管的7段。大数码管采用共阳极接法,低电平

有效。锁存器输出的电平经NPN 三极管9014反相后,再由ULN2003放大后推动

大数码管显示

三 相关图像

3.1 总电路图

上图是protues 的电路图 ,由于我们开发板上没有74HD09和74HC21与门,于是我们在实际开发板上采用软件实现中断信号的产生及K1,K2,K3,K4,K5相与后赋值给P1.6输出口再于外部中断口INTO 的P3.2相连实现外部中断。

3.2.1 控制框图

四 调试结果及分析

1,打开文件,进行编译,确认无误后,点击工具栏中的运行工具。 2,准备调试

3,调入文件到硬件中,开始调试硬件电路,点击运行,电路正常连接。

4,从键盘输入,按正转电机正转运行。

5,从键盘输入,按反转电机反转运行。

6,从键盘输入,按点动,电机点一下转过一个步距角。 7,从键盘输入,按角度转变,电机转过设定角度。

调试完毕,通过键盘可以控制电机的按照预先设置的转速,转向,点动,转过一定角度等功能的运行。所得的结果与理论设计的运行结果相同。调试成功。

设计总结及心得体会 刚接触到设计的时候确实很难着手,不知道该重什么地方下手。主要是理论的学习是空洞的,而且并不是那么熟练。本次设计我们采用的是51单片机对两相四线步进电机进行控制,通过改变相序可以改变电机的转向,通过键盘的按键可以控制电机的正转,

反转,点动等动能。所运行的角度,速度通过LCD1602给以显示。通过调试和运行得到了正确的预期结果。

刚开始就像大海捞针一样,通过上网查阅资料,图书馆借阅文献查询。慢慢开始对我们的设计有了了解,逐步开始了进行,确实发现了很多问题 ,如怎样设置中断,慢慢的感觉懂了一些,问题也一步一步的解决。花了不少时间,有的时候困难来了,我们确实想放弃不管了,最后还是坚持了下来。实在不懂的请教了同学老师,相互探讨下最终解决了一些列问题。这过程让我们很有成就感,感悟到了学习的乐趣。当然还是有些问题需要进一步深究,做的也不是很好,但肯定会坚持学习下去。

通过这次课程设计,不但了解了怎样设计课程设计的方法,更是将书本的知识运用到现实中。深刻加深了对单片机的理解,以及端口的相应功能与接线。

最后次实验有我们六个人合作完成的,通过本次试验,我们收获了很多,懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。并且巩固以前所学过的知识,而且学到很多在书本上所没有学到过的知识。

附录【一】系统设计程序

#include

#define LCD1602_DB P0

#define MOTO P1

sbit K1 = P2^0;

sbit K2 = P2^1;

sbit K3 = P2^2;

sbit K4 = P2^3;

sbit K5 = P2^4;

sbit P1_6 = P1^6;

sbit LCD1602_RS = P2^6;

sbit LCD1602_RW = P2^5;

sbit LCD1602_EN = P2^7; //1602控制中线

unsigned char code str0[] = "Mode1:+zhuan";

unsigned char code str1[] = "Speed: 60r/min";

unsigned char code str2[] = "Mode2:+zhuan";

unsigned char code str3[] = "Speed:120r/min";

unsigned char code str4[] = "Mode3:-zhuan";

unsigned char code str5[] = "Speed:60r/min";

unsigned char code str6[] = "Mode4:Turn 90";

unsigned char code str7[] = "";

unsigned char code str8[] = "Mode5:dian dong";

unsigned char code str9[] = ""; //显示数据缓冲区

unsigned char code moto[]={0x0D,0x07,0x0E,0x0B};

unsigned char th,tl,status=1; // th ,tl 定时器T0初始值中间变量,status, 正反转标识变量

char j=0;

unsigned char *p,*t; //lcd显示数据的中间指针变量

unsigned char keyValue,keyNum=0; //键值变量

void InitLcd1602();

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str);

void Read_Busy();

void Lcd1602_Write_Cmd(unsigned char cmd);

void Lcd1602_Write_Data(unsigned char dat);

void LcdSetCursor(unsigned char x,unsigned char y); //1602操作函数声明

void Delay10ms(unsigned int c); //延时子程序

unsigned char Key_Scan(); //键盘扫描

void main()

{

unsigned char n;

IP=0X01; //INT0中断优先

EA=1;

ET0=1;

EX0=1; //中断开关

IT0=1; //INT0中断方式,边缘触发方式,这种方式下中断请求标志位IE0可自动清零

TMOD=0X01; //T0按方式1定时

InitLcd1602(); //LCD初始化

while(1)

{

P1_6=K1&K2&K3&K4&K5; //产生外中断int0的中断信号(由于没有与门,中断信号由软件产生

if(keyNum==4)

{

for(n=0;n

{

MOTO=moto[j++];

if(j>3)

j=0;

Delay10ms(1);

}

keyNum=0;

}

if(keyNum==5)

{

MOTO=moto[j++];

j&=0x03; //等价于:j=4时,j=0

keyNum=0;

}

}

}

void t0() interrupt 1

{ TH0=th;TL0=tl;

if(status==1) //正传

{

MOTO=moto[j];

j++;

if(j>3)

j=0;

}

if(status==0) //反转

{

MOTO=moto[j];

j--;

if(j

j=3;

}

}

void int_0() interrupt 0

{

Key_Scan(); //扫描键盘

keyNum= keyValue;

switch(keyNum)

{

case 1:

{

TR0=1; //启动定时器T0 status=1; //正传

th=0x3C; tl=0xB0; p=str0; t=str1; break; }; case 2: { TR0=1; //同上 status=1; th=0x9E; tl=0x58; p=str2; t=str3; break; }; case 3: { TR0=1; //............ status=0; //反转 th=0x3C; tl=0xB0; p=str4; t=str5; K3=1; break; }; case 4: { TR0=0; //关闭定时器T0 p=str6; t=str7; break; }; case 5: { TR0=0; //............. p=str8; t=str9; break; } } TH0=th;TL0=tl;

Lcd1602_Write_Cmd(0x01); //清屏

LcdShowStr(0,0,p);

LcdShowStr(0,1,t);

}

unsigned char Key_Scan() //键盘扫描

{

unsigned char i;

if (K1==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 1;

i = 0;

while ((i

Delay10ms(1);

i++;

}

}

}

if (K2==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 2;

i = 0;

while ((i

Delay10ms(1);

i++;

}

}

}

if (K3==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 3;

i = 0;

while ((i

{

Delay10ms(1);

i++;

}

}

}

if (K4==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue=4;

i = 0;

while ((i

{

Delay10ms(1);

i++;

}

}

}

if (K5==0)

{

Delay10ms(1); //消除抖动

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

{

keyValue = 5;

i = 0;

while ((i

{

Delay10ms(1);

i++;

}

}

}

return 0;

}

void Delay10ms(unsigned int c) //延时

{

unsigned char a, b;

for (;c>0;c--)

{

for (b=30;b>0;b--)

{

for (a=100;a>0;a--);

}

}

}

//1602看不懂的话对照PDF 文档

void Read_Busy() //忙检测函数,判断bit7是0,允许执行;1禁止 {

unsigned char sta; //

LCD1602_DB = 0xff;

LCD1602_RS = 0;

LCD1602_RW = 1;

do

{

LCD1602_EN = 1;

sta = LCD1602_DB;

LCD1602_EN = 0; //使能,用完就拉低,释放总线

}while(sta & 0x80);

}

void Lcd1602_Write_Cmd(unsigned char cmd) //写命令

{

Read_Busy();

LCD1602_RS = 0;

LCD1602_RW = 0;

LCD1602_DB = cmd;

LCD1602_EN = 1;

LCD1602_EN = 0;

}

void Lcd1602_Write_Data(unsigned char dat) //写数据

{

Read_Busy();

LCD1602_RS = 1;

LCD1602_RW = 0;

LCD1602_DB = dat;

LCD1602_EN = 1;

LCD1602_EN = 0;

}

void LcdSetCursor(unsigned char x,unsigned char y) //坐标显示

{

unsigned char addr;

if(y == 0)

addr = 0x00 + x;

else

addr = 0x40 + x;

Lcd1602_Write_Cmd(addr|0x80);

}

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str) //显示字符串

{

LcdSetCursor(x,y); //当前字符的坐标

while(*str != '\0')

{

Lcd1602_Write_Data(*str++);

}

}

void InitLcd1602() //1602初始化

{

Lcd1602_Write_Cmd(0x38); //打开,5*8,8位数据

Lcd1602_Write_Cmd(0x0c);

Lcd1602_Write_Cmd(0x06);

Lcd1602_Write_Cmd(0x01); //清屏

}

附录【二】参考文献

[1]段晨东,《单片机原理及接口技术[》[M].清华大学出版社 2008.7第一版

[2]刘宝延,程树康,《步进电机及其驱动控制系统》 [M].1997年11月第一版

[3]王守中,聂元铭 ,《51单片机开发入门与典型事例》. 人民邮电大学出版社2009.10第二版

[4]史敬灼,《步进电动机伺服控制技术》[M].2007年3月第二版


相关文章

  • 课程设计步进电机控制系统
  • 上海工程技术大学课程设计(论文) 步进电机控制系统 目 录 1. 绪论............................................................1 2. 系统原理................ ...查看


  • 二维工作台综合课程设计说明书
  • 综合课程设计 说 明 书 (第11组) 重庆交通大学机电与汽车工程学院 目 录 一.课程设计的题目及要求 ................................................................... ...查看


  • 清华大学课程学习
  • 电机工程与应用电子技术系 00220012 高档单片机原理及应用 2学分 32学时 The Principles and Application of Advanced Single-Chip Computer 本课程受日本瑞萨科技公司资助 ...查看


  • x-y工作台课程设计
  • 课程设计说明书 课程名称: 设计题 专 班 姓 名 学 号: 指导教 设计时间:2016年12月29日-2017年 1 月 日 6 目录 一.课程设计的题目及要求 ...................................... ...查看


  • 线切割机床步进电机的PLC控制
  • 辽 宁 工 业 大 学 题目: 线切割机床步进电机的PLC 控制 院(系): 专业班级: 学 号: 学生姓名: 指导教师: (签字) 起止时间: 2013.12 本科生课程设计(论文) 课程设计(论文)任务及评语 院(系):电气工程学院 教 ...查看


  • 测控技术与系统课程设计论文
  • 目 录 摘要.................................................................................................................. ...查看


  • 热处理加热炉
  • 科信学院 课程设计说明书 (2012 /2013 学年第 二 学期) 课程名称 : <可编程序控制器>课程设计 题 目 : 热处理加热炉电气控制系统设计 专业班级 : 学生姓名 : 学 号: 指导教师 : 刘增环.安宪军.杜永. ...查看


  • 机电传动单向数控平台设计(矿大版)
  • 1 设计任务 1.1设计任务介绍及意义 1.课程设计题目 机电传动单向数控平台设计 2.课程设计内容 (1)机械传动结构设计 (2)电气测控系统 3.课程设计意义 (1)培养学生综合运用所学的基础理论和专业知识,独立进行机电控制系统(产品) ...查看


  • 浙大电气工程及其自动化培养方案
  • 2012级电气工程及其自动化专业培养方案 20130605版 培养目标 培养具有扎实的自然科学基础知识,具有良好的人文社会科学.管理科学基础和外语综合能力,从事电力系统和电机系统的运行与控制.研制出发.自动控制.信息处理.试验分析.以及电力 ...查看


  • 电力拖动与控制
  • <电力拖动与控制>学习领域课程标准 学习领域名称:电力拖动与控制 代码:Z020401029 学时:78 学分:5 适用专业:矿山机电专业 一.学习领域课程描述 (一)课程定位 <电力拖动与控制>课程是矿山机电专业进 ...查看


热门内容