最新毕业设计:基于单片机的电子日历时钟

合集下载

基于单片机的电子万年历设计

基于单片机的电子万年历设计

基于单片机的电子万年历设计一、概述随着科技的快速发展和人们对生活品质的追求,电子设备在日常生活中扮演着越来越重要的角色。

电子万年历作为一种集日期、时间显示于一体的实用电子产品,已经深入到人们的日常生活和工作中。

传统的机械式日历已经无法满足现代人对时间精确性和功能多样性的需求,基于单片机的电子万年历设计应运而生,成为了当前研究的热点之一。

基于单片机的电子万年历设计,旨在利用单片机(如STC89CAT89C51等)的强大计算和控制能力,结合液晶显示屏(LCD)、按键输入等外设,实现时间的准确显示、日期的自动更新、闹钟提醒、温度显示等多样化功能。

该设计不仅具有高度的集成性和可靠性,而且能够通过编程实现各种定制化的功能,满足不同用户的需求。

本文将对基于单片机的电子万年历设计进行详细的介绍和分析,包括设计思路、硬件组成、软件编程等方面。

通过本文的阅读,读者可以了解电子万年历的基本原理和设计方法,掌握单片机在电子万年历设计中的应用技巧,为实际的开发工作提供有益的参考和借鉴。

1.1 研究背景与意义随着科技的不断进步,人们日常生活和工作中对于时间的精度和便捷性的要求日益提高。

传统的机械式日历和简单的电子时钟已经无法满足现代生活的需求。

电子万年历作为一种集时间显示、日历查询、定时提醒等多功能于一体的电子装置,在日常生活、工作乃至科研领域都具有广泛的应用价值。

基于单片机的电子万年历设计,不仅可以提供准确的时间显示,还能实现复杂的日期计算、农历显示、节假日提示等功能,极大地提高了时间管理的效率和便捷性。

单片机作为一种集成度高、功耗低、价格适中的微型计算机,非常适合用于小型化、智能化的电子产品设计,如电子万年历。

本研究的意义在于,通过对基于单片机的电子万年历的设计研究,可以推动微型计算机技术和电子时钟技术的融合发展,提升电子产品的智能化水平,满足人们日益增长的生活和工作需求。

同时,该研究还可以为相关领域的技术人员提供参考和借鉴,推动电子万年历产品的不断创新和优化。

单片机课程设计报告电子万年历

单片机课程设计报告电子万年历

单片机课程设计报告电子万年历单片机课程设计报告:电子万年历一、设计简介在本次单片机课程设计中,我们选择了电子万年历作为设计主题。

电子万年历是一种结合了数字电路、单片机技术和实时时钟(RTC)技术的电子产品,它具有显示年份、月份、星期、日、时、分、秒的功能,还可以根据用户的需求进行定时、闹钟、报时等功能。

二、硬件设计我们采用了基于8051内核的单片机作为主控芯片。

该单片机具有丰富的I/O 端口,适于实现各种复杂的输入输出操作。

此外,它还内置了定时器和中断控制器,可以很方便地实现实时时钟功能。

1.显示模块:为了方便用户查看时间信息,我们选用了LCD显示屏作为显示设备。

LCD屏具有功耗低、体积小、显示内容丰富等优点。

2.实时时钟(RTC)模块:我们采用了常用的DS1302芯片作为实时时钟模块。

该芯片可以提供秒、分、时、日、星期、月、年的信息,而且还有可编程的报警功能。

3.按键模块:为了实现人机交互,我们设计了一组按键。

用户可以通过按键来调整时间、设置闹钟等。

4.电源模块:为了保证系统的稳定工作,我们采用了稳定的5V直流电源。

三、软件设计我们采用了C语言编写程序。

程序主要由以下几个部分组成:1.主程序:主程序主要负责读取RTC模块的时间信息,并控制LCD显示屏显示时间。

同时,主程序还要检测按键输入,根据用户的需求进行相应的操作。

2.RTC驱动程序:为了正确地读取和设置DS1302芯片的时间信息,我们编写了相应的驱动程序。

驱动程序包括初始化和读写寄存器两部分。

3.按键处理程序:按键处理程序用于检测按键输入,并根据按键值执行相应的操作。

比如,用户可以通过按键来增加或减少时间,设置闹钟等。

4.LCD显示程序:LCD显示程序用于控制LCD显示屏的显示内容。

在本设计中,我们使用了点阵字符库,将时间信息以字符的形式显示在LCD屏上。

四、测试与验证为了确保我们的电子万年历设计正确无误,我们进行了以下的测试和验证:1.硬件测试:首先,我们对硬件电路进行了测试,确保每个模块都能正常工作。

基于单片机的电子万年历的设计与实现毕业论文模版

基于单片机的电子万年历的设计与实现毕业论文模版
采用DS1302时钟芯片实现时钟,DS130 是美国DALLAS公司推出的一种高性能、低 功耗、带RAM的实时时钟电路,它可以对年 、月、日、周日、时、分、秒进行计时,具 有闰年补偿功能,工作电压为2.5V~5.5V。
10
时钟芯片连接图
11
4.温度传感器的选择方案
采用数字式温度传感器DS18B20,此类 传感器为数字式传感器而且仅需要一条数据 线进行数据传输,易于与单片机连接,可以 避免A/D模数转换模块,降低硬件成本,简 化系统电路。另外,数字式温度传感器还具 有测量精度高、测量范围广等优点。
19
19
ቤተ መጻሕፍቲ ባይዱ
谢 谢!
20
7
2显示器的选择
采用LCD液晶显示屏,液晶显示屏的显示功 能强大,可显示大量文字,图形,显示多样,清晰 可见,对于电子万年历而言,一个1602的液 晶屏即可,价格也还能接受,需要的接口线较 多,但会给调试带来诸多方便,所以此设计中 采用LCD1602液晶显示屏作为显示模块.
8
液晶显示器连接图
9
3.时钟芯片的选择方案
3
研究目标
设计一种功能全面、计时准确、成本低廉的 基于51单片机的万年历。
4
主要研究内容
论文立足于一个具体的制作实例,即以单 片机为控制核心的电子万年历的设计与制作。 具体做法是以单片机及其最小系统为核心C51 作为主控制系统,集时钟芯片,液晶显示, 按键电路,复位电路等为一体,通过对单片 机进行C语言设计,设计一个电子万年历。
5
分析、设计与实现(1/9)
程序流程图
开始 初始化 读、写日期、时间和温度 分离日期\时间\温度显示值 显示子程序 日期、时间修改子程序 子程序 返回
1单片机芯片的选择:

基于单片机的电子万年历设计与实现毕业设计论文

基于单片机的电子万年历设计与实现毕业设计论文

