单片机的专用定时器的设计_第1页
单片机的专用定时器的设计_第2页
单片机的专用定时器的设计_第3页
单片机的专用定时器的设计_第4页
单片机的专用定时器的设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE1-本科毕业设计本科毕业设计题题目:单片机的专用定时器的设计 摘要在工业电路电子系统设计过程中,为了满足开发过程中系统可操作性高,成本低的要求,人们通常采用以软件代替硬件的方法来降低生产成本。而单片机恰恰符合这一要求。单片机具有技术成熟,应用广泛,性价比高等优点,利用单片机实现的控制系统功能,适用于各种工业环境中。C51系列单片机本身具有功能强大,技术水平高,易于采购的特点,使用C51系列单片机可以实现电路的定时、显示、控制功能。本设计利用C51系列单片机开发板,学习实践了单片机的原理及应用,在EDA软件Keil和Protues下完成了基于单片机的一个可调、可显示专用定时器的软件仿真和硬件测试。C51系列单片机内部的定时/计数器可以精确地实现时间的定时功能。在合理设计数码管、LED发光二极管、键盘等单片机外围电路的基础上,组成了一个结构清晰的专用定时器电路系统。在一定的语言环境下,完成了单片机控制程序的设计,并将由控制程序生成的HEX文件导入到软件环境下的单片机中进行仿真;下载到实际单片机中进行硬件测试,从而完成了技术效果好,可靠性高,方便操作,经济效益高的专用定时器设计。关键字:单片机;C51;定时器;Keil;Protues47-绪论自从1971年微型计算机问世以来,随着大规模集成电路技术的不断发展,微型计算机开始朝向两个方向发展:一个是向高速度,高性能,高集成度的通用微型计算机方向发展,另一个是向稳定性强,可靠性高,价格低廉的单片机方向发展。单片机不论从功能与形态上来说,都是作为控制领域的计算机,因此单片机本质上是一个微型控制器,即Microcontroller。从1976年Inter公司推出第一款单片机以来,经过集成电路技术的发展,总线技术的不断完善,应用领域的逐渐扩大,单片机的控制技术也正日趋成熟。在微型计算机的短暂发展过程中,人们成功地将CPU,内存及一些必要的电路单元集成到一块芯片上,并且专门针对面向控制功能,对结构进行了一定的优化,使其具有可靠性和一定的专用性。单片机与一般通用微机芯片相比具有以一下特点:1、体积小,重量轻2、功能强大,价格低廉3、专门面向控制功能,专用性强4、系统结构清晰,电路布线合理5、运行速度快,抗干扰能力强,可靠性高单片机控制技术已经被广泛应用于各个领域。工业生产自动化在工业自动控制过程,智能监测过程,安装在控制系统中的控制器几乎都是单片机。如利用单片机的定时/计数器对系统进行实时控制监测,自动控制继电器系统以驱动大功率设备,精确控制外围设备的运行时间或工作周期。家用电器及日常生活中的应用目前国内外的各种家用电器已经普遍采用单片机控制技术代替传统电路控制技术,这种单片机大多是小型廉价单片机。它集成了许多外设接口连接外围设备,例如键盘、LED数码管、LCD显示器、及A/D转换器等输入输出设备,用于接收输入信号控制输出信号。由于单片机在系统中起到了输入控制输出的作用,实现了人机对话的功能。利用这一功能,单片机普遍应用于洗衣机、电冰箱、空调、微波炉、电饭煲、电视机及其它影音设备的控制系统中。汽车、航空航天器等电子系统在这些系统中利用单片机,使各个系统构成冗余的网络系统,例如显示系统、动力控制系统、自动控制系统、通信系统等。发达国家的汽车电子系统中已广泛采用CAN总线(ControllerAreaNetworkBus)构成技术效果好,结构复杂的系统网络。在本次设计中,运用单片机内部的定时/计数器,精确控制定时时间,从而控制三个发光二极管按照定时时间有规律地亮灭,同时控制数码管显示器显示剩余时间,以便实时监测电路的运行情况。最终完成的专用定时电路,可以应用于精确定时控制外围大功率设备的启动与关闭。设备通过简易的操作,能够按照不同的周期规律正常运行。第一章设计任务及设计方案1.1设计任务设计一个基于单片机的专用定时器。它可以对time1、time2、time3进行定时。定时次序为先定时time1,直到time1=0,再定时time2,直到time2=0,然后定时time3,time3=0时完成了一个定时周期。使用3个发光二极管分别指示三个定时时间。要求time1(1-99s)、time2(1-99s)、time3(1-99min)大小可以调节。用数码管显示剩余时间。1.2设计基于单片机的专用定时器的意义目前单片机的应用日趋成熟,单片机已经普遍应用于实时监测和自动控制领域。单片机为核心的硬件系统与软件系统相互结合的技术正日益完善。利用单片机具有的精确定时/计数的功能,在工业生产的实时监测、自动控制过程中能发挥很大的作用。设计基于单片机的专用定时器可以生产出一系列可靠性强、操作简单、性价比高的设备,例如定时监测环境报警系统、定时控制交通灯、定时控制大功率设备的开关系统等。1.3实现设计的不同方案的简单比较本次设计采用单片机内的定时/计数器设计一个专用定时器。利用单片机内部的定时/计数器结合相应的程序设计是本次设计有效,可靠,实用的方法。另外实现定时功能也可以采用下面的三种方案:1、软件定时:它的特点是占用硬件资源少,但占用CPU时间多,降低了CPU的利用效率。2、555定时电路:通过外接必要的元器件,构成硬件定时电路。但是利用硬件定时电路,不利于实现方便、可调、易操作、性价比高的定时功能。与本次设计方案相比,如果要使硬件定时电路同样具备可调,易操作的性能,那么就需要设计更复杂的硬件电路系统,增加了产品质量和体积,增加了生产成本。3、采用可编程芯片定时:这种芯片的定时功能强,使用灵活。可用于对单片机的定时/计数器的扩展。考虑到本次设计要求硬件电路简单,容易实现,方便操作,器件价格便,宜易于采购等因素,所以采用以单片机为核心的硬件电路通过合理的程序设计来实现一个专用定时器设计。1.4定时系统设计方案1.4.1系统功能框图设计方案为了实现设计任务,在设计初期设计系统功能框图如图1-1所示。图1-1系统功能框图1.4.2系统工作流程设计方案本定时系统以单片机为核心控制器件,外设4个按键,K1,K2,K3,K4。按键K1控制定时器的开始(K1第奇数次次按下)与复位(K1第偶数次次按下或从未按下)两种状态。当定时器处于复位状态时(K1第偶数次按下或从未按下),按下K2可选择三个定时时间的调整,如果K2第一次按下,可调整time1(默认99s),L1亮作为提示;如果K2第二次按下,可调整time2(默认99s),L2亮作为提示;如果K2第三次按下,可调整time3(默认99min),L3亮作为提示;如果K2第四次按下,使K2恢复到初始状态。K3、K4分别用于加1和加10。完成了3个定时时间的调整后,按下K1,启动定时器1,开始定时。处于定时时间time1时用发光二极管L1指示,处于time2时用L2指示,处于time3时用L3指示。直到定时结束time3=0,置tt=0,使其重新开始time1定时,至此无限循环下去。工作过程简图如图1-2所示。图1-2工作过程简图第二章硬件条件及软件环境介绍2.0定时器系统设计基本硬件条件和软件环境概述本次设计用到的硬件条件是STC89C52单片机开发板;软件环境有KeiluVision3集成开发软件,用于程序的编辑、编译,并生成.hex文件;ISIS7Proteus电路仿真软件,用于调试程序和测试程序的仿真效果。2.1STC89C52单片机开发板简介本次设计所采用的开发板是青岛帕沃伸电子有限公司出品的《OK51-POWER》单片机开发板。开发板的结构布局,如图2-1所示。图2-1电路结构实物图它是一款性价比高的51单片机学习板。它是有USB线连接电脑或外接5V直流电源两种方式供电,提供USB2.0和RS232串口两种通信方式。本次设计是使用USB通信方式实现供电,编程,仿真,通信多种功能。本次设计主要运用到开发板的如下功能单元:1、控制器为STC89C52单片机,它是一个8位单片机,拥有32个I/O口,内置两个定时/计数器,EEPROM。晶振采用11.0592Mhz。2、4位数码管动态显示电路,它是由两个74HC573锁存器控制信号传输,U1,U2。U1是数码管段选锁存器,U2是数码管位选锁存器。数据通过P0口锁存到锁存器中,然后驱动数码管动态显示。3、3三个LED发光二极管,LED发光管也是通过一个74HC573锁存器连接单片机的P1口。4、4个独立键盘。依据开发板固有电路,在Protues中完成定时器系统电路原理图如图2-2所示。图2-2Protues中的电路原理图2.2KeiluVision3软件的使用简介2.2.1Keil软件的运行环境设计中程序编写的环境选用KeiluVision3软件。系统在安装KeiluVision3集成开发软件之前,需要PC满足一定的硬件及软件要求,以确保软件编译器以及其它程序功能正常使用。具体要求如下:Pentium、Pentium-2及以上或兼容处理器的PC;Windows95、98、2000、xp操作系统;至少16MRAM;至少20MB硬盘。2.2.2Keil软件的使用步骤依据本设计过程中Keil软件的应用,总结该软件的使用步骤如下:(1)按照步骤安装好软件后,双击快捷键图标,启动Keil。(2)首先新建一个工程文件,点击“Project->NewProject”,选择工程文件存放路径,并输入工程文件名,这里使用“jjjjj”作为工程文件名,如图2-3所示。图2-3建立新项目(3)点击“保存”后弹出选择CPU及型号对话框。由于Keil中没有STC公司的产品,但是STC公司的单片机与传统的51系列单片机是兼容的,所以这里选择Atmel公司的AT89C52,然后点击“确定”。如图2-4所示。图2-4选择CPU类型(4)新建一个C51程序文件。单击左上角的“NewFile”(5)保存新建程序文件。保存在工程文件“jjjjj”所在文件夹中,以.c为后缀命名新建程序文件,这里命名为“dingshiqi.c”,如图2-5所示。图2-5保存程序文件(6)把保存好的“dingshiqi.c”程序文件加入到工程项目中,在“SourseGroup1”上单击右键,在弹出菜单中选择“AddFileto’GroupsourseGroup1’”,然后双击“dingshiqi.c”文件,将其加入到工程项目中。这时在左边工程信息界面中的“SourceGroup1”下多了一个“dingshiqi.c”程序图2-6添加程序文件(7)在文本编辑框中输入源程序。(8)完成源程序编写后,接着编译工程项目,点击编译按钮,如果在下面的信息窗口中显示“0Errow(s),0Warrning(s)”,说明没有错误,已经成功编译。如图2-7所示。图2-7对当前项目进行编译(9)接下来生成.hex文件。在“Target1”上单击右键,在弹出菜单中单击“OptionsforTarget‘Target1’”选项,意思是“当前项目的目标”图2-8设置Target选项(10)在弹出“Options”窗口中,选择“Output”标签栏,选中“CreatHEXFile”,然后单击“确定”,如图2-9所示。(11)再次点击编译按钮,就会在工程文件夹中生成jjjjj.hex文件。自此,可以通过STC程序烧录软件把jjjjj.hex文件烧录到单片机中进行调试或可以把jjjjj.hex文件导入仿真电路中在Protues软件环境中进行仿真调试。图2-9设置Output选项2.3Proteus的使用2.3.1软件的工作界面ProtuesISIS的工作界面是一个标准的Windows界面。包括:标题栏、主菜单栏、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。2.3.2仿真电路图的绘制(1)打开软件后,首先将所需要的元件加入到对象选择器窗口,单击对象选择器按钮,如图2-10所示。图2-10对象选择器窗口(2)弹出“PickDevices”窗口,在“关键字”栏中输入AT89C51,系统在元件库中搜索出AT89C51的相关器件,在“结果”栏中找到AT89C51,双击它即可把它添加到对象选择器窗口。如图图2-11搜索查找元器件同样,把剩余元器件都添加到对象选择器窗口中。若单击某个元器件,可在预览窗口中可以看到元器件的仿真图形。(3)元器件的放置。在对象选择器窗口中,单击AT89C51,在将鼠标置于图形编辑窗口的欲置位置,单击鼠标,该对象便完成放置。用同样的方法把其他元器件放置到合理位置可以方便以后连接导(4)元件之间的连线。Protues的智能化可以在想要连线的时候进行自动检测,Protues对导线的布置也可以自动选择最合适的路径。(5)总线的使用。如果需要简化电路,使电路结构清晰,那么就可以使用总线代替数量庞大而复杂的导线。在绘图工具栏中单击总线按钮。然后将鼠标置于图形编辑窗口,单击左键,确定总线的起始位置,移动鼠标,找到终了位置,单击左键,再单击右键,表示确认结束画总线操作。(6)导线与总线的连接。导线与总线相连时,在连接处习惯上用斜线表示导线与总线连接。在导线连接处单击右键,弹出菜单栏中选择“设置网络标号”选项,弹出“设置网络标号”对话框,在“标号”栏中输入网络标号。注意相互联通的导线必须标注相同的网络标号,否则电路连接就会出错,如图2-12所示。图2-12导线上插入网络标号

