为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于单片机红外发射步进电机控制系统设计毕业设计说明书

2018-09-23 50页 doc 9MB 14阅读

用户头像 个人认证

北溟愚鱼

暂无简介

举报
基于单片机红外发射步进电机控制系统设计毕业设计说明书盐城工学院本科生毕业设计说明书( 2013) 盐城工学院本科生毕业设计说明书( 2010) 毕业设计说明书 基于单片机红外发射步进电机控制系统设计 专业 学生姓名 班级 学号 指导教师 完成日期 毕业设计说明书 独创性声明 本人声明所呈交的毕业设计说明书是本人在导师指导下进行的研究、设计工作后独立完成的。除了文中特别加以标注和致谢的地方外,说明书中不包含其他人己经发表或撰写过的研究成果。对本文的研究所做贡献集体和个人,均己在说明书中作了明确的说明并表示谢意...
基于单片机红外发射步进电机控制系统设计毕业设计说明书
盐城工学院本科生毕业设计说明书( 2013) 盐城工学院本科生毕业设计说明书( 2010) 毕业设计说明书 基于单片机红外发射步进电机控制系统设计 专业 学生姓名 班级 学号 指导教师 完成日期 毕业设计说明书 独创性声明 本人声明所呈交的毕业设计说明书是本人在导师指导下进行的研究、设计工作后独立完成的。除了文中特别加以标注和致谢的地方外,说明书中不包含其他人己经发或撰写过的研究成果。对本文的研究所做贡献集体和个人,均己在说明书中作了明确的说明并表示谢意。本人完全意识到本声明的法律后果由本人承担。 毕业设计说明书作者签名: 日期: 年 月 日 指导教师签名: 日期: 年 月 日 基于单片机红外发射步进电机控制系统设计 摘 要:介绍了一种基于STC89C52单片机红外发射步进电机控制系统的设计,整个设计主要是涵盖了硬件设计和软件设计,硬件设计部分包括红外发射电路设计和红外接收电路的设计,其中红外发射部分包含设计单片机最小系统、独立式键盘、红外线发射电路,红外接收部分包含设计单片机最小系统、液晶显示屏(LCD)电路、步进电机驱动电路、红外线接收电路。软件设计方面主要涵盖红外编码和解码、步进电机驱动程序、LCD显示程序、独立式键盘程序等等。 整个设计的系统功能是通过红外发射电路发射不同的载波编码,红外接收电路将这些红外信号接收到之后进行软件解码进而来控制步进电机的正转、反转、加速、减速、启动、停止,在同一时间步进电机的工作状态,通过液晶显示器(LCD)清晰的显示出来,这样我们就可以更加清楚地看到步进电机的实时运行状态了。 整个系统采用了分块步进的方法进行设计,按模块设计调试,把每个模块独立调试成功后,最后再结合一起,有效的防止大问题发生,避免了互相影响而出现误差的情况,使系统更加稳定和精确,经过最后实物的调试运行,整个系统运行良好,工作正常,要求的各项功能都能很好的完成,稳定性很好. 关键词:AT89C52单片机;步进电机;红外遥控;液晶显示屏 Design Of The Control System Of Single-chip Stepper Motor Based On Infrared Emission Abstract:Introduced a single-chip design STC89C52 infrared emission control system based on stepper motor , designed primarily covers the entire hardware and software design , hardware design , including infrared transmitter circuit design and infrared receiver circuit design , which includes the design part of the infrared emission smallest single-chip system , separate keyboard , infrared transmitter, infrared receiver section contains the smallest single-chip system design , LCD display (LCD) circuit , stepper motor drive circuit , infrared receiver circuit . Software design covers mainly infrared encoding and decoding , stepper motor drivers , LCD display program, separate keyboard procedures. Function of the whole system is designed to transmit via infrared transmitter circuit different carrier encoding these infrared receiver circuit after receiving the infrared signal decoding software to control the stepper motor and then forward, reverse , acceleration, deceleration , start , stop , at the same time work status stepper motor through the liquid crystal display (LCD) clearly displayed , so that we can see more clearly the real-time operating status of the stepper motor . The entire system uses a method of stepping block design, module design by commissioning an independent after the successful commissioning of each module , and finally combined together , effectively prevent big problems , to avoid the emergence of error conditions affect each other , so system more stable and precise , after the last kind of commissioning , the entire system is running well , work, the functional requirements can be well done , good stability . KeyWords: AT89C52 microcontroller ; Stepper motor ; Infrared remote control; Liquid crystal display 目 录 11. 概述 11.1 课题研究背景 11.2 课题研究的意义 11.3 课题研究的主要内容 22. #设计#确定及设计原理 22.1 整体设计原理 22.2 红外技术原理 32.3 红外发射端原理 32.4 红外接收端原理 43 系统硬件设计与实现 43.1 微机系统电路 43.1.1 STC89C52单片机介绍 53.1.2 时钟电路设计 53.1.3 复位电路 63.2 红外线发射电路 73.3 独立式键盘电路设计 83.4 红外线接收电路 93.5 LCD1602液晶显示屏模块电路 103.6 步进电机电路 134. 系统软件设计 134.1 红外编码子程序设计 154.2 按键子程序设计 154.3 LCD显示电路程序设计 164.4 红外线解码判断子程序设计 164.5 步进电机控制程序 175. 系统调试与测试 175.1 软件调试与测试 175.2 硬件调试与测试 195.3 结论 206. 结束语 21参考文献 22致 谢 24附 录 24附录1.基于单片机红外发射步进电机控制系统设计电路原理图 25附录2.基于单片机红外发射步进电机控制系统元件清单 26附录3. 基于单片机红外发射步进电机控制系统设计源程序 基于单片机红外发射步进电机控制系统设计 1. 概述 1.1 课题研究背景 此次课题设计的思想是基于单片机来控制红外线发射从而遥控步进电机的运动状态。目前在我们生活的各个领域中单片机已经大面积的渗透进去了,想找一个没有单片机的领域已经几乎不可能找到了。比如许许多多导弹上的导航配置,各种各样装备上的仪表控制操作,网络通信以及一些基于计算机的数据传输,自动化过程中的对数据的分析和时时检测,遍及广泛的多种多样IC卡,小型车的平安保护系统,Cameras、 video recorders、Automatic washing machine,还有一些遥控玩具、电子器件等等,以上提到的设备中单片机在里面都起着独一无二的作用,可以说离开单片机这些都玩不转。况且近年来,经济的迅猛发展使得科学技术也得到了很大的发展空间,最明显的改变就是人们的各方面都有了显著的提高尤其是在生活质量方面,现在普通人的家里都有了各种各样的远程控制设备,这已成为人们生活中不可或缺的手段,因为远程控制具有低功耗、低成本等许多优点,因此现在好多家用电器都采用红外遥控的方式。所以通过本课题的设计和研发会对未来具有很大的意义和价值! 1.2 课题研究的意义 此次研究的课题其最大的意义,是着重的体现了自动化专业的本质,有很强的结合力,智能控制。并且将大学四年学习到的单片机课程的知识付诸到实践中去研究,十分透彻完全的了解到了单片机的红外遥控技术和控制方法。此外,通过本次设计,更可以提高自己的动手能力,而且实践能力也得到了提高。 1.3 课题研究的主要内容 本课题是基于单片机红外发射步进电机控制系统设计,整个红外遥控以STC89C52单片机为核心来控制步进电机的运动状况,主要功能是利用独立的按键来控制步进电机的运行方向(反转、正转)和转速(速度加快、速度减慢)。整个设计由红外发射和红外接收二个部分组成。单片机最小系统、红外线接收电路、步进电机驱动电路、液晶显示屏(LCD)电路一起组成了红外接收部分;红外发射模块则由单片机最小系统、红外线发送电路、独立式键盘电路所构成。 2. 设计方案确定及设计原理分析 2.1 整体设计原理 遥控编码和解码集成电路是现今市场上面比较常用的。因为这样制作起来比较简单,但由于其功能键的数量和功能的制约,应用的具有一定的局限性,只是适用于特定的应用程序,整体来说它的范围是有限的。而本课题的红外遥控以单片机为核心来进行设计的,这样的设计具有很多的优点例如灵活的编程、可以随意的设定操作码数量的多少等。整体的设计原理是当一个按钮被我们按下的时候,单片机识别的其关键特性,找到代表其的一段二进制数,然后进行编码,之后将这一段脉冲信号与CPU发出的38 khz频率的载波二次调制,经缓冲放大,便可以激发红外发光二极管的功能即将电能转化为光能,这样红外发光二极管就能发射38Khz频率红外线了,然后发射的红外信号就会被红外接收端给接收到,然后单片机反编码信号,确定控制信号,从而实现控制电路的控制功能,从而完成远程控制。 2.2 红外技术原理 在光学领域红外线是不可见光,是频率低于红色的光,在无线电频谱中,红外光波的频率很小,波长在0.75 – 100us之间的是红外光,这其中近红外光位于0.75—3us之间,中红外光位于3—30us之间,远红外光位于30—100us之间。事实上,红外光其本质是很简单,与普通光的频率特性并没有太大的区别,但是,由于热物体会有能量的产生,所以在红外方面应用技术是非常流行的,而且无法被替代掉,红外是否可以被检测到、有多少红外可以被检测到或者红外检测的技术能否应用于所有自然的或者想象的地方在红外技术应用中是特别重要和首要考虑的。现如今红外通信技术的应用是红外技术的一个重要分支,其发展势头非常的迅猛、快速,尤其是在计算机设备中的红外通信技术的应用,经过这几年的发展已经表现的非常稳定、成熟! 无线远程控制方法主要涵盖以下几种:无线电波、超声波、声控和红外线等方式。其中因为无线电容易对其它的无线电通讯设备造成信号干扰,而且,无线系统本身的抗干扰的性能也是很差,误差会很多,所以这个方式并未能广泛的应用。此外,超声波遥控,其带宽不宽,外部信号很容易对其进行干扰,而且最终方式精度低、抗干扰能力差和语音识别困难,因此也没有用。最后,红外遥控方式是经过红外光来传送信号的,而且近年来科学技术的发展以及单片机的广泛应用使得红外遥控系统得到了很大程度的发展。并且,红外遥控的优点也非常多,比如发射装置的红外线发射二极管价格低廉;数字信号编码与二次调制使得信号传输抗干扰性增强,降低的失误率,功率消耗量降低;不会对其他信号产生干扰;响应速度快、稳定性高、传输效率高等。所以现在这种方法用在许多无线遥控中! 2.3 红外发射端原理 红外遥控发射部分大体上由STC89C52单片机、时钟电路、复位电路、电源、独立式键盘电路以及红外线发射电路等构成。 当独立式键盘电路由按键按下的时候,单片机可以检测到对应端口的一个信号,然后单片机将键对应的操作编码后通过红外发射电路发射出去,这样便完成了一次红外数据的发射。其工作原理框图如图2-1所示。 图2-1 红外发射端工作原理框图 2.4 红外接收端原理 红外遥控接收端则大体上由STC89C52单片机、时钟电路、复位电路、电源、红外接收电路和步进电机控制电路、LCD1602状态显示电路等组成。 当红外接收头HS0038接收到来自发射端的红外信号后,此时接收端的单片机就对接收到的红外信号进行解码,并将其所对应的操作交予步进电机的控制电路对步进电机进行状态控制,这样便实现对步进电机的转向和速度的控制。红外接收端的工作原理框图如图2-2所示。 图2-2红外接收端工作原理框图 3 系统硬件设计与实现 3.1 微机系统电路 3.1.1 STC89C52单片机介绍 STC89C52是一个高性能、低电压的CMOS8位单片机,随机存取数据存储器(RAM)为256bytes,片内含有8Kbytes的可反复擦写的Flash只读程序存储器(PEROM),整个器件采用美国ATMEL公司的非易失性,高密度存储技术生产,兼容MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,STC89C52单片机在如今电子行业中有着广泛的应用。 STC89C52单片机使用的内核是行业标准的C51内核,引脚配置和内部函数跟普通8XC52相同。主要引脚:XTAL1(引脚18)、XTAL2(引脚19)为振荡器的输出输入端口,外部晶振为12MHZ。RST(9脚)为复位输入端口,是衔接复位电路的端口。VSS(20脚)和VCC(40脚)为单片机供电端口,他们分别接地和+5V电源的正极。通用I/O端口P0~P3端口,其功能由软件定义。 其主要特性如下: a)加强型8051单片机,6机器/时钟周期和12机器/时钟周期可以任意选择,指令代码完全兼容传统8051。 b)工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)。 c)工作频率范围:0~40MHZ,相当于普通8051的0~80MHZ,实际工作频率可达48MHZ。 d)用户应用程序空间为8K字节。 e)片上集成512字节RAM。 f)通用I/O口(32个),复位后为:P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。 g)ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RXD/P3.0,TXD/P3.1)直接下载用户程序,数秒即可完成一片。 h)具有EEPROM功能。 i)具有看门狗功能。 g)共3个16位定时器/计数器。即定时器T0、T1、T2。 k)外部中断4路,下降沿中断或低电平触发电路,POWER DOWN模式可由外部中断低电平触发中断方式唤醒。 l)通用异步串行口(UART),还可用定时器软件实现多个UART。 m)工作温度范围:-40~+85摄氏度(工业级)/0~75摄氏度(商业级)。 n)PDIP封装。 AT89C52的引脚图如图3-1所示。 图3-1 AT89C52RC引脚图 3.1.2 时钟电路设计 MCS-51单片机在工作时务必要有时钟控制信号来控制其内部电路严格的执行指令进行工作,而这种时钟信号便是由时钟电路发出的。执行指令时在时钟电路产生一系列控制信号下CPU取出所需要的指令操作码在程序存储器中并且进行译码完成指令所规定的动作。CPU的定时信号有两种,一种是用来控制芯片上的内存或I / O端口,其他的用来对各种功能元件的芯片进行控制。 MCS-51单片机各功能单元的操作是以时钟信号为准的,有条不紊的进行工作着,因此时钟频率直接影响单片机运行的速度,而且单片机系统的稳定性也会受到时钟电路质量的影响。内部时钟和外部时钟是最常见的时钟电路设计方式。 在一般情况下,单片机都使用内部时钟方式,外接一个振荡电路,本课题设计选用内部时钟方式,如图3-2所示电路。 图3-2 STC89C52晶振电路 3.1.3 复位电路 无论是哪种型号的单片机,在其被应用时总会有复位电路的设计。而复位电路设计的好不好、质量过不过关都会对系统的稳定性造成很大的负面影响。很多在实验室调试好的并且设计的也很好的单片机系统拿到了现场进行演示时就会出现很多失败的现象比如“死机”、“程序走飞”等等,而造成这种现象发生的就是由于单片机的复位电路设计的不好,运行起来不稳定。 单片机的复位及其操作是非常重要的。可是,单片机本身是不能进行自主复位的,因此其务必跟对应的外部电路进行相互协作这样才会发出复位信号,从而完成复位操作。上电复位和按键复位是复位操作的二种方式。 a)上电复位:STC89系列单片机的复位引脚连接到电源端(VCC)上串接个电容器,然后连接到地端(GND)上加一个电阻,这样一个RC充放电回路便构造好了,从而确保有充足的时间使单片机在上电时复位(RST)时引脚上存在高电平来进行复位,使系统再次回到低电平的正常工作状态,电路设计中所用电阻和电容通常选择10K和10uF。 b)按键复位:按键复位便是在上电复位的电容上并联一个开关,开关闭合时电容便开始放电,复位引脚(RST)将处于高电平,由于电容充电,因此高电平的状态会持续一段时间用来确保单片机进行复位。本设计系统选用的是上电复位方式,其电路如图3-3所示。 图3-3 STC89C52上电复位 3.2 红外线发射电路 红外线发射管选用了普遍使用的TSAL6200。红外发射管也被称为红外发光二极管,属于半导体类。它是发光元件,能将电能转换成近红外光(不可见光)并发射出去是其主要的能力,在各种光电开关及遥控电路中被泛所用。红外线发射管与普通发光二极管没有太大的区别特别在结构与原理上,红外发光二极管通常使用砷化铝镓,砷化镓这些材料,并且用透明或黑色、浅蓝色的树脂进行封装。 工作原理:基于单片机来控制红外线发射管,用不同的脉冲间隔时间来表示不同按键的编码值,然后二次调制成38kHz信号由红外线发射管发射出去。红外线发射管TSAL6200如图3-4所示: 图3-4 红外线二极管TSAL6200实物图 红外线发射管与单片机接线图如图3-5所示: 图3-5红外线发射管与单片机接线图 3.3 独立式键盘电路设计 用I/O线组成的单个按键电路被称为独立式键盘,其中每个独立式按键都分派到一根I/O口线,每个I/O口线所接的按键工作状态都保持互不干扰、独立的工作状态,由于其结构简单,易于设计所以大多数设计都选择独立式键盘电路。 单个输入比较适合用独立式键盘,每个按键都有与之对应的 I/O 口,只要查询 I/O 口的高低电平就可以确定按键的状态。其由行线和列线构成,按键安放的地方是行、列的交叉点,按键开关的两端分别连接到行线、列线,按键个数等于行数乘以列数,这样的设计可以大大节省使用的I / O端口,它一般用于按键数目较多的电路中。常用行扫描法、列扫描法和线翻转法来查询按键的状态。 使用按键时,必须要考虑的消除按键抖动的影响,消除按键抖动简称按键消抖,主要方法分为硬件消抖和软件消抖。硬件消抖涵盖RC滤波电路,单稳态电路和双稳态电路,双稳态的RS触发器电路是目前用的最多且效果最好的。软件消抖也就是延时消抖,节省硬件资源,使用广泛。此次设计选择了软件消抖。 在本设计系统中,由于不需要很多按键,I/O 口又有大量剩余,系统采用了一五个独立按键开关 S5、S6、S7、S8、S9,每个按键都有一个独立的操作与之对应,即每个按键控制步进电机的一个状态,其电路如图3.4所示。当键S5被按下时,对应的操作为“右转”(正转),步进电机正转;当键S6被按下时,对应的操作为“左转”(反转),步进电机反转;当键S7被按下时,对应的操作为“减速”,步进电机减速;当键S8被按下时,对应的操作为“加速”,步进电机加速;当键S9被按下时,对应的操作为“停止”,步进电机停止.独立式键盘电路与单片机连接图如图3-6所示: 图3-6 独立式键盘电路与单片机连接图 3.4 红外线接收电路 红外线接收头(又称红外线接收模组,IRM)是集成红外线接收PD二极管、放大、滤波和比较器输出等IC模块。红外线接收头可以接受的频率有36,37.9,40,56.7Khz这么几种,用户可按照需求的不同来选择使用不同接受频率的红外接收头,现如今红外接收头已经被广泛应用在各种家用电器中了,因为它不需要再制作接收放大电路,因此很大程度上简化了电路。 常用的红外接收头的外形,均有三只引脚,分别为电源负(GND) 、电源正(VDD)和数据输出(Out)。接收头的引脚排列因型号和外形的不同而有着一点点小小的区别。 普通的红外接收头主要参数如下: 工作电压:2.7~4.5V 工作电流:1.7~2.7mA 接收频率:37.9kHz 峰值波长:940nm 静态输出:高电平 输出低电平:≤0.4V 输出高电平:接近工作电压。 红外线引脚图如图3-7所示: 图3-7 红外线接收头引脚图 红外接收模块采用基于HS0038红外接收器为核心的设计系统。HS0038是一种常用的红外接收头,因为其集接收电路,低通滤波,调制和解调电路,放大电路和控制电路作为一个整体,方便,简单,实用。HS0038接收头一共有三个引脚输出分别是输入、输出、电源,一目了然,大大的方便了我们的使用。HS0038接收头内部构造如图3-8所示。 图3-8 HS0038红外接收头内部构造图 因为HS0038集成了巨大的信号处理功能,所以本设计中只需直接将它与单片机连接便OK了,具体应用电路图如图3-9所示。 图3-9 HS0038应用电路图 本设计主要是采用HS0038红外接收头实物如图3-10。 图3-10 红外接收头HS0038实物图 3.5 LCD1602液晶显示屏模块电路 在这个系统中,我用LCD1602字符液晶显示模块来显示步进电机各种运动状态。液晶显示屏(LCD)具有很多优点,如体积小、微功耗、小巧轻薄、显示的内容丰富等,广泛的应用各个领域中,特别是在低功耗和便携式仪表系统。 LCD1602有16个标准的引脚接口,其中VDD接5V电源正极,VSS接地端,液晶显示器调节对比度的端口为V0,接地电源时对比度最高,接正电源时对比度最弱,对比度过高的时候显示屏会产生“鬼影”,为使显示屏的显示达到最佳效果,显示电路可以通过在V0与VCC之间加一个10K的电位器进行对比度调节从而使显示可以调节到自己想要的那个最佳显示状态。VSS与BLK之间可以接三极管NPN,让三极管NPN做开关,控制液晶显示屏的开关,可以用于省电模式。LCD1602实物引脚图如图3-11所示。 图 3-11 LCD1602实物引脚图 LCD1602与单片机连接图如图3-12所示。 图3-12 LCD1602与单片机连接图 3.6 步进电机电路 3.6.1 步进电机介绍 步进电机可以将电脉冲信号转变为线位移或角位移。当它处于非超载的情况下时,电机停止的位置、速度仅依赖于脉冲和脉冲频率信号的数目,它独立于负载的变化,每当步进电机驱动器接收到一个脉冲信号,步进电机就向设定的方向旋转一个固定的角度,称为“步距角”。由于存在的这种线性关系,而且步进电机具有不累计误差只有周期性误差等特点。使得在速度、位置等领域用步进电机来控制将会变得非常容易。虽然步进电机已被广泛所用,但它不能在常规下使用就像普通的直流电机、交流电机那样。它仅可以在双环形脉冲信号、功率驱动电路等组成系统中使用。步进电机多用于数字式计算机的外部设备,以及打印机、绘图机和磁盘等装置。步进电机实物图如图3-13所示。 图3-13 步进电机实物图 3.6.2 步进电机的控制 a)换相控制:步进电机不同工作方式下都有其规定的通电顺序,各相的通断必须按照这个顺序来进行。 b)步进电机的转向控制:在一定的工作方式下,步进电机正转则是正序换相通电,反之则反转。 c)步进电机的速度控制:步进电机的运动是在脉冲信号的刺激下,一步一个脉冲。二个脉冲之间的时间间隔越短则步进电机速度就越快。 3.6.3 步进电机的励磁方式 步进电动机分为全步励磁及半步励磁的励磁方式,全步励磁分为1相、2相励磁。步进电机收到一个脉冲信号就转动一步。因此,不断发送脉冲信号给步进电机,步进电机就可以连续转动。分述如下:  a)一相励磁法:一瞬间只有一相导通。功耗小,精密度好,但扭矩小,振动大,每个激励信号可以1.8度。励磁顺序为 A→B→C→D→A。以这种方式控制步进电机转动时,其励磁顺序如表3-1所示。如果激励信号反向传输,则步进电机反转。 表3-1 步进电机1相励磁法 b)二相励磁法:一瞬间导通二相。由于其高转矩,振动小,这是如今最常用的方法,每个激励信号可以1.8度。励磁顺序为AB→BC→CD→DA→AB。以这种方式控制步进电机转动时,其励磁顺序如表3-2所示。如果激励信号反向传输,则步进电机反转。 表3-2步进电机2 相励磁法 c)半步励磁:交替轮流导通1、 2相。因其分辨率增强,运行平稳,每个发送激励信号可以0.9度,因此也广泛使用。以这种方式控制步进电机转动时,其励磁顺序如表3-3所示。如果激励信号反向传输,则步进电机反转。 表3-3步进电机半步励磁法 3.6.4 步进电机的工作方式 四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单拍与双拍相比较而言,它们步距角相等,但单拍转动力矩小。八拍与它们相比较,其步距角是它们的一半,所以说,八拍工作方式能保持较高的转动力矩而且控制精度也提高了。本设计采用4相步进电机MP28GA,其驱动方法为4相8拍,额定电压为5V,电源供电方式为单极性直流。只要对正确的相序进行通电,步进电机就可以转动了。 3.6.5 步进电机的驱动电路 因为单片机I/O口输出的电流比驱动步进电机所需的电流要小,因此系统要靠一个ULN2003芯片来放大此时的电流从而驱动步进电机进行工作。ULN2003引脚图如图3-14所示。 图3-14 ULN2003引脚图 单片机控制步进电机工作流程图如图3-15所示。 图3-15 单片机控制步进电机工作流程图 步进电机驱动电路如图3-16所示。 图 3-16 步进电机驱动电路图 4. 系统软件设计 本设计的软件部分由二个部分构成:红外发射端程序和红外接收端程序。红外发射端程序由主程序、独立按键程序、红外编码子程序所构成,红外接收端程序由主程序、红外解码子程序、步进电机控制子程序、LCD显示屏子程序所构成。 4.1 红外编码子程序设计 a)载波:如图4-1所示, 25us的周期即38KHz频率的载波,平时一般通过硬件来产生这个载波,但为了简化电路,节省成本,此次设计由软件来完成。 图4-1 载波信号 b)起始位:如图4-2所示, 9000us的载波和4480us的延迟构成起始位,在这个标志后面就是数据位了。其中361个周期的载波就可以表示9000us。 图4-2 编码起始位 c)标志:如图4-3所示,每一个数据位的区别是通过这个标志。载波长度640us相当于25个周期的载波。 d)数据“0"的传送:如图4-3所示,标志发送后1600us的延迟表示数据“0”。 e)数据"1"的传送:如图4-3所示,发送标志后延迟480us表示数据"1”。 图4-3 编码的二进制“0”、“1”和标志位 f) 数据帧的构成:如图4-4所示,一帧数据由32位组成,碰到一个起始位,意味着一帧数据传送了。 图4-4数据帧的构成 发射引导码后从数据缓存区中取出数据,是 “0”调用“0”发射模是1调用“1”发射模,直到整个数据发射完。其流程图如图4-5所示。 图4-5红外编码子程序编码流程图 4.2 按键子程序设计 当按下一个按钮,程序的消抖再次确认按钮是否被按下,如果没有,继续等待按钮被按下,如果有键被按下,扫描程序,确定相应的键值。其流程图如图4-6所示。 图4-6按键扫描子程序流程图 4.3 LCD显示电路程序设计 LCD1602读操作时序图如图4-7所示: 图4-7 LCD1602读操作时序 LCD1602读操作时序图如图4-7所示: 图4-8 LCD1602写操作时序 4.4 红外线解码判断子程序设计 所谓红外解码顾名思义就是红外编码反操作,将一段二进制数解码出来。红外接收头先接收引导码,然后接收16位二进制码,将这些二进制码反编码出来以后,检测一下8位操作码取反是否与其8位反码一致,若是,则确定码值。若否,则判定此次接收失败,程序结束。 红外解码波形:红外接收头解码后的整合,是去除载波的操作,如图4-9所示。 图4-9红外线解码波形 4.5 步进电机控制程序 步进电机的控制程序,根据红外解码程序代码的值,相应的查询代码值的操作,控制芯片的I / O口发出相应的操作指令,使步进电机进入相应的工作状态。红外接收端主程序流程图如图4-10。 图4-10 红外接收端主程序流程图 5. 系统调试与测试 5.1 软件调试与测试 系统的软件测试比硬件测试更加的麻烦,因为软件测试的时候没有很多区作参考,更多的时候是靠自己的想法并且通过测试区一步一步的靠近正确的结果。而且在实际硬件电路上进行调试的时候,假如发生故障要准确的判断出来是软件故障还是硬件故障是很困难的,因此更多的还靠学校实验室里面的实验板进行调试,渐渐的像成功靠拢。通过调试程序在keil编译一般有以下几点错误:一是逻辑错误,也是语法上的错误,很容易被发现;另一个是错误的功能,是指在语法上正确的前提下,由于一个错误的设计想法或问题,软件的功能无法实现。调试过程中出现的主要问题还是功能上的错误: a)实际调试过程中调试到红外发射模块时,发现红外发射管可以正常工作但是红外接收端却接收不到红外信号,最终经过多次的排查实验,找出原因,原来是错误的设计了定时器的初值,这样就使得红外发射管发射的信号频率就不是38KHz,那么接收端也就接收不到发射过来的红外信号,之后经过改变定时器初值以后接收端便能接收到发射端的红外信号了。 b)在仿真设计系统的过程中,步进电机不工作,经调查,原因是主程序不调用的步进电机程序,把调用语句放在合适的位置后步进电机就可以正常工作了。 c)实际调试系统设计过程中,步进电机依然不工作,经过调查研究,原因是步进电机中复位状态的程序设置为“速度0”,因为在实际运行环境中如果没有先对步进电机进行加速,是观察不到步进电机工作的。 5.2 硬件调试与测试 系统的硬件测试主要的功能就是确定电路是否具有可行性、电路焊接的是否正确以及系统运行的是否稳定。系统测试过程中,首先要通过仿真软件对整个电路图进行检测,检验整个电路是否可行,然后就开始在万用板上焊接,之后检查电路焊接的是否正确,看看是否有开路、短路等,最后检查外部电路连接是否正确,经过反复验证,便可以确保硬件连接是正确的。 在整个系统的调试过程中,发现了如下问题: a)硬件调试过程中,发现红外发射二极管正常工作但红外接收端却接收不到信号,通过排查研究,发现可能是发射管工作电压太低,所以在电路上增加一个三极管后发射管工作正常,接收端就可以收到红外信号了。 b)硬件调试过程中,电路指示灯亮,但步进电机不工作,通过调试,发现是ULN2003的线路有短路现象,排除故障之后整个系统工作就正常工作了。 系统整体运行状态如图5-1、5-2、5-3所示。 图5-1 步进电机正转 图5-2 步进电机反转 图5-3 步进电机停止 5.3 结论 此次课题是基于单片机红外发射步进电机控制系统设计,实物方面包括红外发射部分、红外接收部分、LCD显示部分、步进电机部分。最终设计成果经过调试以后能稳定完美的运行,步进电机能顺利的完成正转、反转、加速、减速、启动、停止的功能。而且LCD液晶显示屏也可以时时的显示步进电机的状态,整体可以说是很好的完成了课题的任务。 本次设计是红外控制步进电机,红外遥控这个技术现如今已经有了很大的发展,以后也必定会有很大的发展前途。通过此次的课题设计我对无线遥控产生了很大的兴趣,以后基于此基础了对于我进一步研究无线遥控通信有了很大帮助! 6. 结束语 经过这次毕业设计,让我知道设计一套电路和写一个程序,不是一件简单的事,经过这么长时间的努力,终于把电路和程序完成,使整个电路系统能正常的运行。步进电机有非常广发的用途,例如可以用到很多精密加工的机械上,工业流水线上等,我们在步进电机加上红外线控制模块,可以无线遥控,解决了很多特殊需求,试步进电机用途更加的广乏。虽然控制功能比较少,但是可以通过修改软件,试功能更加的完善 通过此次课题设计不仅增加了我的理论知识和而且提高了实践能力,并且在制造和调试电路的整个过程中我也体会到了其中的幸福和辛苦。整个设计制作过程不是我原来想象的那么简单的,遇到很多意想不到的困难,整个系统是在调试中不断完善的,不断的调试中我也明白了学习电子科技不是光看看书就有用的,自己动手去焊接连接电路在这个过程中去发现问题去解决问题这个才是最好的方法。本次课题的设计让我学会了如何设计一个系统,有一定程度的认识对于系统的基本结构,而且整个系统的设计过程也让我对红外遥控的基本知识懂得了很多,了解了红外编码的基本原理从而也会编写一点关于这方面的程序了,液晶显示模块的设计使LCD在我的脑海中也有了一定的框架,懂得了要让LCD的字符显示出来必须要调节LCD的驱动电压使其达到一定的电压才可以,步进电机方面懂得了步进电机有很多不同的工作方式,其与其他电机也是有很多不同的地方的。总之,在设计过程中,比以往更深刻的学习了关于单片机、无线数据传输技术的知识,不仅仅是知识的沉淀,还有就是加强的实践能力不仅在硬件设计方面还有软件设计方面,相信这些能力将有助于我未来的职业生涯。 参考文献 [1] 曹巧媛.单片机原理及应用[M].电子工业出版社,2002. [2] 李湘闽,唐宏,葛继.学习型红外遥控器[J],2004. [3] 陈启美.微机原理、外设接口[M].清华大学出版社,2002(第1版). [4] 戴峻峰,付丽辉.多功能红外线遥控器的设计[J].传感器世界,2002. [5] 杨恢先,黄辉先.单片机原理及应用[M].长沙:国防科技大学出版社,2003. [6] 李洪明.漫谈红外遥控[J].电子世界,2000. [7] 付家才.单片机控制工程实践技术[M].北京:化学工业出版社,2004. [8] 余锡存.曹国华.单片机原理及接口技术[M].西安电子科技大学出版社,2000. [9] 杨恢先.一种基于单片机的红外遥控软件解码方法[J].自动化与仪器仪表,2004. [10] 周航慈.单片机程序设计基础[M].北京航空航天大学出版社,2003. [11] 李光飞,楼然苗,胡佳文等.单片机课程设计实例指导[M].北京航空航天出版社,2004. [12] 李学海.标准80C51单片机基础教程[M].北京航空航天大学出版社,2006. [13] 刘乐善.微型计算机接口技术及应用[M].华中科技大学出版社,2004. [14] 马忠梅.单片机C语言Windows环境编程宝典[M].北京航空航天大学出版社,2003. [15] 李伯成基于MCS-51单片机的嵌入式系统设计[M].电子工业出版社,2004. [16] 张毅刚彭喜源MCS-51单片机应用设计[M].哈尔滨工业大学出版社,2000. [17] 梁合庆.增强核闪存80C51教程[M].电子工业出版社,2003. 致 谢 首先我要非常感谢学校让我研究这个课题,这为我以后的工作、学习奠定了基础。此次毕业设计很好的展现了我大学所学的东西。而且经过这段时间的学习实践我的能力有了很大的进步,尤其是在操作能力、分析问题、合作精神、严谨的工作作风等方面。整个毕业得到了很多人的热心帮助和建议,在此我对他们表示我衷心的感谢。如果没有他们的帮忙,我就不会如此顺利的将本次毕业设计完成。 其次,我要还要特别感谢我的指导老师,在我的论文书写及设计期间给了我大量的帮助和非常悉心的指导,帮我理清了设计思路和操作方法以及遇到的各种困难,并且帮我的课题做了很多有效的修改和改进。我从朱老师的身上学到许多能受益终生的东西。最后再次表示对朱晓琴老师衷心的感谢。 另外,我要感谢我的室友,是他们陪伴了我四年,一起住了四年,四年中有很多的酸甜苦辣,但是四年中也留下了许许多多的美好的记忆,感谢一路上有你们。  最后,我要感谢我的父母,如果没有他们无私奉献和默默支持,我将不可能有这么好的4年学习时间。谢谢你们! 签名: 日期: 年 月 日 附录: 附录1:基于单片机红外发射步进电机控制系统设计电路原理图 附录2:基于单片机红外发射步进电机控制系统设计元件清单 附录3:基于单片机红外发射步进电机控制系统设计源程序 附 录 附录1.基于单片机红外发射步进电机控制系统设计电路原理图 附录2.基于单片机红外发射步进电机控制系统元件清单 器件名称 数 量 单片机 2个 按键 5个 红外线发射二级管 1个 红外线接收头 1个 LED灯 2个 晶振 2个 电容 若干 三极管 1个 液晶显示屏 1个 步进电机 1个 ULN2003 1个 滑动变阻器 1个 电阻 若干 附录3. 基于单片机红外发射步进电机控制系统设计源程序 发射部分电路程序: 【红外编码IR】 #include "IR.h" #include "reg52.h" sbit IR_Bit = P2^5; /*----------------------------- 延时12us函数 单片机:AT89S52 晶 振:12Mhz -------------------------------*/ void Delay12us(void) { unsigned char i; ; i = 3; while (--i); } /*----------------------------- 产生n个25us的载波 -------------------------------*/ void Make_n_Carrier(unsigned int n) { while(n) { IR_Bit = 1; Delay12us(); IR_Bit = 0; Delay12us(); n--; } } /*----------------------------- 延时400us函数 单片机:AT89S52 晶 振:12Mhz -------------------------------*/ void Delay400us(void) { unsigned char i; ; i = 197; while (--i); } /*----------------------------- 延时4ms函数 单片机:AT89S52 晶 振:12Mhz -------------------------------*/ void Delay4ms(void) { unsigned char i, j; i = 8; j = 197; do { while (--j); } while (--i); } /*----------------------------- 延时1ms函数 单片机:AT89S52 晶 振:12Mhz -------------------------------*/ void Delay1ms() { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } /*----------------------------- 延时115us函数 单片机:AT89S52 晶 振:12Mhz -------------------------------*/ void Delay115us() { unsigned char i; i = 55; while (--i); } /*----------------------------- 延时480us函数 单片机:STC11F04E 晶 振:12Mhz -------------------------------*/ void Delay480us() //@11.0592MHz { unsigned char i; ; i = 237; while (--i); } /*----------------------------- 利用红外编码发送一个字节 -------------------------------*/ void IR_Send(unsigned char Data) { int i; Make_n_Carrier(361); //产生361个载波,361*25us = 9025us (9000us) Delay4ms(); Delay400us(); //延时大约4400us,形成休止头 for(i=0;i<8;i++) { Make_n_Carrier(25); //635 (624uS)发送标志载波 if(Data&0x80) { Delay1ms(); //发送1(1160us)。大约延时1120us,与发送0的480us一起构成1600us。 Delay115us(); } Delay480us(); Data <<= 1; } Make_n_Carrier(25); } 【键盘程序Key】 #include "Key.h" #include "reg52.h" sbit KEY1 = P1^2; sbit KEY2 = P1^3; sbit KEY3 = P3^2; sbit KEY4 = P3^5; sbit KEY5 = P3^6; void Key_Init(void) { KEY1 = 1; KEY2 = 1; KEY3 = 1; KEY4 = 1; KEY5 = 1; } unsigned char Key_Scan(void) { if(!KEY1) return 1; else if(!KEY2) return 2; else if(!KEY3) return 3; else if(!KEY4) return 4; else if(!KEY5) return 5; else return 0; } 【主程序Main】 #include "Main.h" void main(void) { unsigned char KeyVal=0; Key_Init(); P2 = 0X00; while(1) { while(!Key_Scan()); KeyVal = Key_Scan(); while(Key_Scan()); IR_Send(KeyVal); KeyVal = 0; } } 接收部分电路程序: 【Common 程序】 #include "Common.h" /*============================ 功能:将一个浮点数转换成可以显示字符串 参数: float Data - > 转换的数据 Dnum - > 小数位数 inte - > 整数位数 Type - > 类型选择 1:去掉转换结果首位的'0' ,改用空格代替 ==============================*/ #if Double_To_Str_Def void Double_To_Str(float Data,int Dnum,int inte ,int Type,unsigned char *Str) { long Num=0; int i=0; for(i=Dnum;i>0;i--) Data *= 10; Num = (long)Data; for(i=0;i<(Dnum+inte+1);i++) { if(i==Dnum) i++; Str[Dnum+inte-i] = Num%10+0x30; Num /=10; } if(Dnum) Str[inte] = '.'; //加上小数点 if(Type == 1) { for( i = 0;i < (inte-1);i ++)//判断最高位是否为 0 , 是的话就不显示 { if(Str[i] == 0x30) Str[i] = ' '; else break; } } } #endif /*============================ 功能:简单延时函数 说明: 单片机型号:AT89S52 晶振 :11.0592Mhz 延时单位 :1ms ==============================*/ #if Delay_Def void Delay(int Time) { int i,j; for(i=Time;i>0;i--) for(j=112;j>0;j--); ; } #endif /*============================ 功能:简单延时函数 说明:延时10us ==============================*/ #if DELAY_Def void DELAY(void) { unsigned char i; ;;; i = 24; while (--i); } #endif /*============================ 功能:将一个数组按照升序排列 参数: *Str-> 数组的指针 length-> 数组长度 * Average 数组的均值 ==============================*/ #if Seqen_Str_Def void Seqen_Str(int *Str,int length,int* Average) { long Temp=0; int i=0,j=0; for(j=0;j0;i--) { if(Str[i] 指向需要转换的BCD码 Length --> BCD码的长度 *Str --> 转换的结果 ==============================*/ #if BCD_To_Str_Def void BCD_To_Str(unsigned char *BCD,unsigned char Length,unsigned char *Str) { unsigned char i,j=Length<<1; for(i=0;i>1]&0xF0)>>4) + 0x30; Str[i+1] = (BCD[i>>1]&0x0F) + 0x30; i++; } } #endif /*============================ 功 能:将一个字符转成其位对称的字符(二进制) 参 数: Data 原数据 返回值:转换后的数据 eg: 1100 0001 -> 1000 00011 ==============================*/ #if Symmetrical_Char_Def unsigned char Symmetrical_Char(unsigned char Data) { int Res = 0,i=0; for(i=0x80;i>0;i>>=1) { Res>>=1; if(Data&i) Res |= 0x80; } return (unsigned char)Res; } #endif /*============================ 功 能: 字符串拷贝函数 参 数: Str_S 源数据 Str2_T 目标数组 Bit 位数 ==============================*/ #if Str_Copy_Def void Str_Copy(unsigned char *Str_S,unsigned char *Str_T,unsigned int Bit) { unsigned int i; for(i=0;i得到的 CRC1 校验码 * CRC2 ------>得到的 CRC2 校验码 * Data ------>需要校验的数据 Num ------>需要校验的数据位数 ==============================*/ #if CRC16_Check_Def const char code SCRCH[256]={ 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40}; const char code SCRCL[256]={ 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04, 0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8, 0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC, 0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10, 0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4, 0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38, 0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C, 0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0, 0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4, 0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68, 0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C, 0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0, 0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54, 0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98, 0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C, 0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40}; void CRC16_Check(char *CRCH,char *CRCL,char *Data,int Bit) { unsigned char Temp; int i; (*CRCH) = 0;(*CRCL) =0; //先将两个数清零 for(i=0;i校验的数据 Length ------>长度 Parity_Type ------>校验类型 0 奇校验 1 偶校验 ==============================*/ #if Make_Parity_Def unsigned char Make_Parity(unsigned char* Data,unsigned char Length,unsigned char Parity_Type) { unsigned char i,j,Res=(Parity_Type?0x00:0x01); for(i=0;i0;j>>=1) if(Data[i]&j) Res ^= 1; return Res&0x01; } #endif 【红外解码 IR】 #include "IR.h" #include "reg52.h" sbit IR_Bit = P3^2; extern unsigned char IR_CODE; extern bit NEW_IR_CODE; /*--------------------------------- 初始化外部中断0 ----------------------------------*/ void Interrupt0_Init(void) { IT0 = 1; //选择脉冲方式触发 EX0 = 1; //打开外部中断 EA = 1; } /*--------------------------------- 延时2ms 单片机:AT89S52 晶 振:12Mhz ----------------------------------*/ void Delay2ms(void) { unsigned char i, j; i = 4; j = 225; do { while (--j); } while (--i); } void TR_Receive() interrupt 0 { int i; int Time=0; EA = 0; //先关闭中断,停止接收 IR_CODE = 0; Delay2ms(); //每2ms检测一次,看是否为低电平,检测载波(9000us) Delay2ms(); Delay2ms(); Delay2ms(); if(!IR_Bit) { while(!IR_Bit); Delay2ms(); Delay2ms(); if(IR_Bit) { while(IR_Bit); for(i=0;i<8;i++) { IR_CODE<<=1; while(!IR_Bit); //等待起始位结束 for(Time=0;IR_Bit==1;Time++) ; if(Time>190) IR_CODE+=1; } NEW_IR_CODE = 1; EX0 = 0; } } EA = 1; } 【LCD1602程序】 #include "STC89.h" #include "LCD1602.h" #include "../Common\Common.h" sbit LCD_RS=P1^4; sbit LCD_RW=P1^5; sbit LCD_EN=P1^6; #define LCDData P0 /*---------------------------------------- 函数名:void writeone_com(uchar com) 功 能:1602写数据 ------------------------------------------*/ void Write_Com(unsigned char Com) { LCD_RS=0; LCD_RW=0; LCDData=Com; LCD_EN=1; DELAY(); DELAY(); LCD_EN=0; } /*--------------------------------------- 函数名:void writeone_date(uchar dat) 功 能:1602写数据 -----------------------------------------*/ void Write_Date(unsigned char Dat) { LCD_RS=1; LCD_RW=0; LCDData=Dat; LCD_EN=1; DELAY(); DELAY(); LCD_EN=0; } /*--------------------------------------- 函数名:void write_add(unsigned char pos) 功 能:写地址 ------------------------------------------*/ void Write_Add(unsigned char pos) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 Write_Com(p); //write command } /*--------------------------------- 功 能:清屏 -----------------------------------*/ void Clear_LCD(void) { Write_Com(0x01); Delay(2); } /*------------------------------------ 函数名:void init_1602() 功 能:1602初始化 --------------------------------------*/ void LCD1602_Init(void) { Write_Com(0x38); //配置1602 Write_Com(0x0c); Write_Com(0x06); Write_Com(0x80); Delay(2); Clear_LCD(); } /*---------------------------------- 函数名:void Dis_Str(char* str) 功 能:在制定位置显示一个字符串 参 数:Xpos --> X的位置 0-15 Ypos --> Y的位置 0-1 -------------------------------------*/ void Dis_Str(unsigned char Xpos,unsigned char Ypos,unsigned char *str,int Bit) { int i=0; Write_Add(Xpos+Ypos*0x10); while(Bit--) Write_Date(str[i++]); } /*--------------------------------- 功 能:在制定位置显示一个字符串 参 数:Xpos --> X的位置 0-15 Ypos --> Y的位置 0-1 Type --> 显示类型 12 无光标 14 有光标、光标闪烁 15 有光标、光标不闪烁 -----------------------------------*/ /*void Nonius_ON(char Type,int Xpos,int Ypos) { Write_Add(Xpos+Ypos*0x10); Write_Com(Type); Delay(2); }*/ 【主程序Main】 #include "Main.h" void main(void) { LCD1602_Init(); //初始化1602 Interrupt0_Init(); //初始化外部中断0 Timer_Init(); Deal_IRCode(IR_CODE); //处理红外代码 Dis_Str(0,0,"Remote St. Motor",16); while(1) { while(!NEW_IR_CODE); //等待接收到红外代码 Deal_IRCode(IR_CODE); //处理红外代码 NEW_IR_CODE = 0; //处理完毕,复位标志位 EX0 = 1; //打开外部中断0,等待下一次接收 ET0 = Status; if(!Status) P1 &= 0XF0; } } 【步进电机系统程序system】 #include "System.h" #include "reg52.h" #include "../LCD1602\LCD1602.h" #include "../Common\Common.h" extern bit Dir; //0表示向左,1表示向右 extern bit Status; //状态为,0表示停止,1表示运行。 extern unsigned char Speed; //处理接收到的红外编码 void Deal_IRCode(unsigned char IRCode) { unsigned char Data[4]; float S; switch(IRCode) { case 0: Dir = 0; Status = 0; ET0 = 0; Dis_Str(0,1," 0.0/Min Stop ",16); P1 &= 0XF0; break; case 1: if(Status) { Dir = 0; Dis_Str(10,1,"Right",5); } break; case 2: if(Status) { Dir = 1; Dis_Str(10,1,"Left ",5); } break; case 3: if(Status) { Speed++; if(Speed>10) Speed = 1; S = 60.0/(((float)(Speed))*6.19); Double_To_Str(S,1,2,1,Data); Dis_Str(0,1,Data,4); } break; case 4: if(Status) { Speed--; if(Speed==0) Speed = 10; S = 60.0/(((float)(Speed))*6.19); Double_To_Str(S,1,2,1,Data); Dis_Str(0,1,Data,4); } break; case 5: Status = ~Status; if(Status) { if(Dir) Dis_Str(0,1," 0.0/Min Left ",16); else Dis_Str(0,1," 0.0/Min Right ",16); S = 60.0/(((float)(Speed))*6.19); Double_To_Str(S,1,2,1,Data); Dis_Str(0,1,Data,4); } else Dis_Str(0,1," 0.0/Min Stop ",16); break; } } //定时器初始化,用来驱动步进电机 void Timer_Init(void) { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x48; //设置定时初值 TH0 = 0xF4; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //允许定时器中断 EA = 1; //打开总中断 } //定时器0中断服务函数,用来控制步进电机转动 unsigned char code MotStep1[]={0xf3,0xf6,0xfc,0xf9}; //正转的脉冲 unsigned char code MotStep2[]={0xf9,0xfc,0xf6,0xf3}; //反正的脉冲 void Timer_ISR(void) interrupt 1 { static unsigned char i=0,j=0; TL0 = 0x48; //设置定时初值 TH0 = 0xF4; //设置定时初值 j++; if(j>=Speed) { j = 0; P1 &= 0XF0; if(Dir) P1 |= MotStep1[i++]; else P1 |= MotStep2[i++]; if(i>3) i = 0; } } � EMBED Visio.Drawing.11 ��� _1463577203.vsd � � � 开始� 初始化� 是否有红外信号� 红外解码 步进电机控制 步进电机驱动 结束 Y N _1464110569.vsd 盐城工学院 设计 审核 日期 2014.6.5 课题 名称 图名 专业 学号 基于单片机红外发射步进电机控制系统设计 自动化 1010603221 基于单片机红外发射步进电机控制系统设计原理图 班级 姓名 比例 图号 共一张 B自动化102 发射部分电路原理图 接收部分电路原理图 _1172664573.doc � � � � �
/
本文档为【基于单片机红外发射步进电机控制系统设计毕业设计说明书】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索