单片机实现日历时钟课程设计
基于单片机的万年历课程设计

一、前言随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本设计是基于51系列的单片机进行的电子万年历设计,采用八位数码管显示年月日时分秒及温度信息,具有可调整日期和时间功能。
时间、日期调整由三个按键来实现,并可对闹铃开关进行设置。
日历能显示阳历和阴历年、月、日以及星期、时、分、秒。
设计以STC89C52RC 单片机为核心,构成单片机控制电路;以DS1302时钟芯片作为万年历信号发生器;以DS18B20作为检测温度的传感器。
关键词时钟电钟;DS1302;DS18B20;数码管;单片机。
二、系统概述及总体方案2.1系统概述本电子万年历采用单片机控制技术和数码管显示方案,可以很好的完成万年历和实时温度显示。
它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
2.2总体方案2.2.1单片机芯片:采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超低压工作;同时也与MCS-51系列单片机完全相同,该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用AT89S52作为主控制系统.2.2.2 时钟芯片:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.且同组同学已从Maxim申请到了这种芯片,所以本设计采用了这种芯片。
单片机课程设计(论文)电子万年历的设计

目录1设计要求 (2)2方案论证与对比 (2)液晶显示器控制方式选择 (2)2.2并行接口动态显示电路选择 (2)2.3LCD液晶显示器的接口方法选择 (3)液晶显示器限流电阻选择 (4)3系统硬件电路的设计 (5)主控模块AT89C52 (5)3.2显示模块电路设计 (6)4系统软件设计 (7)4.1系统软件概述 (7)4.2主要子程序设计 (8)4.2.1 时钟中断服务子程序设计 (8)时间调整子程序设计 (9)4.2.3 判断闰年子程序设计 (9)4.2.4 精度分析分析与计算 (10)4.2.5 第一次初值的设置 (10)4.2.6 重载初值的方法 (10)5系统仿真与测试 (11)5.1系统仿真 (11)功能测试 (11)6总结 (12)参考文献 (13)1设计要求本课题以AT89C52单片机为核心,设计并制作出智能LCD电子钟,具有以下基本功能:能进行时间、年份、日期、星期显示;能区分是否闰年;能检测室温并显示。
扩展功能部分可以通过控制按键使时间暂停、可以调整校正时间并通过按键切换轮流显示时间、年份、日期、星期。
2方案论证与对比2.1液晶显示器控制方式选择采用LCD液晶显示,具有超精致影像画质、十足平面显示、节省空间、节省能源等优点,但按控制方式不同,LCD可分为被动矩阵式LCD及主动矩阵式LCD两种。
可根据不同需要采用不同的方式。
方案一被动矩阵式LCD被动矩阵式LCD在亮度及可视角方面受到较大的限制,反应速度也较慢。
由于画面质量方面的问题,使得这种显示设备不利于发展为桌面型显示器,但成本低廉。
方案二主动矩阵式LCD目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD(Thin Film Transistor-LCD,薄膜晶体管LCD)。
TFT液晶显示器是在画面中的每个像素内建晶体管,可使亮度更明亮、色彩更丰富及更宽广的可视面积。
与CRT显示器相比,LCD显示器的平面显示技术体现为较少的零件、占据较少的桌面及耗电量较小,但CRT技术较为稳定成熟。
单片机简易日历课程设计

