万年历实训报告

重庆科创职业学院

万年历实训报告

    院:     

    级: BK31901

指导老师:阎峻岭  陈帅华

    名:         

实训时间:20121019

万年历实训报告

一、任务目的

通过万年历的设计与制作,进一步熟悉单片机内部定时器、I/O口、中断、

提高实践能力

二、设计要求

    用单片机设计一个功能实用,使用简便万年历,具体要求:根据提供的单片机键盘接口模块电路,加上必要的外部电路,设计出万年历的硬件电路,编写软件,用Proteus进行仿真实验,然后进行实物的软硬件调试,并撰写符合要求的实训报告。

三、系统硬件电路设计

1、最小系统:最小系统包括时钟电路和复位电路。

时钟信号的产生:在MCS-51系列单片机内部有一个高增益反相放大器,其输入端引脚为XTAL1,其输出端引脚为XTAL2。只在XTAL1和 XTAL2之间跨接晶振和微调电容,就可以构成一个稳定的自激振荡器。

    复位电路,可分为上店复位电路和按键复位电路,在电子琴设计中采用的是按键复位电路。该电路用RESET键实现复位,此时电源经两个电阻分压,在RST端产生一个复位高电平。

2、万年历原理图

3、程序如下:

#include<reg51.h>

sbit rs=P1^2;

sbit rw=P1^1;

sbit en=P1^0;

sbit s1=P3^4;

sbit s2=P3^5;

sbit s3=P3^6;

char miao,shi,fen;

unsigned char code table[]="  20##-10-18 MON";

unsigned char code table1[]=" 00:00:00";

unsigned char num;

void delay(unsigned int z)

{

  unsigned int x,y;

  for(x=z;x>0;x--)

  for(y=0;y<150;y++);

}

void write_com(unsigned char cmd)//写命令

{

  rs=0;

  rw=0;

  //en=0;

  //_nop_();//延时1000ns

  en=1;

  P2=cmd;

  //_nop_();//延时1000ns

  en=0;

  delay(2);//当不检测忙标志时,每次至少需要ms

}

void write_data(unsigned char dat)//写命令

{

  rs=1;

  rw=0;

  //en=0;

  //_nop_();//延时1000ns

  en=1;

  P2=dat;

  //_nop_();//延时1000ns

  en=0;

  delay(2);//当不检测忙标志时,每次至少需要ms

}

void init()

{

  write_com(0x38);//设置0011100  8BIT

  write_com(0x08);//设置关显示关光标

  write_com(0x0c);

  write_com(0x06);//清指针等

  write_com(0x01);//设置开显示开光标开闪烁

  write_com(0x80);

  for(num=0;num<16;num++)

  {

  write_data(table[num]);

  }

  write_com(0x80+0x40);

  for(num=0;num<12;num++)

  {

  write_data(table1[num]);

  }

  TMOD=0X01;// 定时器方式1

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;//初值15536

  EA=1;

  ET0=1;

  TR0=1;

}

void main()

{

 init();

 while(1);

}

五、系统调试

  该万年历要实现以下功能:

1、 实现正常走时;

2、 能够校准时间和日期;

3、 能够自动区分平润年和大小月;

在仿真过程中出现的最典型的问题是按下加法按钮要么出现闪烁或抖动,要么就加法跳动数次,经分析与试验得知这是由于延时时间使用不当,于是我们在循环扫描的前面加一个FOR语句循环50次后再扫描是否有键被按下

六、心得体会

通过此次万年历的设计与制作,获得了丰富的理论知识,极大地提高了实践能力。不但发挥了团队精神,分工合作,更充分发挥了人的主观能动性。从接到任务开始到较好地完成了作品,我们学到的很多,成长了很多。刚开始,对于任务和要求都不很清晰,思路断断续续的。但最终静下来冷静思考和组员进行讨论,思路也就理顺了反而觉得得心应手了。我知道了凡事要一颗平常的心,不要老想着走捷径,一步一个脚印。

 

第二篇:单片机实习报告_电子万年历.doc张

电子设计总结报告

----电子万年历

   班级:  100404

姓名:  张淇瑞

                  

学号:   20101407

   



摘要

在当代繁忙的工作与生活中,时间与我们每一个人都有非常亲密的关系,每个人都收到时间的影响,为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。为了在观测时间的同时能够了解其他与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

该电子万年历主要采用AT89S52单片机作为主控核心,由DS1302时钟芯片提供时钟、LCD动态扫描显示屏显示,AT89S52单片机具有功耗小,片内ROM全都采用FlashROM:能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KB ROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或程序的新增功能需要烧入程序时,不需要对芯片进行多次插拔,所以不会对芯片造成损坏。DS1302时钟芯片是美国DALLAS公司推出的具有涓流电流充电功能的低功耗实时时钟芯片,它可以对年、月、日等进行计时,还有闰年补偿等功能,而且使用寿命长,误差小,数字显示是采用的LCD液晶显示,可以同时显示各种需要的信息。此外,该电子万年历还具有时间校准等功能。


目  录

1  绪 论. 1

1.1选题背景. 1

1.2  选题目的. 1

1.3设计意义. 2

2  设计要求与方案论证. 3

2.1  设计要求. 3

2.2  系统基本方案选择和论证. 3

2.2.1单片机芯片的选择和方案论证. 3

2.2.2显示模块选择方案和论证. 3

2.2.3时钟芯片的选择方案和论证. 3

2.2.4温度传感器的选择方案与论证. 4

2.3最终方案确定. 4

3  系统的硬件设计与实现. 5

3.1 系统硬件概述. 5

3.1.1系统设计框图. 5

3.1.2系统硬件需求介绍. 5

3.2系统硬件各模块作用. 6

3.2.1 控制系统的设计. 6

3.2.2时钟电路模块的设计. 6

3.2.3 温度采集模块设计. 8

3.2.4闹钟(蜂鸣器电路模块). 9

3.2.5 按键部分. 9

3.2.6 液晶显示模块概述. 10

3.2.7 USB和外部电源供电电路. 10

4  系统的软件实现. 12

4.1程序流程框图. 12

5  设计总结与心得体会. 15

6  参考文献. 16

7  致谢词. 16

8  附录. 17

附录一:. 17

附录二:. 17

                                                          


1 绪 论

1.1 选题背景

在社会迅速发展的今天,单片机的的运用已经渗透到我们生活的每个角落,也似乎很难找到哪个领域没有单片机的足迹。智能仪表、医疗器械,导弹的导航装置,智能监控、通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,汽车的安全保障系统,动控制领域的机器人,数码像机、电视机、全自动洗衣机的控制,电话机以及程控玩具、电子宠物等等,这些都离不开单片机。

              

 图 1-1 万年历          图1-2 智能手机          图1-3数码相机

