《电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1.doc》由会员分享,可在线阅读,更多相关《电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1.doc(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流电子万年历设计(基于AT89C51单片机和DS1302时钟芯片)1.精品文档. 随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次革命就是单片机数码计时技术的应用(电子万年历
2、),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。本设计为软件,硬件相结合的一组设计。在软件设计过程中,应对硬件部分有相关了解,这样有助于对设计题目
3、的更深了解,有助于软件设计。基本的要了解一些主要器件的基本功能和作用。除了采用集成化的时钟芯片外,还有采用MCU的方案,利用AT89系列单片微机制成万年历电路,采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。AT89C51是由ATMEL公司推出的一种小型单片机。95年出现在中国市场。其主要特点为采用Flash存贮器技术,降低了制造成本,其软件、硬件与MCS-51完全兼容,可以很快被中国广大用户接受。 本文介绍了基于AT89C51单片机设计的电子万年历。首先我们在绪论中简单介绍了单片机的发展与其
4、在中低端领域中的优势以及课题的开发意义;接着介绍了AT89C51单片机的硬件结构和本毕业设计所要外扩的LED显示及其驱动方法,并在此基础上实现了万年历基本电路的设计;然后使用单片机汇编语言进行万年历程序的设计,程序采用模块化结构,使得逻辑关系简单明了,维护方便。 一 设计要求与方案论证随着电子技术的发展,人类不断研究,不断创新纪录。万年历目前已经不再局限于以书本形式出现。以电脑软件或者电子产品形式出现的万年历被称为电子万年历。与传统书本形式的万年历相比,电子万年历得到了越来越广泛的应用,采用电子时钟作为时间显示已经成为一种时尚。目前市场上各式各样的电子时钟数不胜数,但多数是只针对时间显示,功能
5、单一不能满足人们日常生活需求。 本文提出了一种基于AT89C51单片机的万年历设计方案,本方案以AT89C51单片机作为主控核心,与时钟芯片DS1302、按键、LED显示等模块组成硬件系统。在硬件系统中设有独立按键和LED显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、选择时间等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。(一)功能要求本电子万年历能动态显示年、月、日、星期、小时、分钟、秒2.方案论证3. 技术可行性 随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。集成技
6、术的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行I/O口、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机(Single-Chip Microcomputer)。而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元、PWM控制输出单元、PWM输出时的死区可编程控制功能等。因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统,如工业流水线控制系统、作为家用电器的主控制器、分布式控制系统的终端节点或作为其主控制节点起中继的作用、数据采集系统、自动
7、测试系统等。单片机的出现,并在各技术领域中得到如此迅猛的发展,与单片机构成计算机应用系统所形成的下述特点有关: 1、单片机构成的应用系统有较大的可靠性。这些可靠性的获得除了依靠单片机芯片本身的高可靠性以及应用有最少的联接外,还可以方便地采用软、硬件技术。2、系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统,应用系统有较高的软、硬件利用系数。 3、由于构成的应用系统是一个计算机系统,相当多的测、控功能由软件实现,故具有柔性特征,不须改变硬件系统就能适当地改变系统功能。4、有优异的性能、价格比。(二) 单片机的选择方案一:采用传统的AT89C51作为电机的控制核心。单片机算术运算功能强,
8、软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。方案二:采用FTC10F04单片机,还带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。其主要特点如下:8KB Flash ROM,可以擦除1000次以上,数据保存10年。由于本系统对CPU运算速度要求很高,需要执行很复杂的运算,方案一成本比较低,适合做设计,方案二运算速度高,性能好,所以两种方案都有可取之处。选用方案一作为主方案,方案二作为备用方案。1 显示模块的选择 使用液晶显示屏显示时间数字。 液晶显示屏(LC
9、D)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强等特点。但由于液晶是以点阵的模式显示各种符号,需要利用控制芯片创建字符库,编程工作量大,控制器的资源占用较多,其成本也偏高。在使用时,不能有静电干扰,否则易烧坏液晶的显示芯片。主控芯片使用51系列AT89C51单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DS1302。采用DS1302作为计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备电源(2.55.5V电源,再2.5V时耗电小于300nA),而且DS1302
10、可以编程选择多种充电电流来队后备电源进图电子万年历电路系统构成框图行慢速充电,可以保证后备电源基本不耗电。显示驱动采用MAX7219,MAX7219 是微处理器和共阴极八段八位LED 数码管显示、图条/柱图显示或64 点阵显示接口的小型串行输入/输出芯片。片内包括BCD 译码器、多路扫描控制器、字和位驱动器和88 静态RAM。外部只需要一个电阻设置所有LED 显示器字段电流。MAX7219 和微处理器只需三根导线连接,每位显示数字有一个地址由微处理器写入。允许使用者选择每位是BCD 译码或不译码。使用者还可选择停机模式、数字亮度控制、从18 选择扫描位数和对所有LED 显示器的测试模式。显示模
11、块采用普通的共阴极四位一体八段LED数码管。二 系统硬件电路的设计(一)电路设计图示为电子万年历电路设计原理图,系统由主控制器AT89C51、时钟电路DS1302、显示驱动MAX7219电路,显示电路及键扫描电路组成。图 电子万年历电路原理图(二)系统硬件概述1. 主控制器AT89C51ATMEL公司生产的AT89C51单片机采用高性能的静态80C51设计,并采用先进工艺制造,还带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。其主要特点如下:8KB Flash ROM,可以擦除1000次以上,数据保存10年。 256字节内部RAM; 电源控制模式
12、; 时钟可停止和恢复; 空闲模式; 掉电模式; 6个中断源; 4个中断优先级; 4个8位I/O口; 全双工增强型TUAR; 3个16位定时/计数器:T0、T1(标准80C51)和增加的T2(捕获和比较) 全静态工作方式:024MHZ2.时钟电路DS1302 DS1302的性能特性: 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较; 用于高速数据暂存的31*8位RAM; 最少引脚的串行I/O; 2.55.5V电压工作范围; 2.5V时耗小于300nA; 用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式; 简单的三线接口; 可选的慢速充电(至Vcc1)的能力。DS
13、1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302的控制字如表所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不
14、能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。位51(A4A0)指示操作单元的地址。最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。为了提高对32个地址寻址能力(地址/命令位15=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址931或RAM寄存器中的地址31不能存储数据。在多字节方式下,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写
15、所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至RAM。表 DS1302控制字 DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字如上表所示,其中奇数为读操作,偶数为写操作。时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。 AM-PM/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时
16、位(2023h)。 DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。3. 显示驱动MAX7219 MAX7219 和单片计算机连接有三条引线(DIN、CLK、LOAD),采用16 位数据串行移位接收方式 八位LED 显示、图条/柱图显示或64 点阵显示 包括BCD 译码器、多路扫描控制器、字和位驱动器和88 静态RAM 可选择停机模式、数字亮度控制、从18 选择扫描位数和对所有LED 显示器的测试模式 最多能驱动8 位LED 显示器 内部RAM 地址0108H 分别对应于DIG0DIG7。 扫描界限寄存器(地址0BH):该寄存器中
17、D0D3 位数据设定值为07H,设定值表示显示器动态扫描个数位18。 停机寄存器(地址0CH):当D0=0 时,MAX721 处于停机状态;当D0=1 时,处于正常工作状态。 显示测试寄存器(地址0FH):当D0=0时,MAX7219 按设定模式正常工作;当D0=1 时,处于测试状态。在该状态下,不管MAX7219 处于什么模式,全部LED 将按最大亮度显示。 亮度寄存器(地址0AH):亮度可以用硬件和软件两种方法调节亮度寄存器中的D0D3位可以控制LED 显示。LED 显示寄存器由内部8 8 静态RAM 构成,操作者可直接对位寄存器进行个别寻址, 以刷新和保持数据, 只要V 超过2 V(一般
18、为 5V)。 控制寄存器包括: 译码模式, 显示亮度调节, 扫描限制(选择扫描位数),关断和显示测试寄存器。MAX7219 的驱动程序首先必须对5 个控制寄存器初始设置即初始化, 各控制寄存器设置含义如下:译码模式选择寄存器(地址 F9H);MAX7219 有两种译码方式:B 译码方式和不译码方式。当选择不译码时, 8 个数据为分别一一对应7 个段和小数点位;B 译码方式是BCD 译码,直接送数据就可以显示。实际应用中可以按位设置选择B 译码或是不译码方式。扫描限制寄存器: 地址 FBH;用于设置显示的LED 个数( 1 8 ) , 比如当设置为0xX4 时,LED 05 显示。亮度调节寄存器
19、: 地址 FAH;共有16 级选择,用于LED 显示亮度的强弱设置。关断模式寄存器:地址 FCH;有两种模式选择:一种是关断状态模式(D0 0);一种是正常操作状态(D0 1),通常选择正常操作状态。显示测试寄存器:地址 FFH;有两种选择用于设置LED 是测试状态还是正常操作状态:当在测试状态时(D0 1)各位全应亮,一般选择正常操作状态(D0 0)。4.主要单元电路的设计表 MAX7219引脚功能(1)显示电路显示部分采用普通的共阴数码管显示,采用动态扫描,以减少硬件路。年月日时分秒星期共需要17位数码显示,考虑到一次扫描17位数码管显示时会出现闪烁情况,故采用动态扫描,可将数码管数量减少
20、至9位,也就是两个四位一体八段LED显示数码管和一个一位LED数码管设计时数码管同时扫描,显示时采用串行口输出段码,用MAX7219驱动数码管。 图 MAX7219主要引脚5.键盘接口键盘在单片机系统中是一个很重要的部件。为了输入数据、查询和控制系统的工作状态,都要用到键盘,键盘是人工干预计算机的主要手段。键盘可分为编码和非编码键盘两种。编码键盘采用硬件线线路来实现键盘编码,每按下一个键,键盘能自动生成按键代码,键数较多,而且还具有去抖动功能。这种键盘使用方便,但硬件较复杂,PC机所用的键盘就属于这种。非编码键盘仅提供按键开关工作状态,其他工作由软件完成,这种键盘键数较少,硬件简单,一般在单片
21、机应用系统中广泛使用。此处主要介绍该类非编码键盘及其与MCS51型单片机的接口。6.时钟电路(1). DS1302工作方式简介及数据操作原理DS1302可以对年、月、日、星期、时、分、秒进行计时, 且具有闰年补偿功能, 工作电压宽达2.55.5V。采用三线接口与CPU进行同步通信, 并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个33x8的用于临时性存放数据的RAM寄存器。DS1302是的DS1202升级产品, 与DS1202兼容, 但增加了主电源/后背电源双电源引脚, 同时提供了对后背电源进行涓细电流充电的能力。DS1302时钟芯片包括实时时钟/日历和31字节的
22、静态RAM。它经过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。时钟的运行可以采用24时或带AM/PM的12小时格式。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多字节的时钟信号或RAM数据。DS1302有主电源/后备电源双电源引脚:Vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电磁备份;Vcc1在双电池系统中提供主电源。在这种运行方式中,Vcc1里连接到后备电源,以便在没有主电源的情况下能保存时间信息以及数据。DS1302由Vcc1或Vcc2中较打大者供电。当
23、Vcc2(Vcc1+0.2V)时,Vcc2给DS1302供电;当Vcc2Vcc1时,DS1302由Vcc1供电。 图S1302DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc2.5V之前,RST脚必须保持低电平。只有在S
24、CLK为低电平时,才能将RST置为高电平。DS1302的控制字如图所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM数据。位51(A4A0)指示操作单元的地址。最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。为了提高对32个地址寻址能力(地址/命令位15=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址931或RAM寄存器中的地址31不能存储数据。在
25、多字节方式下,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至RAM。DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字如下表所示,其中奇数为读操作,偶数为写操作。表 DS1302控制字时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。 AM-PM/12
26、-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(2023h)。 DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。三 系统的软件设计一 程序设计电子万年历的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是MAX7219从单片机中读取数据驱动LED数码管显示时间。AT89C51单片机主要I/O口的分配,P2.0-P2.2分别接MAX7219的DIN,LOAD,CLK三个功能端,P3接查询式按键,P
27、1.0-P1.2分别接DS1302的CLK,IO,RST端。1时间控制流程图DS1302时控流程图四 结束语2010年3月,我开始了我的毕业论文工作,时至今日,论文基本完成。从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。历经了一个多月的奋战,紧张而又充实的毕业设计终于落下了帷幕。回想这段日子的经历和感受,我感慨万千,在这次毕业设计的过程中,我拥有了无数难忘的回忆和收获。3月初,在与毕业设计指导老师徐老师的交流讨论中我的题目定了下来,是:电子万年历的设计。当选题报告,开题报告定下来的时候,我当时便立刻着手资料的收集工作中,当时面对浩瀚的书海真是有些茫然,不知
28、如何下手。在导师细心的指导下,终于使我对自己的工作方向和方法有了掌握。在搜集资料的过程中,我认真准备了一个笔记本。我在学校图书馆,电子阅览室搜集资料,将这些宝贵的资料全部记在笔记本上,尽量使我的资料完整、精确、数量多,这有利于论文的撰写。然后我将收集到的资料仔细整理分类,及时拿给导师进行沟通。4月初,资料已经查找完毕了,我开始着手论文的写作。在写作过程中遇到困难我就及时和导师联系,并和同学互相交流,请教专业课老师。在大家的帮助下,困难一个一个解决掉,论文也慢慢成型。4月底,论文的文字叙述已经完成。5月开始进行相关图形的绘制工作和电路的设计工作。为了画出自己满意的电路图,流程图等。在设计电路初期
29、,由于没有设计经验,觉得无从下手,空有很多设计思想,却不知道应该选哪个,经过导师的指导,我的设计渐渐有了头绪,通过查阅资料,逐渐确立系统方案。方案中LED显示屏驱动电路的设计是个比较头疼的问题,在反复推敲,对比的过程中,最终定下了驱动电路采用MAX7219驱动芯片。当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的毕业设计稿件我的心里是甜的,我觉得这一切都值了。这次毕业论文的制作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。我不会忘记这难忘的几个月的时间。毕业论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书
30、本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手用protel 99设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。我从资料的收集中,掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益
31、。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。在此更要感谢我的指导老师和专业老师,是你们的细心指导和关怀,使我能够顺利的完成毕业论文。在此我要向徐老师师致以最衷心的感谢和深深的敬意。附录 电子万年历程序SUB_WNL入口:SJ DATA 30H ; 世纪 BCD 00 TO 99 NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年 YF DATA 32H
32、; 月份 BCD 01 TO 12 出口 ACC - 本月天数 BCD 28 to 31 B - 本月1日的星期数 1 to 6 = 星期1 to 星期6 ; 0 - 星期日 ; 使用: ACC, B, R5, R6 ; STACK: 3 bytes (不包括调用) ORG 50HSUB_WNL: PUSH PSW MOV A, SJ ACALL BCD2BIN_MOD4 ; x 400年: (大周期) ; =146097天 = 7 * 20871 + 0 天 ; x 100年: ; 000年 = 7 * 0 + 0 + 1 - 1 1 = 0 * 2 + 1 * ; 100年 = 7 * 5
33、217 + 7 + 1 - 2 2 = 1 * 2 ; 200年 = 7 * 10435 + 7 + 1 - 4 4 = 2 * 2 ; 300年 = 7 * 15653 + 7 + 1 - 6 6 = 3 * 2 ; 1,2,4,6 MOV A, R6 ; A=R6= SJ_BIN MOD 4 RLC A ; A=A*2+C A = 1,2,4,6 * XRL A, #10000111B ; A = 87H - A ; 边界调整 MOV R5, A ; A = 86H, 85H, 83H, 81H ; R5: 星期 MOV A, NH JZ WNL_1 ACALL BCD2BIN_MOD4
34、XCH A, R5 SUBB A, R5 ; 0 年 ; 0 = 0 + 0 + 1 + (-1) * MOV R5, AWNL_1: MOV A, YF ADD A, #(WNL_TAB-$-4) MOVC A, A+PC MOV R6, A SWAP A ACALL WNL_F0; 大年对=3月调整准备 ADDC A, R5 ; 月调整 MOV B, #7 DIV AB ; B = A MOD 7 MOV A, R6 ACALL WNL_F0; 大年调整准备 ADDC A, #28 POP PSW RETWNL_TAB: DB 3*2 + 5 * 32+0 ;1 BIT 0 : 2月 标志
35、 DB 0*2+1+1 * 32+0 ;2 * BIT 1.2: 月大小 DB 3*2 + 1 * 32+16 ;3 00:28 天 DB 2*2 + 4 * 32+16 ;4 01:- DB 3*2 + 6 * 32+16 ;5 10: 30 天 DB 2*2 + 2 * 32+16 ;6 11: 31 天 DB 3*2 + 4 * 32+16 ;7 BIT 3: 0 - DB 3*2 + 7 * 32+16 ;8 BIT 4: 0: 1/2月 DB 2*2 + 3 * 32+16 ;9 1: =3月 WNL_F0: ; 6 BYTES ; 大年调整准备 RRC A ;0AH ANL A,
36、#07H ;0BH ;0CH ANL C, F0 ;0DH ;0EH RET ;0FH DB 3*2 + 5 * 32+16 ;10H BIT 5.7: 星期调整数 DB 2*2 + 1 * 32+16 ;11H 0:- DB 3*2 + 3 * 32+16 ;12H 1-7: 调整数 BCD2BIN_MOD4: ; 功能:A. 1 BYTES BCD TO BIN ; B. MOD 4 ; C. MUL 2 ; 入口: ; A : SJ OR NH ; F0 : 大世纪 ; 出口 ; ACC - (BIN(A) 4) * 2 - (BIN(A) MOD 4) - F0 ; R6 - BIN(
37、A) MOD 4 ; C - IIF( (BIN(A) MOD 4)=0, 1, 0 ) ; 使用: ACC, B, R6, PSW ; STACK: 0 bytes (不包括调用) MOV R6, A ; BCD = BIN ANL A, #0F0H ; 16X+Y = 10X+Y SWAP A MOV B, #(256-6) ; (256-6)*X + (16X+Y) MUL AB ; ADD A, R6 ; = 256X + (10X+Y) MOV R6, A ; MOD4 ANL A, #3 XCH A, R6 ; R6 = BIN MOD 4 = 0,1,2,3 ; X 4年:3 *
38、 365 + 366 = 7*209 + (-2) * XRL A, R6 ; A = (BIN 4) RR A ; A = (BIN 4 ) * 2 * MOV C, F0 ; 大世纪调整 SUBB A, R6 ;X 1 年: ;0 年 0 = 0 + 0 + 1 + (-1) * ;1 年 366 = 7*52 + 1 + 1 ;2 年 366 + 365 = 7*104 + 2 + 1 ;3 年 366 + 365 + 365 = 7*156+3 + 1 ; -1,1,2,3 CJNE R6, #1, $ + 3 ; C = IIF(R6=1, 0, 1) MOV F0, C ; C=1 为大年/大世纪 RET END ; END OF FILE