课程设计杨晓琨

上传人:lx****y 文档编号:156169354 上传时间:2022-09-26 格式:DOC 页数:30 大小:496.50KB
收藏 版权申诉 举报 下载
课程设计杨晓琨_第1页
第1页 / 共30页
课程设计杨晓琨_第2页
第2页 / 共30页
课程设计杨晓琨_第3页
第3页 / 共30页
资源描述:

《课程设计杨晓琨》由会员分享,可在线阅读,更多相关《课程设计杨晓琨(30页珍藏版)》请在装配图网上搜索。

1、 单片微型计算机课程设计报告 多功能电子数字钟 姓 名 杨晓琨 学 号 09031XXXX 班 级 电气X班 20120221目录一:概述3二:设计基本原理简介4三:设计要求及说明四:整体设计方案6系统硬件电路设计 系统软件总流程设计模块划分及分析 五:单模块流程设计1各模块设计概述、流程图 模块源程序集合及注释 六:单模块软件测试27七:系统检测调试28硬件电路调试软件部分烧写调试八:心得体会30一、概述课程设计题目:电子数字钟应用知识简介:l 51 单片机 单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。作为嵌入式系统控制核心的单片机具有其体积

2、小、功能全、性价比高等诸多优点。51 系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,5系列单片机的发展又进入了一个新的阶段。在今后很长一段时间内51 系列单片机仍将占据嵌入式系统产品的中低端市场。l汇编语言汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。汇编语言保持了机器语言的优点,具有直接和简捷的特点,其代码具有效率高实时性强等优点。但是对于复杂的运算或大型程序,用汇编语言编写将非常耗时。汇编语言可以与高级语言配合使用,应用十分广泛。l PIS(In-tem Pogramin)在系统可编程,是当今流行

3、的单片机编程模式,指电路板上的空白元器件可以编程写入最终用户代码,而不需要从电路板上取下元器件.已经编程的器件也可以用ISP 方式擦除或再编程。本次课程设计便使用P 方式,直接将编写好的程序下载到连接好的单片机中进行调试。选题目的及设计思想简介:课程设计是一次难得的对所学的知识进行实践的机会,我希望通过课程设计独立设计一个简单的系统从而达到强化课本知识并灵活运用的目的。电子数字钟是日常生活钟随处可见的简单系统。对电子数字钟的设计比较容易联系实际并进行拓展, 在设计中我将力求尽可能跳出课本的样板,从现实生活中寻找设计原型和设计思路,争取有所突破。如图所示便是我本次课程设计流程图,设计的整个过程运

4、用自顶向下分析、自底向上实现的办法进行设计,借鉴在软件工程中学习到的软件设计流程和规范来完成系统设计并在设计过程中体会软件设计的流程。二、设计基本原理简介数字钟的设计首先要保证其走时尽可能准确,其次再根据人们日常的使用习惯来设定其附加功能。在设计中利用单片机定时计数器来完成走时并用两组输出口控制数码管来显示;通过编程向某一输出口输出方波实现报时及闹铃;利用输入端口外接各种开关来完成对走时及显示的控制(如预置时间等)。在设计中需要用到许多技巧.以下为我在学习单片机课程中总结的一些设计思想或方法:l 占空比概念在设计中的运用 如图所示的一串方波序列,导通时间同周期的比值即占空比。在用单片机控制对多

5、个数码管的扫描显示中,数码管接收到的电压可以看成是一串方波序列,占空比控制了数码管的亮度。实际上对显示延时时间的调节就是调节数码管电压的占空比,当占空比大于一定数值的时候数码管可以显示,实验证明占空比在0时仍可以使数码管清晰显示。利用这个概念可以比较直观地理解显示延时的调节。l 的分时复用单片机只有一个C,因此在一个时间内只能执行一条语句,要使单片机同时控制多个外部元件(比如扬声器和数码管)就必须对单片机的PU进行分时复用,让单片机在一小段时间内连续交替执行控制多个器件的语句,从表面上看,单片机便用一个PU控制了多个元件。本次课程设计中对整点报时和闹铃功能的实现便用到了这个概念。l 单片机位寻

6、址区的使用单片机内部数据存储器由20H到2FH共有1个字节的位寻址区可以被作为程序执行过程中的状态参数,许多程序模块至于两个状态(比如闪烁与正常显示,报时与不报时等)用位寻址区中的某一位来记录程序执行状态,在需要对状态进行判断的时候十分方便并且节约空间,一个字节便可以判断八个状态,而非位寻址区的地址记录程序状态时可能需要先进行变换,增加了执行成本且容易出错。l 检测开关时需要注意的问题对于用各种开关控制程序执行状态的程序设计中,需要注意实时地进行开关的检测,以确保一旦有开关动作,程序状态立即随之改变。此外,在用多个开关控制不同执行状态时,应注意设置开关检测的优先级以防止多个开关同时按下时出现错