所以,单片机的学习、开发与应用将对于现代社会的发展,经济的繁荣,和提高满足人类日益增长的物质文化需求有着至关重要的作用。也成就了一批又一智能化控制的工程师和科学家。科技越发达,智能化的东西就越多。学习单片机是社会发展的必然需求,也是我们现代高级技工所必须要掌握的技能。

1.2  选题目的

随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆和摆轮游丝的机械表或钟。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到了秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到了百万分之一秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,他更符合消费者的生活需求,因此,电子万年历的出现带来了钟表计时业跨越性的进步。

1.3 设计意义

(1)在学习了《模拟数字技术和数字电子技术》和《单片机原理》课程后,为了加深对理论知识的理解,学习理论知识在实际中的运用,培养动手能力和解决实际问题的经验并接触专用时钟芯片DS1302,并会用DS1302芯片开发时钟模块,应用到其他系统中去。熟悉protues 和  kiel软件调试程序和仿真。

(2)通过实验提高对单片机的认识。

(3)通过实验提高焊接、布局、电路检查能力。

(4)通过实验提高软件调试能力。

(5)进一步熟悉和掌握单片机的结构及工作原理。

(6)通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。

(7)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。

(8)通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应的工作打下坚实的基础。

2 设计要求与方案论证

2.1 设计要求

(1)具有年、月、日、星期、时、分、秒等功能。

(2)时间与阴、阳历能够自动关联。

(3)具有温度显示功能和温度报警功能。

(4)具备年、月、日、星期、时、分、秒校准功能。

2.2 系统基本方案选择和论证

2.2.1 单片机芯片的选择和方案论证

方案一:采用89C51芯片作为硬件核心,内部具有4KB ROM存储空间,能于3V的超低电压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次查吧会对芯片造成一定的损坏。

 方案二: 采用AT89C52片内ROM全都采用FlashROM:能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KB ROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或程序的新增功能需要烧入程序时,不需要对芯片进行多次插拔,所以不会对芯片造成损坏。

 综上所述,所以采用AT89C52作为主控系统。

2.2.2 显示模块选择方案和论证

方案一:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机相连接时,占用的单片机口线少,但所需要的数码管数量太多,焊接困难极易出错,所以不采用LED数码管作为显示。

方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较合适,如果用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。

方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。

综上所述,我们应该选取LCD液晶显示屏。

2.2.3 时钟芯片的选择方案和论证

方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒技术,采用此种方案虽然减小芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。

方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V-5.5V范围内,2.5V时耗电小于300Ma。

综上所述,我们采用DS1302时钟芯片实现时钟。

2.2.4 温度传感器的选择方案与论证

方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。

方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。

    综上所述,我们采用数字式温度传感器DS18B20。

2.3 最终方案确定

核心控制体:AT89C52单片机

实时时钟芯片:DS1302

数字式温度传感器:DS18B20

LCD液晶显示屏

总共设有四个按键,为节约资源考虑,每个按键都有多种功能。每个按键分别标号为A,B,C,D.第一次按下B,C,D都没有反应,首先按下A键可选择指针位置,B,C键为加减键,D键为闹钟设置键。B同时又是闹钟报警消除键。操作简单,按键灵活。

3 系统的硬件设计与实现

3.1 系统硬件概述

本电路是由AT89S52单片机作为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒等进行计时,具有闰年补偿功能,工作电压为2.5V-5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个用于临时存放数据的RAM寄存器。可产生年、月、日、时、分、秒等,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20构成,显示部分为LCD液晶显示屏,能够实现字符与数字同时显示的功能。

3.1.1 系统设计框图


图2 系统组成框图图

3.1.2 系统硬件需求介绍

AT89C52单片机一片,DS1302实时时钟芯片一个,DS18B20数字式温度传感器一个,+5V无源蜂鸣器二个,12MHZ晶振一个,多个按键和开关,常用电容电阻,连接线,三极管,二极管若干,滑动变阻器一个,USB母口一个。

3.2 系统硬件各模块作用

3.2.1 控制系统的设计

图3 主控制系统

图3为单片机最小电路,其中晶振频率可以根据自己需要进行选择,范围在0-24MHZ,常用12MHZ。复位电路得电容一般用10UF,但并不唯一,只要RC所得时间大于两个机器周期即可。还有其P0内部无上拉电阻,所以在执行输出功能时,外部必须接上拉电阻(一般10K即可)。

P0口有两个作用,一个接上DS1302的AD0-AD7(双向地址/数据复用总线),控制着DS1302的8位并行数据的地址和数据的传输,另接上液晶的DB0-DB7(数据总线)控制着向液晶发送8位并行数据。P1.7接上DS1302的单数据线,发送并接受数据,地址的操作。P3.0到P3.3作为独立按键口。P2.4口为液晶的数据/命令选择端,1为数据,二为命令,P2.5口控制液晶读/写选择端,1为读命令,0为写操作,P2.6口控制液晶使能信号。对DS1302:P2.0口控制DS1302的片选信号的输入(CS),P2.1口控制地址选通输入(AS),P2.2口为读写输入(R/W),P2.3控制着数据选通或读输入(DS)。P3.2(外部中断0)接reset管脚,当闹钟时间到时便由此触发外部中断0,进入到外部中断0程序中。P1.0和P1.1口分别控制着蜂鸣器的报警,当温度、时间到达限定值时会发出高低电平脉冲,以至发出报警声音。

3.2.2时钟电路模块的设计

图4示出DS1302的引脚排列,其中VCC1为后备电源,VCC2为主电源,在主电源关闭的情况下,也能保持时钟的连续运行,DS1302由VCC1或VCC2两者中的较大者供电,当VCC2大于VCC1+0.2V时,VCC2给DS1302供电,当VCC2小于VCC1时候VCC1供电。X1和X2是振荡源,外接32.768KHz晶振,RST是复位片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段,当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作,如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态,上电运行时,在VCC大于等于2.5V之前,RST必须保持低电平,中有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端,SCLK始终是输入端。

时钟电路芯片DS1302引脚图如图4所示:

                        图4  DS1302的引脚图

工作原理如下:

(1) 时钟芯片DS1302的工作原理:

     DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”

是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。

(2) DS1302的控制字节

DS1302的控制字如表1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出

表1  DS1302的控制字格式

                    RAM                                         RD

               1                A4    A3    A2     A1    A0  

                      / CK                                          /WR

                      

(3) 数据输入输出(I/O)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如图5所示:

                        图5  DS1302读/写时序图

(4) DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表2。

表2 DS1302的日历、时间寄存器

 

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

3.2.3 温度采集模块设计

如图6所示。采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。

当系统在正常显示状态下需要进行调整时,按一下切换键进入按键处理中断程序,并且此时默认的是调整年,在液晶显示器上显示N,此时按加或减按钮可以进行加减调整,若再按一下切换键,则跳到月上显示Y,同样可以调整加减,同样的道理,进入日(R)、时(S)、分(F)、秒(M)的调整,最后再按一下切换键时退出中断程序,星期系统自动的调整过来。

