您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页基于51单片机汇编语言的数字钟课程设计报告(含有闹钟万年历)

基于51单片机汇编语言的数字钟课程设计报告(含有闹钟万年历)

来源:吉趣旅游网


单片微型计算机课程设计报告

多功能电子数字钟

姓 名 许伟敏 学 号 060301021124 班 级 电气二班 指导教师 林卫

2009-06-25

目录

一:概述………………………………………………………1 二:设计基本原理简介………………………………………2 三:设计要求及说明…………………………………………3 四:整体设计方案……………………………………………4

系统硬件电路设计 4

系统软件总流程设计 5 模块划分及分析 6

五:单模块流程设计…………………………………………8

各模块设计概述、流程图 8

模块源程序集合及注释 13

六:单模块软件测试…………………………………………23 七:系统检测调试……………………………………………24 硬件电路调试

软件部分烧写调试

八:系统优化及拓展…………………………………………26 九:心得体会…………………………………………………28

单片微型计算机课程设计 基于汇编语言的电子数字钟 概述

一、概述

课程设计题目:电子数字钟 应用知识简介:

 51单片机

单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。作为嵌入式系统控制核心的单片机具有其体积小、功能全、性价比高等诸多优点。51系列单片机是国内目前应用最广泛的单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用,51系列单片机的发展又进入了一个新的阶段。在今后很长一段时间内51系列单片机仍将占据嵌入式系统产品的中低端市场。

选题 系统功能分析硬件电路设计 整体流程设计 及模块划分 模块流程设计  汇编语言

汇编语言是一种面向机器的计算机低级编程语言,通常是为特定的计算机或系列计算机专门设计的。汇编语言保持了机器语言的优点,具有直接和简捷的特点,其代码具有效率高实时性强等优点。但是对于复杂的运算或大型程序,用汇编语言编写将非常耗时。汇编语言可以与高级语言配合使用,应用十分广泛。

模块编码测试 系统合成调试编译  ISP

ISP(In-System Programming)在系统可编程,是当今流行的单片机编程模式,指电路板上的空白元器件可以编程写入最终用户代码,而不需要从电路板上取下元器件。已经编程的器件也可以用ISP方式擦除或再编程。本次课程设计便使用ISP方式,直接将编写好的程序下载到连接好的单片机中进行调试。

下载调试(含硬件电路调试及软件烧写调试) 验收 完成总结报告课程设计流程图↑

选题目的及设计思想简介:

课程设计是一次难得的对所学的知识进行实践的机会,我希望通过课程设计设计一个简单的系统从而达到强化课本知识并灵活运用的目的。电子数字钟是日常生活钟随处可见的简单系统。对电子数字钟的设计比较容易联系实际并进行拓展, 在设计中我将力求尽可能跳出课本的样板,从现实生活中寻找设计原型和设计思路,争取有所突破。

如图所示便是我本次课程设计流程图,设计的整个过程运用自顶向下分析、自底向上实现的办法进行设计,借鉴在软件工程中学习到的软件设计流程和规范来完成系统设计并在设计过程中体会软件设计的流程。

06电气工程及其自动化2班 许伟敏 0603001021124

1

单片微型计算机课程设计 基于汇编语言的电子数字钟 设计基本原理简介

二、设计基本原理简介

数字钟的设计首先要保证其走时尽可能准确,其次再根据人们日常的使用习惯来设定其附加功能。

在设计中利用单片机定时计数器来完成走时并用两组输出口控制数码管来显示;通过编程向某一输出口输出方波实现报时及闹铃;利用输入端口外接各种开关来完成对走时及显示的控制(如预置时间等)。

在设计中需要用到许多技巧。以下为我在学习单片机课程中总结的一些设计思想或方法:

占空比概念在设计中的运用

如图所示的一串方波序列,导通时间同周期的比值即占空比。在用单片机控制对多个数码管的扫描显示中,数码管接收到的电压可以看成是一串方波序列,占空比控制了数码管的亮度。实际上对显示延时时间的调节就是调节数码管电压的占空比,当占空比大于一定数

值的时候数码管可以显示,实验证明占空比在0.1时仍可以使数码管清晰显示。利用这个概念可以比较直观地理解显示延时的调节。

CPU的分时复用

单片机只有一个CPU,因此在一个时间内只能执行一条语句,要使单片机同时控制多个外部元件(比如扬声器和数码管)就必须对单片机的CPU进行分时复用,让单片机在一小段时间内连续交替执行控制多个器件的语句,从表面上看,单片机便用一个CPU控制了多个元件。本次课程设计中对整点报时和闹铃功能的实现便用到了这个概念。

单片机位寻址区的使用

单片机内部数据存储器由20H到2FH共有16个字节的位寻址区可以被作为程序执行过程中的状态参数,许多程序模块至于两个状态(比如闪烁与正常显示,报时与不报时等)用位寻址区中的某一位来记录程序执行状态,在需要对状态进行判断的时候十分方便并且节约空间,一个字节便可以判断八个状态,而非位寻址区的地址记录程序状态时可能需要先进行变换,增加了执行成本且容易出错。

检测开关时需要注意的问题

对于用各种开关控制程序执行状态的程序设计中,需要注意实时地进行开关的检测,以确保一旦有开关动作,程序状态立即随之改变。此外,在用多个开关控制不同执行状态时,应注意设置开关检测的优先级以防止多个开关同时按下时出现错误。

系统资源分配与使用

单片机有许多资源是有限的不能滥用,比如定时计数器T,外部中断等,在设计一个多模块程序时,要注意先做一个整体规划,把稀缺资源用在最需要用的地方。此外在有多个模块时,要注意模块间的数据传递,比如累加器A和进位标志C,在使用时要注意不能让前一个模块的数据对下一个模块产生不希望有的影响。在模块间的数据传递比较多时最好用固定的内部数据存储器,以避免冲突发生错误。

06电气工程及其自动化2班 许伟敏 0603001021124

2

单片微型计算机课程设计 基于汇编语言的电子数字钟 设计要求及说明

三、设计要求及说明

㈠设计要求:

基于单片机电路,借鉴生活中常见的电子钟的功能,结合课本的要求使用汇编语言设计一个简单的电子钟系统。要求使用简便,功能实用,错误少,有一定创新性。 ㈡电子数字钟实现的主要功能:

① 实现正常走时(秒→分→时→日→月→年进位) ② 能够预置时间和日期

③ 能够自动区分平闰年和大小月 ④ 具有闹铃及设定闹铃时间功能 ⑤ 具有整点报时功能