毕业设计(论文)专业电子信息工程技术班次 _______姓名 ______指导老师 _______成都工业学院二0一二年基于单片机的电子万年历设计与实现摘要: 随着半导体技术的迅速发展,特别是大规模集成电路出现,给人类生活带来了很多的改变。

尤其是单片机技术的应用产品已经随着社会前进的步伐走进我们的生活。

电子产品的应用可谓多不胜数,电子万年历就是其中的一种。

电子万年历的出现给人们的生活带来的极大的方便。

电子万年历以硬件汇编语言为主体进行软件设计,增加了程序的可读性和可移植性。

系统通过数码管输出显示数据,可以显示当前时间、公农历日期、星期、温度。

本设计着重要描述的就是基于AT89S52的单片机的电子万年历。

本文首先描述系统硬件工作原理,随后介绍了本系统所应用的各硬件接口技术(即芯片驱动程序)和各个接口模块的功能及工作过程。

本设计的主导思想是软硬件相结合来进行各功能模块的编写。

[关键词] 单片机;万年历;AT89S52;DS1302;目录第1章绪论 (1)设计开发背景 (1)国内外研究现状 (1)设计需要解决的主要问题 (1)本文主要工作 (2)本文的组织结构 (2)第2章方案选择与论证 (3)单片机芯片的选择与论证 (3)显示模块选择方案和论证 (3)时钟芯片的选择方案和论证 (3)温度传感器的选择方案与论证 (4)电路设计最终方案决定 (4)第3章系统的设计与实现 (5)电路设计框图 (5)主要电路模块的设计 (5)3.2.1 单片机主控制模板 (5)3.2.2 时钟模块电路的设计 (7)3.2.3公历与农历转换模块 (9)3.2.4 DS18B20温度模块 (12)3.2.5 时间可调模块 (14)3.2.6 显示模块的设计 (14)第4章系统调试与分析 (16)系统软件开发 (16)系统硬件开发 (17)测试分析及设计发展 (17)4.3.1 测试分析 (17)4.3.2 本设计的发展 (18)结语 (19)致谢 (20)参考文献 (21)附录 (22)第1章绪论设计开发背景近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,再根据具体硬件结构,以及针对具体应用对象的特点与软件结合,以作完善。

毕业设计---基于单片机的多功能电子万年历的设计

毕业设计---基于单片机的多功能电子万年历的设计

基于单片机的多功能电子万年历的设计摘要随着科技的快速发展,自从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

本文主要介绍了基于单片机的智能电子万年历的研制,该万年历能够实时显示公历年、月、日、时、分、秒,以及对应的农历日期、24节气、天干地支、闹铃功能,同时还能够实时测取环境温度。

本系统的硬件部分主要由A VR单片机、时钟芯片、温度传感器等部件组成,文中给出了详细的硬件设计实现及相关电路图;软件部分主要包含公历转农历的算法设计模块、显示模块、时间的读取、温度的检测模块,按键的扫描输入模块等,文中给出了系统的软件程序流程图及各功能模块的软件程序清单,最后介绍了整体系统的设计实现、仿真及调试过程,给出了下一步的改进方案等。

关键词:单片机;液晶技术;万年历;时钟芯片Design of Multifunctional digital Perpetual Calendar Based on MCUAbstractWith the development of technology,Since the concept of the sun, Baizhong, andnow the electronic bell,human beings continue to study and constant innovation record。

This paper-based Microcontroller Development of Intelligent electronic calendar, The calendar can display real-time in the calendar year, month, day, hours, minutes and seconds,a nd the correspond ing date of the Lunar New Year, 24 Solar Terms,at the same time also to real-time measurement from the ambient temperature,In addition to the user through the keyboard input years of history,for the correspond ing period of the Lunar.The system hardware from some of the major A VR microcontroller, a number of digital control, decoder, the clock chip,temperature sensors and other components,the paper gives a detailed design and implementation of hardware and related circuit;Software contains some of the major Lunar calendar to the algorithm design module,dynamic digital display modules,time to read,temperature detection module,Press enter the scanning module.In this paper, the system software modules and flow chart of the list of software programs,Finally, the realization of the overall system design, simulation and debugging process, the next step is the improvement programmes.Keywords:MCU;crystal technology;Calendar;Clock chip目录引言 (1)第1章绪论 (2)1.1课题的背景与意义 (2)1.2 数字万年历的现状与发展 (2)1.3 论文的主要工作及章节安排 (3)1.4 本章小结 (3)第2章方案论证比较.............................................................................. (4)2.1 多功能数字万年历系统概述 (4)2.2计时方案 (4)2.3温度检测方案 (5)2.4显示方案 (5)2.5本章小结 (5)第3章系统硬件设计 (6)3.1 主控制器ATmega16 单片机介绍 (6)3.2 时钟电路DS1302 (6)3.3 温度检测DS18B20 (7)3.4 动态显示 (8)3.5 键盘接口 (8)3.6 语音闹铃模块 (8)3.7 电源设计 (9)3.8本章小结 (11)第4章系统软件设计 (12)4.1 公历计算显示程序设计 (13)4.1.1 DS1302 内部寄存器 (13)4.1.2 时间读取程序设计 (15)4.2 农历转换程序设计 (16)4.2.1 公历转农历算法研究 (16)4.2.2 干支纪年简介 (18)4.2.3 公历转农历程序 (18)4.3 温度测量程序设计 (20)4.3.1 DS18B20 的测温原理 (20)4.3.2 温度程序 (21)4.4 二十四节气算法研究 (23)4.5系统仿真 (24)4.6本章小结 (25)结论与展望 (26)致谢 (27)参考文献 (28)附录 A 电子万年历原理图 (29)附录 B 外文文献与译文 (30)英文原文: (30)中文译文: (33)附录 C 参考文献题录及摘要 (35)附录 D 电子万年历源程序 (37)插图清单图2-1 数字万年历系统框图 (4)图3-1 DS1302与ATmega16连接图 (7)图3-2 DS18B20与AtMEGA16连接图 (8)图3-3 报时电路 (9)图3-4 稳压电源原理图 (10)图3-5 电源电路 (10)图4-1 系统程序流程图 (13)图4-2 公历程序流程图 (14)图4-3 DS18B20测温原理 (21)表格清单表3-1 LCD12864显示内容 (8)表4-1 DS1302的寄存器及其控制字 (14)表4-2 RS位配置 (15)引言人类的日常生活离不开时间,任何具有周期性变化的自然现象都可以用来测量时间。

基于STM32单片机的万年历设计毕业设计论文

基于STM32单片机的万年历设计毕业设计论文

万年历是一种可以显示年、月、日、星期的电子设备,广泛应用于日常生活和办公场所。

本文将介绍一个基于STM32单片机的万年历的设计思路和实现过程。

首先,我们需要明确设计目标。

在这个项目中,我们的目标是使用STM32单片机开发一个功能齐全、易于操作的万年历。

