51单片机数码管时钟电路的设计_AT89C51
基于51单片机的电子时钟

1、电子闹钟的硬件系统框架:设计出电子闹钟的基本整体框架。
2、电子闹钟的电源设计:采用交直流供电电源。
电子钟一般采用数码管等显示介质,因而必须以交流供电为主,以直流电源为后备辅助电源。
3、电子闹钟的主机电路设计:主要有1)系统时钟电路设计:对时间要求不是很高,只要能使系统可靠起振并稳定运行就行。
2)系统复位电路设计:本系统采用的是RC复位方式3)按键与按钮电路设计:按键与按钮电路设计中关键要考虑的就是按键的去抖动问题。
本系统采用软件去抖。
考虑到对时和设定闹铃时间操作的使用频率不高,为了精简系统和降低成本,本系统只设置两个按键。
a)SET键,对应系统的不同工作状态,具有3个功能:在复位后的待机状态下,用于启动设定时间参数(对时或定闹);在设定时间参数状态而且不是设定最低位(即分个位)的状态下,用于结束当前位的设定,当前设定位下移;在设定最低位(分个位)的状态下,用于结束本次时间设定。
b)+1键,用于对当前设定位进行加1操作。
4)闹铃声光指示电路设计:本系统采用声音指示,关键元件是蜂鸣器。
4、电子闹钟的显示电路设计:设计一个由LED数码管组成的显示电路,显示采用共阳极数码管,其目的是为了简化限流电路的设计和实现亮度可调的要求。
一功能模、设计指标:1. 显示时、分、秒。
2. 可以24小时制或12小时制。
3. 具有校时功能,可以对小时和分单独校时,对分校时的时候,停止分向小时进位。
校时时钟源可以手动输入或借用电路中的时钟。
4. 具有正点报时功能,正点前10秒开始,蜂鸣器1秒响1秒停地响5次。
5. 为了保证计时准确、稳定,由晶体振荡器提供标准时间的基准信号。
二、设计要求:1. 画出总体设计框图,以说明数字钟由哪些相对独立的块组成,标出各个模块之间互相联系,时钟信号传输路径、方向和频率变化。
并以文字对原理作辅助说明。
2. 设计各个功能模块的电路图,加上原理说明。
3. 选择合适的元器件,在面包上接线验证、调试各个功能模块的电路,在接线验证时设计、选择合适的输入信号和输出方式,在充分电路正确性同时,输入信号和输出方式要便于电路的测试和故障排除。
时钟电路的设计

一、概述本次设计以AT89C51单片机芯片为核心,辅以必要的外围电路,设计了一个简易的电子时钟并且利用单片机自身的定时计数器,使LED 按照一定的时间间隔闪烁,闪烁时间间隔不小于1秒。
在硬件方面,除了CPU 外,使用七段数码管来进行动态扫描。
通过数码管能够比较准确显示时,分,LED 一闪一灭显示秒,设计方面采用C 语言编程,整个电子时钟能完成时间的显示,手动复位等功能。
本系统是基于AT89C51单片机设计的一个具有显示的数字实时时钟的发光二极管,该系统同事具有硬件设计简单,工作稳定性高,价格低廉等优点。
数字单片机的技术进步反应在内部结构,功率消耗,外部电压等级以及制造工艺上。
二、方案论证利用单片机自身的定时计数器,使LED 发光二极管按照一定的时间间隔闪烁,闪烁时间间隔不小于1秒。
方案一:采用AT89C51单片机来做LED 时间闪烁电路,其方案原理框图如下图1所示。
图1 打片机控制设计时钟电路的原理框图方案二:采用电子电路装置安装,其原理框图如下图2所示。
图2 电子电路控制设计时钟电路原理图时钟电路A T89C51 单片机 复位电路按键控制电路LED 显示电路直流5V 电源电路振荡电路控制电路计数器译码器LED 显示电路本设计采用的是方案一,AT89C51单片机构成的数码管显示时钟,硬件设计简单,工作稳定性高,性价比高比较合适。
三、电路设计1.程序流程图程序总体结构示意流程图如下图3所示。
程序从开始运行,设计要求为1秒的闪烁间隔,内容包括了开关中断子程序,以及总体流程。
YNNY图3 程序总体结构示意图2.复位电路AT89C51的复位方式可以是自动复位,也可以是手动复位,复位电路主要是确定开始开关中断 Countor1++(自加1)Counror1==20 D1=~D1(按位取反操作)TH0=(65536-50000)/256(重新赋初值)P1~0口状态改变单片机的起始状态,完成单片机的启动过程,本实验主要采用手动按键复位方式,该复位方式同样具有自动复位功能.当MCS-51单片机的复位引脚RST出现两个周期以上的高电平时,单片机就执行复位操作。
基于51单片机的电子时钟设计