⑥ 具有生日提醒功能,能够预置生日时间 ⑦ 在任何一种预置状态下,预置项目会闪烁显示

㈢其它设计说明

① 优先级:预置>闹铃>报时>生日提醒>正常显示,即预置状态下闹铃、报时功能及生日提醒功能都无效

② 生日时间到五个数码管显示“HAPPY”

③ 生日显示状态下,按下中断INT0恢复正常显示且此后只有在下更改生日日期或第二年生日显示才有效。

④ 正常显示状态下按下中断INT0进入预置状态,再按一次恢复。

⑤ 用数码管(K0,K1)控制显示状态:00:时间,01:闹铃时间,10:日期,11:生日时间且显示样板如下图所示:

时间:12 点39 分45 秒闹铃:于早晨6 点10 分响,

最后一位为一表示使能有效

日期:08 年2 月29 日生日:6 月1 日生日,最后

两位bd 为birthday 的缩写

⑥ 预置由拨码开关K2/K3/K4分别控制数码管12/34/56显示值,预置优先级:LED34>LED12>LED56(相应数码管显示的项目,显示状态下才能预置)

⑦ 整点报时声音为59分51、53、55、57秒的后半秒报四声低音, 59秒的后半秒报一声高音

⑧ 闹铃每次响一分钟

⑨ 不论是预置状态还是正常走时状态均能够自动区分平闰年和大小月 ⑩ 闹铃使能由拨码开关K5控制并实时显示

06电气工程及其自动化2班 许伟敏 0603001021124

3

单片微型计算机课程设计 基于汇编语言的电子数字钟 整体设计方案

四、整体设计方案

㈠硬件电路设计

系统硬件电路根据系统功能可知,需要六个数码管,一个外部中断INT0,一个扬声器,由此结合单片机课程学习中对实验面板的了解,做出如下电路:

如图,晶振频率12MHz,拨码开关数值由P0口读入;P2口的输出作为控制数码管的段控信号,经74LS573即8位数据锁存器接到数码管中。数码管采用共阴接法(图中未标示);P1.0-P1.5作为数码管的位控信号输出端;开关W2经一个基本RS锁存器接入INT0,每按一次开关INTO取反一次,按两次输入一个下降沿;扬声器由P1.6口控制。

06电气工程及其自动化2班 许伟敏 0603001021124

4

单片微型计算机课程设计 基于汇编语言的电子数字钟 整体设计方案

㈡系统软件总流程设计

根据系统要求,设计出系统软件总流程图如下以T0作为正常走时的计时器,T1作为预置状态下预置项目值自动跳升的控制计时器,INT0作为设定预置及清楚生日信号的控制按钮

初始化开关检测并将要显示的项目送入显示缓存 预置项目闪烁显示其余项目正常显示 Y预置有效? NY闹铃/报时?闹铃/报时 NY生日信号?N显示生日祝福HAPPY 正常显示 T0中断走时(进位秒→分→时→日→月→年) T1预置时间/日期/闹铃时间/生日日期INT0中断设定(预置信号设置/清除;生日标志清除) 软 件 系 统 总 流 程 图 ↑

设计使每一轮显示(即六个数码管都显示一次)便检测一次开关使

06电气工程及其自动化2班 许伟敏 0603001021124

5

单片微型计算机课程设计 基于汇编语言的电子数字钟 整体设计方案

上图的“检测开关值→判断并显示→检测开关值” 的循环时间大约为10ms,即每隔10ms检测一次开关值,每个数码管接收到的电压信号占空比大约为1/7,确保数码管正常显示。三个中断源中断程序执行时间每次均为几十毫秒,基本不影响主程序的显示及闹铃输出。中断优先级T0>INT0>T1,首先确保走时尽可能的准确,其次由于T1的开启和关闭是由INT0进行控制的,故INT0优先级较高。此外有优先级“预置显示>闹铃>整点报时>生日显示”,由于预置显示是人为控制的故优先级最高,考虑到日常生活中假如闹铃或整点报时被生日显示覆盖可能使影响到人们的日常生活故设定生日优先级最低,且闹铃最多影响生日信号一分钟。闹铃和整点报时不影响正常的时间等的显示。

㈢模块划分及分析

根据系统功能将模块划分如下  ONE:初始化程序模块

进行资源分配(EQU,BIT伪指令),设定初值,各中断初始化

 TWO:开关检测模块

检测开关号,将要显示值送入显示缓存

 THREE:显示主程序

显示显示缓存中值,并进行生日,闹铃,报时判断

 SEVEN:显示生日祝福HAPPY程序

经显示主程序判断生日时间到要执行的显示HAPPY程序(其实可以认为是显示主程序的一部分)

 EIGHT:闹铃及整点报时判断程序

判断是否闹铃或报时,如果是则CPLP1.6且忽略生日信号,反之则继续执行后续语句

06电气工程及其自动化2班 许伟敏 0603001021124

6

单片微型计算机课程设计 基于汇编语言的电子数字钟 整体设计方案

 NINE:中断(TO)计时程序

包含了秒→分→时→日→月→年进位以及判断大小月及平闰年以及生日标志设定

 TEN:中断预置程序

控制预置项目的自动加计数的延时时间, 并能判断大小月及平闰年

 ELEVEN:中断(INT0)控制程序

控制预置的开/关及生日信号的清楚

 TEWLVE:延时程序

用于闪烁时的数码管亮度控制

模块划分中遇到的问题及解决:

模块划分的过程中遇到的问题不多,只做了一个比较大的修改。刚开始设置模块的时候并没有设定显示缓存LED12、LED34、LED56而是将主显示模块THREE分成四个部分分别实现对时间、日期、闹铃、生日的显示(编号FOUR、FIVE,SIX便是删去的另外三个部分的程序名)并通过检测开关决定跳转到哪一个部分去执行,但经过分析发现这样做极大地浪费了存储空间而设置显示缓存后,只需要在检测开关后将相应要显示的数据送入显示缓存并在主程序中对显示缓存进行显示即可,这样做大大地缩减了程序存储空间而程序可读性也增强了。在程序编码完成后发现,没有必要将SEVEN显示HAPPY程序同THREE显示主程序单列开来,TWELVE延时程序也并不是必要的,并且模块的划分还有些值得商榷的地方,本报告中的程序还可以通过模块划分的优化修改得更加精简一些。

06电气工程及其自动化2班 许伟敏 0603001021124