7、误。l 系统资源分配与使用单片机有许多资源是有限的不能滥用,比如定时计数器,外部中断等,在设计一个多模块程序时,要注意先做一个整体规划,把稀缺资源用在最需要用的地方.此外在有多个模块时,要注意模块间的数据传递,比如累加器和进位标志C,在使用时要注意不能让前一个模块的数据对下一个模块产生不希望有的影响.在模块间的数据传递比较多时最好用固定的内部数据存储器,以避免冲突发生错误.三、设计要求及说明设计要求:基于单片机电路,借鉴生活中常见的电子钟的功能,结合课本的要求使用汇编语言设计一个简单的电子钟系统。要求使用简便,功能实用,错误少,有一定创新性.电子数字钟实现的主要功能:实现正常走时(秒分时日月年

8、进位) 能够预置时间和日期能够自动区分平闰年和大小月 具有闹铃及设定闹铃时间功能具有整点报时功能 具有生日提醒功能,能够预置生日时间在任何一种预置状态下,预置项目会闪烁显示其它设计说明 优先级:预置闹铃报时生日提醒正常显示,即预置状态下闹铃、报时功能及生日提醒功能都无效 生日时间到五个数码管显示“HPY” 生日显示状态下,按下中断INT0恢复正常显示且此后只有在下更改生日日期或第二年生日显示才有效。正常显示状态下按下中断INT0进入预置状态,再按一次恢复。 用数码管(K0,1)控制显示状态:0:时间,01:闹铃时间,10:日期,11:生日时间且显示样板如下图所示: 预置由拨码开关K2/K3/4

9、分别控制数码管12/3/显示值,预置优先级:LED34LED12LED6(相应数码管显示的项目,显示状态下才能预置) 整点报时声音为9分1、53、55、7秒的后半秒报四声低音, 59秒的后半秒报一声高音 闹铃每次响一分钟 不论是预置状态还是正常走时状态均能够自动区分平闰年和大小月 闹铃使能由拨码开关K5控制并实时显示四、整体设计方案硬件电路设计系统硬件电路根据系统功能可知,需要六个数码管,一个外部中断INT0,一个扬声器,由此结合单片机课程学习中对实验面板的了解,做出如下电路:如图,晶振频率12Hz,拨码开关数值由口读入;P口的输出作为控制数码管的段控信号,经74LS57即8位数据锁存器接到数

10、码管中。数码管采用共阴接法(图中未标示);1.P。5作为数码管的位控信号输出端;开关W2经一个基本RS锁存器接入INT0,每按一次开关INO取反一次,按两次输入一个下降沿;扬声器由P16口控制。系统软件总流程设计根据系统要求,设计出系统软件总流程图如下以T0作为正常走时的计时器,T1作为预置状态下预置项目值自动跳升的控制计时器,IN0作为设定预置及清楚生日信号的控制按钮设计使每一轮显示(即六个数码管都显示一次)便检测一次开关使上图的“检测开关值判断并显示检测开关值” 的循环时间大约为10ms,即每隔10ms检测一次开关值,每个数码管接收到的电压信号占空比大约为1/,确保数码管正常显示。三个中断

11、源中断程序执行时间每次均为几十毫秒,基本不影响主程序的显示及闹铃输出。中断优先级0INT1,首先确保走时尽可能的准确,其次由于T的开启和关闭是由IN0进行控制的,故INT优先级较高.此外有优先级“预置显示闹铃整点报时生日显示,由于预置显示是人为控制的故优先级最高,考虑到日常生活中假如闹铃或整点报时被生日显示覆盖可能使影响到人们的日常生活故设定生日优先级最低,且闹铃最多影响生日信号一分钟.闹铃和整点报时不影响正常的时间等的显示。模块划分及分析根据系统功能将模块划分如下l NE:初始化程序模块进行资源分配(E,BIT伪指令),设定初值,各中断初始化l T:开关检测模块检测开关号,将要显示值送入显示

12、缓存l THRE:显示主程序显示显示缓存中值,并进行生日,闹铃,报时判断l SEVEN:显示生日祝福HPPY程序经显示主程序判断生日时间到要执行的显示HPPY程序(其实可以认为是显示主程序的一部分)lEGHT:闹铃及整点报时判断程序判断是否闹铃或报时,如果是则CLP16且忽略生日信号,反之则继续执行后续语句上图的“检测开关值判断并显示检测开关值 的循环时间大约为1ms,即每隔10ms检测一次开关值,每个数码管接收到的电压信号占空比大约为1,确保数码管正常显示。三个中断源中断程序执行时间每次均为几十毫秒,基本不影响主程序的显示及闹铃输出。中断优先级TIT0,首先确保走时尽可能的准确,其次由于T1

