《单片机作息时间课程设计论文.doc》由会员分享,可在线阅读,更多相关《单片机作息时间课程设计论文.doc(34页珍藏版)》请在三一办公上搜索。
1、第1章 系统设计要求与方案确定1.1设计要求 以单片机为核心,设计一个具有定时和计数功能的智能化作息时间控制器。该控制器要求的功能有:按作息时间接通/断开电铃;课间接通/断开播放音乐设备;时钟显示。作息时间控制器常用于学校教学楼的时间控制,利用单片机内部定时器实现时间基准定时,并配合“启动”、“复位”等按键的操作完成铃声、音乐的开/停控制,显示的内容要求有时、分、秒各两位。1.2设计思路根据设计要求,初步思路如下:1) 计时单元由单片机内部的定时器/计数器T1来实现。2) 时间显示功能通过LED数码管动态扫描来实现。动态扫描的定时时间由单片机内部的定时器/计数器T0实现。3) LED数码管的段
2、码输入和位码输入由8051的P0口、P1口产生。4)时间调整通过接入按钮电路来实现。系统共设三个键,分别定义为: SET功能:设置当前时间,即当电子时钟的时间有误差时,需要随时对它进行调整,使用SET键与+1键、RET键配合来完成这一功能。 +1调整键功能:分别对时间值的小时十位、小时个位、分的十位、分的个位进行+1调整,即该按键每按下一次,对应的时间调整位+1。 RET确认键功能:确认,即对+1调整位进行确认,该键按下时,说明被调整位的值已经确定,转去调整下一位。5)打铃是用P1口输出来控制继电器的闭合,从而控制打铃和放音乐。为了方便观察,用发光二极管来代替继电器,即P1.7对应的发光二极管
3、亮代表电铃接通,若不亮代表电铃断开,P1.6对应的发光二极管亮代表放音机接通,若不亮代表放音机断开。第2章 控制系统硬件电路设计2.1硬件电路的设计方案及框图根据设计要求与设计思路,确定该系统的控制方案,图1所示为开系统设计方案的硬件电路的设计框图。硬件电路由8个部分组成,即单片机按键输入电路、单片机时钟电路、单片机复位电路、6位LED动态扫描电路、语音输出与打铃电路。下面将分别对硬件电路的设计和器件的选择做详细介绍。3个按键输入电路时钟电路复位电路单片机6位LED动态扫描电路语音输出与打铃电路图1 硬件电路设计框图2.2单片机的选择当今单片机厂商琳琅满目,产品性能各异。常用的单片机有很多种:
4、Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、台湾Winbond(华邦)W78系列、荷兰Pilips的PCF80C51系列、Microchip公司的PIC系列、Zilog的Z86系列、Atmel的AT90S系列、韩国三星公司的KS57C系列4位单片机、台湾义隆的EM-78系列等。根据初步设计方案的分析,设计这样一个简单的应用系统,可以选择带有EPROM的单片机,应用程序直接存储在片内,不用在外部扩展程序存储器,电路可以简化。该系统的设计我们采用8051芯片。图2所示为采用双列直插式封装的8051AH芯片管脚图。各管脚的功能如下。1. 电源管脚VCC(40脚
5、):接+5V;VSS(20脚):接地。(注:管脚未画出)2时钟信号管脚X1(19脚),X2(18脚):外部时钟信号的两个管脚3控制线1) RESET(9脚):用作复位输入端。2) EA/VP(31脚):EA为访问内部或外部程序存储器的选择信号。对片内EPROM编程市时,此管脚(作VP)接入21V编程电压。3) ALE/P(30脚):当访问外部存储器时,ALE信号的负跳变将P0口上的低8位地址送入锁存器。当对内EPROM编程时,该管脚(P) 图2 8051AH管脚图用于输入编程脉冲。4) PSEN(29脚):外部程序存储器读选通控制信号。4输入/输出口线1) P0口(3239脚):8路漏极开路型
6、双向并行I/O口。在访问外部存储器时,P0口作为低8位地址/数据总线复用口,通过分时操作,先传送低8位地址,利用ALE信号 的下降沿将地址锁存,然后作为8位数据总线使用,用来传送8位数据。在对片内EPROM编程时,P0口接受指令代码;而在内部程序校验时,则输出指令代码,并要求外接上拉电阻。外部不扩展而单片应用时,则作双向I/O口用,P0口能以吸收电流的方式驱动8个LSTTL负载。2) P1口(18脚):具有内部上拉电阻的8位准双向I/O口。在对片内EPROM编程及校验时,它接收低8位地址。P1口能驱动4个LSTTL负载。3) P2口(2128脚):具有内部上拉电阻的8位准双向I/O口。在外接存
7、储器时,P2口作为高8位地址总线。在对片内EPROM编程及校验时,它接收高8位地址。P2口驱动4个LSTTL负载。4) P3口(1017脚):8位带有内部上拉电阻的准双向I/O口。每一位又具有如下的特殊功能(或称第二功能):P3.0(RXD):串行输入端。P3.1(TXD):串行输出端。P3.2(INT0):外部中断0输入端,低电平有效。P3.3(INT1):外部中断1输入端,低电平有效。P3.4(T0):定时/计数器0外部事件计数输入端。P3.4(T0):定时/计数器0外部事件计数输入端。P3.5(T1):定时/计数器1外部事件计数输入端。P3.6(WR):外部数据存储器写选通信号,低电平有
8、效。P3.7(RD):外部数据存储器读选通信号,低电平有效。2.3时钟与复位电路的设计单片机工作的时间基准是由时钟电路提供的。在单片机的X1和X2两个管脚,接一只晶振及两个电容就构成了单片机的时钟电路,如图3(a)所示。电路中,电容器C1和C2对振荡频率有微调作用,通常的取值范围为(3010pF)。石英晶体选择6MHz或12MHz都可以,其结果只是机械周期时间不同,影响计数器的计数初值。单片机的RST管脚为主机提供一个外部复位信号输入端口。复位信号是高电平有效,高电平有效的持续时间应为2个机器周期以上。单片机的复位方式有上电复位和手动复位两种。图3(b)所示是51系列单片机常用的上电复位和手动
9、复位组合电路,只要VCC上升时间不超过1ms,它们都能很好地工作。复位以后,单片机内部各部件恢复到初始状态。(a)时钟电路 (b)复位电路图3 时钟与复位电路2.4六位LED动态扫描电路2.4.1数码管电路 数码管是单片机系统中常用的显示界面,可以显示“1、2、3、4、5、6、7、8、9、0”和十六进制中的“A、B、C、D、E、F”及小数点“.”, 数码管怎样来显示1,2, 3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。分别被命名为A,B,C,D,E,F,G,H和DP。如果要显示一个数字2, 那么 A、B、G、E、D这5个段的发光管亮,B、E、H(小数点)不亮,就可
10、以了。图5 六位LED显示器内部结构原理图由图4可知:要使数码管发光必须满足两个条件,一、COM端为高电平。二、在A-G端的对应部分输入低电平。这样电流流过相应的字段,数码管就会显示相应的字符了!图5所示,由于数码管的A、B、C.DP端都并在一起,要使每个数码管显示各自的内容,所以必须使用动态扫描方式。表一 字符代码表显示数字 A B C D E F G DP 16进制代码0 0 0 0 0 0 0 1 1 03H 1 1 001 1 1 1 1 9FH 2 0 0 1 0 0 1 0 1 25H 3 0 0 0 0 1 1 0 1 0DH 4 1 0 0 1 1 0 0 1 99H 5 0
11、1 0 0 1 0 0 1 49H 6 0 1 0 0 0 0 0 1 41H 7 0 0 0 1 1 1 1 1 1FH 8 0 0 0 0 0 0 0 1 01H 9 0 0 0 0 1 0 0 1 09H A 0 0 0 1 00 0 1 11H B 1 1 0 0 00 0 1 C1H C 0 1 1 0 0 0 1 1 63H D 1 0 0 0 0 0 0 1 85H E 0 1 1 0 0 0 0 1 61H F 0 1 1 1 0 0 0 1 71H . 1 1 1 1 1 1 1 0 FEH 注:对于想显示的字符只要查表的代码送段码输入口显示即可。我们可以先点亮左边(右边亦可
12、)第一位,其它的都熄灭,延时一定时间后,再点亮第二位,其它都熄灭当点亮完最后一位时再从头开始下一循环。虽然在每一瞬间只有一只发光管被点亮,但由于人的眼睛具有视觉残留效应,只要所设定的延时时间恰当,所看到的所有发光管显示的都是稳定的字符,这就是动态显示方式。为了编程方便,对于上面的电路图,我们将可以显示的字符代码编制成表格如表一所示。2.4.2LED的段码和位码驱动芯片的选择由于选用动态显示,每一位数据的显示是由段和位选信号共同配合完成的,因此,要同时考虑段和位的驱动能力,而且端的驱动能力决定位的驱动能力。选用74LS273芯片作为显示电路的段码输出锁存,选用74LS06芯片来进行反相和提高驱动
13、能力,然后再接各LED显示器的位控端。2.4.3LED驱动电路与单片机的连接图6 六位LED显示接口电路采用单片机的P1口作为位码输出口,通过74LS06芯片驱动数码管的位控端。74LS273作为输出接口由WR及A15组合信号控制,单片机的P0口作为数据线与I/O数据线相连(74LS273的口地址为CFA0H)。如图6所示为六位LED显示接口电路,该电路的工作原理是:从字符代码表格中取出显示字符,通过74LS273芯片锁存、译码和驱动作用,输出具有一定驱动能力的七段字型码,由于六位LED的端码输入管脚是并联在一起的,所以每位LED都获得这个段码。若要控制在每一时刻只有一位LED被点亮,必须由位
14、码信号控制。P1口的低6位输出位码信号经反相后接LED的位码控制端,因此P1口的位码信号在每一时刻只有一位是“1”,其它为位为“0”,然后按时间顺序改变输出“1”的位置。详细的LED动态扫描显示程序请参见软件设计部分T0_SEV子程序的设计。2.5按键电路设计与器件选择该控制系统要用到时钟电路,所以要求能随时对当前时间进行调整。要实现这一功能,可以接入键盘电路。图7 按键电路本系统只需要3个按键,因此选用独立式键盘。如图7所示,电路由按键和3个电阻组成,按键可以才哟功能轻触开关,按键分别命名为SET、+1和 RET键,电阻阻值都为1K。将键盘直接与单片机的P3口相接,用P3.2口线通过按键SE
15、T接入一个外部中断的请求信号INT0;P3.0、P3.1管脚作为I/O口使用。三个按键功能的设计思路如下:1)SET键功能:设置当前时间,即当电子时钟的时间有误差时,需要随时对它进行调整,使用SET键与+1键、RET键配合来完成这一功能。当SET键被按下时,在单片机的INT0管脚产生一个低电平触发中断请求信号,CPU响应中断请求时,就转移到INT0中断服务程序的入口地址,执行中断服务程序。设计INT0的中断服务程序的功能是调整当前时间,程序的标号地址是INTA。2)+1调整键功能:分别对时间值的小时十位、小时个位、分的十位、分的个位进行+1调整,即该按键每按下一次,对应的时间调整位+1。该信号
16、与P3.0管脚连接,当P3.0工作在I/O接口方式时,为了保证能正确输入外部信息,在初始化程序中用指令“SETB P3.0”对它进行编程,即将P3.0管脚作为输入口使用。3)RET确认键功能:确认,即对+1调整位进行确认,该键按下时,说明被调整位的值已经确定,转去调整下一位。该信号与P3.1管脚连接,与P3.0类似,用于I/O接口方式时,在初始化程序中用指令“SETB P3.1”对它进行编程,即将P3.1管脚作为输入口使用。键盘的硬件电路设计只是完成3个按键信号可靠输入,要想实现键盘的输入功能,还要靠软件编程来具体实现。设置当前时间的中断服务程序,请参见软件设计一章中的INTA子程序设计。2.
17、6语音输出与打铃电路设计要求到某一作息时间电铃或语音有输出。我们用发光二极管代替语音输出设备,用代替电铃。电路设计如图8所示。蜂鸣器作为三极管VT的集电极负载,当VT导通时,蜂鸣器发出鸣叫声音;VT截止,蜂鸣器不发声。R是限流电阻。蜂鸣器电路与单片机的接口:VT的基极接到单片机的P1.7管脚,P1.7口作为输出口使用。当P1.7=0时,VT导通,是蜂鸣器的两管脚获得将近5V的直流电压,蜂鸣器中有电流通过,而产生蜂鸣音;当P1.7=1时,VT截止,蜂鸣器的两管脚间的直流电压接近于0V,蜂鸣器不发声。发光二极管与单片机的接口:发光二极管的阴极与单片机的P1.6管脚相连。当P1.6=0时,发光二极管
18、亮,表示有语音输出,当P1.6=1时,发光二极管灭,此时无语音输出。图8 语音输出与打铃电路通过前面的设计过程,可设计出作息时间控制系统的硬件总电路如附录A所示。 第3章 控制系统软件设计3.1软件设计方案确定 根据设计要求,我们将软件设计分成6个功能模块,分别是主程序模块、数码管动态扫描模块、当前时间计时模块、当前时间调整模块、闹铃与语音、输出模块、数制转换模块(如图所示)。各功能模块都具有独立的功能,产生相应的结果,模块的具体设计请见后面章节。主程序模块数码管动态扫描模块当前时间计时模块当前时间调整模块闹铃与语音输出模块数制转换模块图9 作息时间系统软件设计模块3.2内存空间分配 一般在程
19、序设计前要对内存进行合理的分配,这样既可使得编程时心中有数,又可充分利用单片机内部RAM有限的存储空间。作息时间系统程序设计内存分配见表2。表二 内存空间分配表地 址 分 配作 用60H7FH堆栈区40H45HLED段码显示缓冲区,存储显示字符BCD码,低四位有效48H4DHLED位码显示缓冲区,存储LED位码信号,低六位有效32H34H当前时间的二进制存储单元,32H存储小时,33H存储分,34H存储秒。29H输入键值存储单元30H当前调整位标志31HLED显示位数存储单元02H05H计时用工作寄存器(0区R2R5)18H1AH动态扫描用工作寄存器(3区R0R2)2EH控制字存储区地址指针暂
20、存单元6AH控制字开关操作码暂存单元6BH6DH依次存控制字的秒值、分值和小时值3.3主程序设计主程序的内容一般包括:主程序起始地址、中断服务程序入口地址、有关内存单元及相关部件的初始化和一些子程序调用等。主程序设计框图如图所示。1)程序的起始地址:MCS-51系列单片机复位后,(PC)=0000H,而0003H002BH分别为各中断源的入口地址。所以,编程是应在0000H处写一跳转指令。2)主程序初始化内容:所谓初始化,是对将要用到的MCS-51系列单片机内部部件或扩展芯片进行初始工作状态设定。MCS-51系列单片机复位后,特殊功能寄存器IE、IP的内容均为00H,所以应对IE、IP进行初始
21、化编程。同时还要对一些存储单元进行初始化,这些内容都应在初始化程序中完成。参见MAIN标号地址到LOOP标号地址之间的内容。3)代码转化程序:由于人们习惯使用十进制数,而计算机的键盘输入、输出以及显示常采用二进制编码的十进制数(即BCD码)。因此,在程序中经常要进行代码转换。其程序见LOOP标号地址到LOP标号地址间的内容。这段程序的功能是完成将当前时间的二进制数转化为BCD代码,并送显示缓冲区。图10 主程序设计框图3.4各子模块设计3.4.1LED动态扫描程序模块设计 在采用动态扫描显示方式时,要是LED显示比较均匀,又有足够亮度,需要设置适当的扫描频率。当扫描频率在70Hz左右时,能够产
22、生足够的图形和较好的显示效果。一般可以采用间隔20ms对LED进行动态扫描一次,每一位LED的显示时间为2ms。程序流程如图所示。 本系统设计中 ,采用硬件定时和软件定时并用的方式,即T0溢出中断功能实现20ms定时,通过软件延时程序实现1ms定时。1)T0定时器中断服务程序的功能 从显示缓冲区分别取出显示数据的位码和段码,分别送P1口和数据输出P0口,依次显示每一位,每一位能显示时间为2ms,显示6位需要12ms的时间;LED显示器显示每一位时间为2ms,延时2ms子程序是典型的软 图11 LED动态扫描程序流程图件定时程序(程序见DELAY1标号地址到DELAY标号地址)。2)定时器T0的
23、计数初值X=09F0H,即有 TH0=09H TL0=0F0H工作方式寄存器TMOD=0000 0001B=01H,T0定时器以工作方式1完成定时。3.4.2时钟计时程序模块设计作息时间控制系统必须设计一个时钟程序来实现24h的定时功能。本系统中单片机的时钟频率为6MHz,则定时器最长的定时时间是131。72ms,以此来产生24小时的时间值,可采用硬件定时与软件定时想结合的方法来实现。1)24小时时间的产生。选择定时器T1,用工作方式1,定时100ms。T1定时100ms中断一次,利用R2累加器加1,当R2=10时,时间正好是1s;再利用R3计数60s,依次类推,累计24h的时间值,需要设置以
24、下几个寄存器:R2:累计1s时间寄存器。T1中断一次R2=R2+1,计数十次向R3进位,并将R2清零。R3:累计60s时间寄存器。当R3=60s向R4进位,并使R3=0。R4:累计60min时间寄存器。当R4=60min向R5进位,并将R4清零。R5:累计24h时间寄存器。当R5=24h,正好是一昼夜,并使R5=0。R2R5按二进制计数,程序设计的思路和方法,如图程序框图和程序清单。 2)定时器T1的计算初值X=3CB0H。初值寄存器的初值TH1=3CH,TL1=0B0H,工作方式寄存器TMOD=0001 0000B=10H。T1定时器每中断一次,中断10次为1s。程序流程图如图12所示图12
25、 T1定时器程序设计流程图3.4.3键盘接受子程序设计由于机械触点的弹性作用,在闭合及断开的瞬间均伴随有一连串的抖动,而按键稳定闭合时间的长短则是由操作人员的按键动作决定的,为了确保CPU对键的一次闭合仅作一次处理,键抖动可用硬件或软件两种方法消除。这里采用软件去抖动的方法,程序流程图如图13所示,程序见INTA中断服务程序。(4)闹铃与语音输出模块设计 作息时间的主要功能就是实现自动打铃和放语音。该模块的设计流程如图14所示。在主程序的每一个扫描周期都调用该子程序,当作息时间与计时时间相等时,就进行相关功能的选择执行。具体程序见RING子程序。图14 打铃程序流程图3.5程序清单 见附录B第
26、四章 调试步骤与结果1 输入源程序 输入源程序时,应以西文方式输入字母和符号,且中文注释前要加分号。 2对源程序进行汇编和纠错 根据自动汇编提供的错误信息逐条纠正错误,直至汇编信息提示无误。 3确定调试方案 在调试程序前认真分析源程序,确定各功能程序运行的预期结果。然后结合源程序应达到的结果,通过某些关键参数和实验现象检验程序运行结果正确与否。并针对具体的分析和观察对象选择较合适的调试方法。如单步运行、跟踪运行、连续运行、快速运行至光标处、设置断点等调试方法。 4调试程序1) 调试子程序。由于程序比较多,整体调试不容易发现和改正错误,故采取子程序调试的方法,但要明确子程序的具体功能。例如:调试
27、显示子程序时,只将显示子程序进行汇编,确认无误后单步执行,观察CPU窗口和DATA窗口以及CODE窗口相应单元的变化是否跟预期的一样。如果有问题找出问题所在。采取各个击破的方法调试好各个子程序。2)确定各子程序无误后,再调试完整的程序,要注意各子程序之间的衔接以及和主程序之间的调用和返回。运行后,观察有无显示,时钟是否工作,其时、分、秒显示的变化过程是否正确。若运行结果不正确,首先应根据程序运行的实际现象分析判断哪些因素可引起相关故障,再通过调试方法逐一认证和排除。通过反复调试,发现并排除软件与硬件存在的各类问题,以满足系统设计的预期目的。 5、调试结果运行主程序后,可看到六位LED显示器全亮
28、,并且每过一秒,最低位显示器加一,当加到59后,返回0。改变时间初值,显示相应的时间,分钟到59后,也能返回0,小时到23后能返回0。若设定初始时间为7:59:59则过1秒后P1.7对应的发光二极管亮,过10秒后P1.7对应的发光二极管灭;若设定初始时间为9:40:59,则过1秒后P1.6所对应的发光二极管亮,若设定初始时间为9:58:59,过1秒后P1.6所对应的发光二极管灭说明调试正确。第五章 总 结 在这两周的学习和设计中,使我充分认识到理论联系实际的重要。安装和调试自始至终要有严谨的科学作风,不能抱有侥幸心理。理论固然重要,但是在实际应用中遇到的很多问题是不容忽视的。在第一周,我们通过
29、找大量的资料和同学们一起研究和讨论,认识设计的内容,将其分为两大部分(硬件设计部分和软件设计部分),终于设计出一套完整的方案。但是将这些具体的方案落实到实际设计中,出现很多错误,而那些错误在原则上是可以避免的,这就需要我们在调试过程中利用所掌握的知识认真检查,发现不足。然后在讨论如何解决不足之处,如此一次次的改,一次次的查,直到完全符合我们的功能要求。无数次的尝试总算是把设计搞好了,电路调试成功。真是难以去形容那种愉悦的心情。自己的付出总算是有了回报。我也得到了自己知识不足的教训。感觉在知识不牢固的时候是多么无助。自己要反复的去查阅以前的课本和书籍是多烦琐的事情。这也就坚定了我在以后的学习中要
30、认真学好基础知识的决心。总体来说,这次实习使我受益匪浅。在摸索该如何设计电路使之实现所需功能的过程中,特别有趣,培养了我的设计思维,增加了实际操作能力。在让我体会到了设计电路的艰辛的同时,更让我体会到成功的喜悦和快乐。通过这次课程设计,我认识到单片机设计中应注意的几个问题:(1)采用模块化、子程序化的优点是便于连接和移植,特别是重复使用时尤为方便。但使用者必须预先明确各子程序的入口参数、出口参数和所占用的资源,合理利用堆栈,避免主程序与子程序之间、子程序与子程序之间所占用的资源发生冲突。(2)在调试程序前,一定要预先将源程序分析透彻,在此基础上训练如何通过实验现象分析和判断产生故障的原因及故障
31、可能存在的大致范围;灵活运用开发系统所提供的各种调试方法,快速有效地排查和缩小故障范围。通过反复调试,不断地分析和排除故障,调试软件和硬件的能力及速度。(3)调试程序时,要结合能反映故障存在与否的参数变化、运行路径变化、显示内容变化等,选择合适的观测点和观测对象,再运用适当的调试方法,快速地检验调试结果,由此分析和判断故障点。致 谢 两周的课程设计结束了,在此我想对我的指导老师王迎旭老师表达我衷心的谢意。在她耐心的指导下,使这次课程设计取得了较满意的结果。这次设计过程中得到了其他老师的指导和帮助,在此一并表示衷心的感谢。在设计中,我查了不少参考资料,在此向其作者表示敬意!参考文献:1王迎旭.单
32、片机原理与应用.机械工业出版社.2005.82李全利、迟荣强.单片机原理及接口技术.高等教育社.2004.13谭浩强.MCS-51单片机应用教程.清华大学出版社.2004.3附录A:程序清单 SEC EQU 32H MIN EQU 33H HOUR EQU 34HORG 0000HLJMP MAIN ;转主程序ORG 0003H ;外部中断0中断服务程序入口地址LJMP INTA ;转外部中断0中断服务程序ORG 000BH ;T0定时服务程序入口地址LJMP T0_SEV ;转T0定时服务程序ORG 001BH ;T1定时服务程序入口地址LJMP T1_SEV ;转T0定时服务程序ORG 0
33、030H ;设置主程序起始地址=0030HMAIN: MOV SP,#60H ;设堆栈区 MOV 48H,#0DFH ;LED位选择码 MOV 49H,#0EFH MOV 4AH,#0F7H MOV 4BH,#0FBH MOV 4CH,#0FDH MOV 4DH,#0FEH MOV SEC,#10 MOV MIN,#30 MOV HOUR,#06 ;设置时间初值为12:00:00 MOV TMOD,#99H 设置T1,T0定时器,工作方式一 MOV TH1,#3CH ;T1定时100MS MOV TL1,#0B0H MOV TH0,#0D9H MOV TL0,#0F0H ;T0定时20MS定时
34、 MOV IP, #08H ;设置优先级 MOV TCON,#50H ;启动T1,T0定时 MOV IE,#9FH ;开中断LOOP: MOV B,#10 ;将二进制数转换为十进;制数(BCD码) MOV A,HOUR ;并送到显示缓冲区40H到45H DIV AB MOV 40H,A MOV 41H,B MOV B,#10 MOV A,MIN DIV AB MOV 42H,A MOV 43H,B MOV B,#10 MOV A,SEC DIV AB MOV 44H,A MOV 45H,B LCALL RING ;调用打铃子程序 NOP SJMP LOOP;T0中断服务程序T0_SEV: PU
35、SH A PUSH PSW SETB RS1 SETB RS0 CLR TR0 MOV R2,#06H ;设置显示器位数 MOV R0,#40H ;设置段码首地址 MOV R1,#48H ;设置位码首地址GO_ON: MOV A,R2 ;送显示位数A MOV A,R1 ;送位码到A累加器 MOV P1,A ;将位码送P1口 MOV A,R0 ;送段码到A累加器 MOV DPTR,#WorldTab MOVC A,A+DPTR MOV DPTR,#0CFA0H ;将段码输出 MOVX DPTR,A LCALL DELAY1 ;调用延时子程序,延时2MS INC R0 ;段码地址+1 INC R1
36、 ;位码地址+1 DJNZ R2,GO_ON ;判断6位是否显示完,;没完继续显示下一位 MOV TH0,#0D9H MOV TL0,#0F0H POP A SETB ET0 SETB TR0 SETB EA RETIDELAY1: MOV R3,#10H ;延时2MS子程序AGAIN: MOV R4,#48HDELAY: NOP NOP DJNZ R4,DELAY DJNZ R3,AGAIN RET;T1定时器每100ms中断一次,中断10次为1S。程序如下:T1_SEV: MOV TH1,#3CH ;重置T1计数初值 MOV TL1,#0B0H PUSH A ;保护现场 PUSH B PU
37、SH PSW CLR EA CLR RS1 CLR RS0 ;选择0区工作寄存器 INC R2 CJNE R2,#0AH,EN MOV R2,#0 INC R3 ;秒计时单元R3加1 MOV SEC,R3 ;秒值送32H单元 CJNE R3,#3CH,EN ;判断R3=60S否,否则转EN MOV R3,#0 ;60S时间到,R3=0 MOV SEC,R3 ;秒值送32H单元 INC R4 ;分计时单元R4加1 MOV MIN,R4 ;分值送33H单元 CJNE R4,#3CH,EN ;判断R3=60MIN否,否则转EN MOV R4,#0 ;60MIN时间到,R4=0 MOV MIN,R4
38、;分值送33H单元 INC R5 ;小时单元R5加1 MOV HOUR,R5 ;小时值送34H单元 CJNE R5,#18H,EN ;判断R5=24H否,;否则转EN标号地址 MOV R5,#0 ;24H时间到,R5=0 MOV HOUR,R5 ;小时值送34H单元EN: POP PSW ;恢复现场 POP B POP A SETB EA ;开中断 RETI ;中断返回;打铃子程序如下: RING: MOV R3,#04H MOV DPTR,#2FFCHLOOP3: MOV R1,#35H MOV A,#0H INC DPTR DJNZ R3,LOOP3 MOVC A,A+DPTR ;读取控制
39、码 JZ LOOP2 ;控制码为0则返回 MOV 6AH,A ;存控制字 MOV R3,#03HLOOP1: INC DPTR ;地址指针增量 DEC R1 ;计时单元地址减量 MOV A,#0H MOVC A,A+DPTR ;读作息时间(秒,分,时) MOV 6BH,A ;存作息时间 MOV A,R1 ;读计时时间 CJNE A,6BH,LOOP3 ;计时时间与作息时间比较 ;不等则转,继续读下面的控制码 DJNZ R3,LOOP1 ;共读取3次 MOV A,6AH ;开关操作码送A MOV R3,#04H CJNE A,#0FEH,BB ;判断是否打铃定时时间到 CLR P1.7 ;打铃 SJMP LOOP3BB: CJNE A,#7FH,CC ;判断是否播音时间到 CLR P1.6 ;放音乐 SJMP LOOP3CC: CJNE A,#0FDH,DD SETB P1.7 SJMP LOOP3DD: CJNE A,#0BFH,LOOP2 SETB P1.6LOOP2: ret ;返回;设置当前时间程序如下:INTA:SETB P3.0 ;输入键值前,先将P3.0、P3.1置1 SETB P3.1 CLR TR1 ;T1停止定时 CLR ET1