单片机简易日历课程设计一、课程目标知识目标:1. 理解单片机的基础知识,掌握其内部结构和功能;2. 学习简易日历的原理,了解日期、时间与单片机编程的关系;3. 掌握C语言编程基础,运用其进行单片机程序设计。
技能目标:1. 能够独立完成单片机的硬件连接,进行基本的程序下载与调试;2. 运用C语言编写简易日历程序,实现日期、时间的显示与修改;3. 培养学生动手实践能力,提高问题分析及解决能力。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣,激发创新意识;2. 培养学生的团队协作精神,提高沟通与交流能力;3. 培养学生严谨、细心的学习态度,养成良好的编程习惯。
分析课程性质、学生特点和教学要求,本课程旨在通过单片机简易日历的设计与实现,让学生掌握单片机基础知识、编程技能,并培养其团队协作和创新能力。
课程目标具体、可衡量,便于教学设计和评估。
通过本课程的学习,学生将能够独立完成单片机程序的编写与调试,为后续相关课程打下坚实基础。
二、教学内容1. 单片机基础知识:介绍单片机的内部结构、工作原理及功能,涉及教材第1章内容;- 单片机硬件结构及引脚功能;- 单片机工作原理及指令系统。
2. C语言编程基础:学习C语言基础知识,掌握基本语法,为单片机编程打下基础,涉及教材第2章内容;- 数据类型、变量与常量;- 运算符、表达式及语句;- 控制结构(顺序、选择、循环)。
3. 简易日历原理:学习日期、时间的计算方法,了解日历程序设计思路,涉及教材第3章内容;- 日期、时间的基本概念;- 日历程序设计思路及算法。
4. 单片机程序设计:结合C语言,学习单片机程序编写与调试,实现简易日历功能,涉及教材第4章内容;- 单片机程序框架及编程规范;- 简易日历程序的编写与调试;- 硬件连接及程序下载。
5. 实践操作:安排学生进行单片机简易日历的实践操作,巩固所学知识,涉及教材第5章内容;- 硬件连接与程序下载;- 程序调试与优化;- 团队合作、沟通交流。
基于单片机的日历设计方案

引言日历作为我们日常生活中必不可少的工具之一,是人们记录时间、安排活动以及管理生活的重要工具。
在现代科技的发展下,基于单片机的日历设计方案应运而生。
本文将介绍一种基于单片机的日历设计方案,该方案通过单片机的控制和显示功能,能够提供准确的日期和时间显示,具备一些常见的日历功能,并具备一定的扩展性和灵活性。
设计原理硬件设计单片机选择在本设计方案中,选择常见的8位单片机AT89C52作为核心控制芯片。
该单片机具备足够的IO口,能够方便地控制各个模块的输入和输出。
时钟模块为了确保日历的准确性,需要使用一个精确的时钟模块。
在本设计中,选择DS1302时钟模块用于提供稳定的时钟信号。
该模块具备低功耗、精准度高的特点,能够满足日历的需求。
显示模块为了方便用户查看日期和时间,选择一个适合的显示模块十分重要。
本设计方案中,选择TM1637四位数码管模块用于显示日期和时间。
该模块通过单片机的IO口能够方便地进行控制,并能够显示数字和一些常见的符号。
软件设计时钟控制通过单片机与DS1302时钟模块进行通信,获取当前的日期和时间信息。
通过设置注册器来读取年、月、日、时、分和秒的值,并将其保存在单片机内部的变量中。
显示控制通过单片机与TM1637数码管模块进行通信,将日期和时间的值显示在数码管上。
通过设置数码管的段选择和段数据,可以实现具体的数字和符号的显示。
日历功能在本设计方案中,实现了一些常见的日历功能,例如星期显示、日期调整、闹钟设置等。
通过单片机的按键输入,可以实现各种功能的切换和设置。
实现步骤1.连接硬件模块:将单片机、DS1302时钟模块和TM1637数码管模块按照原理图连接起来,并接上所需的电源。
2.编写主程序:使用C语言编写主程序,包括时钟控制、显示控制和日历功能的实现。
3.编译烧录:使用相应的编译器将主程序编译生成可执行文件,并将其烧录到单片机中。
4.测试调试:将单片机上电,通过按键输入进行各种功能的测试和调试,确保日历的正常工作。
单片机课程设计之万年历、闹钟与温度显示设计