13、的开启和关闭是由IN0进行控制的,故NT优先级较高.此外有优先级“预置显示闹铃整点报时生日显示”,由于预置显示是人为控制的故优先级最高,考虑到日常生活中假如闹铃或整点报时被生日显示覆盖可能使影响到人们的日常生活故设定生日优先级最低,且闹铃最多影响生日信号一分钟。闹铃和整点报时不影响正常的时间等的显示。模块划分及分析根据系统功能将模块划分如下l ONE:初始化程序模块进行资源分配(U,IT伪指令),设定初值,各中断初始化l TW:开关检测模块检测开关号,将要显示值送入显示缓存l TRE:显示主程序显示显示缓存中值,并进行生日,闹铃,报时判断lSEE:显示生日祝福HPPY程序经显示主程序判断生日时

14、间到要执行的显示HAPPY程序(其实可以认为是显示主程序的一部分)lEIHT:闹铃及整点报时判断程序判断是否闹铃或报时,如果是则CPLP6且忽略生日信号,反之则继续执行后续语句五、单模块流程设计在完成了系统总流程设计后,便进入到了系统设计中工作量最大的单模块流程设计。由于系统模块划分虽然是系统设计的基础,但比较简单而且模块划分有多种方法,因此单模块的设计可以认为是本程序中最关键的部分。单模块设计的好坏与否决定了系统功能能否被稳定地实现以及下一阶段调试程序的难度。鉴于单模块设计的重要性,我在设计中并不急于对模块进行编码,而是反复论证模块的可行性和流程图,为下一阶段的工作做好准备,同时也能够尽早发

15、现系统模块划分的错误,加以解决。各模块设计概述及模块流程图初始化模块(ONE)初始化模块包含了各中断的跳转语句、存储资源的分配、各存储器和寄存器的赋值以及中断及计时器的状态设置。源程序中共使用了7字节的内部数据存储地址,其中包含3字节位寻址地址以便于进行位判断。三字节的位寻址地址分配如下:2H秒的存储地址,方便对整点报时条件进行判断3-月的存储地址,方便对大小月平闰年进行判断另外一个位寻址字节00H地址拆开用做程序状态标志位0H(b,S)生日标志位,到生日那天为 1 使程序转入生日显示段1H(t,S)预置标志,以INT控制其值,控制预置闪烁的实现02H(b,GS)-闪烁标志,在预置标志有效时控

16、制闪烁项目的亮和灭两状态0H(it,FC)频率控制,在整点报时时控制产生低音还是高音0H(b,B)忽略生日标志,控制预置及报时的优先级高于生日显示05H(bi)-控制生日信号的有效与否,其使用目的参见调试过程源程序中使用了两个寄存器R1、0,1用于控制闪烁的间隔时间,0用于显示延时。在初始化模块中设定了中断的优先级、定时计数器的工作模式、并打开了定时计数器T开始计时其他资源分配项目参见源程序集合及注释.初始化模块指令很大一部分都是伪指令,方便了后面程序的编写开关检测模块(O)开关检测模块主要执行两个任务:读取闹铃使能控制拨码开关5的值并赋予闹铃使能相应值;读取显示选择开关(K,1)的值并将要显

17、示的项目值送入显示缓存LD1、LE4、L5。当5为1时将A1H送入E,反之送入A0H,其中A为“”的字型码查表偏移量.当显示生日日期时,将生日Birtda的缩写“bd”的字型码送入显示缓存ED56。开关检测模块的执行时间大约在4S左右.显示主程序(THR)显示主程序是程序中最复杂的模块,实现的功能也最多,占用了程序运行过程当中90%以上的执行时间.流程图中由判断S(预置信号)开始分成两个分支,当SS1,即预置状态下程序进入预置闪烁部分。预置闪烁的优先级是:LD34ED12LD5即同预置优先级相同(参见调试部分的详细说明)闪烁首先判断是否对LE34进行判断闪烁,如果是则另外两个显示值直接显示,否