7

单片微型计算机课程设计 基于汇编语言的电子数字钟 单模块流程设计

五、单模块流程设计

在完成了系统总流程设计后,便进入到了系统设计中工作量最大的单模块流程设计。由于系统模块划分虽然是系统设计的基础,但比较简单而且模块划分有多种方法,因此单模块的设计可以认为是本程序中最关键的部分。单模块设计的好坏与否决定了系统功能能否被稳定地实现以及下一阶段调试程序的难度。

鉴于单模块设计的重要性,我在设计中并不急于对模块进行编码,而是反复论证模块的可行性和流程图,为下一阶段的工作做好准备,同时也能够尽早发现系统模块划分的错误,加以解决。

㈠各模块设计概述及模块流程图

①初始化模块(ONE)

初始化模块包含了各中断的跳转语句、存储资源的分配、各存储器和寄存器的赋值以及中断及计时器的状态设置。

源程序使用了17字节的内部数据存储地址,其中包含3字节位寻址地址以便于进行位判断。

三字节的位寻址地址分配如下:

开始 22H—秒的存储地址,方便对整点报时条件进行判断 23H—月的存储地址,方便对大小月平闰年进行判断

跳转指令 资源分配(伪指令EQU及BIT) 另外一个位寻址字节00H地址拆开用做程序状态标志位

00H(bit,BS)—生日标志位,到生日那天为1使程序转入生日显示段 01H(bit,SS)—预置标志,以INT0控制其值,控制预置闪烁的实现 02H(bit,GS)—闪烁标志,在预置标志有效时控制闪烁项目的亮和灭两状态 03H(bit,FC)—频率控制,在整点报时时控制产生低音还是高音

时间、日期、闹铃时间、生日日期存储地址赋初值;各状态标志位赋初值 04H(bit,NB)—忽略生日标志,控制预置及报时的优先级高于生日显示 05H(bit)—控制生日信号的有效与否,其使用目的参见调试过程

源程序中使用了两个寄存器R1、R0,R1用于控制闪烁的间隔时间, R0用于显示延时。

在初始化模块中设定了中断的优先级、定时计数器的工作模式、并打开了定时计数器TO开始计时

其他资源分配项目参见源程序集合及注释。初始化模块指令很大一部分都是伪指令,方便了后面程序的编写。

8

设置中断优先级、各中断工作方式 初始化模块流程图↑

06电气工程及其自动化2班 许伟敏 0603001021124

单片微型计算机课程设计 基于汇编语言的电子数字钟 单模块流程设计

②开关检测模块(TWO)

开关检测模块主要执行两个任务:

⒈读取闹铃使能控制拨码开关K5的值并赋予闹铃使能相应值;

⒉读取显示选择开关(K0,K1)的值并将要显示的项目值送入显示缓存LED12、LED34、LED56.当K5为1时将A1H送入RE,反之送入

A0H,其中A为“—”的字型码查表偏移量。当显示生日日期时,将生日Birthday的缩写“bd”的字型码送入显示缓存LED56。

开关检测模块的执行时间大约在40uS左右。

开关检测模块流程图↑

③显示主程序(THREE)

显示主程序是程序中最复杂的模块,实现的功能也最多,占用了程序运行过程当中90%以上的执行时间。流程图中由判断SS(预置信号)开始分成两个分支,当SS=1,即预置状态下程序进入预置闪烁部分。

预置闪烁的优先级是:LED34>LED12>LED56即同预置优先级相同(参见调试部分的详细说明)闪烁首先判断是否对LED34进行判断闪烁,如果是则另外两个显示值直接显示,否则判断是否对LED12进行闪烁,如果是则直接显示LED56的值,只有当前两个显示值都不闪烁的时候,才判断是否对LED56进行闪烁,这样就确保了每次只有一个显示值闪烁。预置通过GS标志位判断预置的亮/灭,由R1控制每50轮显示对GS取反一次。

当SS=0时进入判断闹铃/报时及正常显示模块,模块EIGHT(参见其说明)对闹铃及报时条件进行判断,符合条件则对P1.6取反一次并使NB(忽略生日)有效,此时不进行对BS(生日标志)的判断,即使响铃优先级高于生日显示(其实也可以对程序进行修改使响铃和生日显示不发生冲突,修改方法参见程序优化)。当不响铃并且生日标志BS有效时显示HAPPY

④显示HAPPY子程序(SEVEN)

本程序实际上是显示主程序的分支,在模块的划分过程中为了简化显示主程序的编写而将

06电气工程及其自动化2班 许伟敏 0603001021124

9

单片微型计算机课程设计 基于汇编语言的电子数字钟 单模块流程设计

其单列开来。本程序由生日标志BS控制,当到达生日时间时,T0中断程序会将BS置1使之有效在显示主程序中通过判断BS的置来控制是否执行本模块。

显示主程序及显示”HAPPY”模块流程图↑

说明:* 只有当在预置日期时,才需要对LED56进行预置闪烁判断。并且当LED34(即月份的显示缓存)

已经判断需要闪烁后,LED56便不需要闪烁而直接显示(闪烁优先级LED56最低,每次只对一个项目进行预置,只有一个项目需要闪烁)。这个设置使同时拨下两个以上预置开关时不会出错,参见调试部分说明

** 闹铃及报时判断程序EIGHT执行过程参见其说明

06电气工程及其自动化2班 许伟敏 0603001021124

10

单片微型计算机课程设计 基于汇编语言的电子数字钟 单模块流程设计

⑤闹铃及整点报时判断程序(EIGHT)

在显示主程序中每隔一段时间调用一次本程序来实现闹铃及报时功能。符合闹铃条件时,每调用一次本程序对P1.6取反一次,调节调用的时间间隔便可以调节报时的输出频率。在主程序中设置每完成对一个数码管的显示变调用一次本程序,显示一个数码管的时间大约为1ms,因此响铃频率高音约为500Hz,低音约为250Hz。程序判断闹铃使能RE后分成两个分支,当RE=A1时判断闹铃条件是否满足,满足则对P1.6取反一次,否则跳转判断整点报时条件是否满足。当RE=0时,直接怕暖整点报时条件是否满足。判断整点报时条件时当当前时间满足:

(MIN=59)∩(SECOND=59) ∩(COUNT>10)

时报高音;当满足:

(MIN=59)∩(SECOND=51/53/55/57) ∩(COUNT>10)