基于51单片机的电子时钟设计
摘要:本文论述了基于51单片机的电子时钟设计,包括硬件设计与软件编程。
其中,硬件设计包括基本指示灯、DS1302时钟芯片等的选择与连接,时钟电路、晶振电路的设计等。
软件编程包括时钟显示的实现,时钟校准、闹钟等功能的实现等。
本设计具有精度高、操作简便、易于实现等特点,可广泛应用于各种场合。
关键词:51单片机;电子时钟;硬件设计;软件编程
前言
随着人们生活水平的提高,电子时钟已经成为人们生活中必不可少的物品,目前市场上各种类型的电子时钟层出不穷。
本文以51单片机为基础,设计了一款高精度、易于操作的电子时钟,采用DS1302时钟芯片作为时钟驱动芯片,实现了时钟的准确显示、校准、闹钟等功能。
硬件设计
硬件设计主要包括控制器、时钟驱动、显示装置以及电源。
本设计采用了AT89C51单片机作为控制器,一块DS1302时钟芯片作为时钟驱动,LED数字管作为显示装置。
同时,本设计采用了USB供电方式,其电源电压为5V。
软件编程
软件编程主要包括时钟显示、时钟校准、闹钟功能的实现等。
时钟显示采用了动态显示方式,实现了时间的精确定位。
同时,本设计还具有时钟校准功能,在程序接通时,可自动对时钟进行校准,保证时钟的精确度。
此外,本设计还具有设置闹钟的功能,用户可在指定时间响起闹钟。
结论本文以51单片机为基础,设计了一款高精度、易于操作的电子时钟。
通过对硬件设计、软件编程的设计与实现,使得该产品能够准确显示时间,保证了时钟的稳定性,满足了时间的要求,目前已
得到广泛应用。
AT89C51单片机的概述

AT89C51单片机的概述AT89C51是一款集成电路(IC),属于8051系列单片机。
它由Atmel公司设计和生产,并且在全球范围内广泛应用于各种电子设备中。
AT89C51具有强大的功能和灵活的设计,适用于各种不同的应用领域。
首先,AT89C51单片机采用了哈佛架构,也就是程序存储器和数据存储器是独立的,可以同时访问。
这种架构使得程序的执行更加高效,并且提供了更大的存储空间。
其次,AT89C51的特点在于它是一款低功耗的单片机,具有低电压操作能力。
它的工作电压范围是2.7V至5.5V,适应了不同电源的供电要求。
此外,它还具有强大的I/O引脚,并支持多种数据类型和数据操作。
AT89C51单片机的内部存储器包括4K字节的Flash存储器、128字节的RAM存储器和32字节的特殊功能寄存器(SFR)。
Flash存储器用于存储程序代码,RAM存储器用于存储数据和临时变量,SFR用于存储特殊功能寄存器。
然后,AT89C51单片机支持多种类型的外部存储器,包括静态RAM (SRAM)、动态RAM(DRAM)、并行和串行EEPROM以及闪存等。
这些外部存储器可以扩展单片机的存储容量,满足不同应用的需求。
最后,AT89C51单片机还具有电源管理功能。
它提供了多种节能模式,可以降低功耗并延长电池寿命。
此外,它还支持多种电源电压检测和复位功能,保证系统的稳定性和可靠性。
在总结AT89C51单片机的概述时,可以说它是一款功能强大且灵活的单片机,拥有广泛的应用领域。
它的架构、特点、内部存储器、外部存储器、时钟和计时器、串行通信、中断系统和电源管理等方面都具有卓越的性能,并能满足不同应用的需求。
AT89C51系列单片机介绍