本系统采用C语言编写,控制器采用单片机STC89C52,温度检测部分采用DS18B20温度传感器,时钟系统用时钟芯片DS1302,用八位数码管作为显示器。单片机通过时钟芯片DS1302获取时间数据;通过温度传感器DS18B20采集温度信号送给单片机处理,并在数码管中显示出来,键盘可以切换界面,调时和温度查询与设置闹钟的功能。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。电路图如图3-4所示。
6、数码管显示电路设计
数码管内部是由7个条形发光二极管与一个小圆点发光二极管组成,根据这八个二极管的亮暗组成不同的字符。本系统采用八位数码管作为显示模块,数码管相对其他LCD类的显示器来说,成本比较低廉,省电。两个四位共阴0.56英寸的数码管作为显示屏。如图3-6所示。
7、按键控制电路设计
本系统采用四个按键作为键盘控制实现界面切换的功能,如图3-7所示。能够实现界面切换、时间校正、闹钟设置等功能。机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图3-8所示。抖动时间的长短与开关的机械特性有关,一般为5-10 ms。故软件编程时需要注意消除抖动。
单片机课程设计(可调式中文电子日历)

摘要万年历的功能可实现年、月、日、时、分、秒和星期的显示。
随着社会的发展日历的功能越来越强大,精确度越来越高。
本次设计的日历采用DS1302时钟芯片,该芯片精确度高,性能可靠。
用LCD12864液晶屏,既可以显示数字又可以显示汉字,方便了人们的生活。
本设计总体分为硬件部分和软件部分。
硬件部分可分为:时钟芯片DS1302、AT89C51和LCD12864等。
本设计非常适合家庭使用。
电源采用+5V电压供电。
走时精确,是现代家庭必备的设备之一。
关键词:单片机,万年历, DS1302,时钟芯片1引言可调式电子日历与时钟小巧便于携带,界面清爽,一目了然,方便的知晓当前时间,并可对时间做出修改,实在是居家旅行日常生活之必备用品。
在现今的可调式电子日历与时钟具有性能稳定、精确度高、成本低、易于产品化,以及方便、实用等特点。
2.总体设计2.1基本原理硬件主要涉及到:AT89C51、DS1302、LCD12864等。
软件通过框图编写出程序。
AT89C51主要功能是存储程序、根据程序的内容对各个端口进行判断并做出相应的处理。
LCD12864主要的功能是实现年、月、日、时、分、秒的显示效果。
实时时钟DS1302可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
2.2系统总体框图及设计思路3.详细设计3.1 硬件设计3.1.1 DS1302芯片及原理介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
基于单片机的电子日历时钟

保护 psw、A 寄存器
带显示延时
N
Key0 按下?
Y
秒表模式?
N
设置闹钟?
N
闪烁切换模式
Y
暂停/继续计时
Y 打开/关闭闹钟
滴一声提示
闪烁循环切换
恢复 psw、A 寄存器
退出中断
八、性能测试与故障排查
1、硬件部分
问题:断路。 现象:程序下载完之后可以工作但是 6 个 LED 显示器有 2 个没亮。 分析:因为其他几个显示器完全正常,这两个则完全没亮,所以推断是位选
修改二:程序默认设置的外部中断延时过短,导致操作过于“灵敏”,也即 按键 K0、K1 按下时,跳变过快。这里所说的延时是中断子程序 EX0_INT 和 EX1_INT 中的语句 LCALL DIS_DELAY。解决这个情况只需修改 DELAY 次数,则 DIS_DELAY: MOV D_CNT_DIS,#10H。
; 学生姓名:陈晓伟、冯劲增 ; 学生学号:200830240144,200830240229 ; 分组编号:004
;变量定义
TICK_CNT EQU 20H
;------------------
SECOND_BCD EQU 21H
MINUTE_BCD EQU 22H
HOUR_BCD EQU 23H
ALAM_OFF1 EQU 39H
ALAM_OFF2 EQU 3AH
ALAM_OFF3 EQU 3BH
;------------------
;中断向量表
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EX0_INT
; port INT0
ORG 000BH
单片机实现日历时钟课程设计