图6 温度传感器部分

3.2.4 闹钟(蜂鸣器电路模块)

闹钟模块的接线如图7所示,蜂鸣器用CS9013三极管驱动,蜂鸣器用5V的无源蜂鸣器,并接一个发光二极管作为指示灯,同时在发光二极管前串接个限流电阻,数据端口分别接P1.0,P1.1(由单片机的P1.0,P1.1直接输出驱动)。

 

图7 蜂鸣器部分

3.2.5 按键部分

按键部分如图8所示,本设计总的用了四个按扭开关作为键盘,其中一个是复位键,另三个中的其中两个是调整时间增加、减少的键,第三个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间。

图8 按键部分

3.2.6 液晶显示模块概述

液晶显示模块如图9所示,字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本设计采用16列*2行的字符型LCD1602带背光的液晶显示屏。

图9 液晶显示部分

3.2.7 USB和外部电源供电电路

USB和外部电源供电电路部分如图10所示。

图10 USB和外部电源供电电路部分

这种设计使得万年历可以接插USB口,从而获取电源,也可外部供给+5V电源。此电路图最大优点就是可以连接多个VCC和GND,方便电路连接。有发光二极管做电源指示灯,方便操作。

 

 

 

 

4 系统的软件实现

4.1程序流程框图

 

                

                                                                                                                 

图11 主程序流程图

图­12计算阳历程序流程图

图13 阴历程序流程图

  图14 时间调整程序流程图

5 设计总结与心得体会

本系统以AT89C51为核心部件,使用串行时钟芯片DS1302,实现时间和闹钟的功能设置。通过键盘和液晶显示屏可方便地校对时钟和设置闹钟时间,本系统基本完成了实用电子钟的功能,尽量做到了硬件电路简单稳定,减少电磁干扰和其他环境干扰。在该系统设计,调试完成之后,对最后的成功进行分析,同时结合在调试过程中出现的错误进行综合分析,总结在实际系统设计和调试过程中的宝贵经验。

在系统硬件设计之前,要结合当前系统的发展趋势和现状对系统功能进行定位,使系统在实际应用中具有竞争力。该系统最大的特点就是界面友好,走时准确,和现在使用LED显示数据的万年历相比,体积更小,可以作为轿车车载显示装置,系统采用液晶显示器,可以使系统应用到更加现代化的地方系统具有温度检测功能,可以作为工业温度检测装置,同时可提供温度报警,系统的按键输入功能,可以读取决策,我们可以通过按键发送指令,控制工业现场机器的动作,实现远程控制。

可见,该系统本身不仅具有很大的灵活性,友好的界面,方便的可扩展性,同时,在其基础上的系统市场需求也很客观,工业控制的很多场合对时间要求比较严格,在实际系统中,系统各装置按照预定的时间动作,本系统可以很好的满足这些系统的要求。

通过本次课程设计让我很好的理解了电子万年历的组成部分和工作原理,也更加的激发了我学习单片机的兴趣,使我明白了只有自己亲自动手才能真正地深刻理解并掌握课本上的理论知识,把理论付诸于实践才能牢牢的把课本上的知识变成自己的。本次课程设计也使我认识到了认真、仔细的态度在现在的学习和以后的工作中是多么的重要,“细节决定成败”,因此,从现在开始就要逐步培养自己的认真负责的心态,并养成注重细节的良好习惯。

6 参考文献

1         刘  勇  《数字电路》 电子工业出版社 2004

2         陈正振  《电子电路设计与制作》 广西交通职业技术学院信息工程系 2007

3         杨子文  《单片机原理及应用》 西安电子科技大学出版社 2006

4         王法能  《单片机原理及应用》 科学出版社 2004

5         李全利  《单片机原理及接口技术》  高等教育出版社   2009

6         王为青 邱文勋  《51单片机应用开发案例精选》 人民邮电出版社 2007

7  张鹏  王雪梅   《单片机原理与应用实例教程》  海洋出版社  2008

7 致谢词

感谢学院给我们提供了一个展现自己的舞台,给我们一次难得煅炼的机会,使得我们的动手能力和专业技能都有了很大的提高。很多课本上的知识了解了不一定能够理解,所以只有在实践中去亲自动手操作的才能够真正的掌握,在本次课程设计确实面临了很多的困难与挫折,但是只要我们能够静下心来慢慢分析、慢慢学习,通过向老师的请教和与同学的探讨,终究能够解决困难。

    在做作品的日子里得到了杨老师的悉心指导,在此向我们的指导教师致以诚挚的谢意。感谢提供相关技术帮助的老师和同学,是你们给了我很多无私的支持和帮助,正是由于你们的支持和鼓励才能让我对这次的作品完成有了信心和动力,我在此深表谢意。

8 附录

附录一:

电路图

附录二:

参考程序


(1)DS18B20温度子程序


 CONFIG12 EQU 7FH

  TEMPH EQU 21H

  TEMPL EQU 20H

  REG2 EQU 22H

  REG3 EQU 23H

  REG4 EQU 24H

  DAT EQU P0.7

TOUTOU:

  LCALL CHUSHI

  LCALL RDTEMP

  MOV A,TEMPL

  ANL A,#11110000B

  MOV TEMPL,A

  MOV A,TEMPH

  ANL A,#00000111B

  ORL A,TEMPL

  SWAP A

  MOV 25H,A

  MOV A,25H

  MOV B,#64H

  DIV AB

  MOV A,B

  MOV B,#0AH

  DIV AB

  SWAP A

  ORL A,B

  MOV 10H,A

  RET

CHUSHI:

  LCALL RESET

  MOV A,#0CCH

  LCALL WRITE111

  MOV A,#4EH

  LCALL WRITE111

  MOV A,#CONFIG12

  LCALL WRITE111

  RET

RDTEMP:

  LCALL RESET

  MOV A,#0CCH

  LCALL WRITE111

  MOV A,#44H

  LCALL WRITE111

  LCALL DL1MS

  LCALL RESET

  MOV A,#0CCH

  LCALL WRITE111

  MOV A,#0BEH

  LCALL WRITE111

  LCALL ERAD111

  MOV TEMPL,A

  LCALL ERAD111

  MOV TEMPH,A

  RET

RESET:

LA:

  SETB DAT

  MOV 52H,#200

LB:

  CLR DAT

  DJNZ 52H,LB

  SETB DAT

  MOV 52H,#30

LC:

  DJNZ 52H,LC

  CLR C

  ORL C,DAT

  JC LB

  MOV 58H,#80

LD:

  ORL C,DAT

  JC LP

  DJNZ 58H,LD

  SJMP LA

LP:

  MOV 52H,#250

LF:

  DJNZ 52H,LF

  RET

WRITE111:

  MOV 53H,#8

W51HA:

  SETB DAT

  MOV 54H,#8

  RRC A

  CLR DAT