时报低音。利用位寻址区来存储SECOND的方法,只要(SECOND>50)∩(SECOND.0=1)时便满足报低音的秒条件。利用TO中断次数存储器COUNT的大小可以判断是否到了后半秒(T0每50ms中断一次,中断20次到达一秒)。通过增加一个标志位FC来时下对高低音的区分,高音不受FC的影响,低音只有当FC=0的时候才对P1.6取反一次。并且每调用一次本程序便对FC取反一次,便达到每调用两次取反一次P1.6的效果。本程序的执行时间小于40us,因此多次调用不过分影响执行时间

闹铃及整点报时判断程序流程图↑

⑥中断(TO)计时程序(NINE)

中断计时程序的流程比较简单。程序除实现正常走时外还需要判断是否到达生日时间置生

06电气工程及其自动化2班 许伟敏 0603001021124

11

单片微型计算机课程设计 基于汇编语言的电子数字钟 单模块流程设计

LJMP NINE 定时器T0赋初值,重开定时 COUNT加一 日标志位有效。程序的输出均为BCD码,方便了显示程序对高低位的分离并查表显示。程序比较复杂的地方在于对平闰年及大小月的判断。把月MONTH存储在位寻址区,当MONTH=02H时判断是否是平闰年,先将年由BCD码转化为二进制码,此时当年的后两位为全零的时候为闰年(由于只显示年的个位和十位,由2000年开始,00年、04年…为闰年,N 其共同特点就是二进制后两位为零),否则为平年。当MONTH≠2时判断是否为大小月,MOUTH<7时单月(即MONTH.0=1的月)为大月,否则为小月;当MONTH>7时双月为大月。

到1秒? Y COUNT清零 SECOND加一

⑦中断(T1)预置程序(TEN)

N T1通过中断INT0控制开启或关闭,每次定时50毫秒,存储地址COUNTS计数15次执行一次中断程序。由开关(K0,K1)控制预置项目,通过开关K2/K3/K4来分别控制LED12/LED34/LED56的预置,当两个开关都是有效时,具有优先级的区分,确保无论按几个开关都最多

N 只有一个项目被预置。判断预置的优先级顺序是:

LED34>LED12>LED56 这样安排

N 的原因是由于根据生活经验LED34所对应的4个项目(小时、闹铃分、月、生日日)被预置的可能性最大。

N 在预置日期和生日是要

中断(T1)预置程序↑

注意对大小月

及平闰年进行判断(判断方法与中断计时程序中说明的方法类似,但不需要

N 考虑进位)且月和日在溢出后应置一而不是归零。

到1分钟? Y SECOND清零 MIN加一 到一小时? Y MIN清零 HOUR加一 到一天? Y HOUR清零 DAY加一 判断平闰年及大小月* Y 到一月? DAY=1 MONTH加一 到一年? Y MONTH=1 YEAR 加一 ⑧中断(INT0)设定程序(ELEVEN)

中断INT0设置是否进行预置以及对生日标志的清除。且有如下设置顺序:

N 清除预置信号并关T1>清除生日标志>设定预置信号并开T1。每按一次中断都只执行其中一个项目

生日到了? Y BS=1 中断返回 ⑨延时程序(TWELVE)

延时时间约2ms即显示两个数码管的时间,用于预置闪烁调节数码关的电压占空比一致而不出现数码管随着闪烁亮度改变的现象。

中断(TO)计时程序流程图↑

06电气工程及其自动化2班 许伟敏 0603001021124

12

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

㈡模块源程序集合及注释

;*************************************************************ONE初始化

ORG 0

SJMP ONE ORG 0003H LJMP ELEVEN ORG 000BH LJMP NINE ORG 001BH LJMP TEN

ONE:LED12 EQU 30H ;数码管12显示缓存 LED34 EQU 31H ;数码管34显示缓存 LED56 EQU 32H ;数码管56显示缓存

COUNT EQU 33H ;定时器T0(用来走时)计数值存储器(计数中断20次到1秒)

COUNTS EQU 34H ;定时器T1(用来预置)计数值存储器(计数中断15次到预置值加一) HOUR EQU 40H ;以下为时间,日期,闹铃时间,生日的存储地址 MIN EQU 41H SECOND EQU 22H YEAR EQU 50H MONTH EQU 23H DAY EQU 52H

RH EQU 60H ;闹铃小时 RM EQU 61H ;闹铃分 RE EQU 62H ;闹铃使能 BM EQU 71H ;生日-月份 BD EQU 72H ;生日-天 MOV LED12,#0 MOV LED34,#0 MOV LED56,#0 MOV COUNT,#0 MOV COUNTS,#0 MOV HOUR,#0 MOV MIN,#0 MOV SECOND,#0 MOV YEAR,#0 MOV MONTH,#1 MOV DAY,#1 MOV RH,#0 MOV RM,#0 MOV RE,#0 MOV BM,#6 MOV BD,#1

BS BIT 00H ;birthday symbol生日标志(到生日那天就为1)

SS BIT 01H ;set symbol预置信号(按下中断预置为1,便开始闪烁和预置) GS BIT 02H ;glisten symbol闪烁标志 FC BIT 03H ;frequency control频率控制

NB BIT 04H ;neglect bitrhday symbol 忽略生日标志 CLR BS CLR SS CLR GS CLR FC CLR NB

SETB 05H ;生日显示有效标志位 MOV IP,#02H;中断优先级:T0>INT0>T1 MOV TMOD,#11H MOV IE,#8BH SETB IT0

06电气工程及其自动化2班 许伟敏 0603001021124

13

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

MOV TH0,#3CH ;50ms MOV TL0,#0B0H SETB TR0

MOV R1,#50 ;显示延时用 MOV R0,#0 ;显示延时用

;************************************************************** TWO检测开关号

TWO:MOV P0,#0FFH JB P0.5,TWO1

MOV RE,#0A0H ;0A0表示闹铃无效,送0A0是为了方便将使能查表显示,表中第A项为\"-\" SJMP TWO2 TWO1:MOV RE,#0A1H TWO2:JB P0.0,TWO4 JB P0.1,TWO3 MOV LED12,HOUR MOV LED34,MIN MOV LED56,SECOND SJMP THREE TWO3:MOV LED12,YEAR MOV LED34,MONTH MOV LED56,DAY SJMP THREE TWO4:JB P0.1,TWO5 MOV LED12,RH MOV LED34,RM MOV LED56,RE SJMP THREE TWO5:MOV LED12,BM MOV LED34,BD MOV LED56,#0BCH SJMP THREE