第三章定时器硬件电路设计3.0硬件电路的主要组成结构单元本次设计的功能模块主要有:STC89C52单片机,LED数码管,发光二极管,键盘及若干必要的连线组成。电路线路清晰,结构简单,可以成功实现专用定时器电路的定时功能。基本功能框图如图3-1所示。图3-1基本功能模块3.1单片机端口分配方法及最小系统一、单片机端口分配方法单片机的种类很多,主要产品有:Intel公司的80C51,80C52等产品;Atmel公司的AT89C51,AT89C52等产品;STC的STC89C51,STC89C52等产品。本次设计所使用的是STC89C52单片机。实物图如图3-2所示。STC89C52有40个管脚,如图3-3所示。图3-2STC89C52单片机实物图图3-3单片机的40管脚示意图P0、P1、P2、P3为8位的并行I/O口用于数据的并行输入与输出。本次设计P0口用于控制数码管的段选端;P2口用于控制数码管的位选端;P1口控制LED发光二极管;P3口连接4个独立键盘。20号管脚Vcc接+5V,40号管脚Vss接地。XTAL1、XTAL2连外接晶振。二、单片机的最小系统单片机的最小系统包括复位电路和晶振电路。电路如图3-4所示。图3-4单片机的最小系统复位电路采用上电复位电路,通电时,电容相当于短路,于是RST引脚为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,当RST端电压降到低电平时,单片机开始正常工作。晶振电路采用的晶振频率为11.0592Mhz,外接两个谐振电容(22pF)用于起振。3.2数码管动态显示电路3.2.1LED数码管介绍常用显示电路有:LED数码管、LCD液晶显示器。显示方式有:段显示(7端、米字形等),点阵式显示(5×8、8×8点阵等)。由于本次设计只需显示简单的数字,考虑到本次设计的特点,采用价格便宜,应用普遍,性能良好的LED数码管。LED数码管可分为两种:即共阳极型和共阴极型。区别仅在于数码管各段的公共端是接+5V电源还是接地。本次设计选用了共阴极数码管。数码管的基本结构如图3-5所示。共阴数码管段码对照方式见表3-1。图3-5数码管的基本结构表3-1共阴极数码管段码对照表显示数dpgfedcba段码0001111113f100000110062010110115b3010011114f401100110665011011016d6011111017d700000111078011111117f9011011116f3.2.274HC573简介图3-674HC573仿真图在专用定时器系统的硬件电路中,一共用到了3个74HC573锁存器,其中两个锁存器用于控制四个数码管的段选端(用U1控制)和位选段(用U2控制),还有一个用于控制3个LED发光二极管(用U3控制)。它的仿真图如图3-6图3-674HC573仿真图74HC573锁存器有20个管脚,分别是:一个Vcc,一个GND,一个OE端,一个LE端,8个控制信号输入端,8个控制信号输出端。OE是输出始能端,只有当OE端为低电平时,锁存器才能正常工作,这里OE端接地;LE是锁存端,当LE为高电平时,输出端信号等于输入端信号,当LE为低电平时,无论控制信号在输入端如何变化,输出端信号保持不变。74HC573的功能表见表3-2所示。表3-274HC573功能表INPUTS(输入端)OUTPUT(输出端)QOELEDLHHHLHLLLLXQ0HXXZ3.2.3数码管动态显示电路在仿真电路和实际电路中的基本结构动态显示特点:硬件简单,但软件复杂,CPU占用时间较多。由于数码管的动态显示的电路可以使得电路结构简单,线路清晰,故本次设计采用数码管的动态显示电路。数码管动态显示电路在Protues仿真软件中的调试结果如图3-7所示。图3-7在仿真调试中数码管的动态显示电路实际单片机开发板中数码管动态显示电路的连接方式与Protues软件环境仿真调试中数码管动态显示电路的连接方式有所不同,但采用的基本原理是一样的。它的电路结构是由4位LED数码管的段选线和位选线分别与两个74HC573锁存器的输出端(Q0-Q7)相连;74HC573锁存器的OE端接地,锁存端LE分别接P2.6和P2.7,分别控制数码管的段选和位选,锁存器输入端(D0-D7)与P0口相连,P0口再连接上拉电阻。实际开发板电路在Protues仿真环境中的仿真原理图,如图3-8所示:图3-8开发板电路的仿真原理图3.2.4数码管动态显示电路的工作过程设计这里用U1代表控制数码管段选的锁存器,用U2代表控制数码管位选的锁存器。以在数码管的3、4位显示数字15为例。简述数码管动态显示过程如下:第一步P2.7口发出控制信号打开U2的锁存端,从P0口接收消影信号,通过U2把消影信号传送到数码管的位选端,使得数码管的所有位都没有被选中。第二步P2.7口发出控制信号关闭U2的锁存端,使数码管的位选端保持消影状态,而不受P0口信号变化的影响。第三步P2.6口发出控制信号打开U1的锁存端,从P0口接收段选控制信号,这里欲显示数字“1”,段选控制信号应为0x06,通过U1把段选控制信号传送到数码管的段选端。第四步P2.6口发出控制信号关闭U1的锁存端,锁存器变为锁存状态,使数码管的段选端的状态保持不变。第五步P2.7口发出控制信号打开U2的锁存端,从P0口接收位选控制信号,这里欲选中数码管的第3位,位选控制信号应为0xfd,通过U2把位选控制信号传送到数码管的位选段,这时数码管的第3位被选中,此时数码管的状态应该是在第3位上显示出数字“1”了。第六步P2.7口发出控制信号关闭U2的锁存端,使位选的状态保持不变。第七步插入延时函数,使第三个数码管显示“1”的状态保持一段时间。第八步同第一步和第二步,就是把消影信号传输到数码管的位选段,这时数码管所有位都不被选中,数码管的状态变为全灭状态。到第八步为止,就是在一小段时间内第三位数码管显示数字“1”硬件电路之间,相互联系的全过程。下面硬件电路的动作是使数码管的第4位显示数字“5”,过程类似,这里不再赘述。从数码管的动态显示电路的工作过程可以清楚地看出,欲显示一组固定数字,它的每一位并不是同时显示在动态数码管电路中的,而是按照先显示高位数字,后显示数字的顺序,快速逐个点亮数码管。由于人眼有视觉暂留效应和数码管在灭的时候有余辉,因此运用数码管的动态显示的方法效果上与静态显示是一样的。而且运用数码管的动态显示技术,更能体现单片机自动控制系统的优势,充分体现了单片机的自动控制特性和集成电路芯片的高效性。这是用普通电路系统不可比拟的。3.3定时/计数器应用3.3.1定时/计数器的组成结构前面已经提到,比较其他实现定时功能的方法,本次设计决定采用单片机内部定时/计数器。定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD寄存器是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON寄存器是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。定时/计数器的结构示意图如图3-9所示。图3-9定时/计数器的结构示意图图3-9定时/计数器的结构示意图3.3.2定时/计数器的基本原理加1计数器输入的计数脉冲有两个来源,一个是由系统内部的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器清零,且计数器的溢出使TCON中TF0或TF1自动置1,向CPU发出中断请求(定时/计数器中断允许时)表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的12分之一)。计数值N乘以机器周期T就是定时时间t。例如:设计数值为50000,机器周期为1/12MHz*12=1us,则定时时间为t=50000us=50ms。3.3.3定时/计数器的控制80C51系列单片机定时/计数器的工作由两个特殊功能寄存器控制,即TMOD寄存器(工作方式寄存器)和TCON寄存器(控制寄存器)。TMOD用于设置其工作方式;TCON用于控制其启动及中断申请。工作方式寄存器TMOD:工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于定时器T0,高四位用于定时器T1。其格式如表3-3所示。表3-3TMOD寄存器格式位76543210地址字节:89HGATEC/TM1M0GATEC/TM1M0TMODGATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器(T0或T1)工作;GATA=1时,不仅要用软件使TR0或TR1为1,同时外部中断引脚也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一个条件。C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。M1M0:工作方式设置位。定时/计数器有四种工作方式。见表3-3所示。表3-3工作方式设置表M1M0工作方式说明00方式013位定时/计数器01方式116位定时/计数器10方式28位自动重装位定时/计数器11方式3T0分成两个独立的定时/计数器;T1此方式停止计数本次设计使用定时器的工作方式1。因此把TMOD工作方式寄存器设置为0x01,即00000001。控制寄存器TCON:TCON的低4位用于控制外部中断。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如表3-4所示。表3-4TCON寄存器格式位76543210字节地址:88HTF1TR1TF0TR0TCONTF1:定时器1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。定时器T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TR1:定时器1运行控制位。TR1置1时,定时器T1开始工作;TR1置0时,定时器T1停止工作。TR1由软件置1或清0。所以,定时/计数器T1的启动与停止由软件控制。TF0:定时器0溢出中断请求标志位,其功能同TF1。TR0:定时器0运行控制位,其功能同TR1。本次设计采用定时器0的工作方式1来实现定时的功能。方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器。工作方式寄存器设置为TMOD=0x01,当定时器0溢出时,系统自动置TF0为1,CPU响应溢出中断后由硬件自动把TF0清0。TR0用软件置1使得定时器T0正常工作,清0使得定时器T0停止工作。结构示意图如图3-12所示。图3-10定时器T0的工作方式1示意图