18、则判断是否对ED1进行闪烁,如果是则直接显示LED5的值,只有当前两个显示值都不闪烁的时候,才判断是否对LED56进行闪烁,这样就确保了每次只有一个显示值闪烁。预置通过GS标志位判断预置的亮/灭,由R1控制每0轮显示对S取反一次。当SS=0时进入判断闹铃/报时及正常显示模块,模块EIGHT(参见其说明)对闹铃及报时条件进行判断,符合条件则对P1取反一次并使NB(忽略生日)有效,此时不进行对BS(生日标志)的判断,即使响铃优先级高于生日显示(其实也可以对程序进行修改使响铃和生日显示不发生冲突,修改方法参见程序优化)。当不响铃并且生日标志BS有效时显示APY显示HPY子程序(EVE)本程序实际上是

19、显示主程序的分支,在模块的划分过程中为了简化显示主程序的编写而将其单列开来。本程序由生日标志B控制,当到达生日时间时,T0中断程序会将S置1使之有效在显示主程序中通过判断BS的置来控制是否执行本模块。说明:只有当在预置日期时,才需要对LED56进行预置闪烁判断。并且当LED4(即月份的显示缓存)已经判断需要闪烁后,LD56便不需要闪烁而直接显示(闪烁优先级LD56最低,每次只对一个项目进行预置,只有一个项目需要闪烁)。这个设置使同时拨下两个以上预置开关时不会出错,参见调试部分说明闹铃及报时判断程序EIHT执行过程参见其说明闹铃及整点报时判断程序(IGHT)在显示主程序中每隔一段时间调用一次本程

20、序来实现闹铃及报时功能。符合闹铃条件时,每调用一次本程序对P1。取反一次,调节调用的时间间隔便可以调节报时的输出频率.在主程序中设置每完成对一个数码管的显示变调用一次本程序,显示一个数码管的时间大约为1m,因此响铃频率高音约为500H,低音约为20Hz。程序判断闹铃使能后分成两个分支,当E=A时判断闹铃条件是否满足,满足则对1。6取反一次,否则跳转判断整点报时条件是否满足。当RE=0时,直接怕暖整点报时条件是否满足.判断整点报时条件时当当前时间满足:(MIN=59)(ECOND=9) (OT10)时报高音;当满足:(M=59)(SECND=1/535/57) (CUT1)时报低音。利用位寻址区

21、来存储ECON的方法,只要(CO5)(SECOND。=1)时便满足报低音的秒条件。利用TO中断次数存储器OUNT的大小可以判断是否到了后半秒(0每ms中断一次,中断20次到达一秒)。通过增加一个标志位FC来时下对高低音的区分,高音不受FC的影响,低音只有当FC=0的时候才对P1.取反一次。并且每调用一次本程序便对FC取反一次,便达到每调用两次取反一次1。的效果。本程序的执行时间小于40,因此多次调用不过分影响执行时间中断(TO)计时程序(IE) 中断计时程序的流程比较简单。程序除实现正常走时外还需要判断是否到达生日时间置生日标志位有效。程序的输出均为BCD码,方便了显示程序对高低位的分离并查表

22、显示.程序比较复杂的地方在于对平闰年及大小月的判断。把月MN存储在位寻址区,当NTH=02H时判断是否是平闰年,先将年由D码转化为二进制码,此时当年的后两位为全零的时候为闰年(由于只显示年的个位和十位,由200年开始,0年、0年为闰年,其共同特点就是二进制后两位为零),否则为平年.当MONTH2时判断是否为大小月,THLD12LED6这样安排的原因是由于根据生活经验ED3所对应的4个项目(小时、闹铃分、月、生日日)被预置的可能性最大。在预置日期和生日是要注意对大小月及平闰年进行判断(判断方法与中断计时程序中说明的方法类似,但不需要考虑进位)且月和日在溢出后应置一而不是归零。中断(NT0)设定程

23、序(ELEEN)中断T0设置是否进行预置以及对生日标志的清除。且有如下设置顺序:清除预置信号并关T1清除生日标志设定预置信号并开T1。每按一次中断都只执行其中一个项目延时程序(TWELV)延时时间约ms即显示两个数码管的时间,用于预置闪烁调节数码关的电压占空比一致而不出现数码管随着闪烁亮度改变的现象。模块源程序集合及注释;*ONE初始化ORG 0SJMP ONEORG 00HLJMPELVENGBHLJMP NOR001BHLJMPTENOE:D12 30H;数码管12显示缓存L EQ 31H;数码管3显示缓存LED56 U 32H ;数码管5显示缓存CUT QU 33H ;定时器T0(用来走

24、时)计数值存储器(计数中断0次到1秒)COUNS EQ 34H ;定时器1(用来预置)计数值存储器(计数中断1次到预置值加一)HOU QU 0H;以下为时间,日期,闹铃时间,生日的存储地址MIN EQU41HSEOND Q22HYRQU0HMOTHU 3DAY E5HH U60H ;闹铃小时RM QU61 ;闹铃分E QU 62H ;闹铃使能M EQU 71H;生日月份BDEQU72H ;生日天MED2,0MOV LD34,#0MV LED6,#0M ONT,MOV COUNTS,#0OV OUR,OMIN,#0MO EON,0O YEA,#0MOV MNH,#1MVDAY,1MOVRH,0O