山东科技大学信息与电气工程学院07-1班学生卡号0701100517lfj;1键——可调日历;2键——结束返回;3键——秒加1/xx1;4键——分加1/月加1;5键——显示24小时制/时加1/年加1;6键——显示12小时制;7键——可调时间;8键——可调日期CLK BIT P1.6;时钟信号端DISP BIT P1.7;串出锁存端DBUF EQU 30H ;秒的最低位地址KCLK BIT P2.3KEY BIT P3.5PL BIT P1.7LED BIT P1.1CHANGE2 BIT 21H ;加12的标志位AD1 EQU 40H ;秒AD2 EQU 41H ;分AD3 EQU 42H ;小时AD4 EQU 43H ;天AD5 EQU 44H ;月AD6 EQU 45H ;年;定义结束ORG 0000HLJMP MAINORG 000BH ;T0xxxxLJMP INTORG 0030HMAIN:MOV R0,#AD1MOV R7,#06HLOOP0:MOV A,#00HMOV @R0,AINC R0DJNZ R7,LOOP0;R0~R7清零MOV IE,#82H ;允许T0xxMOV TMOD,#01H ;T0允许工作MOV TH0,#4CHMOV TL0,#00H ;送入计数初值0.5s MOV R5,#00H;初始化结束SETB TR0;T0使能LOOP:LCALL TEST ;扫描键盘CJNE A,#0FEH,NEXTD ;0FEH为1键LCALL DY1MSLCALL KEYDONENEXTD:SJMP LOOP ;扫描键盘看是否需要调整日历DISPLAY: LCALL TEST ;扫描键盘CJNE A,#0DFH,ERSHISI1;0DFH为6键SETB PSW.1;显示十二小时LJMP TIMEZHUANERSHISI1:CJNE A,#0EFH,ERSHISI2;0EFH为5键CLR PSW.1;显示二十四小时CLR CHANGE2LJMP TIMEZHUANERSHISI2:CJNE A,#0CFH,CHANGE;0CFH为5+6键CLR PSW.1SETB CHANGE2 ;CHANGE2=1表示把十二表示法转换成二十四小时LJMP TIMEZHUANCHANGE:CLR CHANGE2TIMEZHUAN:LCALL TESTCJNE A,#7FH,NEXTL;7FH为8键SETB PSW.5LJMP ZHUAN1NEXTL:CJNE A,#0BFH,ZHUAN1;0BFH为7键CLR PSW.5ZHUAN1:JB PSW.5,DAY ;PSW.5=0调整时间,为1则调整日期MOV A,AD1;调整时间键码分离MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD2MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AJB PSW.1,TIMEZHUAN1LJMP TIMEZHUAN2TIMEZHUAN1:;判断时间是否大于12 MOV A,AD3MOV B,#0CHSUBB A,BJC NORMALTMOV AD3,ALJMP NORMALTTIMEZHUAN2:JNB CHANGE2,NORMALT ;判断是否加12 MOV A,AD3ADD A,#12MOV AD3,ACLR CHANGE2NORMALT: MOV A,AD3MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ASJMP DDISP DAY:MOV A,AD4 MOV B,#0AH DIV ABMOV R0,#DBUF MOV @R0,B INC R0MOV @R0,A MOV A,AD5 MOV B,#0AH DIV ABINC R0MOV @R0,B INC R0MOV @R0,A MOV A,AD6 MOV B,#0AH DIV ABINC R0MOV @R0,BINC R0MOV @R0,ADDISP:;调整日期键码分离;显示,串入并处的方式,上升沿写入MOV R0,#DBUFMOV R7,#06HLOOP2:MOV R6,#08HMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;显示秒CLR CLOOP3:RRC ACLR CLKMOV DISP,CSETB CLKDJNZ R6,LOOP3INC R0DJNZ R7,LOOP2RETKEYDONE:;人工手动调整日历AGAINB:LCALL DY250MS ;防抖250msLCALL TESTCJNE A,#7FH,NEXTL1;7FH为8键SETB PSW.5LJMP ZHUAN12NEXTL1:CJNE A,#0BFH,ZHUAN12CLR PSW.5;以上为扫描键盘并设置PSW.5ZHUAN12:JB PSW.5,NEXT6B ;判断调整日期还是时间CJNE A,#0FDH,NEXTA ;0FDH为2键,如果按键值为FDH则结束LJMP BACK NEXTA:CJNE A,#0FBH,NEXTB;0FBH为3键INC AD1;秒加1MOV A,AD1CJNE A,#3CH,AGAINAMOV AD1,#00HSJMP AGAINANEXTB:CJNE A,#0F7H,NEXTC;0F7H为4键INC AD2;分加1MOV A,AD2MOV AD2,#00HSJMP AGAINANEXTC:CJNE A,#0EFH,AGAINA;0EFH为5键INC AD3;时加1MOV A,AD3CJNE A,#18H,AGAINAMOV AD3,#00HNEXTT:SJMP AGAINANEXT6B:CJNE A,#0FDH,NEXTAB;JIESHUJIAN ;0FDH为2键LJMP BACKNEXTAB:CJNE A,#0FBH,NEXTBB;0FBH为3键INC AD4;xx1MOV A,AD4CJNE A,#20H,AGAINAMOV AD4,#01HSJMP AGAINANEXTBB:CJNE A,#0F7H,NEXTCB;0F7H为4键INC AD5;月加1MOV A,AD5MOV AD5,#01HSJMP AGAINANEXTCB:CJNE A,#0EFH,AGAINA;0EFH为5键INC AD6;年加1MOV A,AD6CJNE A,#64H,AGAINAMOV AD6,#00HAGAINA:LCALL DISPLAYLJMP AGAINBBACK:RETINT:INC R5CJNE R5,#20,NEXTS1;循环20次,每次循环为0.5秒,共0.05*20=1秒MOV R5,#00HLCALL DISPLAY ;满一秒后的显示LJMP MENDNEXTS1:LJMP NEXTS ;满一秒后的显示MEND:MOV A,AD1CJNE A,#0AH,LAREMENDSETB LED ;满十秒关灯,否则继续LAREMEND:INC AD1MOV A,AD1CJNE A,#3CH, NEXTS2LJMP MEND1NEXTS2:LJMP NEXTS ;以上为看是否修改秒,满60,分加一否则跳转继续MEND1:MOV AD1,#00HINC AD2MOV A,AD2CJNE A,#3CH,NEXTS3LJMP MEND2NEXTS3:LJMP NEXTS ;以上为看是否修改分,满60,时加一否则跳转继续MEND2:MOV AD2,#00HINC AD3MOV A,AD3CJNE A,#0Ah,ZAIJIANCHAAJMP BAOSHIZAIJIANCHA:CJNE A,#0Bh,ZHENGCHANGBAOSHI:CLR LED ;以上为两个报时开灯ZHENGCHANG:MOV A,AD3CJNE A,#18H,NEXTS4;不满二十四小时跳出LJMP MEND3;满二十四后跳到清零小时继续加天NEXTS4:LJMP NEXTSMEND3:MOV AD3,#00HINC AD4MOV A,AD5CJNE A,#02H,JIXUTIAN ;判断是否为二月份MOV A,AD6MOV B,#4HDIV ABMOV A,BJZ RUNNIAN ;判断是否为闰年PINGNIAN:MOV A,AD4;平年CJNE A,#1DH,NEXTSMOV AD4,#01HAJMP JIXUYUERUNNIAN: MOV A,AD4;闰年CJNE A,#1EH,NEXTSMOV AD4,#01HAJMP JIXUYUEJIXUTIAN:;不为二月,再查看是那个月MOV A,AD5CJNE A,#01H,PAN1LJMP SANSHIYIPAN1:CJNE A,#03H,PAN3 LJMP SANSHIYIPAN3:CJNE A,#04H,PAN4 LJMP SANSHIPAN4:CJNE A,#05H,PAN5 LJMP SANSHIYIPAN5:CJNE A,#06H,PAN6 LJMP SANSHIPAN6:CJNE A,#07H,PAN7 LJMP SANSHIYIPAN7:CJNE A,#08H,PAN8 LJMP SANSHIYIPAN8:CJNE A,#09H,PAN9 LJMP SANSHIPAN9 :CJNE A,#10H,PAN10 LJMP SANSHIYIPAN10:CJNE A,#11H,SANSHIYI LJMP SANSHI SANSHIYI:MOV A,AD4;月份:1,3,5,7,8,10,12 CJNE A,#20H,NEXTSMOV AD4,#01HAJMP JIXUYUESANSHI:MOV A,AD4;月份:2,4,6,8,11 CJNE A,#1FH,NEXTSMOV AD4,#01HJIXUYUE: INC AD5;满月后加年CJNE A,#0DH,NEXTSMOV AD5,#01HINC AD6MOV A,AD6CJNE A,#64H,NEXTS ;年满100后清零MOV AD6,#00HNEXTS:;再赋初值MOV TH0,#4CHMOV TL0,#00HRETIDY250MS:;延迟防抖250msMOV R4,#0FAHLOOP8:LCALL DY1MSDJNZ R4,LOOP8RETDY1MS:;延迟防抖1msMOV R5,#0FAHLOOP7:MOV R7,#70HDJNZ R5,LOOP7RET;键盘扫描子程序TEST:MOV R7,#08HSETB PLCLR PL ;低电平锁存NOPNOPSETB PL ;高电平输出MOV A,#0FFHAGAIN3:CLR KCLKNOPNOPMOV C,KEY ;把p3.5的状态存入C SETB KCLKRLC A ;键盘状态存入ADJNZ R7,AGAIN3;扫描八个按键RETTAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H ;子程序功能xx:;TEST——扫描键盘;DDISP——显示;NEXTS——重新赋初值;DY1MS——延迟防抖1msEND。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东科技大学信息与电气工程学院07-1班学生卡号0701100517 lfj;1键——可调日历;2键——结束返回;3键——秒加1/日加1;4键——分加1/月加1;5键——显示24小时制/时加1/年加1;6键——显示12小时制;7键——可调时间;8键——可调日期CLK BIT P1.6 ;时钟信号端DISP BIT P1.7 ;串出锁存端DBUF EQU 30H ;秒的最低位地址KCLK BIT P2.3KEY BIT P3.5PL BIT P1.7LED BIT P1.1CHANGE2 BIT 21H ;加12的标志位AD1 EQU 40H ;秒AD2 EQU 41H ;分AD3 EQU 42H ;小时AD4 EQU 43H ;天AD5 EQU 44H ;月AD6 EQU 45H ;年;定义结束ORG 0000HLJMP MAINORG 000BH ;T0中断入口LJMP INTORG 0030HMAIN: MOV R0,#AD1MOV R7,#06HLOOP0: MOV A,#00HMOV @R0,AINC R0DJNZ R7,LOOP0 ;R0~R7清零MOV IE,#82H ;允许T0中断MOV TMOD,#01H ;T0允许工作MOV TH0,#4CHMOV TL0,#00H ;送入计数初值0.5sMOV R5,#00H;初始化结束SETB TR0 ;T0使能LOOP: LCALL TEST ;扫描键盘CJNE A,#0FEH,NEXTD ;0FEH为1键LCALL DY1MSLCALL KEYDONENEXTD: SJMP LOOP ;扫描键盘看是否需要调整日历DISPLAY: LCALL TEST ;扫描键盘CJNE A,#0DFH,ERSHISI1;0DFH为6键SETB PSW.1 ;显示十二小时LJMP TIMEZHUANERSHISI1:CJNE A,#0EFH,ERSHISI2;0EFH为5键CLR PSW.1 ;显示二十四小时CLR CHANGE2LJMP TIMEZHUANERSHISI2:CJNE A,#0CFH,CHANGE;0CFH为5+6键CLR PSW.1SETB CHANGE2 ;CHANGE2=1表示把十二表示法转换成二十四小时LJMP TIMEZHUANCHANGE: CLR CHANGE2TIMEZHUAN:LCALL TESTCJNE A,#7FH,NEXTL;7FH为8键SETB PSW.5LJMP ZHUAN1NEXTL: CJNE A,#0BFH,ZHUAN1;0BFH为7键CLR PSW.5ZHUAN1: JB PSW.5,DAY ;PSW.5=0 调整时间,为1则调整日期MOV A,AD1 ;调整时间键码分离MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD2MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AJB PSW.1,TIMEZHUAN1LJMP TIMEZHUAN2TIMEZHUAN1: ;判断时间是否大于12MOV A,AD3MOV B,#0CHSUBB A,BJC NORMALTMOV AD3,ALJMP NORMALTTIMEZHUAN2:JNB CHANGE2,NORMALT ;判断是否加12MOV A,AD3ADD A,#12MOV AD3,ACLR CHANGE2NORMALT: MOV A,AD3MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ASJMP DDISPDAY: ;调整日期键码分离MOV A,AD4MOV B,#0AHDIV ABMOV R0,#DBUFMOV @R0,BINC R0MOV @R0,AMOV A,AD5MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,AMOV A,AD6MOV B,#0AHDIV ABINC R0MOV @R0,BINC R0MOV @R0,ADDISP: ;显示,串入并处的方式,上升沿写入MOV R0,#DBUFMOV R7,#06HLOOP2:MOV R6,#08HMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTR ;显示秒CLR CLOOP3:RRC ACLR CLKMOV DISP,CSETB CLKDJNZ R6,LOOP3INC R0DJNZ R7,LOOP2RETKEYDONE: ;人工手动调整日历AGAINB: LCALL DY250MS ;防抖250msLCALL TESTCJNE A,#7FH,NEXTL1 ;7FH为8键SETB PSW.5LJMP ZHUAN12NEXTL1:CJNE A,#0BFH,ZHUAN12CLR PSW.5 ;以上为扫描键盘并设置PSW.5 ZHUAN12:JB PSW.5,NEXT6B ;判断调整日期还是时间CJNE A,#0FDH,NEXTA ;0FDH为2键,如果按键值为FDH则结束LJMP BACKNEXTA: CJNE A,#0FBH,NEXTB;0FBH为3键INC AD1 ;秒加1MOV A,AD1CJNE A,#3CH,AGAINAMOV AD1,#00HSJMP AGAINANEXTB: CJNE A,#0F7H,NEXTC;0F7H为4键INC AD2 ;分加1MOV A,AD2CJNE A,#3CH,AGAINAMOV AD2,#00HSJMP AGAINANEXTC: CJNE A,#0EFH,AGAINA;0EFH为5键INC AD3 ;时加1MOV A,AD3CJNE A,#18H,AGAINAMOV AD3,#00HNEXTT: SJMP AGAINANEXT6B:CJNE A,#0FDH,NEXTAB;JIESHUJIAN ;0FDH为2键LJMP BACKNEXTAB: CJNE A,#0FBH,NEXTBB;0FBH为3键INC AD4 ;日加1MOV A,AD4CJNE A,#20H,AGAINAMOV AD4,#01HSJMP AGAINANEXTBB: CJNE A,#0F7H,NEXTCB;0F7H为4键INC AD5 ;月加1MOV A,AD5CJNE A,#0DH,AGAINAMOV AD5,#01HSJMP AGAINANEXTCB: CJNE A,#0EFH,AGAINA;0EFH为5键INC AD6 ;年加1MOV A,AD6CJNE A,#64H,AGAINAMOV AD6,#00HAGAINA: LCALL DISPLAYLJMP AGAINBBACK: RETINT: INC R5CJNE R5,#20,NEXTS1 ;循环20次,每次循环为0.5秒,共0.05*20=1秒MOV R5,#00HLCALL DISPLAY ;满一秒后的显示LJMP MENDNEXTS1: LJMP NEXTS ;满一秒后的显示MEND: MOV A,AD1CJNE A,#0AH,LAREMENDSETB LED ;满十秒关灯,否则继续LAREMEND:INC AD1MOV A,AD1CJNE A,#3CH, NEXTS2LJMP MEND1NEXTS2: LJMP NEXTS ;以上为看是否修改秒,满60,分加一否则跳转继续MEND1: MOV AD1,#00HINC AD2MOV A,AD2CJNE A,#3CH,NEXTS3LJMP MEND2NEXTS3: LJMP NEXTS ;以上为看是否修改分,满60,时加一否则跳转继续MEND2: MOV AD2,#00HINC AD3MOV A,AD3CJNE A,#0Ah,ZAIJIANCHAAJMP BAOSHIZAIJIANCHA:CJNE A,#0Bh,ZHENGCHANGBAOSHI: CLR LED ;以上为两个报时开灯ZHENGCHANG:MOV A,AD3CJNE A,#18H,NEXTS4 ;不满二十四小时跳出LJMP MEND3 ;满二十四后跳到清零小时继续加天NEXTS4: LJMP NEXTSMEND3: MOV AD3,#00HINC AD4MOV A,AD5CJNE A,#02H,JIXUTIAN ;判断是否为二月份MOV A,AD6MOV B,#4HDIV ABMOV A,BJZ RUNNIAN ;判断是否为闰年PINGNIAN:MOV A,AD4 ;平年CJNE A,#1DH,NEXTSMOV AD4,#01HAJMP JIXUYUERUNNIAN: MOV A,AD4 ; 闰年CJNE A,#1EH,NEXTSMOV AD4,#01HAJMP JIXUYUEJIXUTIAN: ; 不为二月,再查看是那个月MOV A,AD5CJNE A,#01H,PAN1LJMP SANSHIYIPAN1: CJNE A,#03H,PAN3LJMP SANSHIYIPAN3: CJNE A,#04H,PAN4LJMP SANSHIPAN4: CJNE A,#05H,PAN5LJMP SANSHIYIPAN5: CJNE A,#06H,PAN6LJMP SANSHIPAN6: CJNE A,#07H,PAN7LJMP SANSHIYIPAN7: CJNE A,#08H,PAN8LJMP SANSHIYIPAN8: CJNE A,#09H,PAN9LJMP SANSHIPAN9 : CJNE A,#10H,PAN10LJMP SANSHIYIPAN10: CJNE A,#11H,SANSHIYILJMP SANSHISANSHIYI:MOV A,AD4 ;月份:1,3,5,7,8,10,12CJNE A,#20H,NEXTSMOV AD4,#01HAJMP JIXUYUESANSHI: MOV A,AD4 ; 月份:2,4,6,8,11CJNE A,#1FH,NEXTSMOV AD4,#01HJIXUYUE: INC AD5 ; 满月后加年CJNE A,#0DH,NEXTSMOV AD5,#01HINC AD6MOV A,AD6CJNE A,#64H,NEXTS ; 年满100后清零MOV AD6,#00HNEXTS: ;再赋初值MOV TH0,#4CHMOV TL0,#00HRETIDY250MS: ; 延迟防抖250msMOV R4,#0FAHLOOP8: LCALL DY1MSDJNZ R4,LOOP8RETDY1MS: ; 延迟防抖1msMOV R5,#0FAHLOOP7: MOV R7,#70HDJNZ R5,LOOP7RET;键盘扫描子程序TEST: MOV R7,#08HSETB PLCLR PL ;低电平锁存NOPNOPSETB PL ;高电平输出MOV A,#0FFHAGAIN3: CLR KCLKNOPNOPMOV C,KEY ;把p3.5的状态存入CSETB KCLKRLC A ;键盘状态存入ADJNZ R7,AGAIN3 ;扫描八个按键RETTAB:DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H ;子程序功能索引:;TEST——扫描键盘;DDISP——显示;NEXTS——重新赋初值;DY1MS——延迟防抖1msEND。