3.1 AT89C51系列单片机介绍3.1.1 AT89C51系列基本组成及特性AT89C51是一种带4k字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
而在众多的51系列单片机中,要算 ATMEL 公司的AT89C51更实用,也是一种高效微控制器,因为它不但和8051指令、管脚完全兼容,而且其片内的4K程序存储器是FLASH工艺的,这种工艺的存储器,用户可以用电的方式达到瞬间擦除、改写。
而这种单片机对开发设备的要求很低,开发时间也大大缩短。
AT89C51基本功能描述如下:AT89C51是一种低损耗、高性能、CMOS八位微处理器,而且在其片种还有4k字节的在线可重复编程快擦快写程序存储器,能重复写入/擦除1000次,数据保存时间为十年。
它与MCS-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51系列产品没有的功能。
AT89C51可构成真正的单片机最小应用系统,缩小系统体积, 增加系统的可靠性,降低了系统成本。
只要程序长度小于4k, 四个I/O口全部提供给用户。
可用5V电压编程,而且写入时间仅10毫秒, 仅为8751/87C51 的擦除时间的百分之一,与8751/87C51的12V电压擦写相比, 不易损坏器件, 没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。
AT89C51 芯片提供三级程序存储器锁定加密,提供了方便灵活而可靠的硬加密手段, 能完全保证程序或系统不被仿制。
另外,AT89C51 还具有MCS-51系列单片机的所有优点。
128×8 位内部RAM, 32 位双向输入输出线, 两个十六位定时器/计时器, 5个中断源, 两级中断优先级, 一个全双工异步串行口及时钟发生器等。
AT89C51有间歇、掉电两种工作模式。
间歇模式是由软件来设置的, 当外围器件仍然处于工作状态时, CPU可根据工作情况适时地进入睡眠状态, 内部RAM和所有特殊的寄存器值将保持不变。
基于AT89C51单片机的数字钟设计

随着 电子 技术 的 飞速 发展 ,以单 片机 为核 心设
口的 四位作为显示器各位 的片选 信号 ,另 四位作 为键 盘扩展 口使用 ,采用一个频率为 1 1 . 0 5 9 2 MI - I z的晶振 构成时钟 电路 ,系统原理如 图 1 所示 。
计 的数 字钟 越 来 越 受 到人 们 喜 爱 。 因其 具 有 功 能 强 、体积 小 、功 耗 低 、价 格 便 宜 、工 作 可 靠 等 特
准 ,暂停 等功 能 ,计 时准确 ,功 能完 善 。
1 系统 框 图 简 介
系统设计 中用 到 A T 8 9 C 5 1 单 片机 的部分 功能 :
3 系统 主 程 序 流 程 图
Ab s t r a c t :T h i s p a p e r i n t r o d u c e s t h e AT 8 9 C 5 1 mi c r o c o n t r o l l e r a s t h e c o r e c o mp o n e n t s a n d o t h e r p e r i p h e r a l c i r c u i t a n d t h e c o r r e s p o n d —
杨 建成
( 台州学 院 物理与 电子工程学院 ,浙江 台州 3 1 8 0 0 0 )
摘要 :文章介绍 了采 用 A T 8 9 C 5 1单 片机为核心部件 以及 其他 外围电路 、相应接 口进行数字钟的设计 与实现。结 果显示用单 片机 来设计数 字钟 ,软件 实现各种功能 比较方便 ,结构 简单 ,精度 高、性 能稳 定。 关 键 词 :单片机 ;数 码管 ;按 键开关 ;设计
YAN G J i a n c h e n g
at89c51最简单的应用电路及其程序编写

at89c51最简单的应用电路及其程序编写文章标题:AT89C51最简单的应用电路及其程序编写主题词:AT89C51、应用电路、程序编写导语:AT89C51是一款经典的单片机芯片,具有广泛的应用领域。
本文将深入探讨AT89C51的最简单应用电路及其程序编写,旨在帮助读者全面、深入地理解这一主题。
一、AT89C51概述AT89C51是一款8位微控制器,由恩智浦(NXP)公司生产。
它采用MCS-51指令集架构,具有4KB的闪存和128字节的RAM,以及 32 个I/O 引脚,适用于各种嵌入式系统设计。
作为一款经典产品,AT89C51在工业控制、汽车电子、家用电器等领域都有着重要的应用。
二、AT89C51的最简单应用电路针对AT89C51的最简单应用电路,我们选取了典型的晶振外部工作方式,以便展示AT89C51的基本工作原理。
该电路包括AT89C51芯片、12MHz晶振、液晶显示模块、热敏电阻和数码管等元件。
通过连接这些元件,我们可以实现一个简单的温度检测系统,并通过数码管显示温度数值。
三、程序编写在进行AT89C51程序编写时,我们需要首先了解MCS-51指令集的基本结构和指令格式。
根据我们设计的应用功能,编写相应的C语言程序,并通过Keil C51等IDE软件进行编译和下载。
在程序编写的过程中,我们需要充分考虑AT89C51的资源限制和时钟频率,以确保程序的稳定性和高效性。
四、个人观点和理解作为一款经典的单片机芯片,AT89C51在嵌入式系统设计中具有重要的地位。
通过设计简单的应用电路和进行程序编写,我们可以更好地认识和理解AT89C51的工作原理和应用特点。
AT89C51也可以作为学习嵌入式系统的良好教学工具,帮助学习者快速掌握单片机的设计和编程技能。
总结通过本文的探讨,我们详细介绍了AT89C51的最简单应用电路及其程序编写。
通过这一过程,我们对AT89C51的工作原理和应用有了更深入的了解,也为后续的单片机设计和编程打下了坚实的基础。
基于AT89C51单片机定时闹钟设计