25、VRM,0MOV ,0O BM,OV BD,1BSBI 00H;brthdaysymol生日标志(到生日那天就为1)SBT 01 ;set symbo预置信号(按下中断预置为1,便开始闪烁和预置)S BIT 02H;listn symbol闪烁标志 B 03H ;frquency otrol频率控制B BIT 4H;neglec bitrhd smbl 忽略生日标志CL BSCLR SLGSCLR FCCLR NBSTB 0H ;生日显示有效标志位OVIP,02H;中断优先级:T0NT01MOVTMO,HMOV E,8BEBITM TH0,H;mMOV0,0B0HSTB TR0MOV1,5;显

26、示延时用V R0,#0;显示延时用;*TWO检测开关号WO:MV P0,FHJ P0.5,TOMORE,0A;0A表示闹铃无效,送0A是为了方便将使能查表显示,表中第A项为-SMP TWO2WO1:MOV E,0A1HTWO2:J P0。0,TW4JB 0。,TW3OV LE12,HOUMOV LED34,MNMO LED56,SECDSJP THEEWO3:MO LD12,YEAMOV LED34,ONMO LE56,DAYSPTHREETWO:JB P0,TWO5MV L2,RHOVLE34,RMMOV LE,REJP TRETWO5:OVLE2,BMMOVED3,DV LED56,0CH

27、SP THE;* TREE显示主程序(同时包含了闹铃,预置闪烁,闹铃功能)THEE:MOV P1,#0OV P0,#0FFOV DPT,#TAB3NB S,THREEB;判断预置信号是否有效,预置有效则转入判断闪烁显示模块,否则转入正常显示模块SJP THEETREB:LMP RE11 ;HREE1是正常显示并判断整点报时及闹铃模块THEEA:JNB 0。3,THRE1;开始是判断闪烁显示,这句判断是否预置分/月生日的日/闹铃分JNBG,THREE1 ;是否闪烁?LCAL WLVE ;闪烁则调用延时不显示LE34JMP TRE4THEE1:MV A,ED34N A,0FHOVC ,A+TROV

28、 P2,ATHRE:SETB1。3NOPDJN R0,THEECR P13MV A,LESWP AANL A,#0FHOC ,ADPRMOV P2,TRE:ETP。2NODJ 0,HRLRP。2B P。2,THEE4;判断是否预置小时年/生日月/闹铃的小时JNB G,THRE4 ;是否显示小时/年/生日月闹铃的小时LAL TWLVSMPTHRTHE4:MV ,LE1AN ,0FMVC A,A+DPTRMOV 2,ATREE5:SETB P.1OPNZ 0,HREE5CL 1.1MOV A,LED12SWAP AANL A,0FHOVC ,ADRO P2,ATHEE:SET P.0NOPDNZ

29、R0,THEE6CLR P1.0JB0,THREE7 ;数码管5只有在显示日期的天时才有预置闪烁功能,其余三项都不需要判断闪烁JN P01,THREE7BP。3,THREEN P0。,THREENBGS,THREELALL TWLEJMP THRETHREE7:MOVA,LED56AL,0FHOVC A,ADPTO ,AEE8:ETB P1.5NOPDNZ R0,THREECLR 15OV ,LE5WA AAL A,FMOVC A,+DTRMOV2,ATHREE9:STB P14NPDJZR,TREELP1.HEE10:DJNR1,TWAJMPWOBTWOA:LMP TWOOB:MOVR1,#

30、50 ;判断闪烁一次是否完成L GS ;取反闪烁标志,用于控制闪烁的亮和灭LJ W;一轮显示完后再判断开关号;*正常显示THR1:LALEIGT ;判断是否取反P1.即输出闹铃或整点报时,以下每次显示都要调用一次JB B,THREE1 ;如果是在整点报时状态就不显示生日提醒,报时过后显示提醒JNB BS,THREE2SMP SEVE ;跳到生日提醒程序THRE12:CL NB ;开始正常显示时间及判断闹铃输出OV ,LD34ANL A,0FHMOVC A,A+DPTROV2,ATHRE13:SB P13NDNZ R0,THEE13LR P1OV A,ED4SWAAN ,#0HMV,ADPRMV