;************************************** THREE显示主程序(同时包含了闹铃,预置闪烁,闹铃功能) THREE:MOV P1,#0 MOV P0,#0FFH MOV DPTR,#TAB3 JNB SS,THREEB ;判断预置信号是否有效,预置有效则转入判断闪烁显示模块,否则转入正常显示模块

SJMP THREEA

THREEB:LJMP THREE11 ;THREE11是正常显示并判断整点报时及闹铃模块

THREEA:JNB P0.3,THREE1 ;开始是判断闪烁显示,这句判断是否预置分/月/生日的日/闹铃分 JNB GS,THREE1 ;是否闪烁?

LCALL TWELVE ;闪烁则调用延时不显示LED34 SJMP THREE4 THREE1:MOV A,LED34 ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE2:SETB P1.3 NOP

DJNZ R0,THREE2 CLR P1.3 MOV A,LED34 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE3:SETB P1.2 NOP

06电气工程及其自动化2班 许伟敏 0603001021124

14

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

DJNZ R0,THREE3 CLR P1.2

JNB P0.2,THREE4 ;判断是否预置小时/年/生日月/闹铃的小时 JNB GS,THREE4 ;是否显示小时/年/生日月/闹铃的小时 LCALL TWELVE SJMP THREE7 THREE4:MOV A,LED12 ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE5:SETB P1.1 NOP

DJNZ R0,THREE5 CLR P1.1 MOV A,LED12 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE6:SETB P1.0 NOP

DJNZ R0,THREE6 CLR P1.0 JB P0.0,THREE7 ;数码管56只有在显示日期的天时才有预置闪烁功能,其余三项都不需要判断闪烁 JNB P0.1,THREE7 JB P0.3,THREE7 JNB P0.4,THREE7 JNB GS,THREE7 LCALL TWELVE SJMP THREE10 THREE7:MOV A,LED56 ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE8:SETB P1.5 NOP

DJNZ R0,THREE8 CLR P1.5 MOV A,LED56 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE9:SETB P1.4 NOP

DJNZ R0,THREE9 CLR P1.4

THREE10:DJNZ R1,TWOA SJMP TWOB TWOA:LJMP TWO

TWOB:MOV R1,#50 ;判断闪烁一次是否完成

CPL GS ;取反闪烁标志,用于控制闪烁的亮和灭 LJMP TWO ;一轮显示完后再判断开关号 ;**************************正常显示

THREE11:LCALL EIGHT ;判断是否取反P1.6即输出闹铃或整点报时,以下每次显示都要调用一次 JB NB,THREE12 ;如果是在整点报时状态就不显示生日提醒,报时过后显示提醒 JNB BS,THREE12

SJMP SEVEN ;跳到生日提醒程序

THREE12:CLR NB ;开始正常显示时间及判断闹铃输出

06电气工程及其自动化2班 许伟敏 0603001021124

15

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

MOV A,LED34 ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE13:SETB P1.3 NOP

DJNZ R0,THREE13 CLR P1.3 MOV A,LED34 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE14:SETB P1.2 NOP

DJNZ R0,THREE14 CLR P1.2 LCALL EIGHT MOV A,LED12 ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE15:SETB P1.1 NOP

DJNZ R0,THREE15 CLR P1.1 MOV A,LED12 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE16:SETB P1.0 NOP

DJNZ R0,THREE16 CLR P1.0 LCALL EIGHT MOV A,LED56 ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE17:SETB P1.5 NOP

DJNZ R0,THREE17 CLR P1.5 MOV A,LED56 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A THREE18:SETB P1.4 NOP

DJNZ R0,THREE18 CLR P1.4

LJMP TWO ;一轮显示完后判开关

TAB3:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H 7FH,6FH,40H,7CH,5EH

;0.1.2.3.4.5.6.7.8.9.-.b.d,的字形表\"bd\"在显示生日时间时显示在LED56

;**************************************************SEVEN生日时显示生日祝福语”HAPPY” SEVEN:MOV P1,#01H

06电气工程及其自动化2班 许伟敏 0603001021124

16

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

MOV P2,#76H DJNZ R0,SEVEN SEVEN1:MOV P1,#02H MOV P2,#77H DJNZ R0,SEVEN1 SEVEN2:MOV P1,#04H MOV P2,#73H DJNZ R0,SEVEN2 SEVEN3:MOV P1,#08H MOV P2,#73H DJNZ R0,SEVEN3 SEVEN4:MOV P1,#10H MOV P2,#6EH DJNZ R0,SEVEN4

LJMP TWO ;一轮显示完后判开关

;******************************************************************EIGHT判断是否闹铃子程序 EIGHT:MOV A,RE

CJNE A,#0A1H,EIGHT1 MOV A,MIN

CJNE A,RM,EIGHT1 MOV A,HOUR

CJNE A,RH,EIGHT1

SJMP EIGHT4 ;闹铃时间到则CPLP1.6一次并忽略生日标志(即NB有效) EIGHT1:MOV A,MIN

CJNE A,#59H,EIGHT7 MOV A,SECOND

CJNE A,#59H,EIGHT5 ;是否等于59分59秒 EIGHT2:MOV A,COUNT ;是否到达后半秒 CJNE A,#10,EIGHT3 EIGHT3:JC EIGHT7 EIGHT4:CPL P1.6 SETB NB SJMP EIGHT7 EIGHT5:MOV A,SECOND

CJNE A,#51H,EIGHT6 ;是否大于51秒 EIGHT6:JC EIGHT7

JNB 10H,EIGHT7 ;判断是否报低音

JB FC,EIGHT7 ; 只有FC有效时才输出 SJMP EIGHT2 EIGHT7:CPL FC ;用来控制报低音和高音,满足报低音条件时,调用两次本程序对P1.6取反一

次,高音时调用一次取反一次

RET

;******** NINE中断(T0)计时程序(包含了秒-分-时-日-月-年间的进位及判断大小月,平闰年) NINE:MOV TH0,#3CH ;开定时器 MOV TL0,#0B0H SETB TR0 INC COUNT MOV A,COUNT

CJNE A,#20,INEAA SJMP AAA INEAA:LJMP NINE1

AAA:MOV COUNT,#0 ; 计时 MOV A,SECOND ADD A,#01

DA A ;换成bcd码以方便显示 MOV SECOND,A

CJNE A,#60H,INEAA

06电气工程及其自动化2班 许伟敏 0603001021124

17

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

MOV SECOND,#0 MOV A,MIN ADD A,#01 DA A