W52HA:

  DJNZ 54H,W52HA

  MOV DAT,C

  MOV 54H,#30

W53HA:

  DJNZ 54H,W53HA

  DJNZ 53H,W51HA

  SETB DAT

  RET

ERAD111:

  CLR EA

  MOV 58H,#8

RD1A:

  CLR DAT

  MOV 54H,#6

  NOP

  SETB DAT

RD2A:

  DJNZ 54H,RD2A

  MOV C,DAT

  RRC A

  MOV 55H,#30

RD3A:

  DJNZ 55H,RD3A

  DJNZ 58H,RD1A

  SETB DAT

  RET


(2)读、写DS1302子程序


;写1302程序WRITE:

  CLR SCLK

  NOP

  SETB RST

  NOP

  MOV A,32H

  MOV R4,#8

WRITE1:

  RRC A   ;送地址给1302

  NOP

  NOP

  CLR SCLK

  NOP

  NOP

  NOP

  MOV IO,C

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  NOP

  DJNZ R4,WRITE1

  CLR SCLK

  NOP

  MOV A,31H

  MOV R4,#8

WRITE2:

  RRC A

  NOP     ;送数据给1302

  CLR SCLK

  NOP

  NOP

  MOV IO,C

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  NOP

  DJNZ R4,WRITE2

  CLR RST

  RET

;读1302程序

READ:

  CLR SCLK

  NOP

  NOP

  SETB RST

  NOP

  MOV A,32H

  MOV R4,#8

READ1:

  RRC A   ;送地址给1302

  NOP

  MOV IO,C

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  NOP

  NOP

  CLR SCLK

  NOP

  NOP

  DJNZ R4,READ1

  MOV R4,#8

READ2:

  CLR SCLK

  NOP ;从1302中读出数据

  NOP

  NOP

  MOV C,IO

  NOP

  NOP

  NOP

  NOP

  NOP

  RRC A

  NOP

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  DJNZ R4,READ2

  MOV 31H,A

  CLR RST

  RET


系统程序清单


CONFIG12 EQU 7FH

  TEMPH EQU 21H

  TEMPL EQU 20H

  REG2 EQU 22H

  REG3 EQU 23H

  REG4 EQU 24H

  DAT EQU P0.7

  SCLK  EQU P3.2

  IO   EQU P3.3

  RST  EQU P3.4

  year DATA 66H

  month DATA 65H

  week DATA 64H

  day  DATA 63H

  hour DATA 62H

  mintue DATA 61H

  second DATA 60H

  ORG 0000H

  LJMP  START

  ORG 001BH

  LJMP INTT1

START:             ;初值

  LCALL ZJ

  SETB EA

  MOV SCON,#00H    ; 串行输出,方式0

  MOV TMOD,#10H    ;计数器1,方式1

  MOV TL1,#00H

  MOV TH1,#00H

  MOV 32H,#8EH

  MOV 31H,#00H     ;允许写1302

  LCALL WRITE

  MOV 32H,#90H

  MOV 31H,#0A6H   ;1302充电,充电电流1.1MA

  LCALL WRITE

  ;主程序

MAIN1:

  MOV 32H,#8DH    ;读出年

  LCALL  READ

  MOV year,31H

  MOV 32H,#8BH   ;读出星期

  LCALL READ

  MOV week,31H

  MOV 32H,#89H   ;读出月

  LCALL READ

  MOV month,31H

  MOV 32H,#87H  ;读出日

  LCALL READ

  MOV day,31H

  MOV 32H,#85H  ;读出小时

  LCALL READ

  MOV hour,31H

  MOV 32H,#83H  ;读出分钟

  LCALL READ

  MOV mintue,31H

  MOV 32H,#81H  ;读出秒

  LCALL READ

  MOV second,31H

  ;~~~~~~~~~~~~分离缓存~~~~~~~~

  MOV R0,year    ;年分离,送显示缓存

  LCALL DIVIDE

  MOV 7BH,R1

  MOV 4BH,R1

  MOV 7CH,R2

  MOV 4CH,R2

  MOV 78H,week

  MOV 48H,week

  MOV R0,month  ;月分离,送显示缓存

  LCALL DIVIDE

  MOV 79H,R1

  MOV 49H,R1

  MOV 7AH,R2

  MOV 4AH,R2

  MOV R0,day   ;日分离,送显示缓存

  LCALL DIVIDE

  MOV 76H,R1

  MOV 46H,R1

  MOV 77H,R2

  MOV 47H,R2

  MOV R0,hour ;小时分离,送显示缓存

  LCALL DIVIDE

  MOV 74H,R1

  MOV 44H,R1

  MOV 75H,R2

  MOV 45H,R2

  MOV R0,mintue ;分钟分离,送显示缓存

  LCALL DIVIDE

  MOV 72H,R1

  MOV 42H,R1

  MOV 73H,R2

  MOV 43H,R2

  MOV R0,second  ;秒分离,送显示缓存

  LCALL  DIVIDE

  MOV 70H,R1

  MOV 40H,R1

  MOV 71H,R2

  MOV 41H,R2

  CLR EA

  LCALL TOUTOU

  SETB EA

  LCALL DISPLAY

  LCALL GENGXIAN    ;更新农历程序

  JNB P0.1,SETG111

  JNB F0,SSS

  setb P0.4         ;非闰月,则p0.4清零,指示灯亮

  LJMP MAIN1

SETG111:

  LJMP SETG

SSS:

  clr P0.4   ;闰月,则p0.4置位,指示灯不亮

  LJMP MAIN1

;~~~~~~~~~~~~~~  温度

TOUTOU:

  LCALL CHUSHI

  LCALL RDTEMP

  MOV A,TEMPL

  ANL A,#11110000B

  MOV TEMPL,A

  MOV A,TEMPH

  ANL A,#00000111B

  ORL A,TEMPL

  SWAP A

  MOV 25H,A

  MOV A,25H

  MOV B,#64H

  DIV AB

  MOV A,B

  MOV B,#0AH

  DIV AB

  SWAP A

  ORL A,B

  MOV 10H,A

  RET

CHUSHI:

  LCALL RESET

  MOV A,#0CCH

  LCALL WRITE111

  MOV A,#4EH

  LCALL WRITE111

  MOV A,#CONFIG12

  LCALL WRITE111

  RET

RDTEMP:

  LCALL RESET

  MOV A,#0CCH

  LCALL WRITE111

  MOV A,#44H

  LCALL WRITE111

  LCALL DL1MS

  LCALL RESET

  MOV A,#0CCH

  LCALL WRITE111

  MOV A,#0BEH

  LCALL WRITE111

  LCALL ERAD111

  MOV TEMPL,A

  LCALL ERAD111

  MOV TEMPH,A

  RET

RESET:

LA:

  SETB DAT

  MOV 52H,#200

LB:

  CLR DAT

  DJNZ 52H,LB

  SETB DAT

  MOV 52H,#30