具体地说,这个万年历应该能够显示当前的年、月、日和星期,并且能够进行日期的加减操作,同时应该具备一些辅助功能如闹钟设置、倒计时等。

接下来,我们需要进行硬件设计。

首先需要选择适当的显示屏,比如常见的LCD或OLED屏幕。

然后,我们需要选择合适的按键和外部触发器,用于用户的交互输入。

同时,还需要添加一些必要的接口,如USB接口用于数据传输和维护。

在软件设计方面,我们需要定义合适的数据结构来存储日期、时间、闹钟等信息。

同时,需要编写相应的程序来实现日期的显示和更新、日期的加减、闹钟的设置等功能。

在实现倒计时功能时,我们可以使用定时器中断来实现精确的计时。

此外,为了提高用户体验,我们可以添加一些额外的功能。

比如,我们可以为万年历设计一个简洁美观的用户界面,考虑使用图形库绘制用户界面元素。

同时,可以添加一些实用的功能如温湿度监测、天气预报等。

最后,在整个开发流程结束后,我们需要进行集成测试和调试,确保万年历的各项功能正常运行。

并且,我们还可以考虑为万年历添加一些优化和改进措施,如增加存储容量、优化节能技术等。

综上所述,基于STM32单片机的万年历设计主要涉及硬件设计和软件设计两个方面。

通过精心的设计和合理的实现,我们可以开发出一款功能丰富、易于使用的万年历产品,满足用户的各种需求。

毕业设计—基于单片机的12864时钟显示

毕业设计—基于单片机的12864时钟显示

学士学位毕业论文(设计)题目:基于单片机的12864时钟显示摘要电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。

它可以对年、月、日、星期、时、分、秒进行计时,采用直观的数字显示,可以同时显示年月日时分秒等信息,还有时间校准等功能。

该电子时钟主要采用STC89C52单片机作为主控核心,用DS1302时钟芯片作为时钟、液晶12864显示屏显示。

STC89C52单片机是由深圳宏晶科技公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的12864液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。

此外,该电子时钟还具有时间校准等功能。

关键词:STC89C51单片机,DS1302时钟芯片,液晶12864AbstractElectronic clock is a very extensive daily timing tool, to the people has brought great convenience, more and more popular in the community. It can be the year, month, date, day, hour, minute, second for a time, using intuitive digital display, can display information such as year, month, day, hour, and time alignment functions. The electronic clock is used mainly as a master STC89C52 microcontroller core, with theDS1302 clock chip as a clock, LCD display12864. STC89C52 SCM is a Shenzhen Hong Crystal Technology has introduced, power consumption, voltage can be selected 4 ~ 6V voltage power supply; DS1302 clock chip is American DALLAS company launched with a fine current charging low-power real-time clock chip, it can year, month, date, day, hour, minute, second for a time, also has a leap year compensation and other functions, DS1302 and long life, small error; 12864 LCD digital display isused to display that can display year, month, date, day, hour, minute, second and so on. In addition, the electronic clock also has a time calibration function.Key Words:STC89C51 microcontroller, DS1302 clock chip, LCD 12864目录1绪论 (3)1.1时钟发展史 (3)1.2 目前的研究现状 (4)1.3研究目的及意义 (4)2 总体方案设计 (5)2.1 方案的选择 (5)2.1.1设计要求 (5)2.1.2方案的选择 (5)2.2总体方案组成框图 (6)3系统硬件设计 (6)3. 1主芯片模块 (6)3.1.1 中断系统 (8)3.1.2常用寄存器 (8)3.2晶振和复位电路 (10)3.2.1晶振电路 (10)3.2.2复位电路 (11)3.3 DS1302时钟芯片电路 (11)3.3.1 DS1302引脚图 (11)3.3.2 DS1302寄存器 (12)3.3.3 DS1302外围电路 (13)3.4 LCD12864显示模块 (13)3.4.1 LCD12864引脚功能 (13)3.4.2 LCD12864指令说明 (14)3.4.3 LCD12864电路接线 (15)3.5 红外遥控模块 (16)4 系统软件设计 (17)4.1 主程序设计 (17)4.2 LCD12864驱动程序 (19)4.3 DS1302驱动程序 (21)4.4 红外遥控程序 (24)5 调试结果 (25)5.1 正常显示日期时间画面 (26)5.2 进入调整时间日期画面 (26)5.3图片显示画面 (26)6总结 (27)致谢 (28)参考文献 (29)附录一 (31)附录二 (32)1绪论1.1时钟发展史很早以前,人类主要是利用天文现象和流动物质的连续运动来计时。

「基于单片机的多功能电子万年历设计」

「基于单片机的多功能电子万年历设计」

基于单片机的多功能电子万年历设计引言在现代社会中,计算机及其应用已经成为我们生活中不可或缺的一部分。

计算机科技的发展不仅使我们的生活更加便捷,还为我们提供了更多的娱乐和功能选择。

在这样一个科技高度发达的时代,电子万年历作为一种基于单片机技术的应用产品,正逐渐走进人们的生活。

而本文将着重对基于单片机的多功能电子万年历进行设计与实现。

一、设计目标本次设计主要是基于单片机的多功能电子万年历。

设计目标包括:1.显示日期、时间和星期几的功能。

2.具备日历计算功能,能够计算今天是该年的第几天,该周的第几天等信息。

3.具备闹钟和定时器功能。

二、设计思路基于单片机的多功能电子万年历的设计理念是通过单片机与LCD显示屏、温度传感器、按键等外设组合实现多种功能。

具体实现步骤如下:1. 使用单片机和RTC(Real-Time Clock)芯片实现时间的获取和处理。

RTC芯片可以提供准确的时钟信息,单片机可以通过与RTC芯片的通信来读取时钟信息,并进行相应的处理。

2.使用单片机与LCD显示屏进行通信,将获取的时间、日期和星期信息显示在LCD显示屏上。

3.设计按键接口,通过按键的触发实现切换功能或进行相应操作。

例如,通过按键的触发可以实现日期、时间的调整,以及闹钟和定时器的设置等。

4.使用单片机和温度传感器实现温度测量功能。

通过温度传感器读取当前温度信息,并将其显示在LCD屏幕上。

5.使用定时器功能实现闹钟和定时器的功能。

单片机可以通过定时器来控制闹钟和定时器的开启与关闭,并通过LCD屏幕上的显示提醒用户。

三、电路设计本次设计中需要使用的元器件主要包括单片机、RTC芯片、LCD显示屏、温度传感器和按键。

其中,单片机为本次设计的核心控制器,RTC芯片用于提供准确的时钟信息,LCD显示屏用于显示时间、日期和其他信息,温度传感器用于测量当前温度信息,按键用于触发相应的操作。