MOV MIN,A

CJNE A,#60H,INEAA MOV MIN,#0 MOV A,HOUR ADD A,#01 DA A

MOV HOUR,A

CJNE A,#24H,INEAA MOV HOUR,#0 MOV A,DAY ADD A,#01 DA A

MOV DAY,A

;************************判断平闰年及大小月 MOV A,MONTH

CJNE A,#02H,TEN6A

MOV A,YEAR ;把年由BCD码换成二进制码 ANL A,#0F0H SWAP A MOV B,#10 MUL AB MOV 24H,A MOV A,YEAR ANL A,#0FH ADD A,24H

JB ACC.0,TEN5A ;二进制码后两位为00表示为闰年 JB ACC.1,TEN5A MOV 24H,#01 MOV A,DAY

CJNE A,#30H,NINE1 MOV DAY,#1 SJMP NINE0 TEN5A:MOV A,DAY

CJNE A,#29H,NINE1 MOV DAY,#1 SJMP NINE0

;**************判断大小月;大于等于8月时双月为大月,小于8月时单月为大月 TEN6A:MOV A,MONTH

CJNE A,#08H,TEN7A TEN7A:JC TEN9A JB 18H,TEN8A MOV A,DAY

CJNE A,#32H,NINE1 MOV DAY,#1 SJMP NINE0 TEN8A:MOV A,DAY

CJNE A,#31H,NINE1 MOV DAY,#1 SJMP NINE0

TEN9A:JNB 18H,TEN10A MOV A,DAY

CJNE A,#32H,NINE1 MOV DAY,#1 SJMP NINE0 TEN10A:MOV A,DAY

06电气工程及其自动化2班 许伟敏 0603001021124

18

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

CJNE A,#31H,NINE1 MOV DAY,#1 ;******************* NINE0:MOV A,MONTH ADD A,#01 DA A

MOV MONTH,A SETB 05H

CJNE A,#13H,NINE1 MOV MONTH,#1 MOV A,YEAR ADD A,#01 DA A

MOV YEAR,A NINE1:MOV A,MONTH CJNE A,BM,NINE2 MOV A,DAY

CJNE A,BD,NINE2 JNB 05H,NINE2 SETB BS NINE2:RETI

;*****************************************TEN中断(T1)预置加一程序由INT0控制其的开启与关闭 ;*******************判断预置项目 TEN:MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 INC COUNTS MOV A,COUNTS CJNE A,#15,TENE MOV COUNTS,#0 JB P0.0,RBRB JB P0.1,DAT SJMP TIME DAT: LJMP DATE RBRB:JB P0.1,BDAT LJMP RTIME BDAT:LJMP BDATE TENE:RETI

;**********************预置时间 TIME: JNB P0.3,TEN1 MOV A,MIN ADD A,#01 DA A

MOV MIN,A

CJNE A,#60H,TENA MOV MIN,#0 SJMP TENA TEN1:JNB P0.2,TENA MOV A,HOUR ADD A,#01 DA A

MOV HOUR,A

CJNE A,#24H,TENA MOV HOUR,#0 TENA:RETI

;******************预置日期 DATE:JNB P0.3,TEN3 MOV A,MONTH

06电气工程及其自动化2班 许伟敏 0603001021124

19

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

ADD A,#01 DA A

MOV MONTH,A

CJNE A,#13H,TENB MOV MONTH,#1 SJMP TENB TEN3:JNB P0.2,TEN4 MOV A,YEAR ADD A,#01 DA A

MOV YEAR,A SJMP TENB TEN4:JNB P0.4,TENB MOV A,DAY ADD A,#01 DA A

MOV DAY,A

;***************判断平闰年 MOV A,MONTH

CJNE A,#02H,TEN6 MOV A,YEAR ANL A,#0F0H SWAP A MOV B,#10 MUL AB MOV 24H,A MOV A,YEAR ANL A,#0FH ADD A,24H JB ACC.0,TEN5 JB ACC.1,TEN5 MOV A,DAY

CJNE A,#30H,TENB MOV DAY,#1 SJMP TENB TEN5:MOV A,DAY

CJNE A,#29H,TENB MOV DAY,#1 SJMP TENB

;**************判断大小月 TEN6:CJNE A,#08H,TEN7 TEN7:JC TEN9 JB 18H,TEN8 MOV A,DAY

CJNE A,#32H,TENB MOV DAY,#1 SJMP TENB TEN8:MOV A,DAY

CJNE A,#31H,TENB MOV DAY,#1 SJMP TENB TEN9:JNB 18H,TEN10 MOV A,DAY

CJNE A,#32H,TENB MOV DAY,#1 SJMP TENB TEN10:MOV A,DAY

CJNE A,#31H,TENB MOV DAY,#1

06电气工程及其自动化2班 许伟敏 0603001021124

20

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

TENB: RETI

;**************************预置闹铃时间 RTIME:JNB P0.3,TEN12 MOV A,RM ADD A,#01 DA A MOV RM,A

CJNE A,#60H,TENC MOV RM,#0 SJMP TENC TEN12:JNB P0.2,TENC MOV A,RH ADD A,#01 DA A MOV RH,A

CJNE A,#24H,TENC MOV RH,#0 TENC:RETI

;************************预置生日日期 BDATE:JNB P0.3,TEN14 MOV A,BD ADD A,#01 DA A MOV BD,A MOV A,BM

CJNE A,#02H,TEN15 MOV A,BD

CJNE A,#30H,TEND MOV BD,#1 SJMP TEND

TEN15:CJNE A,#08H,TEN16 TEN16:JC TEN18 JB 18H,TEN17 MOV A,BD

CJNE A,#32H,TEND MOV BD,#1 SJMP TEND TEN17:MOV A,BD

CJNE A,#31H,TEND MOV BD,#1 SJMP TEND TEN18:JNB 18H,TEN19 MOV A,BD

CJNE A,#32H,TEND MOV BD,#1 SJMP TEND TEN19:MOV A,BD

CJNE A,#31H,TEND MOV BD,#1

SJMP TEND TEN14:JNB P0.2,TEND MOV A,BM ADD A,#01 DA A MOV BM,A

CJNE A,#13H,TEND MOV BM,#1 TEND:SETB 05H RETI

06电气工程及其自动化2班 许伟敏 0603001021124

21

单片微型计算机课程设计 基于汇编语言的电子数字钟 源程序集合及注释