LC:

  DJNZ 52H,LC

  CLR C

  ORL C,DAT

  JC LB

  MOV 58H,#80

LD:

  ORL C,DAT

  JC LP

  DJNZ 58H,LD

  SJMP LA

LP:

  MOV 52H,#250

LF:

  DJNZ 52H,LF

  RET

WRITE111:

  MOV 53H,#8

W51HA:

  SETB DAT

  MOV 54H,#8

  RRC A

  CLR DAT

W52HA:

  DJNZ 54H,W52HA

  MOV DAT,C

  MOV 54H,#30

W53HA:

  DJNZ 54H,W53HA

  DJNZ 53H,W51HA

  SETB DAT

  RET

ERAD111:

  CLR EA

  MOV 58H,#8

RD1A:

  CLR DAT

  MOV 54H,#6

  NOP

  SETB DAT

RD2A:

  DJNZ 54H,RD2A

  MOV C,DAT

  RRC A

  MOV 55H,#30

RD3A:

  DJNZ 55H,RD3A

  DJNZ 58H,RD1A

  SETB DAT

  RET

;公历设置程序~~~~~~~~~~~~~~~~~~~~~

SETG :

  SETB TR1

  SETB ET1

  MOV 32H,#8EH

  MOV 31H,#00H      ;允许写1302

  LCALL WRITE

  MOV 32H,#80H

  MOV 31H,#80H      ;1302停止振荡

  LCALL WRITE

GWAIT:   ;~~~~~~~~~~~~~~~~~~

  LCALL DISPLAY

  JNB P0.1,GWAIT

SETG1:

  LCALL DISPLAY

  JNB P0.1,SETG2

  JNB P0.2,GADDYEAR

  JNB P0.3,JIANYEAR

  AJMP SETG1

GADDYEAR:

  MOV R7,66H      ;年加一

  LCALL ADD1

  MOV 66H,A

  CJNE A,#51H,GADDYEAR1

  MOV 66H,#00H

  AJMP GADDYEAR1

JIANYEAR:

  MOV R7,66H      ;年减一

  LCALL JIAN1

  MOV 66H,A

  CJNE A,#00H,GADDYEAR1

  MOV 66H,#51H

GADDYEAR1:

  MOV 32H,#8CH    ;年值送人1302

  MOV 31H,66H

  LCALL WRITE

  MOV R0,66H

  LCALL DIVIDE    ;年分离送显示缓存

  MOV 4BH,R1

  MOV 7BH,R1

  MOV 4CH,R2

  MOV 7CH,R2

WAITT1:     ;~~~~~~~~~~~~~~~~

  LCALL DISPLAY

  JNB P0.2,WAITT1

  JNB P0.3,WAITT1

  AJMP SETG1

SETG2:

  SETB 0AH         ;调月时闪标志

GWAIT2:

  LCALL DISPLAY

  JNB P0.1,GWAIT2

SETG3:

  LCALL DISPLAY

  JNB P0.1,SETG4

  JNB P0.2,GADDMONTH

  JNB P0.3,JIANMONTH

  AJMP SETG3

GADDMONTH:

  MOV R7,65H     ;月加一

  LCALL ADD1

  MOV 65H,A

  CJNE A,#13H,GADDMONTH1

  MOV 65H,#01H

  AJMP GADDMONTH1

JIANMONTH:

  MOV R7,65H     ;月减一

  LCALL JIAN1

  MOV 65H,A

  CJNE A,#00H,GADDMONTH1

  MOV 65H,#12H

GADDMONTH1:

  MOV 32H,#88H  ;月值送人1302

  MOV 31H,65H

  LCALL WRITE

  MOV R0,65H

  LCALL DIVIDE  ;月分离,送显示缓存

  MOV 79H,R1

  MOV 49H,R1

  MOV 7AH,R2

  MOV 4AH,R2

WAITT2:  ;~~~~~~~~~~~~~~~~~~~~

  LCALL DISPLAY

  JNB P0.2,WAITT2

  JNB P0.3,WAITT2

  AJMP SETG3

SETG4:

  SETB 0BH    ;调日时闪标志

GWAIT4:

  LCALL DISPLAY

  JNB P0.1,GWAIT4

SETG5:

  LCALL DISPLAY

  JNB P0.1,SETG6

  JNB P0.2,GADDDAY

  JNB P0.3,JIANDAY

  AJMP SETG5

GADDDAY:

  MOV R7,63H     ;日加一

  LCALL ADD1

  MOV 63H,A

  CJNE A,#32H,GADDDAY1

  MOV  63H,#01H

JIANDAY:

  MOV R7,63H     ;日减一

  LCALL JIAN1

  MOV 63H,A

  CJNE A,#00H,GADDDAY1

  MOV  63H,#31H

GADDDAY1:

  MOV 32H,#86H ;日值送人1302

  MOV 31H,63H

  LCALL WRITE

  MOV R0,63H

  LCALL DIVIDE  ;日分离,送显示缓存

  MOV 76H,R1

  MOV 46H,R1

  MOV 77H,R2

  MOV 47H,R2

WAITT3:    ;~~~~~~~~~~~~~~~~~

  LCALL DISPLAY

  JNB P0.2,WAITT3

  JNB P0.3,WAITT3

  AJMP SETG5

SETG6:

  SETB 0CH    ;调星期时闪标志

GWAIT6:

  LCALL DISPLAY

  JNB P0.1,GWAIT6

SETG7:

  LCALL DISPLAY

  JNB P0.1,SETG8

  JNB P0.2,GADDWEEK

  JNB P0.3,JIANWEEK

  AJMP SETG7

GADDWEEK:

  MOV R7,64H       ;星期加一

  LCALL ADD1

  MOV 64H,A

  CJNE A,#07H,GADDWEEK1

  MOV  64H,#00H

  AJMP GADDWEEK1

JIANWEEK:

  MOV R7,64H       ;星期减一

  LCALL JIAN1

  MOV 64H,A

  CJNE A,#00H,GADDWEEK1

  MOV  64H,#06H

GADDWEEK1:

  MOV 32H,#8AH

  MOV 31H,64H     ;星期值送人1302

  LCALL WRITE

  MOV R0,64H

  LCALL DIVIDE   ;星期值分离送显示缓存

  MOV 48H,R1

  MOV 78H,R1

WAITT4:       ;~~~~~~~~~~~~~~~ ~~~~~

  LCALL DISPLAY

  JNB P0.2,WAITT4

  JNB P0.3,WAITT4

  AJMP SETG7

SETG8:

  SETB 0DH       ;调小时时闪标志

GWAIT8:

  LCALL DISPLAY

  JNB P0.1,GWAIT8

SETG9:

  LCALL DISPLAY

  JNB P0.1,SETG10

  JNB P0.2,GADDHOUR

  JNB P0.3,JIANHOUR

  AJMP SETG9

