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

合集下载

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

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

基于单片机控制的电子万年历设计1设计要求功能:电子万年历能显示阳历、时间、室温,并能表明是否是闰年,通过按键实现切换。

本课题以单片机为核心,设计并制作出智能LCD电子钟,具有以下基本功能:计时、秒、分、时、天、周、月、年;能进行时间、年份、日期、星期显示;能区分是否闰年;能检测室温并显示。

扩展功能部分可以通过控制按键使时间暂停、可以调整校正时间并通过按键切换轮流显示时间、年份、日期、星期。

2方案论证与对比2.1液晶显示器控制方式选择采用LCD液晶显示,具有超精致影像画质、十足平面显示、节省空间、节省能源等优点,但按控制方式不同,LCD可分为被动矩阵式LCD及主动矩阵式LCD两种。

可根据不同需要采用不同的方式。

方案一被动矩阵式LCD被动矩阵式LCD在亮度及可视角方面受到较大的限制,反应速度也较慢。

由于画面质量方面的问题,使得这种显示设备不利于发展为桌面型显示器,但成本低廉。

方案二主动矩阵式LCD目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD(Thin Film Transistor-LCD,薄膜晶体管LCD)。

TFT液晶显示器是在画面中的每个像素内建晶体管,可使亮度更明亮、色彩更丰富及更宽广的可视面积。

与CRT显示器相比,LCD显示器的平面显示技术体现为较少的零件、占据较少的桌面及耗电量较小,但CRT技术较为稳定成熟。

相比之下,本设计当中选用方案二主动矩阵式LCD方式。

2.2 并行接口动态显示电路选择可以采取串行接口动态显示电路或者并行接口动态显示电路,比较如下:方案一串行接口动态显示电路利用8051系列单片机内部的串行接口,也可以实现动态显示及键盘处理。

这样不但可以节省8051的并行I/O接口,而且在大多数不用单行口的情况下,可免于扩展接口。

在这种方法中,串行口工作在方式0状态,相当于一个移位寄存器,其输入/输出通过RXD引脚,移位脉冲则由TXD输出。

每次输入或输出8位数据(一个字节)。

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

基于单片机的电子万年历的设计与实现毕业论文模版
采用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章绪论设计开发背景近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,再根据具体硬件结构,以及针对具体应用对象的特点与软件结合,以作完善。

基于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屏幕上。

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

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

基于单片机的万年历设计报告一、研究意义随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活当中。

日历是人们不可或缺的日常用品。

但一般日历都为纸制用品,使用不便,寿命不长。

电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺陷。

本设计以AT89S52单片机为核心,构成单片机控制电路,AT89C52是一种带8K字节闪速可编程可擦除只读存储器(PEROM)的低电压、高性能CMOS 8位为控制器。

该器件采用ATMEL 非易失存储器制造技术制造,与工业标准的80C51和80C52指令集和输出管脚相兼容。

结合DS1302时钟芯片和24C02 FLASH存储器,完成时间的自动调整和掉电保护,全部信息用液晶显示。

时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。

日历能显示阳历和阴历年、月、日以及星期、时、分、秒。

在显示阴历月份时,能标明是否闰月。

二、总体方案设计本设计以AT89S52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片和24C02 FLASH存储器,显示阳历的年、月、日、星期、时、分、秒和阴历的年、月、日,在显示阴历时间时,能标明是否闰月,同时完成对它们的自动调整和掉电保护,全部信息用液晶显示出来。

输入接口由三个按键来实现,用这三个按键可以对日期和时间进行调整,并可以对闹铃的开关和闹铃的时间进行设置。

闹铃功能通过蜂鸣器来实现。

软件控制程序实现所有的功能。

整机电路使用+5V稳压电源,可稳定工作。

系统框图如图2-1所示,其软硬件设计简单,时间记录准确,可广泛应用于长时间连续显示的系统中。

三、系统硬件设计按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、存储模块、键盘接口模块、显示模块和闹铃模块共6个模块组成,电路系统构成框图如图3-1所示。

主控芯片使用52系列AT89S52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302,存储模块采用美国ATMEL公司生产的低功耗CMOS串行EEPROM存储芯片AT24C02。

课程设计基于单片机的电子日历设计大学论文

课程设计基于单片机的电子日历设计大学论文

基于单片机的电子日历设计一、设计目的和要求单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

通过对一个基于单片机的能实现电子日历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、时钟电路DS1302、显示电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

系统设计要求:电子日历能显示,能调整。

基于51系列的单片机进行的电子万年历设计可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

具体实现功能:显示年月日时分秒及星期信息,具有可调整日期和时间功能,与即时时间同步。

主要使用到的工具和器件:✧Keilc51✧Protues✧DS1302✧AT89S52✧LCD12864二、方案设计每一系统都有几个核心的模块。

它对整个系统的性能有非常大的影响。

比如系统的主控。

2.1 主控芯片选择方案论证方案一:选择51系列的单片机;AT89S52 是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

  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号闪烁中。

相关文档
最新文档