31、 P2,ATHREE14:SEB P1。NOPDJNZR0,THREE1C.2CL EIGHTOV ,ED12ANLA,0FHMOVC ,+DPTROV P2,ATREE1:SETB P1。1PDJNZR0,THRE1CLR 。1MOV ,LE12SWAP ANLA,0MOVC A,ADPTRMOV P2,AHE16:EBP1。NOPDJNZR,TRE16CLR P1。0LCALEIGTMOV A,DL ,0FHMOC ,APTMOV P2,AHR7:SETB 1。5NODJR0,TH17CLR15MOV A,LED56SP AAN ,0FHMC,A+DTRMV 2,THEE18:ETB 1.

32、NODZ 0,THEE8LRP1。4LP TW;一轮显示完后判开关TB3:D 3FH,5BH,4FH,66H,D,D,07H 7F,6FH,40H,7CH,5EH;1。2.。4。67.8。-b。d,的字形表bd”在显示生日时间时显示在LD56;*SEEN生日时显示生日祝福语”HAPSEVN:MOV P,#01HMOV P2,6HDNZ R0,SEVENSEV1:MOV P1,02HV 2,#77DJNZ 0,SEE1SEVN2:MOVP,0HMOV 2,#3HDJZ R0,SEVN2SN3:MOVP1,#HOV P2,7HDNZ R,SEN3EN:OV 1,#10HMV 2,6EHJNZ R0

33、,EVNLJMP O ;一轮显示完后判开关;*IGHT判断是否闹铃子程序IHT:MOVA,REE A,#0A1H,IGHT1OV ,MNCJNE A,EIGMO A,OURCJNE A,RH,EIGHT1SMP IHT4 ;闹铃时间到则CPLP1.6一次并忽略生日标志(即有效)EIHT1:MOVA,MNCJNEA,59H,GHT7MOA,SECONDCJNEA,59H,IGHT ;是否等于59分9秒EIHT2:MOVA,COUNT ;是否到达后半秒CNE A,#0,IGHT3IGHT3:JCIHT7HT4:PL .6SETBNBSJMP EIGT7EIHT5:OV A,SECNDCJE ,#1

34、H,EIGHT6 ;是否大于5秒EIGH6:JEIGHT7JNB 0,EIHT ;判断是否报低音JB FC,EIHT7 ; 只有FC有效时才输出JMP EIH2GHT7:PL FC ;用来控制报低音和高音,满足报低音条件时,调用两次本程序对P6取反一次,高音时调用一次取反一次RT;* NIE中断(T0)计时程序(包含了秒分时-日月-年间的进位及判断大小月,平闰年)NE:O T0,3C ;开定时器MOV TL0,#00HETB TR0INCCOUNTMOVA,UNCJ A,20,INESJP AEAA:LJMN1AAA:O CUN,0 ; 计时MV A,SECNDADD A,01DA A;换成b

35、cd码以方便显示OV SECOND,ACN A,#,INEAAMV SECND,#MOA,MNAD ,01A AMV MIN,ACJN A,60H,INEAAOVIN,MVA,HA A,01AAHU,ACE,24H,IEAOV HO,0MOA,AYA A,0DA AVDY,A;*判断平闰年及大小月MOV A,MNHCJEA,02,EN6AOV ,YER ;把年由BCD码换成二进制码ANL A,0HWA AMOV,#10MUABMOV 24H,AMOVA,YRAL A,0FADD ,2H ACC。,TN5A ;二进制码后两位为00表示为闰年J AC.1,TEAO 4H,#01OV A,DACJE

36、 A,#3,NINE1MOV DA,#1JP INTEA:MO A,AYCJNE A,#9H,INE1MOV DAY,1SJMPNINE0;*判断大小月;大于等于8月时双月为大月,小于8月时单月为大月TE:MOV ,NTHCN ,0H,TENAEN:JCTN9AJB 1H,TEAMVA,DAYJNE A,32H,NINE1MOV DY,1JM NNE0TEN8A:O A,DYCJNA,E1MOVDAY,#SJM NI0E9A:JNB8H,TN10OV A,DAYCJN A,3H,NINE1MOV AY,JNE0TE10A:MOV,DAYCNE A,#1H,IE1VDAY,#1;*INE0:MO

37、V A,ONH A,01DA AMOV MONTH,ASETB05HJE A,1,NINE1MMONTH,V A,YARAD A,01AAMV EAR,N1:MVA,ONTHNE A,BM,NINE2MO A,DYCJNEA,BD,NIN2NB 05H,NINE2SEB BSNN2:ETI;*TEN中断(T)预置加一程序由INT0控制其的开启与关闭;*判断预置项目TEN:MV T1,CHV T,#0B0B TR1INC COUTOV ,COTSCN A,#15,TENEMOVCOUNS,0JB P0。0,B 0。1,TSTIMDA:LM DTEBR:B0.1,BTLMP RTIDAT:LJMP