GADDHOUR:

  MOV R7,62H        ;小时加一

  LCALL ADD1

  MOV 62H,A

  CJNE A,#24H,GADDHOUR1

  MOV 62H,#00H

  AJMP GADDHOUR1

JIANHOUR:

  MOV R7,62H        ;小时减一

  LCALL JIAN1

  MOV 62H,A

  CJNE A,#00H,GADDHOUR1

  MOV 62H,#23H

GADDHOUR1:

  MOV 32H,#84H     ;小时值送人1302

  MOV 31H,62H

  LCALL WRITE

  MOV R0,62H

  LCALL DIVIDE      ;小时值分离送显示缓存

  MOV 74H,R1

  MOV 44H,R1

  MOV 75H,R2

  MOV 45H,R2

WAITT5:  ;~~~~~~~~~~~~~~~~~~~~~~~~~

  LCALL DISPLAY

  JNB P0.2,WAITT5

  JNB P0.3,WAITT5

  AJMP SETG9

SETG10:

  SETB 0EH        ;调分时候闪标志

GWAIT10:

  LCALL DISPLAY

  JNB P0.1,GWAIT10

SETG11:

  LCALL DISPLAY

  JNB P0.1,SETGOUT

  JNB P0.2,GADDMINTUE

  JNB P0.3,JIANMINTUE

  AJMP SETG11

GADDMINTUE:

  MOV R7,61H      ;分钟加一

  LCALL ADD1

  MOV 61H,A

  CJNE A,#60H,GADDMINTUE1

  MOV 61H,#00H

  AJMP GADDMINTUE1

JIANMINTUE:

  MOV R7,61H      ;分钟减一

  LCALL JIAN1

  MOV 61H,A

  CJNE A,#00H,GADDMINTUE1

  MOV 61H,#59H

GADDMINTUE1:

  MOV 32H,#82H    ;分钟值送人1302

  MOV 31H,61H

  LCALL WRITE

  MOV R0,61H

  LCALL DIVIDE    ;分钟值分离送显示缓存

  MOV 72H,R1

  MOV 42H,R1

  MOV 73H,R2

  MOV 43H,R2

WAITT6:

  LCALL DISPLAY

  JNB P0.2,WAITT6

  JNB P0.3,WAITT6

  AJMP SETG11

SETGOUT:

  LCALL DISPLAY

  JNB P0.1,SETGOUT

  LCALL GENGXIAN

  MOV 32H,#80H

  MOV 31H,#00H     ;1302晶振开始振荡

  LCALL  WRITE

  MOV 32H,#8EH

  MOV 31H,#80H     ;禁止写入1302

  LCALL  WRITE

  CLR 08H

  CLR 09H

  CLR 0AH

  CLR 0BH

  CLR 0CH

  CLR 0DH

  CLR 0EH

  CLR 0FH

  CLR ET1                 ;关闪中断

  CLR TR1

  LJMP MAIN1

;;闪动调时程序~~~~~~~~~~~~~~~~

INTT1:

  PUSH ACC

  PUSH PSW

GFLASH:

  CPL 0FH

  JB 0FH,GFLASH1

  MOV 7CH,4CH  ;全部显示

  MOV 7BH,4BH

  MOV 7AH,4AH

  MOV 79H,49H

  MOV 78H,48H

  MOV 77H,47H

  MOV 76H,46H

  MOV 75H,45H

  MOV 74H,44H

  MOV 73H,43H

  MOV 72H,42H

  MOV 71H,41H

  MOV 70H,40H

GFLASHOUT:

  POP PSW

  POP ACC

  RETI

GFLASH1:

  JB 0AH,GFLASH2 ;调年闪

  MOV 7CH,#0FH

  MOV 7BH,#0FH

  AJMP GFLASHOUT

GFLASH2:

  JB 0BH,GFLASH3 ;调月闪

  MOV 7AH,#0FH

  MOV 79H,#0FH

  AJMP GFLASHOUT

GFLASH3:

  JB 0CH,GFLASH4 ;调日闪

  MOV 77H,#0FH

  MOV 76H,#0FH

  AJMP GFLASHOUT

GFLASH4:

  JB 0DH,GFLASH5 ;调星期闪

  MOV 78H,#0FH

  AJMP GFLASHOUT

GFLASH5:

  JB 0EH,GFLASH6 ;调小时闪

  MOV 75H,#0FH

  MOV 74H,#0FH

  AJMP GFLASHOUT

GFLASH6:

  MOV 73H,#0FH  ;调分钟闪

  MOV 72H,#0FH

  AJMP GFLASHOUT

;加一程序~~~~~~~~~~~~~~~~~~~~~~~~~

ADD1:

  MOV A,R7

  ADD A,#1

  DA A

  RET

;减一程序~~~~~~~~~~~~~~~~~~~~~~~~~

JIAN1:

  MOV A,R7

  DEC A

  CJNE A,#4FH,KK1

  MOV A,#49H

KK1:

  CJNE A,#3FH,KK2

  MOV A,#39H

KK2:

  CJNE A,#2FH,KK3

  MOV A,#29H

KK3:

  CJNE A,#1FH,KK4

  MOV A,#19H

KK4:

  CJNE A,#0FH,KK5

  MOV A,#09H

KK5:

  RET

;分离程序~~~~~~~~~~~~~~~~~~~~~~~~~

DIVIDE:

  MOV A,R0

  ANL A,#0FH

  MOV R1,A

  MOV A,R0

  SWAP A

  ANL A,#0FH

  MOV R2,A

  RET

;写1302程序~~~~~~~~~~~~~~~~~~~~~~~~~~

WRITE:

  CLR SCLK

  NOP

  SETB RST

  NOP

  MOV A,32H

  MOV R4,#8

WRITE1:

  RRC A     ;送地址给1302

  NOP

  NOP

  CLR SCLK

  NOP

  NOP

  NOP

  MOV IO,C

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  NOP

  DJNZ R4,WRITE1

  CLR SCLK

  NOP

  MOV A,31H

  MOV R4,#8

WRITE2:

  RRC A

  NOP     ;送数据给1302

  CLR SCLK

  NOP

  NOP

  MOV IO,C

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  NOP

  DJNZ R4,WRITE2

  CLR RST

  RET

;读1302程序~~~~~~~~~~~~~~~~~~~~~~~~~

READ:

  CLR SCLK

  NOP

  NOP

  SETB RST

  NOP

  MOV A,32H

  MOV R4,#8

READ1:

  RRC A    ;送地址给1302

  NOP

  MOV IO,C

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  NOP

  NOP

  CLR SCLK

  NOP

  NOP

  DJNZ R4,READ1

  MOV R4,#8

READ2:

  CLR SCLK

  NOP    ;从1302中读出数据

  NOP

  NOP

  MOV C,IO

  NOP

  NOP

  NOP

  NOP

  NOP

  RRC A

  NOP

  NOP

  NOP

  NOP

  SETB SCLK

  NOP

  DJNZ R4,READ2

  MOV 31H,A

  CLR RST

  RET