;*******************************ELEVEN中断(INT0)控制了预置的开\\关以及生日信号的清除 ELEVEN:JNB SS,ELEVEN1 ;预置有效时按一次INT0关预置 CLR SS CLR TR1

SJMP ELEVEN3

ELEVEN1:JNB BS,ELEVEN2 ;预置无效判断生日信号有效则清除生日信号 CLR 05H CLR BS

SJMP ELEVEN3

ELEVEN2:SETB SS ;都无效则令预置有效 MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 ELEVEN3:RETI

;***************************************************************TWELVE 延时小程序 TWELVE:MOV P1,#0 MOV P2,#0

DJNZ R0,TWELVE TWELVE1:MOV P1,#0 MOV P2,#0

DJNZ R0,TWELVE1 RET

06电气工程及其自动化2班 许伟敏 0603001021124

22

单片微型计算机课程设计 基于汇编语言的电子数字钟 单模块软件测试

六、单模块软件测试

㈠编码中常用的程序结构说明

① JNB SS,THREEB;

SJMP THREEA

THREEB:LJMPTHREE11; THREEA:JNBP0.3,THREE1

由于使用JNB等跳转指令的时候,跳转长度比较短,故需要跳转到比较远的地方时需要用这个结构。相当于:

JNB SS,THREE11 JNB P0.3,THREE1

②THREE1:MOV A,LED34

ANL A,#0FH MOVC A,@A+DPTR MOV P2,A

THREE13:SETB P1.3

NOP

DJNZ R0,THREE13 CLR P1.3 MOV A,LED34 SWAP A ANL A,#0FH MOVC A,@A+DPTR MOV P2,A

THREE14:SETB P1.2

NOP

DJNZ R0,THREE14 CLR P1.2

显示主程序中常用的语句段,分离LED34中的高半位和低半位作为字形码段控信号查表偏 移量,通过R0延时,延时时间大约为每个数码管1ms。

③ TEN6A:MOV A,MONTH

CJNE A,#08H,TEN7A TEN7A:JC TEN9A

判断MONTH是否大于08H,由于CJNE指令不能对直接地址进行比较只能通过A来判断

④ MOVA,YEAR

ADD A,#01 DA A MOV YEAR,A

对T0及T1中断程序中常用的对某项目进行加一并进行BCD码调整的的程序段,由于“INC A”指令不影响标志位,故不能和“DA A”指令结合使用。

㈡单模块软件测试中的问题及解决

由于此前花费大量的经历在模块的流程图设计当中,因此在模块调试的过程中并没有出现太多的问题。主要问题在于语法错误,比如前述程序结果说明中的①、④语句和一些输入的错误。并且由于程序过于长,难以进行完整的软件调试,调试过程中发现的问题主要出现在烧写调试过程中。

23

06电气工程及其自动化2班 许伟敏 0603001021124

单片微型计算机课程设计 基于汇编语言的电子数字钟 系统检测调试

七、系统检测调试

㈠硬件电路调试

由于硬件电路基本上都是使用实验面板上常用的部分电路,调试相对简单。 调试操作项目:①将实验板上的跳线J5同INT0相连,使P3.2受W2控制

②将跳线J3,J2分别同LED相连,使数码管5、6送P1.4和P1.5控制 ③利用长跳线将P1.6与扬声器相连(由于这个操作会影响单片机的其他输出电路的使用,因此注意此操作必须在烧写下载后才能进行,否则会报错) ④将跳线J10同“+5V”连接

㈡软件部分烧写调试

我一共进行了三次软件部分烧写调试,纠正了许多程序错误,主要修改部分如下: 第一次调试:

①中断预置程序无法进行正常的加一程序 ②计时进位有误,无法正常进位 ③日期无法正常显示 ④闪烁有错误,无法正常闪烁 ⑤显示的数字不稳定,有许多干扰

从第一次调试的结果上看,几乎所有的功能都无法正常显示。事实上,在第一次调试后对程序进行检查后发现,造成这些问题的主要原因是程序有十几处的输入有误,并不是程序流程上的问题。因此这里不做过多的叙述。

第二次调试:

经过第一次调试以后的修改,解决了第一次调试中出现的前四个问题,但第五个问题“显示的数字不稳定,有许多干扰”仍然无法发现问题的所在,在机房进行了多次修改都不成功。经过思考和对跟其他同学的显示语句进行比对,我判断问题的原因可能是我在过去编程时养成的一个不好的习惯,我经常使用的一个延时办法,容易把干扰放大。对于数码管的显示及延时我经常使用以下语句: “AAA:MOV P1,#位控

MOV P2,#段控 DJNZ R0,AAA ” 这个语句段比较简单,不需要另外编写一个延时程序,延时时间大约1.3ms,用在干扰语句比较少的地方很方便。但却可能出现一个隐患,假如P1或者P2在赋值过程中会出现干扰,那么对其重复的赋值便会放大干扰。并且由于常常只需要给其中一个数码管赋值,而这个语句却一次性给所有的数码管赋位控信号,可能将单个数码管段控信号中出现的干扰传递到其他管中。因此我对以上程序做了修改如下:

06电气工程及其自动化2班 许伟敏 0603001021124

24

单片微型计算机课程设计 基于汇编语言的电子数字钟 系统检测调试

“ MOV P2,#段控 THREE13:SETB P1.3

NOP

DJNZ R0,THREE13 CLR P1.3”

这样便解决了以上提出的问题。实际上,通过调用延时程序的方法进行延时同样也不会出现以上问题,由此可见,在软件设计中养成一个规范的设计习惯极为重要。在第二天调试的时候发现这个语句的确能够避免干扰的出现。

第三次调试:

第三次调试基本解决了上述出现的问题,但又发现了两个新问题:

①在程序执行的过程中,一旦进入生日显示状态便无法通过INT0跳出,除非日期走过一天。

②在同时拨下两个以上的预置开关时,预置和闪烁可能出现不同步的情况。比如预置时间时可能出现小时在闪烁,但改变的确实分钟的值。 由于对程序的流程比较熟悉,产生这两个问题原因很快就被我发现。

第一个问题产生原因主要是虽然每次按下INT0都将清除生日标志,但生日标志的设定却是每秒进行一次,因此生日标志被清除后马上就又会出现,所以无法跳出生日显示。为了解决这个问题,我增加了一个标志位05H(bit)来控制生日标志的设定,只有在05H(bit)有效的情况下,生日显示才有效,在按INT0清除生日表示的时候同时清除05H(bit),而05H(bit)只有在重新预置生日时间以后或是过了新的一年才会有效,其设定不受外界控制。