第四章定时器软件设计及实现4.0软件设计概述完成电路硬件的设计后,还需要有软件(程序)来控制单片机的正常运行。为了使编写出来的程序结构简明,层次清晰,有必要按照合理的步骤分阶段进行程序设计。这些阶段主要分为:软件功能分析,程序模块划分,建立数学模型,编写程序,编译及调试程序。4.1软件功能分析根据专用定时器的设计要求,它是由三个定时时间(time1、time2、time3)依次循环定时,并且可以在数码管上显示剩余时间。设计还要求三个定时时间可以在0-99s、0-99min之间任意调整。通过上述分析可知,程序实现的基本功能为先判断是否调整好时间,若是,则进入定时显示模块;若不是,则进入时间调整显示模块。4.2程序的模块划分上述软件功能分析表明,要实现专用定时器的功能,程序设计可分为两个主要模块:时间调整显示模块,时间定时显示模块。通过识别按键K1的状态,来判断进入时间调整显示模块,还是进入时间定时显示模块。这里K1第1次、第3次等第奇数次按下,标志程序进入时间定时显示模块;K1第0次、第2次等第偶数次按下,标志程序进入时间调整显示模块。程序流程图如图4-1所示。处于时间调整显示模块状态时,用按键K2的状态来判断进入定时时间1(time1)、定时时间2(time2)、定时时间3(time3)。按键K3、K4分别对定时时间加1和加10操作。这就是时间调整显示模块下的三个时间调整子模块。时间定时显示模块由必要的变量参数模块、定时/计数程序、剩余时间的计算显示模块组成。图4-1程序流程图4.3程序的基本逻辑结构分析及程序编写第一步定义相关参数及变量列出共阴极数码管的码型表,定义无符号字符型变量t0,time1,time2,time3,kk1,kk2,qian,bai,shi,ge定义无符号整型变量tt,temp。对置于主函数前的子函数进行定义。这里对延时子函数(voiddelay(uintz))、数码管动态显示子函数(voiddisplay(ucharqian,ucharbai,ucharshi,ucharge))进行定义。对置于主函数后的子函数进行声明,模块判断子函数(voidpanduan();)、定时时间调整子函数(voidtiaozheng();)、初始化子函数(voidinit();)、显示剩余时间子函数(voidxianshi();)进行声明。第二步定义主函数根据上面的分析,已知程序分为两个主要模块。因此有必要在主函数中进行两个主模块的判断。为了使程序结构简明,层次清晰,主函数的编写方法采用在其内部调用子函数的方法。主函数内部先是调用初始化函数(init();),它已经在前面声明过了,后面将会对其进行定义;然后编写“while”循环语句程序段,在循环体内部先调用模块判断子函数(panduan(););接着用“if”判断语句,根据模块判断子函数的结果,引导程序分别进入时间调整显示模块和时间定时显示模块。第三步定义模块判断子函数由于预先设置了按键K1,根据K1的状态可以对进入哪个主模块进行判断。基本方法是利用前面已经定义的无符号字符型变量kk1的值来表示K1的两个不同状态,即每按下一次K1,kk1自加1,kk1有两种取值:kk1=1(第奇数次按下),kk1=0(第偶数次按下)。利用“switch”判断语句把两种情况表示出来,switch(kk1){case1:TR0=1;break;case2:init();break;}意思是情况1是启动定时器1进入时间定时显示模块;情况2是重新回到初始状态,所有变量返回到默认值,包括kk1的值清零,程序回到时间调整显示模块。在该段子程序中,使用延时子函数对按键K1进行消抖动处理,具体方法见源程序附录。第四步定义时间调整显示模块子函数这里用到剩余的三个按键,K2、K3、K4,它们分别起到了不同的作用。前面提到的判断子函数,识别按键K1的状态,判断是进入时间调整显示模块,还是进入时间定时显示模块,通过主函数的引导进入相应模块。本段时间调整子函数模块的编写,也用到了类似的方法,根据按键K2的状态判断进入哪个定时时间调整子模块,即判断是进入time1的调整模块、time2的调整模块、还是进入time3的调整模块。首先利用“if”语句判断是否按下K2,每按下一次按键K2,则kk2自加1。接着对几种按键状态依次进行模块化编写。如果K2第一次被按下,即kk2=1,那么P1口控制的第一个发光二极管亮,用以指示进入time1的时间调整模块,并且在数码管上显示调整时间;利用“if”语句的嵌套方法,再判断按键K3是否按下,如果判断是,则time1时间加1,接着用“if”语句判断time1是否超出99,如果判断是,则time1清零。判断K4是否按下与判断K3是否按下是并列关系,按键K4用于对time1进行加10操作。上述是K2第一次按下的情况调整time1子模块的流程简述。这里按键K2第二次按下(kk2=2),按键K2第三次按下(kk2=3)这两中情况类似于按键K2第一次按下(kk2=1)的情况,所以不再赘述。当K2第四次按下(kk2=4)时,程序把kk2清零,数码管全灭,发光二极管全灭,此时已经完成调整时间模块的一个循环操作。第五步定义初始化函数程序进入初始化函数时,令变量tt=0;kk1=0;kk2=0;控制数码管的四位数值都置为10(意思是对应的共阴极码型为0x00即全部熄灭),三个定时时间默认的初始值都为99,发光二极管全灭(P1口置为0xff);下面再对定时器1的相关寄存器和变量进行赋值:设置定时器为工作方式1即TMOD=0x01;设置定时器1的定时时间TH0=(65536-50000)/256;TL0=(65536-50000)%256;开总中断EA=1;开定时器1中断ET0=1;默认情况是先关闭定时器1,TR0=0。第六步定义剩余时间的显示子函数根据设计要求和功能分析的结果,依次循环显示time1,time2,time3的剩余定时时间,必须按照一定的逻辑结构和合理的数学算法进行程序编写。这里首先引用了两个变量:一个是记录当前已流逝时间总和的变量,用tt表示;另一个是计算当前定时时间的剩余时间的变量,用temp表示。考虑到tt是从0开始,每过一秒钟tt加1,所以首先利用“if”判断语句来比较变量tt与time1,如果变量tt小于等于time1,则计算定时时间1(time1)的剩余时间为temp=time1-tt,并且用数码管显示剩余时间的值(变量temp),同时点亮发光二极管L1(P1=0xfe)指示正处于time1的定时时间阶段。当变量tt值大于time1时,进入下面的time2的定时时间阶段。同样用“elseif”判断语句判断变量tt是否小于等于time1+time2+1,这里加1是为了补充time1阶段最后tt等于time1时显示0用掉的1秒钟。同样用数码管显示剩余时间的值(变量temp),点亮发光二极管L2(P1=0xfd)指示正处于time2定时时间阶段。当变量tt的值大于time1+time2+1时,进入time3定时时间的阶段,还是用“elseif”判断语句判断tt是否小于等于time1+time2+time3*60+2,这里加2是为了补充time1阶段显示0时用掉的1秒钟和time2阶段显示0时用掉的1秒钟,time3乘以60是因为time3的时间单位是分钟。当变量tt大于time1+time2+time3*60+2时,变量tt清零,使程序又重新回到time1的定时阶段。第七步定义定时器1中断服务子程序首先在其内部需要重新设置一下定时器1的定时时间(TH0=(65536-50000)/256;TL0=(65536-50000)%256;);其次设置定时溢出时的溢出中断响应为t0自加1(t0++);然后编写一个“if”判断语句,实现一秒钟定时计数(if(t0==20){t0=0;tt++;}),这条语句的意思是如果t0加到20,那么t0清零,tt自加1。由于t0加1用去定时时间为50ms,加20次刚好为1秒钟,前面已经提到变量tt用于记录单位时间秒的总量。至此基本完成软件设计。源程序清单见附录。4.4程序的编译及调试4.4.1根据实际电路修改原仿真电路程序的调试过程将编写好的源程序复制到KeiluVision3软件中进行编译,并生成.hex文件。Keil软件的使用方法及具体步骤在前面已经有了详细说明,这里不再赘述。接下来将.hex文件导入到单片机中,进行Protues仿真调试与实际单片机开发板的调试。由于本次设计原先是根据在Protues环境下如图3-8所示的电路图编写的程序,后来购买了单片机开发板进行实物调试和Protues仿真。虽然根据如图3-8所示Protues软件仿真电路所编写的程序与根据单片机开发板电路所编写的程序略有不同,但是它们的基本原理是一样的。为了使程序适用于实际单片机开发板电路,通过对电路结构的认真分析和研究,最后对程序进行了以下几点修改。4.4.2键盘模块的程序调试及修改在Protues环境下,原仿真电路中的4个独立键盘分别与单片机的P1.3,P1.4,P1.5,P1.6口相连;而单片机开发板的4个独立键盘分别与单片机的P3.4,P3.5,P3.6,P3.7相连,因此对应原仿真电路的程序,按键定义部分:sbitK1=P1^3;sbitK2=P1^4;sbitK3=P1^5;sbitK4=P1^6;应修改为sbitK1=P3^4;sbitK2=P3^5;sbitK3=P3^6;sbitK4=P3^7;4.4.3数码管动态显示电路模块的程序调试及修改如图3-8所示Protues仿真环境下的数码管动态显示电路与实际单片机开发板的数码管动态显示电路有所不同。一、根据原仿真电路的显示模块的程序分析在如图3-8所示电路中,数码管动态显示电路基本结构是采用四个共阴极数码管,8位段选端直接与单片机的P0口相连,再接一个10K的上拉电阻与单片机的P0口相连,数码管的4位位选端直接与单片机的P2口相连。根据此电路编写的数码管动态显示程序分析如下:列出共阴极数码管的码型表,码型表的编写依据可参见数码管硬件电路的介绍;列出数码管的位选表,它是由8个16进制数组成的数组,这里只用到数组的后4个数组元素,它们通过单片机P2口的高四位控制数码管的位选;然后开始对数码管动态显示子函数进行定义。基本方法是使用“for”循环语句,利用延时函数,对数码管的个位、十位、百位、千位进行快速地循环扫描,并且显示相应的数值。这里用到一个循环变量dispcount,通过循环语句使变量dispcount依次循环地取4,5,6,7四个值,表示按照次序依次显示千位、百位、十位、个位上的数值。程序分析:循环语句写为“for(dispcount=4;dispcount<8;dispcount++)”。循环体内先对P2口全部置1,关闭数码管的位选端,即消影,“P2=0xff;”。再对P0口控制的数码管的段选端输入相应的码型,引用数组元素的形式表示,“P0=table[dispbuf[dispcount]];”。同样对P2控制的数码管的位选端输入相应的值,也是用数组元素的形式表示,“P2=tablewe[dispcount];”。调用延时子函数,“delay(1);”。最后再对P2口置1,关闭数码管位选,“P2=0xff;”。上述就是根据如图3-8所示仿真电路中的数码管动态显示电路的显示子函数的分析。在下面的程序中,一旦遇到例如显示数值abcd的情况,只需要把abcd每一位的数值赋给数码管的相应位上,“dispbuf[4]=a;dispbuf[5]=b;dispbuf[6]=c;dispbuf[7]=d;”。接着在其后调用一下显示子函数即可“Display();”。二、根据实际单片机开发板电路的显示模块的程序分析在单片机开发板中有6个LED数码管可供选择,这里只选用了前四个数码管。由于其基本结构已经在前面的硬件电路的分析中描述过了,这里不再赘述。下面来分析如何修改原仿真电路的数码管动态显示的程序,使之适合开发板上的数码管动态显示电路。程序分析如下:先是列出共阴极数码管的码型表,这里不变。接着定义4个新的无符号字符型变量qian,bai,shi,ge;然后开始数码管动态显示子函数的定义:这里不用“for”循环语句,而是对每一位数值显示进行独立编写,一共编写4组位显示语句。例如先对qian位显示进行程序编写。程序开始对数码管的位选端置1,即关数码管位选,这就是所谓的消影处理,“wela=1;P0=0xff;wela=0;”。接着对数码管的字形端输入要显示的字形,“dula=1;P0=table[qian];dula=0;”。锁存住字形代码后,对P0口置1,“P0=0xff;”。然后对数码管的位选端输入相应的位选代码,“wela=1;P0=0xfe;wela=0;”。最后再对数码管的位选端置1,关数码管位选。对bai位、shi位、ge位显示程序编写方法类似。具体程序可见源程序附录。上述对实际单片机开发板的数码管动态显示子程序定义完毕。同样在下面的程序中,一旦遇到例如需要显示数值abcd的情况,只需要把数值abcd的每一位数值赋给数码管的相应位上即可,这里“qian=a;bai=b;shi=c;ge=d;”。然后在后面调用一下动态显示子程序即可,“display(qian,bai,shi,ge);”。以上便是程序在Protues仿真电路中的调试及实际单片机开发板中的调试比较与分析。运用这两种不同形式调试方法,对于得出本次设计的结论起到了重要作用。

