重庆科创职业学院
万年历实训报告
学 院:机 电 学 院
班 级:电信 BK31901
指导老师:阎峻岭 陈帅华
姓 名:彭 晶
实训时间:2012年10月19
万年历实训报告
一、任务目的
通过万年历的设计与制作,进一步熟悉单片机内部定时器、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次后再扫描是否有键被按下
六、心得体会
通过此次万年历的设计与制作,获得了丰富的理论知识,极大地提高了实践能力。不但发挥了团队精神,分工合作,更充分发挥了人的主观能动性。从接到任务开始到较好地完成了作品,我们学到的很多,成长了很多。刚开始,对于任务和要求都不很清晰,思路断断续续的。但最终静下来冷静思考和组员进行讨论,思路也就理顺了反而觉得得心应手了。我知道了凡事要一颗平常的心,不要老想着走捷径,一步一个脚印。
电子设计总结报告
----电子万年历
班级: 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
在社会迅速发展的今天,单片机的的运用已经渗透到我们生活的每个角落,也似乎很难找到哪个领域没有单片机的足迹。智能仪表、医疗器械,导弹的导航装置,智能监控、通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,汽车的安全保障系统,动控制领域的机器人,数码像机、电视机、全自动洗衣机的控制,电话机以及程控玩具、电子宠物等等,这些都离不开单片机。
图 1-1 万年历 图1-2 智能手机 图1-3数码相机
所以,单片机的学习、开发与应用将对于现代社会的发展,经济的繁荣,和提高满足人类日益增长的物质文化需求有着至关重要的作用。也成就了一批又一智能化控制的工程师和科学家。科技越发达,智能化的东西就越多。学习单片机是社会发展的必然需求,也是我们现代高级技工所必须要掌握的技能。
随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。
二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表界的第三次革命。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆和摆轮游丝的机械表或钟。第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到了秒级。第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到了百万分之一秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,他更符合消费者的生活需求,因此,电子万年历的出现带来了钟表计时业跨越性的进步。
(1)在学习了《模拟数字技术和数字电子技术》和《单片机原理》课程后,为了加深对理论知识的理解,学习理论知识在实际中的运用,培养动手能力和解决实际问题的经验并接触专用时钟芯片DS1302,并会用DS1302芯片开发时钟模块,应用到其他系统中去。熟悉protues 和 kiel软件调试程序和仿真。
(2)通过实验提高对单片机的认识。
(3)通过实验提高焊接、布局、电路检查能力。
(4)通过实验提高软件调试能力。
(5)进一步熟悉和掌握单片机的结构及工作原理。
(6)通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。
(7)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。
(8)通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应的工作打下坚实的基础。
(1)具有年、月、日、星期、时、分、秒等功能。
(2)时间与阴、阳历能够自动关联。
(3)具有温度显示功能和温度报警功能。
(4)具备年、月、日、星期、时、分、秒校准功能。
方案一:采用89C51芯片作为硬件核心,内部具有4KB ROM存储空间,能于3V的超低电压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次查吧会对芯片造成一定的损坏。
方案二: 采用AT89C52片内ROM全都采用FlashROM:能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KB ROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或程序的新增功能需要烧入程序时,不需要对芯片进行多次插拔,所以不会对芯片造成损坏。
综上所述,所以采用AT89C52作为主控系统。
方案一:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机相连接时,占用的单片机口线少,但所需要的数码管数量太多,焊接困难极易出错,所以不采用LED数码管作为显示。
方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较合适,如果用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。
方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。
综上所述,我们应该选取LCD液晶显示屏。
方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒技术,采用此种方案虽然减小芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。
方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V-5.5V范围内,2.5V时耗电小于300Ma。
综上所述,我们采用DS1302时钟芯片实现时钟。
方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。
方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。
综上所述,我们采用数字式温度传感器DS18B20。
核心控制体:AT89C52单片机
实时时钟芯片:DS1302
数字式温度传感器:DS18B20
LCD液晶显示屏
总共设有四个按键,为节约资源考虑,每个按键都有多种功能。每个按键分别标号为A,B,C,D.第一次按下B,C,D都没有反应,首先按下A键可选择指针位置,B,C键为加减键,D键为闹钟设置键。B同时又是闹钟报警消除键。操作简单,按键灵活。
本电路是由AT89S52单片机作为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒等进行计时,具有闰年补偿功能,工作电压为2.5V-5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个用于临时存放数据的RAM寄存器。可产生年、月、日、时、分、秒等,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20构成,显示部分为LCD液晶显示屏,能够实现字符与数字同时显示的功能。
图2 系统组成框图图
AT89C52单片机一片,DS1302实时时钟芯片一个,DS18B20数字式温度传感器一个,+5V无源蜂鸣器二个,12MHZ晶振一个,多个按键和开关,常用电容电阻,连接线,三极管,二极管若干,滑动变阻器一个,USB母口一个。
图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口分别控制着蜂鸣器的报警,当温度、时间到达限定值时会发出高低电平脉冲,以至发出报警声音。
图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(读)。
如图6所示。采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。
当系统在正常显示状态下需要进行调整时,按一下切换键进入按键处理中断程序,并且此时默认的是调整年,在液晶显示器上显示N,此时按加或减按钮可以进行加减调整,若再按一下切换键,则跳到月上显示Y,同样可以调整加减,同样的道理,进入日(R)、时(S)、分(F)、秒(M)的调整,最后再按一下切换键时退出中断程序,星期系统自动的调整过来。
图6 温度传感器部分
闹钟模块的接线如图7所示,蜂鸣器用CS9013三极管驱动,蜂鸣器用5V的无源蜂鸣器,并接一个发光二极管作为指示灯,同时在发光二极管前串接个限流电阻,数据端口分别接P1.0,P1.1(由单片机的P1.0,P1.1直接输出驱动)。
图7 蜂鸣器部分
按键部分如图8所示,本设计总的用了四个按扭开关作为键盘,其中一个是复位键,另三个中的其中两个是调整时间增加、减少的键,第三个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间。
图8 按键部分
液晶显示模块如图9所示,字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本设计采用16列*2行的字符型LCD1602带背光的液晶显示屏。
图9 液晶显示部分
USB和外部电源供电电路部分如图10所示。
图10 USB和外部电源供电电路部分
这种设计使得万年历可以接插USB口,从而获取电源,也可外部供给+5V电源。此电路图最大优点就是可以连接多个VCC和GND,方便电路连接。有发光二极管做电源指示灯,方便操作。
图11 主程序流程图
图12计算阳历程序流程图
图13 阴历程序流程图
图14 时间调整程序流程图
本系统以AT89C51为核心部件,使用串行时钟芯片DS1302,实现时间和闹钟的功能设置。通过键盘和液晶显示屏可方便地校对时钟和设置闹钟时间,本系统基本完成了实用电子钟的功能,尽量做到了硬件电路简单稳定,减少电磁干扰和其他环境干扰。在该系统设计,调试完成之后,对最后的成功进行分析,同时结合在调试过程中出现的错误进行综合分析,总结在实际系统设计和调试过程中的宝贵经验。
在系统硬件设计之前,要结合当前系统的发展趋势和现状对系统功能进行定位,使系统在实际应用中具有竞争力。该系统最大的特点就是界面友好,走时准确,和现在使用LED显示数据的万年历相比,体积更小,可以作为轿车车载显示装置,系统采用液晶显示器,可以使系统应用到更加现代化的地方系统具有温度检测功能,可以作为工业温度检测装置,同时可提供温度报警,系统的按键输入功能,可以读取决策,我们可以通过按键发送指令,控制工业现场机器的动作,实现远程控制。
可见,该系统本身不仅具有很大的灵活性,友好的界面,方便的可扩展性,同时,在其基础上的系统市场需求也很客观,工业控制的很多场合对时间要求比较严格,在实际系统中,系统各装置按照预定的时间动作,本系统可以很好的满足这些系统的要求。
通过本次课程设计让我很好的理解了电子万年历的组成部分和工作原理,也更加的激发了我学习单片机的兴趣,使我明白了只有自己亲自动手才能真正地深刻理解并掌握课本上的理论知识,把理论付诸于实践才能牢牢的把课本上的知识变成自己的。本次课程设计也使我认识到了认真、仔细的态度在现在的学习和以后的工作中是多么的重要,“细节决定成败”,因此,从现在开始就要逐步培养自己的认真负责的心态,并养成注重细节的良好习惯。
1 刘 勇 《数字电路》 电子工业出版社 2004
2 陈正振 《电子电路设计与制作》 广西交通职业技术学院信息工程系 2007
3 杨子文 《单片机原理及应用》 西安电子科技大学出版社 2006
4 王法能 《单片机原理及应用》 科学出版社 2004
5 李全利 《单片机原理及接口技术》 高等教育出版社 2009
6 王为青 邱文勋 《51单片机应用开发案例精选》 人民邮电出版社 2007
7 张鹏 王雪梅 《单片机原理与应用实例教程》 海洋出版社 2008
感谢学院给我们提供了一个展现自己的舞台,给我们一次难得煅炼的机会,使得我们的动手能力和专业技能都有了很大的提高。很多课本上的知识了解了不一定能够理解,所以只有在实践中去亲自动手操作的才能够真正的掌握,在本次课程设计确实面临了很多的困难与挫折,但是只要我们能够静下心来慢慢分析、慢慢学习,通过向老师的请教和与同学的探讨,终究能够解决困难。
在做作品的日子里得到了杨老师的悉心指导,在此向我们的指导教师致以诚挚的谢意。感谢提供相关技术帮助的老师和同学,是你们给了我很多无私的支持和帮助,正是由于你们的支持和鼓励才能让我对这次的作品完成有了信心和动力,我在此深表谢意。
电路图
参考程序
(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
重庆电力高等专科学校计算机科学系实训报告一、实训任务:1、看实训要求,计划出自己实训所要用元件,在网上查找资料。2、思考仿真原理图…
实验6基于命令行窗口的日历查询程序综合性实验1引言11实验目的1了解程序开发环境调试工具的使用2掌握小型系统的开发过程学会用C语言…
设计题目电子万年历设计任务与要求1显示年月日时分秒及星期信息2具有可调整日期和时间功能3增加闰年计算功能方案比较方案一系统分为主控…
河南城建学院C语言程序设计课程设计说明书设计题目万年历专业计算机科学与技术班级设计人员张宁博杨文利郭秀丽指导教师张星魏新红张芳芳计…
洛阳理工学院课程设计报告洛阳理工学院单片机课程设计题目姓名学号专业班级指导老师洛阳理工学院课程设计报告目录摘要21课设要求32硬件…
C语言课程设计报告万年历设计人贾伟涛学号20xx010912班级13电信应电班指导老师张伟日期20xx年6月9日内容提要通过大一下…
C语言课程设计报告设计名称C语言课程设计专业班级姓名学号指导教师实习时间成绩目录一设计目的2二设计内容3三详细设计说明4四软件使用…
课程设计评分表课程设计题目:万年历设计C语言课程设计之万年历实验报告分享者:##一、实验题目:万年历设计二、试验时间:20##年1…
哈尔滨工程大学实验报告实验名称电子系统设计实验班级20xx0822学号20xx082228姓名王嘉博实验时间成绩指导教师李北明实验…
xxxxx毕业论文设计开题报告题目基于年历设计学院电气工程学院年级xxx级专业电子信息工程姓名宋飞学号20xx588693指导教师…