四、软件设计本次设计中需要编写相应的软件程序,用于读取RTC芯片提供的时钟信息,并将其显示在LCD屏幕上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一课程设计题目:电子日历时钟二实现的功能:基本功能:(1)显示北京时间,并且能够校准时间;(2)程序使用汇编语言;(3)显示的时、分、秒之间以及年、月、日间以小数点分隔;(4)显示公历日期,并且能够校准日期;发挥功能:(5)运动秒表;(6)闹钟功能;(7)自动整点报时。

三课程设计的目的:课程标志性内容的设计理解和综合运用,对所学内容进行一次实操,学以致用。

四、设计方案说明1、硬件部分(1)采用6位LED数码管显示日期或者时间。

(2)显示器的驱动采用“动态扫描驱动”,且采用“一键多用”的设计方案,系统电路大为简化。

使用小数点表示闹钟设置状态;(3)电路连接使用PCB,使电路连接简洁美观2、软件部分(1)“时钟”基准时间由单片机内部的定时中断提供,考虑因素:定时时间是“秒”的整除数,且长短适宜。

最长不能超过16位定时器的最长定时时间;最短不能少于中断服务程序的执行时间。

基准时间越短,越有利于提高时钟的运行精确度。

基准时间定为0.05秒。

(2)用一个计数器对定时中断的次数进行计数,由基准时间为0.05秒知计数值为20即可实现实现“秒”定时,同理进行“分”﹑“时”定时,以及“日”﹑“月”﹑“年”定时。

(3)LED 数码管显示器采用“动态扫描驱动”考虑问题:驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间短),而驱动信号的间歇时间必须小于“余辉时间”(电流大余辉时间长),但驱动电流大小受硬件电路能力和LED数码管极限功耗的制约。

(4)动态扫描显示方式在更新显示内容时,考虑到因LED数码管余辉的存在可能会造成显示字符的模糊,所以新内容写入显示器之前将所有的LED数码管熄灭。

(5)关于自动识别“月大﹑月小”和“平年﹑润年”问题的考虑a)月大和月小2月另外计算;4月﹑6月﹑9月﹑11 月为月小30天,其余为月大31天。

b)平年和润年(年号能被4整除的就是润年)平年的2月为28天;润年的2月为29天。

五、使用说明实物图请参照后面附带图片,从左至右为按键K2,K1,K0,以两个LED显示器为一组,左中右显示时分秒或者年月日,还有闹钟和秒表K2:复位 K1:设置闪烁 K0:切换时间/日期或者调整时间/日期初始状态:接上电源之后,日期默认为10年6月21日,时间为0时0分秒,闹钟2点整但默认关闭,秒表为0状态(1)显示状态切换:不断按K0键就会依次循环显示下面的状态初始状态时间日期闹钟时间闹钟状态秒表状态(2)调节时间,日期:按K0键切换到想要调节的显示状态,再按K1键选择要修改的位,不断按K1键会按左闪烁.中闪烁.右闪烁.确定.四个状态切换,闪烁的位可以修改,按K0键可以实现增加,不能递减,例如要调慢时间要按到循环到较慢时间。

(3)闹钟使用:闹钟默认响的时间为一分钟,闹钟的时间设置同时间日期的调节,只需把状态切换到闹钟时间的状态,闹钟的开关先按K0键切换到屏幕显示为OFF的状态,如下:再按K1可切换到开状态,如下图,再按K1可关闭,不断循环(4)秒表:K0键按4下就可切换到秒表状态,出示为0,此时按下K1键就可开始计时,再按一下K1键可停止,此时K1为秒表开关,按K0键可再切换显示其他。

六、硬件连接图1、原理图2、pcb图3、实物图1.主程序2.定时器0中断子程序3.外部中断0子程序4.外部中断1子程序八、性能测试与故障排查1、硬件部分问题:断路。

现象:程序下载完之后可以工作但是6个LED显示器有2个没亮。

分析:因为其他几个显示器完全正常,这两个则完全没亮,所以推断是位选的线路出故障。

检测:用万用表测试各点电压,着重测试两条位选线路的断路与短路情况,最终发现两处断路。

解决:焊锡接上,最终全亮2、软件部分偶数组实现基础功能的程序老师已经提供,该程序基本没有多大的问题,就是里面的几个参数需要修改,同时还有一个小bug。

修改一:由于提供的程序所默认采取的晶振计数频率是6MHz,但是所提供的现实原件则是12MHz,所以根据晶振的不同,定时器的定时时间变为0.05s。

按照该程序直接跑的话,计数时间为0.5s。

这就需要设置计数次数TICK_CNT为#14H,即0.05s*20=1s。

代码段:MOV TICK_CNT,#14H修改二:程序默认设置的外部中断延时过短,导致操作过于“灵敏”,也即按键K0、K1按下时,跳变过快。

这里所说的延时是中断子程序EX0_INT和EX1_INT中的语句LCALL DIS_DELAY。

解决这个情况只需修改DELAY 次数,则DIS_DELAY:MOV D_CNT_DIS,#10H。

修改三:观察实物电路工作发现每一位:LED数码管的小数点都是亮的,没有起到用小数点区分时间/日期中的时分秒/年月日。

要解决这个问题,在显示子程序中TSA代码段的MOV Rx A前插入语句ADD A,#80H(x=1、2、4、6)。

以及加上发挥部分的拓展功能:秒表和闹钟。

九、原件清单十、心得体会与总结这个学期做了两个与汇编有关的课程设计(不过这次是大作业),一次是开学初的微机原理课程设计,还有就是这次单片机原理大作业。

上次基本上只与程序打交道,硬件部分实操不多。

而这次大作业则是硬件、软件两方面都有兼顾,且两者所花的时间也都不少。

虽然从老师那已经获取了原理图和程序,但这是我们第一次比较系统的从熟悉软件操作到软硬件设计了解整个流程。

硬件部分,由于先前我们都没有操作过protel之类的软件,所以一切从零开始,针对这次大作业需要,学习了protel软件的基本操作、原理图的绘制修改、原件的封装以及原件集成库的创建,当然还有PCB板的排线。

之后就是PCB图打印,电路板热压制、腐蚀、钻孔,元器件的焊接。

流程很简洁,过程很纠结。

我们一步一个脚印地制作着,生怕哪个步骤出错而导致前功尽废。

不过在我们不懈努力下终于走完。

但是焊接的不仔细——两个电阻虚焊,使后来电路出现问题,也排查了好久,需要记住教训。

软件部分,虽然老师已经给了具备基本功能的程序,但是仍需看懂弄懂,后期才能更好地发现问题以及修改添加功能。

我发现这个过程也并非一件易事,清楚认识每一句的作用也需要经常查阅书籍。

另外在硬件焊接已经实现后我们把两者结合在一起,通过下载器把程序烧进52单片机中实现既定功能,发现上面故障排查中出现的问题,继而针对每个问题分别从软硬件寻找解决方法,这个过程我认为收获更大,能让我们更清楚熟悉软硬件两者的运作方法。