第五章专用定时器硬件测试利用STC烧录软件进行硬件测试一、双击图标打开SCT烧录软件。它的操作界面如图5-1所示。图5-1SCT烧录软件操作界面二、在单片机类型栏中选择SCT89C52RC。三、根据电脑与开发板相连的USB端口所在COM口的位置,在COM口栏中选择相应的COM口。COM查询方法是:在“我的电脑”属性->硬件选项卡->设备管理器->端口,在此处可以查找到相应的COM。这里设置为COM6。四、在开发板关闭电源开关的前提下,进行下载.hex文件程序的操作,点击下载按钮。五、待程序烧录成功后,就可以打开开发板电源,进行硬件测试。测试结果如图5-2所示。图5-2硬件演示结果结论本设计运用单片机控制技术的部分原理知识,设计了一个可靠,耐用,廉价的专用定时器。由于利用了单片机的智能控制模块,可靠实用的定时/计数器模块,从而本设计完成的专用定时器电路也同时具备智能化,可靠性高等优点。为了方便调试,节省资源,减少工作量,缩短工作时间,本设计充分使用了Protues电路仿真软件。在Protues环境下,可以直观地了解到电路的工作过程,有效地帮助学习单片机的工作原理,快速地发现程序中出现的漏洞。尤其在设计初期的程序编写过程中,得益于Protues软件快速方便的优点,才可以方便地对程序进行反复修改及仿真调试,直至达到理想的效果。由于在后期的硬件调试时,发现硬件电路与之前的仿真电路有所不同,尤其在数码管动态显示电路模块处多了两个74HC573锁存器,工作进度开始停了下来。通过查阅74HC573的相关资料以及分析研究单片机开发板的电路原理图,掌握了74HC573的用法和数码管动态显示电路的工作原理后,才开始了对程序的修改和调试。同样,为了方便分析硬件结构和调试程序,首先在Protues环境中画出开发板电路的仿真图,然后再进行程序的反复调试及修改工作,最终完成定时器系统的软件仿真和硬件测试。本次设计的难点和重点在于程序设计的模块化分析,这也是本说明书叙述比较详细的一部分。由于运用到单片机及其内部定时中断单元,掌握单片机原理及其程序设计的相关知识是有必要的。因此在设计初期,大量阅读相关资料和参考文献,做了充分的准备工作。在模块化编程之前,为了使编写出来的程序条理清晰,富有层次感,还需要对系统的工作流程有详细的研究和分析,建立合适的数学模型。由于设计者水平有限,对相关知识掌握地还不够到位,本说明书中难免有部分知识点的遗漏和叙述不当之处,敬请各位老师给予批评指正。参考文献[1]裴岩,刘利民等.《单片机系统综合设计与实践》.呼和浩特市:内蒙古大学出版社,2003.8[2]杨国林等.《C语言程序设计》.呼和浩特市:内蒙古大学出版社,2001.8[3]郭天翔.《51单片机C语言教程》.北京:电子工业出版社,2009.11[4]皮大能,南光群,刘金华.《单片机课程设计指导书》.北京:北京理工大学出版社,2010.7[5]青岛帕沃伸电子有限公司.《OK51-Power单片机学习系统使用手册》.青岛:2010[6]Anyok.《Protues初级教程》.[7]《Protues仿真软件在单片机设计中的应用》.[8]施柏鑫.《Protues与单片机实时动态仿真》.北京:北京邮电大学信息工程学院.2006[8]AtmelHeadquarters,AtmelProductOperations.<AtmelMicrocontrollerHandbook>.美国:2001[9]STCHeadquarters,STCProductOperations.<STCMicrocontrollerHandbook>.美国:2007[10]KeilElektronikGmbH,KeilSoftware公司.《Cx51编译器用户手册》.1988-2001[11]RogerS.Press.《软件工程-实践者的研究方法》.北京:机械工业出版社.2002[12]《74HC573英文版用户手册》 附录原仿真电路的程序清单#include<reg51.h> //C51的包含头文件#defineucharunsignedchar //变量宏定义#defineuintunsignedintucharcodetable[]={ //共阴极数码管的码型表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0};ucharcodetablewe[]={0xfe,0xfd, //数码管的位选表0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchardispbuf[]={0,0,0,0,0,0,0,0};uchart0,time1,time2,time3,dispcount,kk1,kk2;uinttemp,tt;sbitK1=P1^3;sbitK2=P1^4;sbitK3=P1^5;sbitK4=P1^6;voidpanduan(); //函数的声明voidtiaozheng();voidinit();voidxianshi();voiddelay(uintz) //延时子程序{ uintt1,y; for(t1=z;t1>0;t1--) for(y=110;y>0;y--);}voidDisplay() //数码管显示子程序{ for(dispcount=4;dispcount<8;dispcount++) { P2=0xff; P0=table[dispbuf[dispcount]]; P2=tablewe[dispcount]; delay(1); P2=0xff; }}voidmain(){ init(); //调用初始化程序 while(1) { panduan(); if(kk1==0) //调用启动开关判断程序 {tiaozheng();} //调用时间调整程序 else {xianshi();} //调用显示剩余时间程序 } }voidpanduan() { if(K1==0) { delay(5); if(K1==0) { kk1++; switch(kk1) { case1:TR0=1;break; //第一次按下启动定时 case2:init();break; //第二次按下复位 } while(K1==0); do{delay(5);} while(K1==0); } } }voidtiaozheng(){ if(K2==0) { delay(5); if(K2==0) { kk2++; while(K2==0); do{delay(5);} while(K2==0); } } if(kk2==1) //如果K2按下1次则调整time1的时间 { P1=0xfe; dispbuf[4]=10; dispbuf[5]=10; dispbuf[6]=time1/10; dispbuf[7]=time1%10; Display(); if(K3==0) { delay(5); if(K3==0) { time1++; if(time1>99) time1=0; while(K3==0); do{delay(5);} while(K3==0); } } if(K4==0) { delay(5); if(K4==0) { time1=time1+10; if(time1>99) time1=0; while(K4==0); do{delay(5);} while(K4==0); } } } elseif(kk2==2) //如果K2按下第2次则调整time2的时间 { P1=0xfd; dispbuf[4]=10; dispbuf[5]=10; dispbuf[6]=time2/10; dispbuf[7]=time2%10; Display(); if(K3==0) { delay(5); if(K3==0) { time2++; if(time2>99) { time2=0; } while(K3==0); do{delay(5);} while(K3==0); } } if(K4==0) { delay(5); if(K4==0) { time2=time2+10; if(time2>99) { time2=0; } while(K4==0); do{delay(5);} while(K4==0); } } } elseif(kk2==3) //如果K2按下第3次则调整time3的时间 { P1=0xfb; dispbuf[4]=time3/10; dispbuf[5]=time3%10; dispbuf[6]=10; dispbuf[7]=10; Display(); if(K3==0) { delay(5); if(K3==0) { time3++; if(time3>99) { time3=0; } while(K3==0); do{delay(5);} while(K3==0); } } if(K4==0) { delay(5); if(K4==0) { time3=time3+10; if(time3>99) { time3=0; } while(K4==0); do{delay(5);} while(K4==0); } } } elseif(kk2==4) //如果K2按下第4次则K2复位 { kk2=0; P1=0xff; } } voidinit(){ tt=0; kk1=0; kk2=0; dispbuf[4]=10; dispbuf[5]=10; dispbuf[6]=10; dispbuf[7]=10; Display(); time1=99; time2=99; time3=99; P1=0xff; //发光二极管全灭 TMOD=0x01; //选用中断方式1 TH0=(65536-50000)/256; //设置定时器0的定时时间 TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=0; //关闭定时器}voidxianshi(){ if(tt<=time1) //如果定时时间小于time1 { //则计算并显示time1的剩余时间 temp=time1-tt; P1=0xfe; dispbuf[4]=10; dispbuf[5]=10; dispbuf[6]=temp/10; dispbuf[7]=temp%10; Display(); } elseif(tt<=(time1+time2+1)) //如果定时时间小于time1、time2之和 { //则计算并显示time2的剩余时间 temp=time1+time2+1-tt; P1=0xfd; dispbuf[4]=10; dispbuf[5]=10; dispbuf[6]=temp/10; dispbuf[7]=temp%10; Display(); } elseif(tt<=(time1+time2+time3*60+2)) //如果定时时间小于time1、time2、time3之和 { //则计算并显示time3的剩余时间 temp=time1+time2+time3*60+2-tt; P1=0xfb; dispbuf[4]=(temp/60)/10; dispbuf[5]=(temp/60)%10; dispbuf[6]=(temp-((temp/60)*60))/10; dispbuf[7]=(temp-((temp/60)*60))%10; Display();} else //如果定时时间大于time1、time2、time3之和 { //则tt清零 tt=0; }}voidtm0()interrupt1 //中断子程序{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(t0==20) { t0=0; tt++; }}根据实际开发板电路编写的源程序清单#include<reg51.h> //C51的包含头文件#defineucharunsignedchar //变量宏定义#defineuintunsignedintucharcodetable[]={ //共阴极数码管的码型表0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0};uchart0,time1,time2,time3,kk1,kk2,qian,bai,shi,ge;uinttt,temp;sbitK1=P3^4;sbitK2=P3^5;sbitK3=P3^6;sbitK4=P3^7;sbitdula=P2^6;sbitwela=P2^7;voidpanduan(); //函数的声明voidtiaozheng();voidinit();voidxianshi();voiddelay(uintz) //延时子函数的定义{ uintt1,y; for(t1=z;t1>0;t1--) for(y=110;y>0;y--);}voiddisplay(ucharqian,ucharbai,ucharshi,ucharge)//显示子函数的定义{wela=1; P0=0xff; wela=0; dula=1; P0=table[qian]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(1); wela=1; P0=0xff; wela=0; wela=1; P0=0xff; wela=0; dula=1; P0=table[bai]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); wela=1; P0=0xff; wela=0; wela=1; P0=0xff; wela=0; dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); wela=1; P0=0xff; wela=0; wela=1; P0=0xff; wela=0; dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1); wela=1; P0=0xff; wela=0;}voidmain(){ init(); //调用初始化程序 while(1) { panduan(); if(kk1==0) //调用启动开关判断程序 {tiaozheng();} //调用时间调整程序 else {xianshi();} //调用显示剩余时间程序 } }voidpanduan() { if(K1==0) { delay(5); if(K1==0) { kk1++; switch(kk1) { case1:TR0=1;break; //第一次按下启动定时 case2:init();break; //第二次按下复位 } while(K1==0); do{delay(5);} while(K1==0); } } }voidtiaozheng(){ if(K2==0) { delay(5); if(K2==0) { kk2++; while(K2==0); do{delay(5);}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论