38、 BDTETE:EI;*预置时间TME: JB P0。3,TN1MO A,MINDD A,1DA MV MI,AJNE ,60H,TENOV IN,#0SJMPTEAT:JN2,EAMOV A,HOUAA,#01A MVHOR,AJNEA,2,TEAMOHOUR,TENA:ETI;*预置日期AT:JB P.3,TE3OV ,MONHADD A,#0DA AMOV MOTH,ACJEA,#13H,ENBMV MOH,#1SJPTNN3:JNBP0,TEN4OV A,YEARADD A,DA MOV YEAR,ASJMTENE4:JNP04,TENBOV A,DAYDD ,0A AMODAY,;*

39、判断平闰年MVA,MONTHCN A,02,TEN6MO A,YERAN A,0FHSWP AMOV ,#10ML AMOV24H,OV A,YEARANL A,FHA A,24HJBACC.0,TE5J ACC.,ENMV A,DACJNE A,30H,ENMOV DA,#SP TENBTEN:MOV A,AYNA,#9H,TENBMOV DY,#1SPTENB;*判断大小月N6:CJNE,#8H,TNEN:JC TENJ 8H,TEN8MOV A,DYCJNE ,#32H,TNBMOV DA,#1SJMP TENBEN8:MOA,DYCJNEA,#31,ENOVY,1JPTNBTEN:JN

40、B 18,E10OV ,DYNE ,#32H,TENBMVA,1MPTNBTEN10:MOA,DAYCJE ,#31H,TEBMOV DA,#: RET;*预置闹铃时间TIM:NB P。,TE2MV A,RMDA,DA MOV ,CJNE ,60H,ENCMV RM,#0SJP TEN12:JNB P0.,NCO A,RH A,#01DA MVRH,ACJN A,24H,TNCOV R,TENC:RETI;*预置生日日期BDE:NB P03,T14MV A,BDADDA,01DA AMOVBD,AMV ,BMCJNE A,02H,E1MO A,DCJNE A,#3H,TENDO D,#1JP

41、TENDTEN1:CJE,0H,TEN16TEN1:JC EN8JB 18H,TE17MOV A,BDCJNEA,#2,TNDMOV BD,1JMP TENDEN:VA,BDJA,3H,TENDMOV,#SMP TNEN18:J 8H,TEN19MO A,CJNE A,#32H,TN ,1SJMP ENDTEN19:MOVA,BJE A,31H,ENDMOVBD,1SP TETEN1:JNB P0,TNDMOV A,MADD A,#01 AOVM,ACJE ,#13H,TENDMOV ,#TND:SETB 05HRETI;*LEN中断(INT0)控制了预置的开关以及生日信号的清除ELEVEN:

42、JB SS,ELEVEN1 ;预置有效时按一次INT关预置CLRSSCL TR1SMP ELEVEN3ELN:B BS,EEN ;预置无效判断生日信号有效则清除生日信号CLR 05CR SJMPLVEN3ELEV2:ETBS ;都无效则令预置有效MOV TH1,3HOV TL1,BHSEB TR1ELEVEN3:ETI;*TWELVE延时小程序WEVE:OVP1,#0MV P2,0JN R0,WELVTWLE1:MO,#0MOV 2,#0DJNZR0,TWELE1R六、单模块软件测试编码中常用的程序结构说明 B S,THREEB;JMP THREEATHREB:JMTREE11;THREA:N

43、B.3,THREE1由于使用JNB等跳转指令的时候,跳转长度比较短,故需要跳转到比较远的地方时需要用这个结构.相当于:B SS,THEE11NB 。,THRETHRE1:MOA,LE4ANLA,0FHMOVC A,A+DPTMO P2,AHRE:SETBP13NODJNZ R,TRE13CP.3OV A,LED34SWAPAL ,#0HMOVC A,A+TRM P2,ATREE4:ETBP12NPJNZ R0,THREE14CR P1.2显示主程序中常用的语句段,分离LED4中的高半位和低半位作为字形码段控信号查表偏移量,通过R延时,延时时间大约为每个数码管1ms。 TEN6A:O ,MONT

44、HCJNEA,08,T7ATN7:J TEA判断MNH是否大于8H,由于CNE指令不能对直接地址进行比较只能通过来判断MOV,YARAD A,01DA AME,A对T0及T1中断程序中常用的对某项目进行加一并进行CD码调整的的程序段,由于“IC A”指令不影响标志位,故不能和“D A”指令结合使用。单模块软件测试中的问题及解决由于此前花费大量的经历在模块的流程图设计当中,因此在模块调试的过程中并没有出现太多的问题。主要问题在于语法错误,比如前述程序结果说明中的、语句和一些输入的错误。并且由于程序过于长,难以进行完整的软件调试,调试过程中发现的问题主要出现在烧写调试过程中。七、系统检测调试硬件电