;BCD码转换为10进制程序~~~~~

BCD_10:

  MOV A,R0

  ANL A,#0FH

  MOV R1,A  ;高位×10, 加低位

  MOV A,R0

  SWAP A

  ANL A,#0FH

  MOV B,#10

  MUL AB

  ADD A,R1

  MOV R0,A

  RET

;查一年数据程序~~~~~~~~~~~~~~~~

CHECKMONTH:

  LCALL BCD_10

;农历和公历为同一年,

;NEW此时R2中的值为FFH时,R3有值,否则为0

NEW:

  NOP

M1:

  MOV A,R2   ;R2减一月天数

  CLR C

  SUBB A,#29

  MOV R1,A

  MOV A,R6

  JB ACC.6,SM11

  MOV A,R2

  CLR C

  SUBB A,#30

  MOV R1,A

SM11:

  JC SM12

  MOV A,R1       ;R2减1月天数,够减

  MOV R2,A       ;转二月

  AJMP M2

SM12:

  CJNE R3,#00H,M13 ;R2减1月天数

  LJMP Y1           ;不够减,判R3为0否

M13:

  MOV A,R2          ;不为0,R3加到R2中

  ADD A,R3          ;再让一月减

  MOV R2,A          ;还不够,则转Y1

  MOV R3,#00H

  AJMP M1

M2:

  CLR C         ;R2减一月天数,够减

  MOV A,R2    ;转三月

  SUBB A,#29

  MOV R1,A

  MOV A,R6

  JB ACC.5,M21

  MOV A,R2

  CLR C

  SUBB A,#30

  MOV R1,A

M21:

  JC M22

  MOV A,R1  ;R2减2月天数,够减

  MOV R2,A

  AJMP MM2

M22:

  CJNE R3,#00H,M23  ;R2减2月天数

  LJMP Y2         ;不够减,判,R3为0否

M23:

  MOV A,R2        ;不为0,R3加到R2中

  ADD A,R3        ;再让二月减

  MOV R2,A        ;还不够,则转Y2

  MOV R3,#00H

  AJMP M2

MM2:

  LCALL CHECKRE  ;查2月,如果不为闰月

  CJNE A,#02H,M3  ;转3月

RM2:

  MOV A,R4

  ANL A,#0FH

  JNZ RM21

  MOV A,R2

  CLR C

  SUBB A,#30

  MOV R1,A

  AJMP RM22

RM21:

  MOV A,R2

  CLR C

  SUBB A,#29

  MOV R1,A

RM22:

  JC RM23

  MOV A,R1  ;R2减闰2月天数,够减

  MOV R2,A   ;转3月

  AJMP M3

RM23:

  CJNE R3,#00H,RM24 ;R2减闰2月天数

  LJMP RY2      ;不够减,判,R3为0否

RM24:

  MOV A,R2        ;不为0,R3加到R2中

  ADD A,R3        ;再让闰2月减

  MOV R3,#00H     ;还不够,则转RY2

  SUBB A,#30

  MOV R1,A

M121:

  CJNE R3,#00H,M122  ;R2减12月天数

  LJMP Y12           ;不够减,判,R3为0否

M122:

  MOV A,R2           ;不为0,R3加到R2中

  ADD A,R3           ;再让12月减

  MOV R2,A           ;还不够,则转Y12

  MOV R3,#00H

  LJMP M12

Y1:

  MOV A,R2

  MOV R0,A       ;R2中为日的值

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#01H

  CLR F0    ;非闰月

  LJMP S_PLAY

Y2:

  CJNE R2,#00H,Y21

  MOV A,R6      ;R2中为0,则为前一个月

  MOV 56H,#29H  ;的的最后一天

  JB ACC.6,Y22

  MOV 56H,#30H

Y22:

  MOV 57H,#01H

  CLR F0

  LJMP S_PLAY

Y21:

  MOV A,R2

  MOV R0,A     ;R2中为日的值

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#02H

  CLR F0

  LJMP S_PLAY

RY2:

  CJNE R2,#00H,RY21

  MOV 56H,#29H  ;R2中为0,则为前一个月

  MOV A,R6      ;的的最后一天

  JB ACC.5,RY22

  MOV 56H,#30H

RY22:

  MOV 57H,#02H

  CLR F0

  LJMP S_PLAY

RY21:

  MOV A,R2     ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#02H

  SETB F0    ;闰月

  LJMP S_PLAY

Y3:

  CJNE R2,#00H,Y31

  LCALL CHECKRE     ;查前一个月是否为闰月

  CJNE A,#02H,Y32

  MOV 56H,#29H      ;前一个月是闰月

  MOV A,R4

  ANL A,#0FH   ;R2中为0,则为前一个月

  JNZ Y33            ;的的最后一天

  MOV 56H,#30H

  MOV 57H,#02H

  SETB F0

  LJMP S_PLAY

Y33:

  MOV 57H,#02H

  SETB F0

  LJMP S_PLAY

Y32:

  MOV 56H,#29H  ;前一个月不是闰月

  MOV A,R6

  JB ACC.5,Y34

  MOV 56H,#30H

Y34:

  MOV 57H,#02H

  CLR F0

  LJMP S_PLAY

Y31:

  MOV A,R2

  MOV R0,A      ;R2中为日的值

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#03H

  CLR F0

  LJMP S_PLAY

RY3:

  CJNE R2,#00H,RY31

  MOV 56H,#29H

  MOV A,R6

  JB ACC.4,RY32   ;R2中为0,则为前一个月

  MOV 56H,#30H    ;的的最后一天

RY32:

  MOV 57H,#03H

  CLR F0

  LJMP S_PLAY

RY31:

  MOV A,R2       ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#03H

  SETB F0

  LJMP S_PLAY

Y4:

  CJNE R2,#00H,Y41

  LCALL CHECKRE    ;查前一个月是否为闰月

  CJNE A,#03H,Y42

  MOV 56H,#29H     ;前一个月是闰月

  MOV A,R4         ;R2中为0,则为前一个月

  ANL A,#0FH       ;的最后一天

  JNZ Y43

  MOV 56H,#30H

  MOV 57H,#03H

  SETB F0

  LJMP S_PLAY

Y43:

  MOV 57H,#03H

  SETB F0

  LJMP S_PLAY

Y42:

  MOV 56H,#29H  ;前一个月不是闰月

  MOV A,R6

  JB ACC.4,Y44

  MOV 56H,#30H

Y44:

  MOV 57H,#03H

  CLR F0

  LJMP S_PLAY

Y41:

  MOV A,R2       ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#04H

  CLR F0

  LJMP S_PLAY

RY4:

  CJNE R2,#00H,RY41

  MOV 56H,#29H    ;R2中为0,则为前一个月

  MOV A,R6        ;的的最后一天

  JB ACC.2,RY42

  MOV 56H,#30H