第二个问题产生的原因主要是比较简单,预置时间时,判断哪个项目闪烁的优先级,和判断哪个项目数值改变的优先级不一致,由于是中断程序和显示主程序同时控制这个功能,因此这两个优先级必须一样,否则当同时按下两个项目的预置开关的时候,中断程序首先判断一个开关有效,改变其对应值,而显示主程序却首先判断第二个开关有效,对第二个开关的显示值进行闪烁。因此只要修改其优先级一致即可解决这个问题。程序中设置的优先级是K3>K2>K4.

06电气工程及其自动化2班 许伟敏 0603001021124

25

单片微型计算机课程设计 基于汇编语言的电子数字钟 系统优化及拓展

八、系统优化及拓展

由于种种因素,在设计过程中不得不放弃一些功能并且也难免有一些没有考虑的地方,这里我对自己在这些方面的想法进行一些简单阐述。

(一)系统优化设想

A、在程序编写过程中由于只考虑程序的完整性,许多语句段过于繁冗,可以通过优化模块划分,增加可调用子程序的方法来缩短源程序的长度。

⑴将显示主程序中的显示语句(第六部分单模块测试中提到过的显示语句段)出来成为一个子程序,该程序段一共被使用了12次。但是很显然将其涉及到很多个的模块间数据交换,子程序编写很困难,因此可以采用一个折中的办法,将其中高低半位分离的语句段成一个子程序供调用。利用R3及A、B进行模块间数据传递,用除16的方法分离特定位的高低半位作为段控信号查表量就可以比较容易地编写出该子程序。

⑵将判断大小月及平闰年的语句段成一个子程序。该程序一共被用了2次,但其本身有约50条语句,对缩短源程序长度的贡献比较明显,并且将其需要解决的问题不多。

B、模块的重新划分。前述对模块的编写说明中已经提出,本程序中对模块的划分有许多不合理的地方。显示主程序及过于复杂,一些小程序可以并入其他程序中。(事实上这样做是增加程序的可读性)

C、前述对模块的编写说明提到,对显示主程序设置了一个优先级以避免响铃和生日显示有冲突(其实这个冲突只有在生日那天才会出现,影响极小)。事实上可以通过在显示“HAPPY”程序中也调用闹铃及报时判断子程序来消除冲突。 D、如果实际应用中闹铃或整点报时的频率不符合要求可以通过修改显示主程序中正常显示时的延时长度来改变调用闹铃及报时判断子程序的频率从而改变响铃的频率,但缺点是同时会改变数码管接收电压的占空比。

E、程序共使用了一个中断按钮和六个拨码开关按钮,实际应用当中用七个按钮来控制数字钟虽然操作简单,但增加了硬件的成本和体积(每个按钮都需要占用一定体积)。因此考虑通过修改程序来减少按钮数量。

实际上,只需要一个中断按钮和两个拨码开关即可实现程序要求。用一个拨码开关确定是正常显示还是预置,另一个拨码开关确定闹铃是否有效,而中断按钮确定预置项目及预置的清除。这样会大大增加中断程序的复杂程度,但基本原理比较简单。

增加一个计数寄存器R4来控制显示的项目,在拨码开关确定为正常显示状态时,通过中断按钮可以改变R4的值,以判断R4值取代之前的检测开关值。增加一个计数寄存器R5来控制预置项目,在拨码开关确定为预置状态时,通过中断按钮可以改变R5的值,通过判断R4、R5的值可以确定要预置的项目。

06电气工程及其自动化2班 许伟敏 0603001021124

26

单片微型计算机课程设计 基于汇编语言的电子数字钟 系统优化及拓展

(二)系统拓展设想

这里阐述课本中介绍的其他功能的实现办法。

以下三个功能必须增加一个拨码开关K6来确定要显示的项目(如果采用了上述体统优化E点中提到的方法便不需要),与前面已经实现的四种显示项目一起一共用三个开关来判断显示项目。

A、交替显示年月日及时分秒

增加该功能实际上是增加了检测开关号程序的复杂程度,当开关号确定要交替显示年月日及时分秒时,增加一个计数寄存器R6和一个标志位06H(bit)开控制将谁赋给显示缓存LED(12/34/56). 06H(bit)由R6控制,R6每轮显示结束值减一,计数50次清零同时对06H(bit)取反(用DJNZ指令实现),检测开关号时同时检测06H(bit)的值以控制赋值项目。

B、跑表功能:按ms显示时间,以中断启动或停止计时

在判断显示跑表功能后,启动定时计数器T1,用类似走时程序的办法来实现跑表功能。参考中断程序T0编写。这样会增加中断程序T1的复杂程度。 C、倒计时功能:可设定任意时间进行倒计时 利用前述预置时间等的办法来预置倒计时的时间,利用类似跑表功能的办法来实现倒计时功能。这样同样会增加中断程序T1的复杂程度。

以上B和C两个功能都需要使用定时计数器T1,但是由于T1只有受外界控制时才启动,因此不会发生冲突。

06电气工程及其自动化2班 许伟敏 0603001021124

27

单片微型计算机课程设计 基于汇编语言的电子数字钟 心得体会

九、心得体会

在本次课程设计开始时我就希望能通过这次课程设计学习到尽可能多的知识。因此我选择了难度比较大的数字钟。此前在学习数字电子技术课程的时候,课程设计的题目同样也是数字钟,但是由于使用的语言和硬件不同,设计过程需要考虑的问题也大不相同。数电课程设计的模块划分是由老师完成的,而这个工作锻炼价值很大;同时,数电课设中不需要考虑CPU的时间复用问题,因此,因此本次课程设计的难度比较大。

在课程设计的第一次调试过程中,出现了许多我无法解释的问题,使我有些灰心,但是在认真重新读完自己的程序以后,我发现原来出现问题的原因都是自己的粗心,在修改完这些问题以后,接下来的调试就比较顺畅了,归结原因主要还是我对流程图的设计下了很多功夫,为调试打下了良好的基础。

我对程序设计课程的学习的目标是在若干年以后能够设计一个复杂的系统,包括硬件电路和软件部分。所以,这次课程设计我付出了比别人跟多的努力,同样也学习到了更多的知识。在我能够设计更复杂的实用系统的时候,回想现在我连设计一个简单的数字钟系统都没有很好的把握时,我一定会为自己的成长感到喜悦。

06电气工程及其自动化2班 许伟敏 0603001021124

28

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务