45、路调试由于硬件电路基本上都是使用实验面板上常用的部分电路,调试相对简单。调试操作项目:将实验板上的跳线J5同INT0相连,使3.2受W控制将跳线J3,J分别同LED相连,使数码管5、6送1和P1.5控制利用长跳线将P6与扬声器相连(由于这个操作会影响单片机的其他输出电路的使用,因此注意此操作必须在烧写下载后才能进行,否则会报错)将跳线J10同“+5”连接软件部分烧写调试我一共进行了三次软件部分烧写调试,纠正了许多程序错误,主要修改部分如下:第一次调试:中断预置程序无法进行正常的加一程序计时进位有误,无法正常进位日期无法正常显示闪烁有错误,无法正常闪烁显示的数字不稳定,有许多干扰从第一次调试的结

46、果上看,几乎所有的功能都无法正常显示。事实上,在第一次调试后对程序进行检查后发现,造成这些问题的主要原因是程序有十几处的输入有误,并不是程序流程上的问题。因此这里不做过多的叙述。第二次调试:经过第一次调试以后的修改,解决了第一次调试中出现的前四个问题,但第五个问题“显示的数字不稳定,有许多干扰”仍然无法发现问题的所在,在机房进行了多次修改都不成功。经过思考和对跟其他同学的显示语句进行比对,我判断问题的原因可能是我在过去编程时养成的一个不好的习惯,我经常使用的一个延时办法,容易把干扰放大。对于数码管的显示及延时我经常使用以下语句:“A:MOV P,#位控MOP2,#段控DJN ,AAA”这个语句

47、段比较简单,不需要另外编写一个延时程序,延时时间大约1。3ms,用在干扰语句比较少的地方很方便。但却可能出现一个隐患,假如P或者P在赋值过程中会出现干扰,那么对其重复的赋值便会放大干扰.并且由于常常只需要给其中一个数码管赋值,而这个语句却一次性给所有的数码管赋位控信号,可能将单个数码管段控信号中出现的干扰传递到其他管中。因此我对以上程序做了修改如下:“MOV P2,段控THREE:SETB P1.3NOPDNR0,TRE1LR 13这样便解决了以上提出的问题.实际上,通过调用延时程序的方法进行延时同样也不会出现以上问题,由此可见,在软件设计中养成一个规范的设计习惯极为重要.在第二天调试的时候发

48、现这个语句的确能够避免干扰的出现.第三次调试:第三次调试基本解决了上述出现的问题,但又发现了两个新问题:在程序执行的过程中,一旦进入生日显示状态便无法通过IT0跳出,除非日期走过一天。在同时拨下两个以上的预置开关时,预置和闪烁可能出现不同步的情况.比如预置时间时可能出现小时在闪烁,但改变的确实分钟的值.由于对程序的流程比较熟悉,产生这两个问题原因很快就被我发现。第一个问题产生原因主要是虽然每次按下INT0都将清除生日标志,但生日标志的设定却是每秒进行一次,因此生日标志被清除后马上就又会出现,所以无法跳出生日显示.为了解决这个问题,我增加了一个标志位0(bit)来控制生日标志的设定,只有在5H(

49、it)有效的情况下,生日显示才有效,在按INT0清除生日表示的时候同时清除05H(bi),而H(bt)只有在重新预置生日时间以后或是过了新的一年才会有效,其设定不受外界控制。第二个问题产生的原因主要是比较简单,预置时间时,判断哪个项目闪烁的优先级,和判断哪个项目数值改变的优先级不一致,由于是中断程序和显示主程序同时控制这个功能,因此这两个优先级必须一样,否则当同时按下两个项目的预置开关的时候,中断程序首先判断一个开关有效,改变其对应值,而显示主程序却首先判断第二个开关有效,对第二个开关的显示值进行闪烁。因此只要修改其优先级一致即可解决这个问题.程序中设置的优先级是K3K2K4八、心得体会在本次课程设计开始时我就希望能通过这次课程设计学习到尽可能多的知识。因此我选择了难度比较大的数字钟。此前在学习数字电子技术课程的时候,课程设计的题目同样也是数字钟,但是由于使用的语言和硬件不同,设计过程需要考虑的问题也大不相同。数电课程设计的模块划分是由老师完成的,而这个工作锻炼价值很大;同时,数电课设中不需要考虑U的时间复用问题,因

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!