而且我俩分工是按硬件、软件而分的,自个儿认为分工尚算明确,各司其职。

十一、程序附录;wahaha.asm; (Electronic Calendar and Clock); Reference for Grade 2008, s.c.u.t.; Key0(for shift/adjust) connected to INT1; Key1(for un-flash/flash) connected to INT0; 学生姓名:陈晓伟、冯劲增; 学生学号:200830240144,200830240229; 分组编号:004;变量定义TICK_CNT EQU 20H ;T0倍乘;------------------SECOND_BCD EQU 21H ;时间记录MINUTE_BCD EQU 22HHOUR_BCD EQU 23HDAY_BCD EQU 24H ;日期记录MONTH_BCD EQU 25HYEAR_BCD EQU 26H;------------------FLASH_FLAG EQU 27H ;是否闪烁DIS_FLAG EQU R7 ;当前显示内容标志 ;DIS_FLAG: 0-时间;1-日期;2-闹钟;3-闹钟开关;4-秒表;------------------NSECOND_BCD EQU 2BH ;闹钟时间NMINUTE_BCD EQU 2CHNHOUR_BCD EQU 2DH;------------------TCC_BCD EQU 2EH ;秒表计时器TBB_BCD EQU 2FHTAA_BCD EQU 30H;------------------TIMER_FLAG EQU 31H ;秒表模式TIMER_START_FLAG EQU 32H ;秒表开始;------------------ALAM_STATE EQU 33H ;闹钟开启标志;------------------DI_40H EQU 34H ;提示音延时变量DI_41H EQU 35H ;延时;------------------ALAM_ON1 EQU 36H ;闹钟状态显示ALAM_ON2 EQU 37HALAM_ON3 EQU 38HALAM_OFF1 EQU 39HALAM_OFF2 EQU 3AHALAM_OFF3 EQU 3BH;------------------;中断向量表ORG 0000HLJMP MAINORG 0003HLJMP EX0_INT ; port INT0ORG 000BHLJMP T0_INT ; port T0ORG 0013HLJMP EX1_INT ; port INT1;主程序ORG 0030HMAIN: NOP ; main program ;初始化堆栈MOV SP,#60H;初始化变量MOV SECOND_BCD,#00H ; BCD of "second"MOV MINUTE_BCD,#00H ; BCD of "minute"MOV HOUR_BCD,#00H ; BCD of "hour"MOV NSECOND_BCD,#00H ;闹钟BCD of "second"MOV NMINUTE_BCD,#00H ;闹钟 BCD of "minute"MOV NHOUR_BCD,#06H ;闹钟BCD of "hour"MOV TCC_BCD,#00H ; 秒表BCD of "second"MOV TBB_BCD,#00H ; 秒表BCD of "minute"MOV TAA_BCD,#00H ; 秒表BCD of "hour"MOV TIMER_START_FLAG,#00H ;秒表工作标志MOV TIMER_FLAG,#00H ;秒表模式标志MOV DAY_BCD,#21H ; BCD of "day"MOV MONTH_BCD,#06H ; BCD of "month"MOV YEAR_BCD,#010H ; BCD of "year"MOV FLASH_FLAG,#00H ; flag for un-flash/flash MOV DIS_FLAG,#00H ; flag for shift(time/date)MOV ALAM_ON1,#55H ; BCD OFF 闹钟状态显示MOV ALAM_ON2,#01HMOV ALAM_ON3,#55HMOV ALAM_OFF1,#63HMOV ALAM_OFF2,#42HMOV ALAM_OFF3,#33HMOV ALAM_STATE,#00H ;初始化闹钟状态为OFF;------------------MOV TL0,#0B0H ; constant for 0.05sMOV TH0,#3CH ; 65536-15536=50,000 for 12MHz MOV TICK_CNT,#14H ; times of overflow 0.05*20=1sMOV TMOD,#01H ; Mode 1 for T0, Timer ModeSETB ET0 ; open T0SETB EX0 ; open INT0, Key1SETB EX1 ; open INT1, Key0SETB EA ; total openSETB PT0 ; priority for T0,高优先级SETB TR0 ; start T0, RunSCAN_HOUR: ;闹钟扫描MOV A,SECOND_BCDCJNE A,#00H,SCANALARMMOV A,MINUTE_BCDCJNE A,#00H,SCANALARMHOUR:CLR P2.0NOP ;整点,滴SETB P2.0SCANALARM: ;闹钟扫描MOV A,ALAM_STATEJZ SCAN_HOUR ;闹钟开关已打开?MOV A,NHOUR_BCDCJNE A,HOUR_BCD,WAITMOV A,NMINUTE_BCDCJNE A,MINUTE_BCD,WAITALARM:CLR P2.0 ;闹铃:滴滴滴滴`````` SETB P2.0CLR P2.0SETB P2.0CLR P2.0SETB P2.0CLR P2.0SETB P2.0NOPNOPNOPWAIT:SETB P2.0SJMP SCAN_HOUR ; wait for interrupt; -------------------------------------------------; sub: T0 interrupt; 定时器0中断T0_INT:PUSH ACCMOV TL0,#0B0H ; constant for 0.05s MOV TH0,#3CH ; Timer 0重装载MOV A,TIMER_START_FLAGCJNE A,#01H,TIMER_NEXT ;秒表模式?LJMP TIMER_INC ;秒表计时TIMER_NEXT:DJNZ TICK_CNT,NOT_1S ; is up to 1 second ?SJMP IS_1SNOT_1S:LJMP T0_RET; 1秒时间到IS_1S:MOV A,SECOND_BCD ; take BCD of "second"CJNE A,#59H,IN3 ; is up to 59 seconds ?SJMP IN4IN3:LJMP SECOND_INC ; 秒加1IN4:MOV SECOND_BCD,#00H ; 秒进位MOV A,MINUTE_BCD ; take BCD of "minute"CJNE A,#59H,IN5 ; is up to 59 minutes ?SJMP IN6IN5: LJMP MINUTE_INCIN6: MOV MINUTE_BCD,#00H ; 分进位MOV A,HOUR_BCD ; take BCD of "hour"CJNE A,#23H,HOUR_INC ; is up to 23 hours ?MOV HOUR_BCD,#00H ; "时"进位MOV A,MONTH_BCD ; take BCD of "month"CJNE A,#02H,NOT_FEB ; is February ?;2月处理;--------------------------FEB: NOPACALL BCD_DIV4 ; BCD of "year in 26H" divided by 4MOV A,R3 ; remainder in R3CJNE A,#00H,NOT_LEAP_Y ; "00" means leap year;闰年,29天LEAP_Y: MOV A,DAY_BCD ; take BCD of "day" in Feb.CJNE A,#29H,DAY_INC ; is up to 29 days (leap year)?MOV DAY_BCD,#01H ; keep the first dayMOV MONTH_BCD,#03H ; increase "month"SJMP RESET_CNT;非闰年NOT_LEAP_Y: MOV A,DAY_BCD ; take BCD of "day" in Feb.CJNE A,#28H,DAY_INC ; is up to 28 days (common year)?MOV DAY_BCD,#01H ; keep the first dayMOV MONTH_BCD,#03H ; increase "month"SJMP RESET_CNT;---------------------------;非2月处理;30/31天?NOT_FEB:NOP ; other "month" except Feb.CJNE A,#04H,Y01 ; is April ?AJMP MON_30DY01: CJNE A,#06H,Y02 ; is June ?AJMP MON_30DY02: CJNE A,#09H,Y03 ; is September ?AJMP MON_30DY03: CJNE A,#11H,T11 ; is November ?AJMP MON_30D;31天T11: MOV A,DAY_BCD ; take BCD of "day"CJNE A,#31H,DAY_INC ; is up to 31 days ?AJMP NEXT_MONTH;30天MON_30D:MOV A,DAY_BCD ; take BCD of "day"CJNE A,#30H,DAY_INC ; is up to 30 days ?;天进位NEXT_MONTH: MOV DAY_BCD,#01H ; keep the first day MOV A,MONTH_BCD ; take BCD of "month"CJNE A,#12H,MONTH_INC ; is December ?; 月进位MOV MONTH_BCD,#01H ; keep the first monthMOV A,YEAR_BCD ; take BCD of "year"CJNE A,#99H,YEAR_INC ; is up to 99 years ?MOV YEAR_BCD,#00H ; keep the first yearSJMP RESET_CNT;年加1YEAR_INC: MOV A,YEAR_BCD ; take BCD of "year"ADD A,#01H ; increase "year"DA A ; adjust BCDMOV YEAR_BCD,A ; keep "year"SJMP RESET_CNTMONTH_INC: MOV A,MONTH_BCD ; take BCD of "month"ADD A,#01H ; increase "month"DA A ; BCD码调整MOV MONTH_BCD,A ; keep "month"SJMP RESET_CNTDAY_INC: MOV A,DAY_BCD ; take BCD of "day"ADD A,#01H ; increase "day"DA A ; BCD码调整MOV DAY_BCD,A ; keep "day"SJMP RESET_CNTHOUR_INC: MOV A,HOUR_BCD ; take BCD of "hour"ADD A,#01H ; increase "hour"DA A ; BCD码调整MOV HOUR_BCD,A ; keep "hour"SJMP RESET_CNTMINUTE_INC: MOV A,MINUTE_BCD ; take BCD of "minute"ADD A,#01H ; increase "minute"DA A ; BCD码调整MOV MINUTE_BCD,A ; keep "minute"SJMP RESET_CNTSECOND_INC: MOV A,SECOND_BCD ; take BCD of "second"ADD A,#01H ; increase "second"DA A ; BCD码调整MOV SECOND_BCD,A ; save back "second"RESET_CNT: MOV TICK_CNT,#14H ; retrieve times of overflowT0_RET:POP ACCRETI;--------------------------------------------------------------------;秒表增TIMER_INC:TCC_INC:MOV A,TCC_BCD ; take BCD of "0.05S"CLR CSUBB A,#95HJZ TBB_INCMOV A,TCC_BCDADD A,#05H ; increase "0.05S"DA A ; BCD码调整MOV TCC_BCD,A ; keep "0.05S"AJMP TIMER_OUTTBB_INC:MOV TCC_BCD,#00HMOV A,TBB_BCD ; take BCD of "SECOND"CLR CSUBB A,#59HJZ TAA_INCMOV A,TBB_BCDADD A,#01H ; increase "SECOND"DA A ; BCD码调整MOV TBB_BCD,A ; keep "SECOND"AJMP TIMER_OUTTAA_INC:MOV TBB_BCD,#00HMOV A,TAA_BCD ; take BCD of "MINUTE"CLR CSUBB A,#59HJZ TDD_INCMOV A,TAA_BCDADD A,#01H ; increase "MINUTE"DA A ; BCD码调整MOV TAA_BCD,A ; save back "MINUTE"AJMP TIMER_OUTTDD_INC:MOV TAA_BCD,00HTIMER_OUT: LJMP TIMER_NEXT ;返回定时器中断;------------------------------------------------------------------;-------------------------------------------------------------------; sub: LED Display;显示子程序DISPLAY:MOV A,DIS_FLAGCJNE A,#03H,DISPLAY2 ;选择不同字模MOV DPTR,#TAB2SJMP DISPLAY3DISPLAY2:MOV DPTR,#TAB ; set address of code table DISPLAY3:MOV A,DIS_FLAG ; take flag for shiftCJNE A,#00H,DISP_DATE ; "00" 当前显示内容为时间;R0: point to display bufferDISP_TIME: MOV R0,#SECOND_BCD ; beginning from "second"SJMP TSADISP_DATE:CJNE A,#01H,DISP_ALAM ; "01" 当前显示内容为日期 MOV R0,#DAY_BCD ; "FF" for showing dateSJMP TSA;显示时间或日期DISP_ALAM:CJNE A,#02H,DISP_ALAM_SET ; "02" 当前显示内容为闹钟MOV R0,#NSECOND_BCD ; beginning from "second"SJMP TSADISP_ALAM_SET:CJNE A,#03H,DISP_TIMER ; "03" 当前显示内容为闹钟设置MOV A,ALAM_STATE ; 闹钟状态显示JZ SHOWOFFMOV R0,#ALAM_ON1 ; 显示"ON"SJMP TSASHOWOFF:MOV R0,#ALAM_OFF1 ;显示"OFF"SJMP TSADISP_TIMER: ;"04"当前显示内容为秒表MOV R0,#TCC_BCD ; beginning from "second"TSA: MOV A,@R0 ; begin from "day"ANL A,#0FH ; get the "low half byte"MOVC A,@A+DPTR ; take character from code tableMOV R1,A ; keep in R1 for DS6 showingMOV A,@R0SWAP AANL A,#0FH ; get the "high half byte"MOVC A,@A+DPTR ; take character from code table MOV R2,A ; keep in R2 for DS5 showing;---------------INC R0MOV A,@R0 ; next one from "month"ANL A,#0FH ; get the "low half byte"MOVC A,@A+DPTRMOV R3,A ; keep in R3 for DS4 showingMOV A,@R0SWAP AANL A,#0FH ; get the "high half byte"MOVC A,@A+DPTRMOV R4,A ; keep in R4 for DS3 showing;-------------INC R0MOV A,@R0 ; next one from "year"ANL A,#0FH ; get the "low half byte"MOVC A,@A+DPTRMOV R5,A ; keep in R5 for DS2 showingMOV A,@R0SWAP AANL A,#0FH ; get the "high half byte"MOVC A,@A+DPTRMOV R6,A ; keep in R6 for DS1 showing;---------------------;P1:位选线;P0:段选线NOPTDP: MOV P1,#0FFH ; close all showing///;Display DS6MOV A,ALAM_STATE ;是否显示闹钟状态位?(最末位小数点)JZ DIS_NEXTMOV A,R1ANL A,#7FHMOV R1,ADIS_NEXT:MOV A,R1MOV P0,A ; send character to DS6MOV A,FLASH_FLAG ; get flag of un-flash/flashCJNE A,#03H,A02 ; "03" is flash on DS5&DS6SJMP A03A02: CJNE A,#03H,A04; ; "03" is flash on DS5&DS6A03: MOV A,TICK_CNT ; take Counter of overflow RRC AJNC A05 ; check bit C ( 1 or 0 )A04: MOV P1,#0dfH ; turn on DS6A05: LCALL DELAYMOV P1,#0FFH ; close all showing;Display DS5MOV P0,R2 ; send character to DS5MOV A,FLASH_FLAG ; get flag of un-flash/flashCJNE A,#03H,B02 ; "03" is flash on DS5&DS6SJMP B03B02: CJNE A,#03H,B04B03: MOV A,TICK_CNT ; take times of overflow RRC AJNC B05 ; check bit C ( 1 or 0 )B04: MOV P1,#0efH ; turn on DS5B05: LCALL DELAYMOV P1,#0FFH ; close all showing;Display DS4MOV A,R3ANL A,#7FH ;该位增加小数点显示MOV P0,A ; send character to DS4MOV A,FLASH_FLAG ; get flag of un-flash/flashCJNE A,#02H,C02 ; "02" is flash on DS3&DS4SJMP C03C02: CJNE A,#02H,C04C03: MOV A,TICK_CNT ; take times of overflow RRC AJNC C05 ; check bit C ( 1 or 0 )C04: MOV P1,#0f7H ; turn on DS4C05: LCALL DELAYMOV P1,#0FFH ; close all showing;Display DS3MOV P0,R4 ; send character to DS3MOV A,FLASH_FLAG ; get flag of un-flash/flashCJNE A,#02H,D02 ; "02" is flash on DS3&DS4SJMP D03D02: CJNE A,#02H,D04D03: MOV A,TICK_CNT ; take times of overflow RRC AJNC D05 ; check bit C ( 1 or 0 )D04: MOV P1,#0fbH ; turn on DS3D05: LCALL DELAYMOV P1,#0FFH ; close all showing;Display DS2MOV A,R5ANL A,#7FH ;该位增加小数点显示MOV P0,A ; send character to DS2MOV A,FLASH_FLAG ; get flag of un-flash/flashCJNE A,#01H,E02 ; "01" is flash on DS1&DS2SJMP E03E02: CJNE A,#01H,E04E03: MOV A,TICK_CNT ; take times of overflow RRC AJNC E05 ; check bit C ( 1 or 0 )E04: MOV P1,#0fdH ; turn on DS2E05: LCALL DELAYMOV P1,#0FFH ; close all showingMOV P0,R6 ; send character to DS1MOV A,FLASH_FLAG ; get flag of un-flash/flashCJNE A,#01H,F02 ; "01" is flash on DS1&DS2SJMP F03F02: CJNE A,#01H,F04F03: MOV A,TICK_CNT ; take times of overflow RRC AJNC F05 ; check bit C ( 1 or 0 )F04: MOV P1,#0feH ; turn on DS1F05: LCALL DELAYMOV P1,#0FFH ; close all showingRET;-------------------------------------------------------------------; ----------------------------------------; sub: delay (1.542ms for 12MHz, 3.084ms for 6MHz);延时子程序D_CNT_2 EQU 28HD_CNT_1 EQU 29HDELAY: MOV D_CNT_2,#03HD_LOOP2: MOV D_CNT_1,#0FFH ;[1]D_LOOP1: DJNZ D_CNT_1,D_LOOP1 ;[2]DJNZ D_CNT_2,D_LOOP2 ;[2]RET; ----------------------------------------; --------------------------------------------------------- ;外部中断0; sub: INT0 interrupt; 处理按键K0,切换时间/日期/闹钟/闹钟设置/秒表显示或者调整EX0_INT: NOP ; switch or adjust with date/time PUSH ACCPUSH PSWLCALL DIS_DELAY ; re-bounce (with LED display)JNB P3.3,OUT ; check port INT1;K0按下NOP ; inhibit INT1 ( use k0);---------------------------------------------------MOV A,FLASH_FLAGCJNE A,#00H,JUDGE_MODE ;有闪烁进入调整模式SET_DIS: ;无闪烁进入设置显示或秒表模式CLR P2.0 ;按键滴一声MOV DI_41H,#19HDI_LPO:MOV DI_40H,#0FFHDI_LP:DJNZ DI_40H,DI_LPDJNZ DI_41H,DI_LPOSETB P2.0;---------------------------------------------------MOV A,DIS_FLAGINC AMOV DIS_FLAG,ACJNE A,#04H,CROSSTIMER ;进入秒表?;---------------------------------------------------TIMER:MOV TIMER_FLAG,#01H ;进入秒表,秒表模式设置为开 LJMP EX0_RET ;退出;---------------------------------------------------CROSSTIMER: ;显示模式切换CJNE A,#05H,OUTMOV DIS_FLAG,#00H ;已到5需置零MOV TIMER_FLAG,#00HMOV A,TIMER_START_FLAGJNZ OUT ;秒表后台工作,暂停计数时退出则对秒表清零MOV TCC_BCD,#00H ; BCD of "second" 秒表清零MOV TBB_BCD,#00H ; BCD of "minute"MOV TAA_BCD,#00H ; BCD of "hour"OUT: LJMP EX0_RET ; 退出;--------------------------------------------------- JUDGE_MODE: ;进入调整模式MOV A,DIS_FLAG ; 读取当前显示内容为?(时间/日期/秒表/闹钟)CJNE A,#00H,JDATE ;是否进入时间调整00;--------------------------------------------------- JTIME: ;调整时间MOV A,FLASH_FLAG ; take flag of un-flash/flash ADH: CJNE A,#01H,ADM ; "03" for adjusting "hour"MOV A,HOUR_BCD ; take BCD of "hour"CJNE A,#23H,JH0 ; is up to 23 hours ?MOV HOUR_BCD,#00H ; keep the first hourLJMP JHFJH0: ADD A,#01H ; increase "hour"DA A ; adjust BCDMOV HOUR_BCD,A ; keep "hour"JHF: LJMP EX0_RET;-----------------------------------------ADM: CJNE A,#02H,ADS ; "02" for adjusting "minute"MOV A,MINUTE_BCD ; take BCD of "minute"CJNE A,#59H,JM0 ; is up to 59 minutes ?MOV MINUTE_BCD,#00H ; keep the first minuteLJMP JMFJM0: ADD A,#01H ; increase "minute"DA A ; adjust BCDMOV MINUTE_BCD,A ; keep "minute"JMF: LJMP EX0_RETADS: MOV A,SECOND_BCD ; take BCD of "second"CJNE A,#59H,JS0 ; is up to 59 seconds ?MOV SECOND_BCD,#00H ; keep the first secondLJMP JSFJS0: ADD A,#01H ; increase "second"DA A ; adjust BCDMOV SECOND_BCD,A ; keep "second"JSF: NOPLJMP EX0_RET;--------------------------------------------------- JALAM0: LJMP JALAMJDATE: CJNE A,#01H,JALAM0 ;是否进入日期调整01 JYY: NOP ; "01 to 06" is in flashMOV A,FLASH_FLAGCJNE A,#01H,JMM ; "01" for adjusting "year";调节年MOV A,YEAR_BCD ; take BCD of "year"CJNE A,#99H,YY0 ; is up to 99 year ?MOV YEAR_BCD,#00H ; keep the first yearLJMP YYFYY0: ADD A,#01H ; increase "year"DA A ; adjust BCDMOV YEAR_BCD,A ; keep "year"YYF: LJMP EX0_RET;--------------------------------------- JMM: CJNE A,#02H,JDD ; "02" for adjusting "month";调节月MOV A,MONTH_BCD ; take BCD of "month"CJNE A,#12H,MM0 ; is December ?MOV MONTH_BCD,#01H ; keep the first monthLJMP MMFMM0: ADD A,#01H ; increase "month"DA A ; adjust BCDMOV MONTH_BCD,A ; keep "month"MMF: LJMP EX0_RET;---------------------------------------JDD: CJNE A,#03H,AA1 ; "03" for adjusting "day"LJMP BB1AA1: LJMP ADH ;BB1: MOV A,MONTH_BCD ; first, should take "month"CJNE A,#02H,NFB ; is February ?IFB: NOPACALL BCD_DIV4 ; BCD of "year in YEAR_BCD" divided by 4MOV A,R3 ; remainder in R3CJNE A,#00H,ANG ; "00" means leap yearARN: MOV A,DAY_BCD ; take BCD of "day"CJNE A,#29H,D0A ; is up to 29 days in Feb.?LJMP D0BD0A: LJMP DDAD0B: LJMP DD1ANG: MOV A,DAY_BCD ; take BCD of "day"CJNE A,#28H,D0A ; is up to 28 days in Feb.?LJMP DD1NFB: NOP ; check "little/large" monthCJNE A,#04H,Y04 ; is April ?LJMP AD1Y04: CJNE A,#06H,Y05 ; is June ?LJMP AD1Y05: CJNE A,#09H,Y06 ; is September ?LJMP AD1Y06: CJNE A,#11H,Y07 ; is November ?LJMP AD1Y07: NOP ; for "large" monthMOV A,DAY_BCD ; take BCD of "day"CJNE A,#31H,D0A ; is up to 31 days ?LJMP DD1AD1: NOP ; for "little" month MOV A,DAY_BCD ; take BCD of "day"CJNE A,#30H,D0A ; is up to 30 days ? DD1: MOV DAY_BCD,#01H ; keep the first day LJMP DDFDDA: ADD A,#01H ; increase "day"DA A ; adjust BCDMOV DAY_BCD,A ; keep "day"DDF: LJMP EX0_RET;--------------------------------------------------- JALAM: ;调整闹钟MOV A,FLASH_FLAG ; take flag of un-flash/flash NADH: CJNE A,#01H,NADM ; "03" for adjusting "hour"MOV A,NHOUR_BCD ; take BCD of "hour"CJNE A,#23H,NJH0 ; is up to 23 hours ?MOV NHOUR_BCD,#00H ; keep the first hourLJMP NJHFNJH0: ADD A,#01H ; increase "hour"DA A ; adjust BCDMOV NHOUR_BCD,A ; keep "hour"NJHF: LJMP EX0_RET;----------------------------------------- NADM: CJNE A,#02H,NADS ; "02" for adjusting "minute"MOV A,NMINUTE_BCD ; take BCD of "minute"CJNE A,#59H,NJM0 ; is up to 59 minutes ?MOV NMINUTE_BCD,#00H ; keep the first minuteLJMP NJMFNJM0: ADD A,#01H ; increase "minute"DA A ; adjust BCDMOV NMINUTE_BCD,A ; keep "minute"NJMF: LJMP EX0_RETNADS: MOV A,NSECOND_BCD ; take BCD of "second"CJNE A,#59H,NJS0 ; is up to 59 seconds ?MOV NSECOND_BCD,#00H ; keep the first secondLJMP NJSFNJS0: ADD A,#01H ; increase "second"DA A ; adjust BCDMOV NSECOND_BCD,A ; keep "second"NJSF: NOPLJMP EX0_RET;---------------------------------------------------EX0_RET:NOP ;中断退出POP PSWPOP ACCRETI;---------------------------------------------------;---------------------------------------------------; sub: INT1 interrupt; 处理按键K1,设置闪烁EX1_INT:NOP ; revise flag(00 to 06) in FLASH_FLAGPUSH ACCPUSH PSWJNB P3.2,EX1_RET ; check port INT0LCALL DIS_DELAY ; re-bounce (with LED display);;K1按键按下NOP ; inhibit INT0 (use k1)MOV A,DIS_FLAGCJNE A,#03H,TIMER_START0 ;非设置闹钟开关模式?MOV A,ALAM_STATECPL A ;取非ANL A,#01H ;保留最后MOV ALAM_STATE,A ;设置闹钟开关AJMP DI_START ;提示音后退出;--------------------------------------------------- TIMER_START0:MOV A,TIMER_FLAGCJNE A,#01,FLASH_SHIFT ;非秒表模式?TIMER_START:MOV A,TIMER_START_FLAGCPL AANL A,#01H ;保留最低位MOV TIMER_START_FLAG,A ;设置秒表开关;---------------------------------------------------DI_START:CLR P2.0 ;按键滴一声MOV DI_41H,#19HDI_LOOPO:MOV DI_40H,#0FFHDI_LOOP:DJNZ DI_40H,DI_LOOPDJNZ DI_41H,DI_LOOPOSETB P2.0AJMP EX1_RET ;退出;--------------------------------------------------- FLASH_SHIFT: ;进入切换闪烁MOV A,FLASH_FLAG ; take flag of un-flash/flashCJNE A,#00H,ED1 ; "00" 无闪烁MOV FLASH_FLAG,#01H ; 设置1,2号数码管闪烁SJMP EX1_RETED1: CJNE A,#01H,ED2 ; "01" 1,2号闪烁中。

相关文档
最新文档