首页 毕业设计:基于STC89C52单片机的步进电机控制系统设计与实现

毕业设计:基于STC89C52单片机的步进电机控制系统设计与实现

举报
开通vip

毕业设计:基于STC89C52单片机的步进电机控制系统设计与实现唐 山 学 院 毕 业 设 计 设计题目:基于STC89C52单片机的步进电机控制系统设计与实现                       系        别:      信息工程系      班        级:                        姓      名:                        指 导  教 师:                        2013年6月10 日 基于单片机的步进电机控制系统 设计与实现 摘  要 步进电机是一种纯粹的数字控制电动...

毕业设计:基于STC89C52单片机的步进电机控制系统设计与实现
唐 山 学 院 毕 业 设 计 设计 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目:基于STC89C52单片机的步进电机控制系统设计与实现                       系        别:      信息工程系      班        级:                        姓      名:                        指 导  教 师:                        2013年6月10 日 基于单片机的步进电机控制系统 设计与实现 摘  要 步进电机是一种纯粹的数字控制电动机,是一种受电脉冲信号控制的无刷式直流电动机,是现代定位驱动装置的核心,广泛应用在机械、电力、纺织、电子、仪表、印刷以及航空航天、船舶、兵器等国防工业等领域。基于单片机的步进电机控制系统具有稳定度高、成本低、控制方便、应用范围广等特点。 本系统是由STC89C52单片机核心处理模块,遥控器命令输入模块,ULN2003及28BYJ-48步进电机组成的电机模块,12864液晶输出模块共同组成的基于单片机的步进电机控制系统。 本设计以载波为38KHZ的红外遥控器作为用户的控制端,它的功能是把用户的命令转换为红外信号。红外信号由TL1838接收,它可以将光信号转换为电信号,并将其发送给微控制器STC89C52。STC89C52对电信号进行相应处理即可获得用户所发出的指令,并依此来控制28BYJ48型四相八拍电机并以12864液晶作为当前状态的显示器。用户可以对步进电机进行加速、减速、正转、反转的控制。本步进电机控制系统具有精度高、运行稳定、控制方便、维护简单、应用范围广等特点。 关键词:STC89C52    12864液晶    步进电机  红外遥控 Design and Implementation of Stepper Motor Control System Based on MCU Abstract Stepper motor is a kind of pure digital control motor and brushless dc motor  controlled by electric pulse signal type. Stepper motor is the core of the modern orientation drive, widely used in machinery, electric power, textile, electronics, instruments, printing and aerospace, ships, weapons, and other areas of the defense industry, etc. The characteristics of the stepping motor control system based on single chip microcomputer include high stability, low cost, convenient control and wide application , etc. The stepper motor control system consists of core processor using the single chip processor, command input control module using IR remote control , display module using 12864 LCD and 28BYJ48 stepping motor module which using ULN2003 as driver. The infrared remote control with carrier for 38 KHZ is used as the control end of  the user, which can convert the users’ commands into the infrared signal. The TL1838 can receive the infrared signal and convert it into electrical signal, which input to tSTC89C52.The MCU can obtain instructions of users by processing the incoming signal and control stepping motor of the 28BYJ48 type, the current status can be shown by 12864 LCD. Users could control acceleration, deceleration, forward, inversion for the stepping motor. The features of the control system of stepper motor includes high precision, stable running, convenient control and simple maintenance and wide application, etc. Key word: MCU; 12864 LCD; Stepper Motor; Infrared remote control 目    录 1 引言    1 2 总体设计方案    2 2.1 系统设计原理    2 2.2 总体设计框图    2 3系统硬件模块的组成    3 3.1单片机控制模块    3 3.1.1 STC89C52主要结构    3 3.1.2 STC89C52功能特性描述    3 3.1.3 时钟电路    6 3.1.4复位电路    6 3.2 步进电机模块    7 3.2.1 步进电机简介    7 3.2.2步进电机的结构    8 3.2.3 28BYJ-48步进电机工作原理    8 3.3 ULN2003芯片概述与特点    9 3.4 红外线发射接收模块    10 3.4.1 红外线遥控的介绍    10 3.4.2红外通信基本原理    10 3.4.3 红外遥控发射系统    12 3.4.4 红外遥控接收系统    12 3.4.5 TL1838与单片机的接口    14 3.5 12864显示模块    14 3.5.1 12864液晶的特点    14 3.5.2 12864液晶的引脚说明    15 3.5.3 12864液晶的读写操作    17 3.5.4 12864液晶的控制指令    17 3.5.5 12864液晶接口电路    20 3.6 蜂鸣器模块    20 3.6.1 蜂鸣器介绍    20 3.6.2 蜂鸣器的接口电路    21 4 软件设计与调试    22 4.1 主程序流程图    22 4.2程序设计思路    23 4.2.1 遥控器的解码    23 4.2.2 步进电机的控制    23 4.2.3 显示屏的控制    24 4.2.4 蜂鸣器的控制    24 4.2.5 模块中的通信    24 5 编程与下载软件    25 5.1 Keil软件    25 5.2 STC-ISP下载软件    26 6 硬件电路制作    27 6.1 原理图的绘制    27 6.2 电路实现的基本步骤    27 7 结 论    30 谢  辞    31 参考文献    32 附  录    33 1 引言 步进电机是一种纯粹的数字控制电动机,又称为阶跃电机或脉冲电机[1]。是一种转动速率与转动步数可以由脉冲数量与频率控制的直流电机,也就是说这是一种转动速度与脉冲频率相一致的同步电机。它是一种将电脉冲能量转换为机械能的机制,这种方式使它转动的每一个角度,每个角度占用的时间都由用户掌控。 随着科学技术的迅猛发展,步进电机的研究也到达了新的水准。定位驱动系统已完全由步进系统所主宰。在过去,人们认为步进系统在很多方面都不及伺服系统,但是由于技术的不断革新,材料的不断升级优化以及计算机技术的不断成熟,使得步进控制系统在技术层面上迎来了崭新的一页。定位驱动系统是处于不断发展状态的,经历了步进系统、直流伺服系统、交流伺服系统等过程的发展与过度,现在又回到了步进控制系统。定位驱动装置之所以再一次回到步进系统,是因为它可以将系统简化,维护非常简单,它所构成的开环控制系统是无需反馈的,同时又能保持非常高的精度。所以现如今的定位驱动装置大多是采用步进系统的,这在将来的几十年都不会改变,这种由脉冲去控制转动方位,脉冲频率决定转动速度的定位方式一定会在很大程度上决定着工业与生活中的定位装置的发展趋势。 步进电机的上述特点使得它广泛应用于冶金、机械、电力、纺织、电子、轻工、重工、电子、医疗、印刷以及航空航天等国防工业等领域。举一个典型的例子,数控机床在机械行业中有着举足轻重的地位,而数控机床的正常运转又是依赖步进电机的,它核心就是步进电机系统。这种无需反馈的开环系统决定了数控机床的工作可靠、性能稳定、维护方便、加工迅捷的特点,也使数控机床成为如今机床发展的主要方向。在其他的许多行业中,步进控制系统也发挥着举足轻重的作用。比如我们在生活中常见的有钟表、广告牌、绘图仪等,在生产中常见的有印刷机器、纺织机、包装机械等。 本设计主要是基于单片机的步进电机控制系统,可以通过遥控器的键盘设置期望的步进电机转动状态,通过红外发射装置及接收装置,使单片机接收到用户需要的控制命令,进行相应的处理,使步进电机改变运动状态并在LCD显示屏显示出来。本设计虽然是理论上的步进系统,并没有广泛应用于工业中的定位装置与生产当中。但是随着步进电机技术的不断革新和电机身上所固有的脉冲与角位移严格成正比的特点,以及红外遥控的准确、迅捷、易于控制的优势,步进电机对步进电机稳定、高效、准确的控制,都决定了基于单片机的红外控制步进电机系统将在生活生产中迎来广阔的市场。为了表现步进电机的在生活生产中的应用广泛性,本设计的一些功能的设定有一定的针对性,可以具体的表现出红外控制的步进系统的优越性能。         2 总体设计方案 2.1 系统设计原理 单片机STC89C52是整个系统关键部分,通过对遥控器上键盘的命令输入,经遥控器编码后发出红外信号,TL1838接收到信号并在单片机中解码。本文提出的采用38KHZ的遥控器为核心控制器件的步进电机控制系统, 根据输出信号的不同可以控制步进电机的转动状态,其中采用了28BYJ-48的步进电机,以ULN2003为驱动芯片,并通过单片机程序控制和处理, 从而实现了步进电机的状态控制及相应状态显示。 本系统采用STC89C52单片机为核心处理器,遥控器为命令输入模块,由ULN2003及28BYJ-48步进电机组成的转动模块、12864液晶的输出模块共同组成的基于单片机的步进电机控制系统。 2.2 总体设计框图 本设计采用STC89C52单片机为核心处理器,利用载波为38KHZ的遥控器为输入模块键盘输入模块,控制步进电机的正转和反转,并以三种不同的速度进行转动,并且转动状态在12864液晶上显示。系统构成如图2-1所示。 步进 电机 ULN 2003 TL1838 单 片 机 遥控器 蜂鸣器 12864液晶 图2-1 系统框图 由系统框图可知,遥控器和TL1838为输入装置,步进电机、12864液晶、蜂鸣器为输出装置,单片机为中心处理装置,ULN2003为驱动器。         3系统硬件模块的组成 3.1单片机控制模块 主控电路中,以单片机为主体,通过 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 遥控输入的指令,改变步进电机的运行参数和显示参数。它是系统的大脑。 单片机(Micro Controller,又称微控制器)是在一块硅片上集成了各种部件的微型机算计,这些部件包括中央处理器CPU、数据存贮器RAM、程序存贮器ROM、定时器/计数器和多种I/O接口电路[3]。 3.1.1 STC89C52主要结构 STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,内置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口[4]。 3.1.2 STC89C52功能特性描述   STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用宏晶公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。STC89C52具有以下标准功能:8k字节Flash、256字节RAM、32 位I/O 口线、看门狗定时器、2个数据指针、三个16 位定时器/计数器、一个6向量2级中断结构、全双工串行口、片内晶振及时钟电路。另外,STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下个中断或硬件复位为止[5]。STC89C52的引脚结构如图3-1所示。   图3-1 STC89C52单片机引脚图     GND:接地。 VCC:供电电压。 P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4个TTL逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),在flash编程和校验时,P1口接收低8位地址字节。P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器。能驱动4个TTL 逻辑电平。 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的一些特殊功能口,如表3-1所示。 表3-1  P3口的第二功能 信道位 第二功能 说明 P3.0 RXD 串行口的输出 P3.1 TXD 串行口的输入 P3.2 外部中断0的中断请求输入 P3.3 外部中断1的中断请求输入 P3.4 T0 计数器0的计数输入 P3.5 T1 计数器1的计数输入 P3.6 外部数据存储器的写选通信号 P3.7 外部数据存储器的读选通信号 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。     ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。     :外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次有效。但在访问外部数据存储器时,这两次有效的信号将不出现。     /VPP:当保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,将内部锁定为RESET;当端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。     XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。     XTAL2:来自反向振荡器的输出。 3.1.3 时钟电路 STC89C52有内部时钟和外部时钟两种连接方式。设计中使用内部时钟,即在RXD和TXD两端并联晶振和适当电容。需要注意的是并不是晶振有定时的作用,而是通过和单片机内部的高增益反相放大器连接,使它可以在一定频率下稳定震动,起到口令的作用。其连接电路如图3-2所示。 图3-2 时钟电路                    在RXD和TXD引脚上并联的晶振是系统的定时元件,内部振荡器就产生自激振荡。 时钟电路中选用的晶振可以在1.2~24MHz之间选择,并联的电容值可在5~30pF之间选择,为单片机提供了有序准确的命令,是单片机正常运行的前提。 3.1.4复位电路 AT89C52的外围电路是必须有复位功能的,一般分为自动复位和按键复位。设计使用的是手动复位,电路原理是在普通RC复位电路的基础上接一个有下拉电阻10K、上拉电容10μf接VCC,电源由开关经串接的1K限流电阻至复位脚(和上拉电容并联),上拉电容支路负责在“上电”瞬间实施复位;开关通过1K上拉电阻和10K下拉电阻分压器,保证对单片机实施按键电平复位[6]。电路图如图3-3所示。 图3-3 复位电路 复位可以对单片机初始化。其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序[7]。复位一般有两种作用,一种是在进入系统时要正常的初始化,另一种是程序可能会出现错误,运行混乱,是系统处于死锁状态,为了解决这种困境,通常采用复位方式。 3.2 步进电机模块 3.2.1 步进电机简介 人类社会进入自动化时代的今天,传统电动机的功能已不能满足各种运动控制系统的要求。为了适应这些要求,发展了一系列新的具备控制功能的电动机系统,其中较有自己特点,且应用十分广泛的一类便是步进电机。从发展趋向来讲,步进电机已经能与直流电动机,异步电动机,以及同步电动机并列,成为电动机的一种基本类型,步进电机己成为除直流电动机和交流电动机以外的第三类电动机。步进电机是电动脉冲信号为角位移或线位移的开环步进电机控制元件块。步进电机对于其他种类电机的优势是在非超载的情况下,电机的运动状态如电动机转速、停止的位置非常稳定,可以完全在用户的掌控之中的,负载的变化,在恶劣环境下都不会对它产生影响,这取决于它的控制方式的与众不同。步进电机的转动圈数完全取决于给它脉冲的数量,它转动速度又完全取决于脉冲频率。只要给步进电机一个脉冲,就会驱动电机在旋转方向上转动一个固定的角度,称为“步进角”,旋转角度是固定的一步一步的操作[8]。所以它的可操作性非常优越,但是步进电机的转动速度是比较慢的,随着科技的发展,这种缺点也在逐渐改善。步进电机的实物图如图3-4所示。 图3-4 28BYJ48型四相八拍电机 本设计选择28BYJ-48步进电机作为设计对象,步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。使步进电机连续转动的方法是不断的供给控制脉冲。每个脉冲都对应步进电机的某一项或两项绕组,当它的通电状态改变时对应的转子就会转过一定角度, 这个角度叫做步距角。通电状态改变一个周期时转子所转的角度成为齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A),双(双相绕组通电)四拍(AB-BC-CD-DA-AB),八拍(A-AB-B-BC-C-CD-D-DA-A)。 3.2.2步进电机的结构 步进电机有转子和定子两部分,在电流作用下的,定子和转子的相互作用,使得电机不停转动。28BYJ-48步进电机的定子是由硅钢片叠成的,定子上有8大磁极,每2个相对的磁极(N,S)组成一对,共有4对,如图3-5所示。定子齿有个励磁绕阻,其几何轴线依次分别与转子齿轴线错开。 0、1/4π、2/4π、3/4π(相邻两转子齿轴线间的距离为齿距以π表示),即A与齿1相对齐,B与齿2向右错开1/4π,C与齿3向右错开1/2π,D与齿4向右错开3/4π。而转子是由软磁材料制成,其外表面也均匀地分布着小齿,与定子上的小齿相同,并且小齿的大小相同,间距相同。 3.2.3 28BYJ-48步进电机工作原理 步进电机是一种将电脉冲转换为角位移的执行机构,步进电机的转动圈数完全取决于给它脉冲的数量,它转动速度又完全取决于脉冲频率。只要给步进电机一个脉冲,就会驱动电机在旋转方向上转动一个固定的角度,可以通过电脉冲个数来控制角偏移量,从而达到准确定位的目的,同时可以通过控制脉冲频率,来控制电机转动的速度和加速度,从而达到调速的目的。本设计选择28BYJ-48步进电机作为设计对象,其原理图如3-5所示。 图3-5 步进电机接线示意图 在图中可以看到附在周围的是定子,在中间的是转子。定子的作用是产生一个电磁场,这个电磁场和转子的磁场可以产生一个扭力[9],使得步进电机转动。但是定子的电磁场是不能和转子磁场在同一直线的。使步进电机不停转动的前提是定子的磁场不停的变换,这个变换是通过一次改变绕组的磁场,始终是定子和转子的磁场产生错位,促使步进电机的稳定转动。而改变磁场切换的时间间隔,就可以控制步进电机的速度了,这就是步进电机的驱动原理。由于单片机的驱动电流较小,不能直接用来驱动步进电机,优势不能充分展现,所以一般都是使用ULN2003达林顿阵列驱动,可以为步进电机提供较大的扭力,使电机稳定工作。 3.3 ULN2003芯片概述与特点 ULN2003芯片是高耐压、大电流达林顿阵列,由7组达林顿晶体管阵列和相应的电阻网络以及钳位二极管网络构成,具有同时驱动7组负载的能力,为单片双极型大功率高速集成电路[10]。由于步进电机并不是简单的转动,它要带动不同的负载,完成不同的工作,所以需要产生较大的扭力,又由于直接使用三极管驱动的局限和功率电子电路大多要求具有大电流输出能力,所以步进电机的驱动一般使用ULN2003。ULN2003芯片高压大电流达林顿晶体管阵列产品属于可控大功率器件功率驱动电路,可控大功率驱动器件驱动电路是功率电子设备输出电路的一个重要组成部分。具体电路图如图3-6所示。 图3-6  ULN2003接线示意图 ULN2003实际上只是一个放大电路,用来放大电流,对于实际的逻辑控制没有任何作用。如果没有这个芯片电机也会转动,只是转动的扭力会受很大影响,制约步进电机的性能。 3.4 红外线发射接收模块 3.4.1 红外线遥控的介绍 红外线是太阳光线中众多不可见光线中的一种,在太阳光中就包含着红外线。由德国科学家霍胥尔于1800年发现,又称为红外热辐射。很多人不知道红外线与紫外线等不可见光线或者红光等可见光线的产生区别,它们最大的区别是波长不同,波长是震荡频率的结果。人眼能够识别的可见光的种类为红、橙、黄、绿、青、蓝、紫,波长是从长到短排列的。其中红光的波长范围为0.62~0.76um;紫光的波长范围为0.38~0.46。比紫光的波长还要短的光叫紫外线,比红光的波长还要长的光叫红外线。红外线遥控技术就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。红外线是我们最常用的一种不可见光线,家用电器的遥控器基本上都是使用红外线。有一个很有趣的特点,当按下遥控器的键盘时,我们看不到红外发射头发出的光线,但是如果我们用照相机来对着红外发射头,按下键盘时,在相机中我们可以观察到它发出了亮光。 红外遥控的特点是造价较低,适合市场的推广,各类家庭用户的使用。编解码较容易,不会因为程序电路的复杂性而经常出现故障。它由32位码长,4段码,通过用户码的不同区别开了不同产品的不同遥控,以免互相干扰,不影响周边环境、不干扰其它电器设备。还有一个重要原因,红外线不会对人体造成伤害,发射接收距离较长,方便用户使用。一般在10米以内可以灵敏接收的。 3.4.2红外通信基本原理 通信控制系统大多是由发射与接收两部分组成的,红外通信也不例外。发射系统对一个红外辐射源进行调制后发射红外信号,而接收系统用红外一体化接收头进行接收,两者联合构成了红外通信系统。红外通信的基本原理是:发送端将基带二进制信号调制为一系列的脉冲串信号(载波信号),通过红外发射管发射红外信号。红外信号由接收端转换成电信号,并对其进行放大、滤波等处理,还原成二进制数字信号,并将其输出。 由于各遥控产品的不同,还有很多不同的遥控厂商,必须有一个通信 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 来保障不同种类的红外产品获得最佳的通信效果。红外线的波长在750nm至1mm之间,红外通信一般采用红外波段内的近红外线,波长在0.75um至25um之间。红外数据协会将红外通信协议定为波长限定在850nm~900nm范围之间。红外线的调制方法常用的有两种,一种是通过脉冲宽度来实现信号调制的脉宽调制(PWM),另一种是通过脉冲串之间的时间间隔来实现信号调制的脉冲调制(PPM)[13] 。 本设计采用脉冲调制方法,即二进制信息由两个脉冲的时间间隔来表示,首先产生一个同步头,然后产生2个8位用户码,接着8位数据码和8位数据反码,如图3-7所示。 数据1 图3-7 PPM调制波形图 8位 红外遥控的一个数据帧是由引导码、用户码、数据码和数据反码组成的。每个品牌的用户码一般都是不同的,数据码同种种类的遥控器一般差异不大。每段码都为8位,2段用户码,数据码及其反码只有1段。每帧数据由一个起始位、2段8个用户码位8个数据码和数据反码构成,如图3-8所示。每帧传送1个字节的数据。 图3-8 数据帧结构示意图 由于红外光存在反射,在全双工的方式下发送的信号也可能会被本身接收,因此,红外通信应采用异步半双工方式,即通信的某一方发送和接收交替进行。 3.4.3 红外遥控发射系统 红外遥控系统结构红外遥控系统主要分为调制、发射、接收和解调四部分,如图3-9所示。 图3-9 红外遥控系统 调制红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源功耗。调制载波频率一般在30kHz到60kHz之间,一般红外遥控使用的是38kHz,占空比1/3的方波。如图3-10所示。 图3-10 载波波形 有很多芯片都可以发射红外光,但是对于遥控的芯片选择要考虑使用设备和编码种类的不同。对于家用电器的遥控,必须功率要低,这样电池才可以长时间使用,一般都使用可休眠的的发射芯片,能不按键时遥控处于不工作模式。芯片一般选用的晶振为陶瓷共鸣器,因为其有足够的物理撞击能力,虽然准确性不如石英晶体,但是通常是可以允许一些误差的。经过编码后,要用专用的发射头发射出去。普通的发光二极管是不能担此重任的,因为它只能发射出可见光。红外发射二极管是专门用来发射红外线的,它的内部材料是与普通二极管完全不同的,所以导致了其发出的是红外线而不是可见光[12]。听上去红外发射二极管价格也很便宜,与普通发光二极管差不多,某些方面也促进了红外通信技术的发展。 3.4.4 红外遥控接收系统 有发射就要有接收,由于发射的红外线有38K的载波,所以一定要先把接收的信号滤波才行,为了得到准确的编码,还要把信号进行放大、积分等。这是一个复杂的过程,也应该有复杂的电路来处理。随着科技的发展,芯片集成能力的不断提高,这个看似复杂的任务只需要一个叫做红外接收头的电子器件就可以完成工作。常用的红外接收头有HX1838,TL1838等,它们的性能、结构基本都是一样的,可以把38K载波滤掉,并进行一定的处理,使中心处理器件接收到准确的编码,但需要注意的是它处理后的是原来编码的反码。图3-11中就是TL1838一体化红外接收头,其38就是接收38K载波的意思。 图3-11 TL1838实物图 TL1838如图3-11所示,从左边开始,分别为1脚、2脚、3脚,分别为信号输出脚、地和电源,其电平与TTL兼容。TL1838系列特性如下: 工作电压:2.7~5.5V 工作电流:1.4mA 距离:15M 频率:38K 角度:±45° 波长:940nm 当TL1838接收到红外光信号时,内部的PIN红外接收管将其装换为电信号,又经过放大电路、解调电路的作用,由输出引脚输出与TTL电平兼容的电信号,该电信号可以直接送到微处理器中处理。 TL1838的输出波形如图3-12所示。当接收到频带内的红外信号时,TL1838接收器会输出低电平,否则数出高电平,从而“将时断时续”的红外信号解调成原来的连续方波信号。需要注意的一点是,它并没有把红外信号解码,因为它处理后发出的信号不是标准的1、0高低电平。不管是1还是0,都包含着高低电平,只是高低电平所持续的时间是不同的,这需要单片机自己通过程序来判断了。 高电平 图3-12(a) 已调制红外信号 (b) TL1838输出信号 TL1838的有效传输距离是15m,它的工作电压为2.7~5.5V,接收稳定,功率小,在各种红外接收场合的可以使用。TL1838由于它的稳定性能,低廉的价格,是一款性价比很高的红外一体化接收头[13]。 3.4.5 TL1838与单片机的接口 本设计的红外遥控系统是将普通遥控器解码,把它的32位码写进单片机程序中,使得可以通过对遥控器键盘的控制,单片机可以得到相对指令。其连接线电路如图3-13所示。 图3-13 遥控的接收头的连线 把其输出端接单片机的外部中断0,每当遥控器发出信号时都会触发单片机外部中断,这时再触发单片机的定时中断对其发出的信号进行鉴定,以检测出其码位。 3.5 12864显示模块 3.5.1 12864液晶的特点 现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。12864型液晶显示模块具有体积小,功耗低,显示内容丰富等特点。设计中用到的就是这种显示屏。其实物图如图3-14所示。 图3-14 12864实物图 12864型液晶显示屏共有20个引脚,其中有8位数据总线D0~D7,5个控制引脚R/W、E、RS、PSB、RST,5个电源引脚,其中包括背光电源和显示器电源。三个用于调节背景亮度和字符亮度以及供电的引脚。12864型液晶是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或图形的目的。它由点阵字符显示器件和专用的行和列驱动器组成,体积小、功耗极低、显示内容丰富。可以通过对外围电路的调节来控制屏幕亮度,工作电压为5V。 本设计使用的液晶使用ST7920控制器,5V电压驱动,带背光,内置8192个16*16点阵、128个字符(8*16点阵)及64*256点阵显示RAM。与外部CPU接口采用并行或串行两种控制方式。 3.5.2 12864液晶的引脚说明 12864液晶有多种驱动芯片,虽然驱动芯片有很多种,但原理基本相同。本次设计采用驱动芯片为ST7920的12864液晶对步进电机工作状态进行显示,其引脚分布图如图3-15所示。     图3-15  12864液晶管脚图 12864液晶管脚及其功能描述,如表3-2所示: 表3-2  12864管脚说明 管脚号 管脚名称 电平 管脚功能描述 1 VSS 0V 电源地 2 VCC 3~5V 电源正 3 V0 — 对比度(亮度)调整 4 RS(CS) H/L RS=“H”,表示DB7—DB0为显示数据 RS=“L”,表示DB7—DB0为显示指令数据 5 R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7—DB0 R/W=“L”,E=“H→L”,DB7—DB0的数据被写到R或DR 6 E(SCLK) H/L 使能信号 7 DB0 H/L 三态数据线 8 DB1 H/L 三态数据线 9 DB2 H/L 三态数据线 10 DB3 H/L 三态数据线 11 DB4 H/L 三态数据线 12 DB5 H/L 三态数据线 13 DB6 H/L 三态数据线 14 DB7 H/L 三态数据线 15 PSB H/L H:8位或4位并口方式,L:串口方式 16 NC — 空脚 17 RESET H/L 复位端,低电平有效 18 VOUT — LCD驱动电压输出端 19 A VDD 背光源正端 20 K VSS 背光源负端 在对液晶模块进行操作时,其忙标志位(BF)提供内部工作情况,BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可以接受外部指令和数据[14]。 原则上每次对控制器进行读/写操作之前,都必须进行读/写检测。实际上,由于单片机的操作速度低于液晶控制器的反应速度,因此可不必进行读/写检测,或只进行简短的延时即可。 3.5.3 12864液晶的读写操作 12864与外部CPU接口有并行或串行两种控制方式,由于本设计采用的是并行读写模式,所以主要介绍并行控制方式。读状态的操作时序为RS=L,R/W=H,E=H;读数据操作时序为RS=H,R/W=H,E=H;时序图如图3-16所示。 图3-16  12864液晶的读时序 写指令的操作指令为RS=L,R/W=L,E=高脉冲脉冲,DB0~DB7=指令码。写数据的操作指令为RS=H,R/W=L,E=高脉冲,DB0~DB7=数据[14],时序图如3-17所示。 图3-17  12864液晶的写时序 12864液晶是一种可以读数据和存数据的器件。由于设计中只用到了些操作,所以要着重说明写操作的方法。E端为使能端,R/W来区分读和写,RS来控制数据还是指令,时序的协调性非常重要。 3.5.4 12864液晶的控制指令 12864共有18条控制指令,来对显示器写状态。现在详细分析液晶的显示集。 (1)清除显示 CODE:RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L L L L H 功能:清除显示屏幕,把DDRAM位址计数器调整为“00H”。 (2)位址归位 CODE:RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L L L H X 功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM。 (3)位址归位 CODE:RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L L H I/D S 功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM (4)显示状态 开/关 CODE:RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L H D C   B 功能: D=1;整体显示ON    C=1;游标ON    B=1;游标位置ON (5)游标或显示移位控制 CODE:     RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L H S/C R/L X   X 功能:设定游标的移动与显示的移位控制位:这个指令并不改变DDRAM的内容。 (6)功能设定 CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L H DL X 0 RE X   X 功能:DL=1(必须设为1)  RE=1;扩充指令集动作    RE=0:基本指令集动作。 (7)设定CGRAM位址 CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L H AC5 AC4 AC3 AC2 AC1 AC0 功能:设定CGRAM位址到位址计数器(AC)。 (8)设定DDRAM位址 CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:设定DDRAM位址到位址计数器(AC)。 (9)读取忙碌状态(BF)和位址 CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L H BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值。 (10)写资料到RAM CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 H L D7 D6 D5 D4 D3 D2 D1 D0 功能:写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)。 (11)读出RAM的值 CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 H H D7 D6 D5 D4 D3 D2 D1 D0 功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)。 (12)待命模式(12H) CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L L L L   H 功能:进入待命模式,执行其他命令都可终止待命模式。 (13)卷动位址或IRAM位址选择(13H) CODE:     RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L L L H   SR 功能:SR=1;允许输入卷动位址      SR=0;允许输入IRAM位址 。 (14)反白选择(14H) CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L L H R1   R0 功能:选择4行中的任一行作反白显示,并可决定反白的与否。 (15)睡眠模式(015H) CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L L L H SL X   X 功能:SL=1;脱离睡眠模式  SL=0;进入睡眠模式。 (16)扩充功能设定(016H) CODE:     RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L L H H X 1 RE G L 功能:RE=1;扩充指令集动作    RE=0;基本指令集动作  G=1;绘图显示ON  G=0;绘图显示OFF。 (17)设定IRAM位址或卷动位址(017H) CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L L H AC5 AC4 AC3 AC2 AC1 AC0 功能:SR=1;AC5~AC0为垂直卷动位址  SR=0;AC3~AC0写ICONRAM位址。 (18)设定绘图RAM位址(018H) CODE: RW  RS    DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0 L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0 功能:设定GDRAM位址到位址计数器(AC)。 3.5.5 12864液晶接口电路 本设计中显示器显示出电机的转动状态,正转、反转、速度等显示内容。本设计的液晶电路如图3-18所示。 图3-18  LCD连接电路图 此电路是液晶的驱动电路,使液晶显示电机状态,单片机的P1口为数据接口,P3.5及P3.6控制液晶的命令与数据传输。滑动电阻器用来控制液晶的亮度。 3.6 蜂鸣器模块 3.6.1 蜂鸣器介绍 蜂鸣器是一种常见的一体化结构的电子讯响器,采用直流电压供电,在计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中广泛应用。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示[15]。 3.6.2 蜂鸣器的接口电路 蜂鸣器有无源蜂鸣器和有源蜂鸣器之分。有源蜂鸣器在接通接通电源后,内部振荡器产生的音频信号电流通过电磁线圈,产生震荡,使蜂鸣器周期性发声。无源蜂鸣器需要通过外接信号震荡,从而使蜂鸣器发声。设计中使用的是无源扬声器,所以必须由单片机供给震荡信号。其连接电路如图3-19所示。 图3-19 蜂鸣器连接电路图 由于设计所用的是无源蜂鸣器,接PNP三极管以放大电流,单片机P0.0口用来发出脉冲以驱动蜂鸣器,每当按下遥控器的键盘时蜂鸣器都会发出声音。 4 软件设计与调试 4.1 主程序流程图 通过在遥控器上的指令输入,发出红外信号,设计中的TL1838接收到红外信号滤波并处理传送给单片机,单片机对所得到的信号进行解码,以判断所得命令的用意,来控制步进电机的转动以及显示器的显示。主程序流程图如4-1所示。 开始                         主程序输入 初始化 LCD显示 While循环 是否触发外 部中断0 定时器1是 否中断                               否                              否         产生脉冲 驱动电机                           是                              是 遥控解码 驱动蜂鸣器                         完毕 改变电机转动状态及相应显示             完毕                      结束                           图4-1 主程序流程图 设计中的程序主要是由中断函数来主宰。主要用了外部中断1,定时中断2,而主函数主要用来初始化和等待中断。当收到外部中断0的触发时,证明遥控器已发射信号需要解码,定时器2产生中断时来供给步进电机脉冲。 4.2程序设计思路     本设计的程序设计包括遥控的解码,显示屏的显示及步进电机的驱动。其中遥控发出的码位通过TL1838接收由单片机中程序解码并依此来控制步进电机及显示屏。 4.2.1 遥控器的解码 遥控器具有发射指令作用,由于本设计所用遥控器是任意电视遥控,其载频为38KHZ,所以需将遥控器的所有用到键位解码,得到相应键位编码后,将其键位编码放到单片机程序中,当遥控器向TL1838发射时,单片机又对其解码,如果其编码与单片机所存编码相同时即认定此为用户要发的命令,执行这个命令来控制显示器及步进电机。 由上所述,遥控器的解码很重要。遥控器发射32位码,当我想要知道其所用的键的编码时,必须编一个程序可以显示相应的键的编码。将TL1838连接到单片机的外部中断0口,当接受到所发信息后,TL1838会首先去掉其38K的载频,以此得到真正要发射的信息。由于发射的信息是二进制码,所以只包含1和0,又因为发射的1和0都包括高电平和低电平,只是其高低电平的时间不同,所以当外部中断采用脉冲触发时,每个码都会触发外部中断,当触发外部中断时,立刻开启定时器定时,以此判断1和0,同时把其编码发送到显示器上并记录,然后写到本设计的程序中。 在本设计中,识别遥控器的编码的程序思路与上面所述是相同的,只是设计中将其编码进行比较来判断。 4.2.2 步进电机的控制 在本设计中,当单片机发送一组步进电机识别的编码脉冲时,步进电机就会转动。所以在程序中,将其脉冲编码放在数组中,以供程序调用并控制电机。此脉冲编码共有8个状态,正反转是相同的只是其调用书序相反,需要注意的是调用时编码必须按顺序,其编码表为0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09。 当发送完这一串编码后,步进电机只转动45度,所以要转动一圈,需要调用8次,也就是说,转动一圈需要64个脉冲。要控制步进电机的速度,只需在每次发完编码表一次后,延时。步进电机的优点就是转动角位移准确,所以设计中用定时器发送脉冲,这样可以得到非常准确的转动速度。 设计中,用P2口发送脉冲编码,即把脉冲编码一个一个的通过P2口发送给步进电机。而此动作放在定时中断中,每次中断传送一个编码,这样步进电机优化了普通延时程序的不稳定、不准确等问题。 4.2.3 显示屏的控制 12864液晶是一种带存贮功能的器件,有4个显示行,每行可显示8个汉字、16个英文字符,一共有20个引脚,带有背光灯,亮度可以调节。 在控制显示屏的显示时,分为命令和数据的控制。无论是数据控制还是命令控制,都需要向显示器的数据口中写数据,此数据口为8位,在本设计中用单片机的P1口来传输。而写数据和写命令控制上的区别是RS和E引脚。写命令时控制方法是,RS置为0,E置为0,将要写命令通过数据口用单片机传输,然后将E置为1,即把命令写入显示器中。写数据时先将RS置为1,E置为0,将要写数据通过数据口用单片机传输,然后将E职位1,即把数据写入显示器中。 写命令和写数据是相互配合使用的。写命令是控制显示器的显示格式、显示位置、清屏、光标设置等,只有指定了上述的命令,才可以写数据写到自己满意的地方。写数据就是写命令之后把自己要显示的内容写到显示器中。 4.2.4 蜂鸣器的控制 设计中扬声器用的是无源蜂鸣器,用来指示遥控按键后单片机是否解码成功。无源蜂鸣器的声音往往大于有源蜂鸣器,所以本设计选用了无源蜂鸣器。 无源蜂鸣器和有源蜂鸣器程序上控制的区别在于有源蜂鸣器给正5V电压即可发出声音。而无源蜂鸣器必须有震荡,所以要发送高频脉冲。为了方便,设计中直接用延时函数并且0与1不停的连续发送。 4.2.5 模块中的通信 依前面所述,各模块都可以单独工作,但是要称为一个整体,就必须找到一个模块之间通信的方法。本设计用的是控制变量的方式来协调各模块的工作。 当遥控器发出命令后,TL1838接收并传送到单片机中,单片机接收并解码, 判断所发出命令。设置一个变量num,不同的遥控器按键给num不同的数值。通过这个num的数值,传递给步进电机和显示屏。在步进电机和显示屏中都用条件语句,来判断num的值并响应不同的动作。 程序运行初始化以后即进入While循环中,这是一个死循环。死循环的作用是等待,等待定时器1的中断,等待外部中断0的中断。其中设置定时器1的中断优先级高于外部中断0。把解码程序放入外部中断0中,驱动电机的程序放入定时器1中断中,再通过对变量的赋值的判断,即可完成整个设计的不同模块之间的通信。 5 编程与下载软件 单片机的正常运行需要程序的支持,一般使用汇编语言或C语言的编程,编译链接成.hex文件并下载到单片机中。Keil软件为用户提供了程序编辑、编译、链接、调试等功能,为用户提供一套完整的程序开发环境。但是keil生成的.hex文件必须依靠STC-ISP软件才能下载到STC89C52中。下面介绍Keil和STC-ISP的特点及使用方法。 5.1 Keil软件 随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统[16]。 应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存——建立工程并添加源文件——设置工程——编译/汇编、连接,产生目标文件——程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单File/New,在源程序编辑器中输入汇编语言或C语言源程序(或选择File/Open,直接打开已用其它编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm或.c;然后选择菜单Project/New Project,建立新工程并保存;工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面“+”号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择Add File to Group/Source Group1,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其它文件)。加入文件后点“close”返回主界面,展开“Source Group1”前面“+”号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project/Option for Target“Target1”(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,在Output选项卡中选中“Create Hex File”;其它选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。 Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 5.2 STC-ISP下载软件 STC-ISP 是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052系列和12C5410等系列的STC单片机,使用简便,现已被广泛使用。 下载步骤: (1)选择MCU类型:STC89C52RC; (2)选择串口及波特率; (3)打开编译好的.HEX文件; (4)点击“Download/下载”按钮,给单片机上电,消息框提示握手成功,几秒种后程序下载完毕,单片机自动开始运行下载的程序。 软件界面如图5-1所示。 图5-1软件界面 6 硬件电路制作 本次论文设计的原理图绘制和PCB制作所采用的软件是Altium Designer 10 PCB线路设计系统。Altium Designer 10 作为从Protel系列发展起来的新一代办卡机设计软件,以windows Xp界面风格为主,同时,Altium Designer 10 独一无二的DXP技术集成平台也为设计系统提供了所有工具和编辑器的相容环境[17]。 Altium Designer 10 是一套完整的板卡级设计系统,真正的实现了在单个应用程序中的集成。该设计系统的目的就是为了支持整个设计过程。Altium Designer 10 具有可靠的稳定性,增强的图形功能和超强的用户界面,设计者可以选择最适当的设计途径,以最优化的方式工作。 6.1 原理图的绘制 (1) 创建一个新的项目文件 依此执行File    New    Project    PCB Project命令新建一个PCB项目。保存后新建原理图文件,依次执行File    New    Schematic即可创建。 (2) 加载元件库 在电路图放置元件之前,必须先加载库文件。执行主菜单的DESIGN|ADD REMOVE LIBRARY命令或单击左侧设计管理器的ADD|REMOVE按钮。 (3) 绘制电路图 放置元件、绘制导线、放置电源部件、放置电气连接点、放置文字标注。 (4) 修改元件参数 (5) 保存原理图 6.2 电路实现的基本步骤 (1)单片机方案设计。把所要完成的设计分成几个模块,确定各模块的功能,编辑程序并调试。最好可以用Proteus软件进行仿真,虽然并不能代表实际电路的运行结果,但是如果仿真通不过,是很难在具体电路中实现的。 (2)电路原理图:利用电路设计软件,将方案用标准的电路原理图表示,为电路板图的生成提供依据。在设计电路原理图时,必须规划好每一模块的功能,考虑到输入、输出之间的隔离以免产生干扰。因为原理图是制板的依据,对于正确的电路焊接起着关键性作用。本系统的原理图绘制和PCB绘制都是在Altium designer10中完成。 (3)制板:根据电路原理图,网上买元器件进行焊接。焊接时需要注意元器件的引脚不要太长,否则将影响电路的稳定性,尤其是晶振的引脚,如果过长会使晶振不起振。锡点也不能过大,有可能给电路带来很严重的隐患。当进行焊接时,由于电烙铁的温度很高,焊接过程中动作要迅速,否则会损坏元器件。 (4)程序的烧录和调试。调试是一个很麻烦的过程,一件复杂的设计调试更为复杂,要学会各种仿真与调试的方式,在编辑环境中要学会使用断点、单步等调试方法。 硬件电路实物图如图6-1所示。 图6-1 硬件电路实物图 图6-1包括了本次设计用到的所有模块与芯片:电源插头一个,电源线一根,遥控器一个,TL1838一个,12864显示屏,STC89C52单片机一个,步进电机,ULN2003芯片,晶振一个,4.7K电阻若干,杜邦线若干。 设计正常运行后,显示屏的运行状态如图6-2所示。 图 6-2 液晶屏的显示 液晶屏的第一行显示“步进电机控制系统”,第二行显示速度,第三行显示速度档位,最后一行显示速度方向。 设计正常运行后,步进电机的运行状态如图6-3所示。 图6-3 液晶屏的显示 正常运行后步进电机转动速度非常稳定,严格依据脉冲速率来转动。转动时有三个档位,两个转动方向。 7 结 论 在本设计过程中,完成了基于单片机的步进电机的系统设计与实现。通过这次实践,了解了电子设计的实现过程,并且学到了很多没接触过的知识。在设计过程中,翻阅了大量书籍,也通过网上的许多资料,掌握了单片机的设计方法,加强了动手能力。在这次实践中,不仅丰富了我的知识还开阔了我的视野。 在设计过程中,我了解到电子设计需要细心,耐心,上进心。要通过自己的努力与毅力不断的完善设计。对于电路的焊接与设计,一定要细心,一点小错误都会导致系统的瘫痪。在程序的编写上,要耐心,对每个模块都要设计周到,尽量做到最好。最让人无奈的是系统的调试,一些无理由的错误让人非常无奈,自己的想法和设计的结果不相对应时,自己是无助的。所以向老师与同学求助非常重要,通过他们宝贵的建议不断完善自己的作品。 与此同时,我了解到单片机是学习一切微处理器的基础,它虽然在当今应用没有明显优势,但重要的是它可以作为我们学习更强大处理器的必不可少的跳板。在学习单片机时,Proteus仿真软件也是非常重要的,它可以为自己节约大量的时间。对于一项不错的电子设计,电路图是必不可少的,现在比较厉害的电路图软件是Protel系列和Altium系列。对于本次设计用的软件是Altium Designer10,是一款从Protel系列升级的板卡级绘图软件。 本次设计依然存在着很多不足,比如程序响应速度不够快,有时会乱码等,需要更深一层次的学习。我将会不断的努力,从书本、网络上吸取精华,通过自己的实践,努力使自己成为可以为社会做出贡献的人。 谢  辞 写到这里,毕设论文差不多已至尾声;白驹过隙,我四年的大学生活也将敲响结束的钟声。分手在即,站在人生的又一个转折点,我需要感激的很多。 在毕设期间,王志秦老师不辞辛劳地在资料收集、设计构思的过程中多次给我指点,而且在硬件电路的搭建过程中也屡屡给了我帮助。老师温和亲切的性格和细心踏实的风格都给了我很多积极地影响。我亲爱的父母,大学四年来与我一起学习的同学、师长、朋友们在学习生活中给予了我许多帮助,是他们教会了我专业知识,教会了我怎样学习,教会了我怎样做人。  在此,我要对我的指导师表以深深的感谢,感谢其对我的耐心教导,亲切关怀,热情鼓励。感谢杨金泉老师在毕设硬件上给予我莫大的帮助。感谢柳延领老师给我们提供实验室这一良好的毕设环境。衷心感谢同学、师长、朋友们陪我度过四年的快乐时光。感谢的话说也说不完,但再多的话也不够表达我对大家最诚挚的感激与动情! 感谢我遇到的每一个人,是他们一直帮助我成熟,帮助我成长,也一直见证我的成熟和我的成长,谢谢。即将踏入社会,你们带给我的每一次的感动和欢笑都会是我最美好的财富,感谢我迄今为止遇到的每一个人,谢谢! 参考文献 [1] 刘志永.浅析步进电机的PLC控制技术与发展趋势[J].科技资讯,2006,(27) [2] 朱宇,王伟.步进电动机的应用[M].西安微电机研究所,2005.2 [3] 李群芳.单片机原理接口及应用—嵌入式系统技术基础.清华大学出版社.2005,33-35 [4] 夏易路.单片机技术基础 教程 人力资源管理pdf成真迷上我教程下载西门子数控教程protel99se入门教程fi6130z安装使用教程 与实现.[M].北京:电子工业出版社.2008,1:152-164 [5] 赵德安.单片机原理与应用(第二版)[J].机械工业出版社,2009.04 [6] I. Scott MackKenzie.STC89C52RC DataSheet[M].USA.Prentice-Hall.Inc,1995.04 [7]  张毅刚,彭喜元.单片机原理与应用设计[J].电子工业出版社,2010.08 [8] 华大龙,杨晔,潘汉怀.步进电动机原理及其驱动电路研究[J].电子工业出版社,2009.07 [9] 杨宜民. 新型驱动器及其应用[M ].机械工业出版社, 1997.01 [10] 孙平,邢军.PLC控制步进电机驱动系统[J].河南师范大学学报(自然科学版),2001,(4). [11] 邱玉春,李文俊.单片机系统中的红外通信接口[J].电子产品世界.2000 [12] Mark1.Montrose.PRINTED Circuit Board Design Techniques for EMC compliance.IEE Pressseries,2000,12 [13] 刘同法,陈忠平等.单片机外围接口电路与工程实践[M].航天航空大学.2009,3:299-310     郭天祥 [15] 李群芳,肖看.单片机原理、接口及应用[M].北京:清华大学出版社,2005.3 [16] 王为青,程国钢.单片机Keil Cx51应用开发技术.人民邮电出版社.2006,12:197-202 [17] 王渊峰,戴旭辉.Altium Designer10电路设计标准教程[M].科学出版社.2012.01 附  录 附录一 硬件原理图 附录二 程序 /*-----------------------------------------------         #include         #include /*----------------------------------------------- 端口定义及数据类型定义 ------------------------------------------------*/         #define uint unsigned int         #define uchar unsigned char            #define DataPort P1           sbit RS  =  P3^0;            //寄存器选择输入           sbit RW  =  P3^1;            //液晶读/写控制           sbit E  =  P3^3;            //液晶使能控制           sbit PSB =  P3^4;                  sbit IR=P3^2;           sbit BEEP=P0^0;           uchar LowTime,HighTime; //储存高、低电平的宽度           uint num;           uint num1=0;           uint num2=1;           uchar num3=0;           uchar num4=0;         uchar code mottor1[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};         uchar code mottor2[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; /*-----------------------------------------------       遥控编码的存储 ------------------------------------------------*/         uchar a[4];         uchar b=0xF8;         uchar c=0xF4;         uchar d=0xF0;         uchar f=0xEC;         uchar g=0xE8;  //储存用户码、用户反码与键数据码、键数据反码 /*------------------------------------------------ ------------------------------------------------*/       void DelayUs2x(unsigned char t)     {      while(--t);     }                    void delay1ms()         {                                    unsigned char i,j;                for(i=0;i<10;i++)             for(j=0;j<33;j++)                     ;                  }           void Delay(unsigned char n)           {               unsigned char i;               for(i=0;i>1;  //temp中的各数据位右移一位                TH0=0;        //定时器清0                 TL0=0;        //定时器清0                 TR0=1;        //开启定时器T0                 while(IR==0)  //如果是低电平就等待                   ;          //低电平计时                   TR0=0;        //关闭定时器T0                 LowTime=TH0*256+TL0;    //保存低电平宽度                   TH0=0;        //定时器清0                   TL0=0;        //定时器清0                   TR0=1;        //开启定时器T0                   while(IR==1)  //如果是高电平就等待                       ;                                TR0=0;        //关闭定时器T0                   HighTime=TH0*256+TL0;  //保存高电平宽度                   if((LowTime<370)||(LowTime>640))                   return 0;        //如果低电平长度不在合理范围,则认为出错,停止解码                              if((HighTime>420)&&(HighTime<620))  //如果高电平时间在560微秒左  右,即计数560/1.085=516次                   temp=temp&0x7f;      //(520-100=420, 520+100=620),则该位是0                 if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次                   temp=temp|0x80;      //(1550-250=1300,1550+250=1800),则该位是1                 }                                      a[i]=temp;    //将解码出的字节值储存在a[i]                                                                                                }                                    if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码           return 1;    //解码正确,返回1           } /*------------------------------------------------               初始化函数 ------------------------------------------------*/         void LCD_init()   {          Delay(40);          //大于40MS的延时程序         PSB=1;                //设置为8BIT并口工作模式         Delay(1);            //延时         Delay(1);            //延时                      Delay(10);         Write_Cmd(0x30);      //选择基本指令集         DelayUs2x(50);        //延时大于100us         Write_Cmd(0x30);      //选择8bit数据流           DelayUs2x(20);        //延时大于37us           Write_Cmd(0x0c);      //开显示(无游标、不反白)           DelayUs2x(50);        //延时大于100us           Write_Cmd(0x01);      //清除显示,并且设定地址指针为00H           Delay(15);          //延时大于10ms           Write_Cmd(0x06);      //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动           DelayUs2x(50);        //延时大于100us }           void init()           {                       EX0=1;      //开外中断0             ET0=1;      //定时器T0中断允许               IT0=1;      //外中断的下降沿触发                              TR0=0;      //定时器T0关闭               TMOD=0x11;               TH1=(65536-2500)/256;               TL1=(65536-2500)%256;               EA=1;ET1=0;  TR1=1;               } /*------------------------------------------------           显示函数 ------------------------------------------------*/         void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s) { switch(y)     {       case 1: Write_Cmd(0x80+x);break;       case 2: Write_Cmd(0x90+x);break;       case 3: Write_Cmd(0x88+x);break;       case 4: Write_Cmd(0x98+x);break;       default:break;     } while(*s>0)   {       Write_Data(*s);       s++;       DelayUs2x(50);   } }       void xianshi()           {             LCD_PutString(0,1,"步进电机控制系统");             LCD_PutString(0,4,"  方向:");             if(num3==1) LCD_PutString(4,4,"RIGHT");             else LCD_PutString(4,4,"LEFT ");                  if(num2==0)             {LCD_PutString(0,2,"  速度:15 t/m");             LCD_PutString(0,3,"  速度ONE      ");             }           else if(num2==2)           {           LCD_PutString(0,2,"  速度: 4t/m ");           LCD_PutString(0,3,"  速度TWO      ");                     }           else           {           LCD_PutString(0,2,"  速度: 2t/m");           LCD_PutString(0,3,"  速度THREE    ");           }                        }         /*------------------------------------------------                       清屏 ------------------------------------------------*/     void LCD_clear()     {         Write_Cmd(0x01);         Delay(15);     } ------------------------------------------------           主函数 ------------------------------------------------*/                             void main()           {                     init();                   LCD_init();                   PT1=1;                   ET1=1;                   xianshi();                   TR1=1;                   while(1);             } /*------------------------------------------------         遥控器的控制中断函数 ------------------------------------------------*/                             void Int0(void) interrupt 0                 {                      ET0=0;                   EX0=0;  //关闭外中断0,不再接收二次红外信号的中断                     TH0=0;      //定时器T0的高8位清0                     TL0=0;      //定时器T0的低8位清0                     TR0=1;        //开启定时器T0                        while(IR==0);          //如果是低电平就等待,给引导码低电平计时                     TR0=0;                //关闭定时器T0                        LowTime=TH0*256+TL0;  //保存低电平时间                     TH0=0;      //定时器T0的高8位清0                     TL0=0;      //定时器T0的低8位清0                     TR0=1;        //开启定时器T0                     while(IR==1);  //如果是高电平就等待,给引导码高电平计时                     TR0=0;        //关闭定时器T0                     HighTime=TH0*256+TL0;    //保存引导码的高电平长度             if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))                   {                    //如果是引导码,就开始解码,否则放弃,引导码的低电平计时                 //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.                     if(DeCode()==1) // 执行遥控解码功能                     {                          ET1=1;                       PX1=1;                       if(!(a[2]^b))                       {                         num2=0;                         beep();                       }                       else if(!(a[2]^c))                       {                         num2=2;                         beep();                       }                       else if(!(a[2]^d))                       {                         num2=6;                         beep();                         }                         else if(!(a[2]^f))                         {                           num3=~num3;                           beep();                         }                       else  if(!(a[2]^g))                       {                           TR1=~TR1;                           beep();                       }                       xianshi();                       xianshi2();                     }                   }                 EX0=1;  //开启外中断EX0                 } //--------------------------------------------------------------------------         步进电机驱动终端函数 //--------------------------------------------------------------------------             void T1_tim() interrupt 3             {                  TH1=(65536-1000)/256;               TL1=(65536-1000)%256;               if(i>7)i=0;               if(num1>num2)                 {                        num1=0;                   if(num3==0)                     P2=mottor1[i++];                   else P2=mottor2[i++];                       }                    num1++;                    } //--------------------------------------------------------------------------
本文档为【毕业设计:基于STC89C52单片机的步进电机控制系统设计与实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_888153
暂无简介~
格式:doc
大小:661KB
软件:Word
页数:37
分类:生活休闲
上传时间:2017-09-19
浏览量:66