塔里木大学信息工程学院《单片机原理与外围电路》课程论文题目:单片机定时闹钟设计姓名:海热古丽·依马木学号:**********班级:计算机15-1班摘要:本设计是单片机定时闹钟系统,不仅能实现系统要求的功能,而且还有附加功能,即还能设定和修改当前所显示的时间。
本次设计的定时闹钟在硬件方面就采用了AT89C51芯片,用6位LED数码管来进行显示。
LED用P0口进行驱动,采用的是动态扫描显示,能够比较准确显示时时—分分—秒秒。
通过S1、S2、S3、和S4四个功能按键可以实现对时间的修改和定时,定时时间到喇叭可以发出报警声。
在软件方面采用汇编语言编程。
整个定时闹钟系统能完成时间的显示,调时和定时闹钟、复位等功能,并经过系统仿真后得到了正确的结果。
关键词:单片机、AT89C51、定时闹钟、仿真Abstract:T his design is a single-chip timing alarm system, can not only realize the function of system requirements, and there are additional functions, which can set up and modify the display time. Timing alarm clock this design adopts the AT89C51 chip on the hardware side, with 6 LED digital tube to display. LED P0 export driven, by using dynamic scanning display, can accurately display always -sub -seconds seconds. Through the S1, S2, S3, and S4 four function keys can be achieved on the time changes and timing, timing to the horn can send out alarm sound. Using assembly language programming in the software. The timing clock system has functions of time display, timing and timing alarm clock, reset and other functions, and the system simulation to obtain correct results.Keywords: single chip microcomputer, AT89C51, alarm clock, simulatio目录1绪论 (2)1.1课题背景及研究意义 (2)1.2国内外现状 (2)1.3课题的设计目的 (2)1.4课题的主要任务 (2)1.5课题的主要功能 (2)2系统概述 (3)2.1方案论证 (3)2.2系统设计原理 (3)3系统硬件设计 (4)3.1单片机AT89C51简介 (4)3.2数码管显示电路 (6)3.3时钟电路 (7)3.4喇叭:SPEAKER (8)4系统软件设计 (8)4.1系统软件设计说明 (8)4.2 程序调试 (8)4.3 程序流程图 (9)4.3仿真步骤 (10)4.4仿真结果 (10)结论 (12)参考文献 (13)附录A 系统整体电路 (14)附录B 全部程序清单 (14)附录C:PCB图和3D图 (23)1绪论1.1课题背景及研究意义进入信息时代,计算机的影子无处不在,带有像单片机一类嵌入式处理器的小型智能化电子产品,已经成为家用电器的主流,市场需求前景广阔,因此,掌握小型单片机应用系统设计方法,已成为当今电子应用工程师所必备的技能,定时闹钟具备小型单片机应用系统的一切要素,其结构简单、成本低廉、走时精确、设置方便,所以智能化方面有广泛的用途。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广东石油化工学院《51单片机原理与实践》课程设计报告学院计算机与电子信息学院专业班级学号姓名指导教师课程成绩完成日期 2010年12月27日数码管时钟电路的设计一、设计目的:通过这次课程设计掌握单片机系统的基本设计步骤及设计思路,掌握汇编语言的用法及各种指令的含义,比较熟练的运用指令进行单片机系统的设计的,熟悉用KEIL软件进行汇编语言的汇编,以及把代码写入实验板中,观测代码结合实际的运行结果后进行调整,体会到编程的分析问题、确定算法、画程序流程图、编写程序、程序功能模块化的优点的各各步骤。
二、设计要求:LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示。
该电路采用AT89C2051单片机,使用3V电池供电,只使用一个按键开关即可进入调时、省电(不显示LED数码管)和正常显示三种状态。
三、设计实验内容:1. 硬件的设计其采用AT89C51单片机应用设计,LED显示采用动态扫描方式实现,P0口输出段码数据,P2口输出位码数据,P1.1、P1.2接按钮开关。
为了提供LED数码管的驱动电流,采用6MHz晶振。
2. 系统总体分析系统主要包含四大模块:显示模块、时间计时模块、模式切换模块和模式设置模块。
显示模块:主要由主循环负责。
内存中开辟了一段8字节的内存空间,用作数据显示的字符缓冲区。
主循环不断将缓冲区中的字符呈现至数码管。
● 时间计时模块:电子钟的核心模块,记录了时间的时、分、秒信息。
●模式切换模块(MODE ):切换电子钟的设置模式,包括时设置、分设置、秒设置、闹铃开关设置、闹铃时设置和闹铃分设置。
相关数据被设置时将闪烁显示。
●模式设置模块(CONFIG ):通过判断设置模式(MODE ),执行相应的设置。
如时、分、秒的增1以及闹铃开关的变换。
另外,主循环还负责扫描键盘,检测相应键是否被按下,若MODE 键被按下则在特定单元中登记该功能,并启动定时器1,然后返回继续执行显示功能。
在定时器1中断时,被登记的功能正式执行。
期间用时约10ms ,用以消除机械抖动。
主循环流程图大致如下:图(一)主循环流程图定时器1中断服务程序流程图如下:开始键被按下登记相应功能数码管显示是否定时器1中断MODE CONFIGlogf unc = ?执行MODE 执行CONFIG结束图(二)定时器1中断服务程序流程图3. 系统主要程序的设计1)主程序本设计中的主程序主要负责对键盘扫描及显示数据,还包括判断是否闹钟正在活动。
若键盘中的P1.6(模式键)或P1.7(设置键)被按下,登记将被执行的功能,主循环不负责功能模块的执行。
若闹钟正在活动,调用蜂鸣函数。
其中bPalse标识了一秒的前半秒和后半秒,是为了控制显示数据的半秒闪烁。
主函数还包含初始化操作,以下省略。
loop:MOV B, #01111111B;位选通信号MOV R0, #prebuf - 01H ;数据缓冲区nextnu m:ACALL keyscan ;扫描键盘INC R0MOV A, @R0PUSH ACCMOV A, BRL AMOV B, AJB b Palse, showOR L A, dmaskJNB bAlaIng, showMOV led, #0FFHACALL beeponce 若闹铃活动,调用蜂鸣函数DEC SPshow:PUSH ACCACALL displayone 在特定数码管显示数据。
DEC SPDEC SPACALL delayCJNE R0, #prebufend, nextnu mSJMP loopkeyscan:JNB keym, keymode ;若切换键被按下,登记“切换”功能JNB keyc, keyconf ;若设置键被按下,登记“设置”功能RET;=====================;;log fu nction 'mode';;=====================keymode:MOV funclog, #01H ;key actACALL funcperform ;激活“功能执行模块”(见下文),RET;=====================;;log fu nction 'config';;=====================keyconf:MOV funclog, #02HACALL funcperform ;激活“功能执行模块”(见下文)RET2)显示子程序在特定数码管显示数据,通过堆栈传递参数。
第一个参数是待显示的字符,第二个参数是位选通信号。
函数通过查字形码表将字形显示至数码管。
displayone:PUSH ACCPUSH PSWMOV A, R0PUSH ACCPUSH BMOV PSW, #00HMOV A, SPSUBB A, #07HMOV R0, AMOV A, @R0INC R0MOV B, @R0PUSH DPHMOV DPTR, #metrixMOVC A, @A + DPTRJNB b Palse, noftANL A, ftnoft:MOV lmask, BMOV led, APOP DPHPOP DPLPOP BPOP ACCMOV R0, APOP PSWPOP ACCRET3)定时器TO中断服务程序电子钟的计秒程序,负责计算时间。
act: ;main timer actorCJNE R2, #0B H, conCLR b Palse ;palse per second con:DJNZ R2, leaveMOV R2, #14HPUSH ACCPUSH PSWMOV PSW, #00HMOV A, s ;sINC ADA AMOV s, ACJNE A, #60H, incnMOV s, #00HMOV A, m ;mINC ADA AMOV m, ACJNE A, #60H, incnMOV m, #00HMOV A, h ;hINC ADA AMOV h, ACJNE A, #24H, incnMOV h, #00Hincn:SETB b PalseJNB bAlaOn, alarmoffACALL checkala ;check alarm when alarm is ON alarmoff:MOV A, npageANL A, #02HJNZ skipACALL prepareskip:POP PSWPOP ACCleave:MOV TH0,#03CHMOV TL0,#0B0HRETI4)模式切换程序切换设置模式,包括时间时设置、时间分设置、时间秒设置、闹铃开关设置、闹铃时设置、闹铃分设置。
mode: ;mode;SETB P3.2PUSH ACCPUSH PSWPUSH DPLPUSH DPHJNB bAlaIng, modeskipSETB bKick ;stop alarmCLR bAlaIngSJMP modeleavemodeskip:MOV npage, #00HMOV DPTR, #maskdatMOV A, cmodeINC ACJNE A, #07H, enmodeMOV A, #00Henmode:MOV cmode, AANL A, #04HJZ notalapageMOV npage, #02HACALL preala ;时钟调整页准备notalapage:MOV A, cmodeMOVC A, @A + DPTRMOV d mask, A ;设置时闪烁modeleave:POP DPHPOP DPLPOP PSWPOP ACCRET5)模式设置程序对时间量执行加1,特别的闹铃开关执行开关设置。
conf: ;conf;SETB P3.3PUSH ACCPUSH PSWMOV PSW, #00HMOV A, cmodePUSH DPLPUSH DPHJNB bAlaIng, confskip;SETB bKick ;stop alarm;CLR bAlaIngSJMP confleaveconfskip:MOV DPTR, #confsetRL AJMP @A + DPTRset1: ;时设置MOV A, hINC ADA AMOV h, ACJNE A, #24H, notsetMOV h, #00HSJMP notsetset2: ;分设置MOV A, mINC ADA AMOV m, ACJNE A, #60H, notsetMOV m, #00HSJMP notsetset3: ;秒设置MOV A, sINC ADA AMOV s, ACJNE A, #60H, notsetMOV s, #00HSJMP notsetsetae:C PL bAlaOn ;闹钟开关SJMP notsetasetah:MOV A, ah ;闹钟时设置INC ADA AMOV ah, ACJNE A, #24H, notsetaMOV ah, #00HSJMP notsetasetam:MOV A, am ;闹钟分设置INC ADA AMOV am, ACJNE A, #60H, notsetaMOV am, #00Hnotseta:ACALL prealaCLR bKickSJMP confleavenotset:ACALL prepareconfleave:POP DPHPOP DPLPOP PSWPOP ACCRETconfset:SJMP confleaveSJMP set1SJMP set2SJMP set3SJMP setaeSJMP setahSJMP setam6)功能执行程序执行程序负责执行被登记的功能,功能由主循环扫描键盘并登记。
主循环中,当扫描到有键盘按下时,登记下将被执行的功能,然后启动定时器1,定时器1的中断服务程序即是功能执行程序,中断程序分析并执行被登记的功能。
encperform:CLR TR1 ;act oncePUSH ACCPUSH PSWMOV A, funclogCJNE A, #01H, encconfJNB keym, encperformleave ;action just at bu tton u p;ACALL mode ;d o 'm ode'fu nctionSJMP encperformleaveencconf:CJNE A, #02H, encperformleaveJNB keyc, encperformleave ;action just at button up;ACALL conf ;d o 'config' functionencperformleave:POP PSWPOP ACCRETI四、完整源代码s EQU 30Hm EQU 31Hh EQU 32Hdmask EQU 33Hcmode EQU 34Hft EQU 36Hprebuf EQU 37H ;8 byte buffer prebufend EQU 3EHam EQU 3FH ;alarm miniteah EQU 40H ;alarm hournpage EQU 41H ;function pagefunclog EQU 42H ;func to actstack EQU 4FH;pinled EQU P0lmask EQU P2beep EQU P3.3keym EQU P1.6 ;key 'm ode'keyc EQU P1.7 ;key 'config';bit addrbPalse EQU 00HbAlaIng EQU 01HbAlaOn EQU 02HbKick EQU 03H;metrix elementm_none EQU 0AHm_o EQU 0BHm_f EQU 0CHm_n EQU 0DHorg 0000HLJMP startorg 0003HLJMP modelogger ;INT0 to modeorg 000BHLJMP act ;timerorg 0013HLJMP conflogger ;INT1 to configorg 001BHLJMP encperform ;performerorg 0100Hstart:MOV S P, #stackMOV TMOD,#11HMOV TH0,#3C HMOV TL0,#0B0HMOV R2, #14H ;R2 used by T0MOV s, #00HMOV m, #00HMOV h, #00HMOV d mask, #00HMOV cmode, #00HMOV npage, #00HMOV ah, #23HMOV am, #59HSETB EASETB ET0 ;T0SETB PT0SETB TR0SETB ET1 ;T1SETB EX0 ;INT0SETB IT0SETB EX1 ;INT1SETB IT1SETB P3.2SETB P3.3SETB keymSETB keycCLR bAlaIngCLR bAlaOnCLR bKickloop:MOV B, #01111111BMOV R0, #prebuf - 01Hnextnu m:ACALL keyscanINC R0MOV A, @R0PUSH ACCMOV A, BRL AMOV B, AJB b Palse, showOR L A, dmaskJNB bAlaIng, showMOV led, #0FFH ;clr led when alarm ACALL beeponceDEC SPSJMP loopshow:PUSH ACCACALL displayoneDEC SPDEC SPACALL delayCJNE R0, #prebufend, nextnu mSJMP loop ; end start beeponce:C PL beepMOV R5, #02Hbeeploop2:MOV R6, #0FFHbeeploop1:NOPDJNZ R6, beeploop1DJNZ R5, beeploop2RET ;end beeponce;=====================;;display one character;;@param char Character to display;@param mask Position character to display;=====================displayone:PUSH ACCPUSH PSWMOV A, R0PUSH ACCPUSH BMOV PSW, #00HMOV A, SPSUBB A, #07HMOV R0, AMOV A, @R0INC R0MOV B, @R0PUSH DPLPUSH DPHMOV DPTR, #metrixMOVC A, @A + DPTRJNB b Palse, noftANL A, ftnoft:MOV lmask, BMOV led, APOP DPHPOP DPLPOP BPOP ACCMOV R0, APOP PSWPOP ACCRET ;end displayonedelay:PUSH ACCMOV A, R5PUSH ACCMOV A, R6PUSH ACCMOV R5, #03Hdloopo:MOV R6, #0FFHdloop:NOPDJNZ R6, dloopDJNZ R5, dloopoPOP ACCMOV R6, APOP ACCMOV R5, APOP ACCRET ;end delayORG 0200H;=====================;;prepare time datas;to the display buffer;;=====================prepare:MOV ft, #11011111B;enable ftPUSH ACCPUSH PSWPUSH BMOV A, R1PUSH ACCMOV R1, #prebufMOV@R1, #m_noneINC R1MOV@R1, #m_noneINC R1MOV A, h ;hMOV B, ASWAP AANL A, #0FHMOV@R1, AANL B, #0FHINC R1MOV@R1, BMOV A, m ;mMOV B, ASWAP AANL A, #0FHINC R1MOV@R1, AANL B, #0FHMOV@R1, BMOV A, s ;sMOV B, ASWAP AANL A, #0FHINC R1MOV@R1, AANL B, #0FHINC R1MOV@R1, BPOP ACCMOV R1, APOP BPOP PSWPOP ACCRET ;end prepare ;=====================;;prepare alarm datas;to the display buffer;;=====================preala:MOV ft, #0FFH ;no ftPUSH ACCPUSH PSWMOV R1, #prebufMOV@R1, #m_oINC R1JNB bAlaOn, alaoffMOV@R1, #m_nINC R1MOV@R1, #m_noneSJMP alaconalaoff:MOV@R1, #m_fINC R1MOV@R1, #m_falacon:INC R1MOV@R1, #m_noneMOV A, ahSWAP AANL A, #0FHINC R1MOV@R1, AMOV A, ahANL A, #0FHMOV@R1, AMOV A, amSWAP AANL A, #0FHINC R1MOV@R1, AMOV A, amANL A, #0FHINC R1MOV@R1, APOP PSWPOP ACCRET ;end prealaORG 0300H;=====================;;perform action;;=====================encperform:CLR TR1 ;act oncePUSH ACCPUSH PSWMOV A, funclogCJNE A, #01H, encconfJNB keym, encperformleave ;action just at bu tton u p;ACALL mode ;d o 'm ode'fu nction SJMP encperformleaveencconf:CJNE A, #02H, encperformleaveJNB keyc, encperformleave ;action just at button up;ACALL conf ;d o 'config' function encperformleave:POP PSWPOP ACCRETI;=====================;;prepare to d o function;;=====================funcperform:MOV TH1, #0D8HMOV TL1, #0F0HSETB TR1RET;=====================;;log fu nction 'mode';;===================== modelogger:MOV funclog, #01HACALL funcperformRETI;=====================;;log fu nction 'config';;===================== conflogger:MOV funclog, #02HACALL funcperformRETIORG 0400H;=====================;;mode;;to change function;or stop alarm when;alarming;;=====================mode: ;mode;SETB P3.2PUSH ACCPUSH PSWPUSH DPLPUSH DPHJNB bAlaIng, modeskipSETB bKick ;stop alarmCLR bAlaIngSJMP modeleavemodeskip:MOV npage, #00HMOV DPTR, #maskdatMOV A, cmodeINC ACJNE A, #07H, enmodeMOV A, #00Henmode:MOV cmode, AANL A, #04HJZ notalapageMOV npage, #02HACALL prealanotalapage:MOV A, cmodeMOVC A, @A + DPTRMOV d mask, Amodeleave:POP DPHPOP DPLPOP PSWPOP ACCRET ;end mode;=====================;;conf;;to change setting;that the 'mode' decided;;=====================conf: ;conf;SETB P3.3PUSH ACCPUSH PSWMOV PSW, #00HMOV A, cmodePUSH DPLPUSH DPHJNB bAlaIng, confskip;SETB bKick ;stop alarm;CLR bAlaIngSJMP confleaveconfskip:MOV DPTR, #confsetRL AJMP @A + DPTRset1:MOV A, hINC A ;hDA AMOV h, ACJNE A, #24H, notsetMOV h, #00HSJMP notsetset2:MOV A, mINC A ;mDA AMOV m, ACJNE A, #60H, notsetMOV m, #00HSJMP notsetset3:MOV A, sINC A ;sDA AMOV s, ACJNE A, #60H, notsetMOV s, #00HSJMP notsetsetae:C PL bAlaOn ;ala enableSJMP notsetasetah:MOV A, ah ;ala hINC ADA AMOV ah, ACJNE A, #24H, notsetaMOV ah, #00HSJMP notsetasetam:MOV A, am ;ala mINC ADA AMOV am, ACJNE A, #60H, notsetaMOV am, #00Hnotseta:ACALL prealaCLR bKickSJMP confleavenotset:ACALL prepareconfleave:POP DPHPOP DPLPOP PSWPOP ACCRETconfset:SJMP confleaveSJMP set1SJMP set2SJMP set3SJMP setaeSJMP setahSJMP setam ; end confORG 0500Hkeyscan:JNB keym, keymodeJNB keyc, keyconfRET;=====================;;log fu nction 'mode';;=====================keymode:MOV funclog, #01H ;key actACALL funcperformRET;=====================;;log fu nction 'config';;=====================keyconf:MOV funclog, #02HACALL funcperformRETORG 0600Hact: ;main timer actorCJNE R2, #0B H, conCLR b Palse ;palse per second con:DJNZ R2, leaveMOV R2, #14HPUSH ACCPUSH PSWMOV PSW, #00HMOV A, s ;sINC ADA AMOV s, ACJNE A, #60H, incnMOV s, #00HMOV A, m ;mINC ADA AMOV m, ACJNE A, #60H, incnMOV m, #00HMOV A, h ;hINC ADA AMOV h, ACJNE A, #24H, incnMOV h, #00Hincn:SETB b PalseJNB bAlaOn, alarmoffACALL checkala ;check alarm when alarm is ON alarmoff:MOV A, npageANL A, #02HJNZ skipACALL prepareskip:POP PSWPOP ACCleave:MOV TH0,#03CHMOV TL0,#0B0HRETI ;end actcheckala:MOV A, mCJNE A, am, alashu tMOV A, hCJNE A, ah, alashu tJB bKick, notala ;ala stopSETB bAlaIngSJMP notalaalashu t:CLR bAlaIngCLR bKicknotala:RETmaskdat:DB 00000000B, 00001100B, 00110000B, 11000000B, 00000111B, 00110000B, 11000000B metrix:;DB 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6FDB 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60DB 0xFF ;0X0A: NONEDB 0X27 ;0X0B: 'O'DB 0XB1 ;0X0C: 'F'DB 0X37 ;0x0D: 'n'END。