RY42:

  MOV 57H,#04H

  CLR F0

  LJMP S_PLAY

RY41:

  MOV A,R2       ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#04H

  SETB F0

  LJMP S_PLAY

Y5:

  CJNE R2,#00H,Y51

  LCALL CHECKRE  ;查前一个月是否为闰月

  CJNE A,#04H,Y52

  MOV 56H,#29H  ;前一个月是闰月

  MOV A,R4     ;R2中为0,则为前一个月

  ANL A,#0FH         ;的最后一天

  JNZ Y53

  MOV 56H,#30H

  MOV 57H,#04H

  SETB F0

  LJMP S_PLAY

Y53:

  MOV 57H,#04H

  SETB F0

  LJMP S_PLAY

Y52:

  MOV 56H,#29H   ;前一个月不是闰月

  MOV A,R6

  JB ACC.2,Y54

  MOV 56H,#30H

Y54:

  MOV 57H,#04H

  CLR F0

  LJMP S_PLAY

Y51:

  MOV A,R2       ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#05H

  CLR F0

  LJMP S_PLAY

RY5:

  CJNE R2,#00H,RY51

  MOV 56H,#29H    ;R2中为0,则为前一个月

  MOV A,R6        ;的最后一天

  JB ACC.1,RY52

  MOV 56H,#30H

RY52:

  MOV 57H,#05H

  CLR F0

  LJMP S_PLAY

RY51:

  MOV A,R2     ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#05H

  SETB F0

  LJMP S_PLAY

Y6:

  CJNE R2,#00H,Y61

  LCALL CHECKRE   ;查前一个月是否为闰月

  CJNE A,#05H,Y62

  MOV 56H,#29H    ;前一个月是闰月

  MOV A,R4     ;R2中为0,则为前一个月

  ANL A,#0FH      ;的最后一天

  JNZ Y63

  MOV 56H,#30H

  MOV 57H,#05H

  SETB F0

  LJMP S_PLAY

Y63:

  MOV 57H,#05H

  SETB F0

  LJMP S_PLAY

Y62:

  MOV 56H,#29H   ;前一个月不是闰月

  MOV A,R6

  JB ACC.1,Y64

  MOV 56H,#30H

Y64:

  MOV 57H,#05H

  CLR F0

  LJMP S_PLAY

Y61:

  MOV A,R2        ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#06H

  CLR F0

  LJMP S_PLAY

RY6:

  CJNE R2,#00H,RY61

  MOV 56H,#29H ;R2中为0,则为前一个月

  MOV A,R6     ;的最后一天

  JB ACC.0,RY62

  MOV 56H,#30H

RY62:

  MOV 57H,#06H

  CLR F0

  LJMP S_PLAY

RY61:

  MOV A,R2     ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#06H

  SETB F0

  LJMP S_PLAY

Y7:

  CJNE R2,#00H,Y71

  LCALL CHECKRE    ;查前一个月是否为闰月

  CJNE A,#06H,Y72

  MOV 56H,#29H     ;前一个月是闰月

  MOV A,R4         ;R2中为0,则为前一个月

  ANL A,#0FH       ;的最后一天

  JNZ Y73

  MOV 56H,#30H

  MOV 57H,#06H

  SETB F0

  LJMP S_pLAY

Y73:

  MOV 57H,#06H

  SETB F0

  LJMP S_PLAY

Y72:

  MOV 56H,#29H   ;前一个月不是闰月

  MOV A,R6

  JB ACC.0,Y74

  MOV 56H,#30H

Y74:

  MOV 57H,#06H

  CLR F0

  LJMP S_PLAY

Y71:

  MOV A,R2        ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#07H

  CLR F0

  LJMP S_PLAY

RY7:

  CJNE R2,#00H,RY71

  MOV 56H,#29H    ;R2中为0,则为前一个月

  MOV A,R5        ;的最后一天

  JB ACC.6,RY72

  MOV 56H,#30H

RY72:

  MOV 57H,#07H

  CLR F0

  LJMP S_PLAY

RY71:

  MOV A,R2      ;R2中为日的值

  MOV R0,A

  LCALL D_BCD

  MOV 56H,A

  MOV 57H,#07H

  SETB F0

  LJMP S_PLAY

Y8:

  CJNE R2,#00H,Y81

  LCALL CHECKRE  ;查前一个月是否为闰月

  CJNE A,#07H,Y82

  MOV 56H,#29H     ;前一个月是闰月

  MOV A,R4     ;R2中为0,则为前一个月

  ANL A,#0FH       ;的最后一天

  JNZ Y83

  MOV 56H,#30H

  MOV 57H,#07H

  SETB F0

  LJMP S_PLAY

Y83:

  MOV 57H,#07H

  SETB F0

  LJMP S_PLAY

Y82:

  MOV 56H,#29H  ;前一个月不是闰月

  MOV A,R5

  JB ACC.6,Y84

  MOV 56H,#30H

Y84:

  MOV 57H,#07H

  CLR F0

  LJMP S_PLAY

Y81:

  MOV A,R2     ;R2中为日的值

DL1MS:

  MOV R6,#14H

DL1:

  MOV R7,#19H

DL2:

  DJNZ R7,DL2

  DJNZ R6,DL1

  RET

;数据表~~~~~~~~~~~~~~~~~~~`~~

TAB:

  DB 35,15H,51H,00H,23,11H,52H,41H,42,12H,65H,00H

  DB 31,11H,32H,00H,21,42H,52H,21H,39,52H,25H,00H

  DB 28,25H,04H,71H,48,66H,42H,00H,37,33H,22H,00H

  DB 25,15H,24H,51H,44,05H,52H,00H,33,22H,65H,00H

  DB 22,21H,25H,41H,40,24H,52H,00H,30,52H,42H,91H

  DB 49,55H,05H,00H,38,26H,44H,00H,27,53H,50H,60H

  DB 46,53H,24H,00H,35,25H,54H,00H,24,41H,52H,41H

  DB 42,45H,25H,00H,31,24H,52H,00H,21,51H,12H,21H

  DB 40,55H,11H,00H,28,26H,21H,61H,47,26H,61H,00H

  DB 36,13H,31H,00H,25,05H,31H,51H,43,12H,54H,00H

  DB 33,51H,25H,00H,22,42H,25H,31H,41,32H,22H,00H

  DB 30,55H,02H,71H,49,55H,22H,00H,38,26H,62H,00H

  DB 27,13H,64H,60H,45,13H,32H,00H,34,12H,55H,00H

  DB 23,10H,53H,51H,42,22H,45H,00H,31,52H,22H,00H

  DB 21,52H,44H,21H,40,55H,44H,00H,29,26H,50H,71H

  DB 47,26H,64H,00H,36,25H,32H,00H,25,23H,32H,50H

  DB 44,44H,55H,00H,32,24H,45H,00H,22,55H,11H,30H

  END



相关推荐