基于AT89C51单片机的多功能电子万年历的设计
基于89C51设计的电子万年历

第一章设计要求要求:利用89c51单片机设计万年历,通过LED显示器显示年.月.日.时.分.秒,通过键盘较正时间,能自动计算闰年等。
1.走时准确,可显示年.月.日和时.分.秒;2.可调整公历年.月.日和时.分.秒。
第二章单片机系统简介系统原理图1. 89c51工作原理89c51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
89c2051是一种带2K。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令计划输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89c51是一种高效微控制器,89c2051是它的一种精简版本。
89c单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
(1)主要特性1.与MCS-51兼容4K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:OHz-24MHz三级程序存储器锁定128*8位内部RAM32可编程I/O线2个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路(2)管脚说明A T89C51AT89C51共有40个引脚,引脚的排列顺序为从靠芯片的缺口左边那列逆时针数起,依次为1、2、3、4.。
40,其中芯片的1引脚上有一个凹点。
在单片机的40个引脚中,电源引脚2根,外接晶体振荡器引脚2根,控制引脚4根以及4组8位可编程I/O引脚32根。
1)、主电源引脚(2根)Vcc:电源输入,接+5V电源GND:接地线2)、外接晶振引脚(2根)XTAL1:片内晶振电路的输入端XTAL2:片内晶振电路的输出端3)、控制引脚(4根)RST/VPP:复位引脚,引脚上出现2个机器周期的高电频将使单片机复位ALE/PROG:地址锁存允许信号EA/VPP:程序存储器的内外部选通,接地电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令4)、可编程输入/输出引脚(32根)AT89C51单片机有4组8位可编程I/O口,分别为P0、P1、P2、P3口,每个口有8位(8根引脚),共32根、每一根引脚都可以编程,比如用来控制电机、交通灯等,开发产品就是利用这些可编程引脚来实现我们想要的功能。
基于单片机的万年历设计

嵌入式系统概述题目:基于单片机的万年历设计班级:自动化1304班一、系统功能概述此设计以AT89C51为控制芯片,用RTC定时器实现万年历的控制与设计。
所进行控制的语句是通过C语言实现的,并且用串口助手显示能动态地显示当前时间信息,包括年、月、日、时、分、秒。
二、硬件设计原理图:1.万年历电路图设计如下:三、软件设计:1.设计思路:本设计主要由3大部分电路组成:单片机最小系统电路、时钟显示电路和参数修改电路。
其中单片机最小系统主要由复位电路和时钟电路组成。
设计中,当接收到修改参数的指令,将停止时钟的继续,转而进行指令程序,在指令结束后转回断点处继续进行计时。
2.流程图:四、基于单片机万年历的源代码:#include <reg52.h>#include <intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit IO = P1^0;sbit SCLK = P1^1;sbit RST = P1^2;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit KEY1=P3^4;sbit KEY2=P3^5;sbit KEY3=P3^6;uchar*WEEK[]={"SUN","***","MON","TUS","WEN"," THU","FRI","SAT"};uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "};uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};uchar DateTime[7]; //秒,分,时,日,月,周,年ucharflag,flag_1,i,miao,fen,shi,ri,yue,zhou,nian; void DelayMS(uint ms){uchar i;while(ms--){for(i=0;i<120;i++);}}/*********************************************** ******/ //函数名称:Write_A_Byte_TO_DS1302(uchar x)//函数功能: 向1302写入一个字节//入口参数: x//出口参数: 无//调用子程序: 无/*********************************************** ******/void Write_A_Byte_TO_DS1302(uchar x){uchar i;for(i=0;i<8;i++){IO=x&0x01;SCLK=1;SCLK=0;x>>=1;}}void Write_DS1302(uchar add,uchar num) {SCLK=0;RST=0;RST=1;Write_A_Byte_TO_DS1302(add);Write_A_Byte_TO_DS1302(num);RST=0;SCLK=1;}/*********************************************** ******///函数名称:Get_A_Byte_FROM_DS1302()//函数功能: 从1302读一个字节//入口参数: 无//出口参数: b/16*10+b%16 //调用子程序: 无/*********************************************** ******/uchar Get_A_Byte_FROM_DS1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);SCLK=1;SCLK=0;}return b/16*10+b%16;}/*********************************************** ******///函数名称: Read_Data(uchar addr)//函数功能: 指定位置读数据//入口参数: addr//出口参数: dat//调用子程序: Write_Abyte_1302(addr) /*********************************************** ******/uchar Read_Data(uchar addr){uchar dat;RST = 0;SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302();SCLK=1;RST=0;return dat;}/*********************************************** ******///函数名称: GetTime()//函数功能: 读取时间//入口参数: 无//出口参数: 无//调用子程序: 无/*********************************************** ******/void GetTime(){uchar i,addr = 0x81;for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2; }}uchar Read_LCD_State(){uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;}void LCD_Busy_Wait(){while((Read_LCD_State()&0x80)==0x80); DelayMS(5);}void Write_LCD_Data(uchar dat) //写数据到1602{LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1); EN=0;}void Write_LCD_Command(uchar cmd) //写命令{LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1); EN=0;}void Init_LCD() //1602 初始化{Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1);}void Set_LCD_POS(uchar p){Write_LCD_Command(p|0x80);}void Display_LCD_String(uchar p,uchar *s) //1602显示{uchar i;Set_LCD_POS(p);for(i=0;i<16;i++){Write_LCD_Data(s[i]);DelayMS(1);}}void write_com(uchar com){RS=0;P0=com;DelayMS(5);EN=1;DelayMS(5);EN=0;}void write_date(uchar date){RS=1;P0=date;DelayMS(5);EN=1;DelayMS(5);EN=0;}void display(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void display1(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void Format_DateTime(uchar d,uchar *a) {a[0]=d/10+'0';a[1]=d%10+'0';}uchar ZH(uchar dat){uchar tmp;tmp=dat/10;dat=dat%10;dat=dat+tmp*16;return dat;}void Keyscan(){flag_1=1;while(flag_1){if(KEY1==0){DelayMS(5);while(!KEY1);flag=(flag+1)%8;switch(flag){case(1): Write_LCD_Command(0x0f);Write_LCD_Command(0x80+0x40+11);break;case(2):Write_LCD_Command(0x80+0x40+8);break;case(3):Write_LCD_Command(0x80+0x40+5);break;case(4):Write_LCD_Command(0x80+13);break;case(5):Write_LCD_Command(0x80+11);break;case(6):Write_LCD_Command(0x80+8);break;case(7):Write_LCD_Command(0x80+5);break;case(0): flag_1=0;Write_LCD_Command(0x0c);//miaoWrite_DS1302(0x8e,0x00);Write_DS1302(0x80,ZH(DateTime[0]));Write_DS1302(0x8e,0x80);//fenWrite_DS1302(0x8e,0x00);Write_DS1302(0x82,ZH(DateTime[1]));Write_DS1302(0x8e,0x80);//shiWrite_DS1302(0x8e,0x00);Write_DS1302(0x84,ZH(DateTime[2]));Write_DS1302(0x8e,0x80);//riWrite_DS1302(0x8e,0x00);Write_DS1302(0x86,ZH(DateTime[3]));Write_DS1302(0x8e,0x80);// yueWrite_DS1302(0x8e,0x00);Write_DS1302(0x88,ZH(DateTime[4]));Write_DS1302(0x8e,0x80);//nianWrite_DS1302(0x8e,0x00);Write_DS1302(0x8c,ZH(DateTime[6]));Write_DS1302(0x8e,0x80);break;}}if(flag!=0){if(KEY2==0){DelayMS(5);if(KEY2==0)while(!KEY2);if(flag==1) //miao{DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);}if(flag==2) //fen{DateTime[1]++;if(DateTime[1]==60)DateTime[1]=0;write_com(0x80+0x40+8);display(8,DateTime[1]);}if(flag==3) //shi{DateTime[2]++;if(DateTime[2]==24)DateTime[2]=0;write_com(0x80+0x40+5);display(5,DateTime[2]);}/* if(flag==4) //zhou {DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);} */if(flag==5) // ri{DateTime[3]++;if(DateTime[3]==30)DateTime[3]=0;write_com(0x80+11);display1(11,DateTime[3]); }if(flag==6) //yue{DateTime[4]++;if(DateTime[4]==13)DateTime[4]=0;write_com(0x80+8);display1(8,DateTime[4]);}if(flag==7) //nian{DateTime[6]++;if(DateTime[6]==100)DateTime[6]=0;write_com(0x80+5);display1(5,DateTime[6]);}}}if(flag!=0){if(KEY3==0){DelayMS(5);if(KEY3==0)while(!KEY3);if(flag==1) //miao{DateTime[0]--;if(DateTime[0]==-1)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);}if(flag==2) //fen{DateTime[1]--;if(DateTime[1]==-1)DateTime[1]=0;write_com(0x80+0x40+8);display(8,DateTime[1]);}if(flag==3) //shi{DateTime[2]--;if(DateTime[2]==-1)DateTime[2]=0;write_com(0x80+0x40+5);display(5,DateTime[2]);}/* if(flag==4) //zhou {DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);} */if(flag==5) // ri{DateTime[3]--;if(DateTime[3]==-1)DateTime[3]=0;write_com(0x80+11);display1(11,DateTime[3]); }if(flag==6) //yue{DateTime[4]--;if(DateTime[4]==-1)DateTime[4]=0;write_com(0x80+8);display1(8,DateTime[4]);}if(flag==7) //nian{DateTime[6]--;if(DateTime[6]==-1)DateTime[6]=0;write_com(0x80+5);display1(5,DateTime[6]);}}}}}void main() {Init_LCD(); while(1) {EA=1;EX0=1;GetTime();Format_DateTime(DateTime[6],LCD_DSY_BUF FER1+5); //年Format_DateTime(DateTime[4],LCD_DSY_BUF FER1+8); //月Format_DateTime(DateTime[3],LCD_DSY_BUF FER1+11); //日strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTim e[5]]); //周Format_DateTime(DateTime[2],LCD_DSY_BUF FER2+5); //时Format_DateTime(DateTime[1],LCD_DSY_BUF FER2+8); //分Format_DateTime(DateTime[0],LCD_DSY_BUF FER2+11); //秒Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2); }}void int0() interrupt 0{Keyscan();}五、运行结果:。
基于51单片机的电子万年历的设计

1.液晶显示方式。液晶显示效果出众,可以运用菜单项来方便操作,但是在显示时,特别是使用秒表功能时扫描速度跟不上,屏幕会有明显的闪烁。而且由于61板的存储空间有限,液晶显示就不能与语音播抱程序同时实现。这些大大影响了电子万年历的性能。
2.相比液晶显示,8段数码管虽然操作比液晶显示略显繁琐,但可视范围十分宽,而且经济实惠,也不需要复杂的驱动程序。所以最后选择LED数码管显示方案。
256字节内部RAM。
电源控制模式
——时钟可停止和恢复;
——空闲模式;
——掉电模式。
6个中断源。
4个中断优先级。
4个8位I/O口。
全双工增强型UART。
3个16位定时/计数器,T0、T1(标准80C51)和增加的T2(捕获和比较)。
全静态工作方式:0~24MHz。
4.2 时钟电路 DS1302
4.2.1. DS1302的性能特性
如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc大于等于2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302的引脚及内部结构图如图4.1所示,表4.1为各引脚的功能。
DS1302的控制字如图4.2所示。控制字节的最高位(位7)必须是逻辑1;如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。位5~1(A4~A0)指示操作单元的地址。最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。
2 功能要求
1.万年历能用数码管显示阳历年、月、日、星期、[小]时、分、秒并设置指定时间的闹铃。
2.数字式温度计要求测温范围-50~100°C,LED数码管直读显示。
基于AT89C51单片机的多功能电子万年历的设计

1. 前言1.1 课题研究背景伴随着科技的快速发展,时间的流逝,从观察太阳、摆钟到现在电子钟,人类不断的研究,不断的创新纪录。
随着人们的生活水平的提高和生活节奏加快,对时间的要求也越来越高,精准数字计时的消费需求也就越来越多。
二十一世纪的今天,最具有代表性的计时产品就是电子数字万年历,它是近代世界钟表业界的第三次革命。
第一次是摆和摆轮游丝的发明,相对较稳定的机械振荡频率源使钟表的走时差从分级缩小至秒级,代表性的产品是带有摆或摆轮游丝的机械钟或者表。
第二次革命则是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,也使钟表的走时月差从分级缩小到秒级。
第三次革命就是单片机数码计时技术的应用(电子数字万年历),使计时产品的走时日差从分级缩小至1/600万秒,从原有的传统指针计时的方式发展成为人们日常更为熟悉的夜光数字显示方式,直观明了,并且增加了全自动日期、星期、温度以及其他日常附属带来了钟表计时业界跨跃性的进步。
国产的电子万年历有很多种,总体上来说以研究多功能电子数字万年历为主,使万年历除了原有的显示时间,日期等基本功能之外,还具有闹铃,报警等功能。
商家生产的电子数字万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。
本设计为软硬件相结合的一组设计。
在软件设计过程中,应对硬件部分有相关了解,有助于对设计题目的更深了解和软件设计。
要了解一些主要器件的基本功能和作用。
除了采用集成化的时钟芯片之外,利用AT89系列单片机制成万年历电路,采用软硬件结合的方法,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。
AT89C51单片机是由ATMEL公司推出的一种小型单片机。
95年出现在中国市场。
主要特点为采用了Flash存贮器技术,降低了制造成本,其软硬件与MCS-51完全兼容,可以很快被中国广大用户接受。
1 / 331.2课题研究目的与意义二十一世纪是数字化技术高速发展的时期,同时单片机在数字化高速发展的时期扮演着非常重要的地位。
基于51单片机的万年历_毕业设计

基于51单片机的万年历中文摘要本设计万年历以AT89C51为控制中心,与温度传感器DS18B20,时钟芯片DS1302综合应用为一体,不仅能够准确显示时间、日期,闹钟设置,环境温度测量及温度高低温报警等功能。
单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等于一体的器件,只需要外加电源和晶振就可实现对数字信息的处理和控制。
单片机与数字万年历相结合,用于时间显示,温度测试等不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被检测数值的技术指标,从而能够大大提高产品的质量和数量。
关键词:单片机,温度传感器,C语言,液晶显示ABSTRACTThis design USES AT89C51 as calendar control center, and the temperature sensor DS18B20, the clock DS1302 chip integrated application as a whole, and not only be able to accurately display the time, date, alarm, the environment temperature measurement and high temperature, low temperature alarm functions.SCM is a collection of CPU, RAM, ROM, I/O interface and interrupt system is one of the devices, only require additional power can be used for vibration and grain is the process of digital information and control. Single-chip microcomputer and digital calendar, combining for time to show, temperature testing has not only control convenient, simple and flexible configuration advantages, and which could increase the technical index of the tested value, which can greatly improve the quality of the products and quantity.Key words:Single-chip microcomputer, Temperature Sensor,C language,Liquid crystal displ目录第一章前言 (4)1.1系统开发背景及现状 (4)1.2 系统开发的目的 (4)第二章总体设计 (5)2.1 本设计实现的功能和要求 (5)2.2 设计的选择方案和论证 (5)2.2.1单片机芯片的选择方案和论证 (5)2.2.2显示模块选择方案和论证 (5)2.2.3 时钟芯片的选择方案和论证 (6)2.3.4 温度传感器的选择方案与论证 (6)2.3总体设计框图 (6)第三章硬件设计 (8)3.1 主要元器件介绍 (8)3.1.1 单片机简介 (8)3.1.2 传感器DS18B20介绍 (9)3.1.3 LCD1602液晶显示介绍 (10)3.2 各模块设计 (11)3.2.1 主控制电路 (11)3.2.2 LCD1602显示模块设计 (12)3.2.3 DS18B20温度传感器模块 (13)3.2.4 键盘输入模块设计 (13)3.2.5 蜂鸣器模块设计 (13)3.2.6 DS1302时钟电路模块 (14)第四章软件设计 (16)第五章安装与调试 (18)5.1 安装制作 (18)5.2 硬件调试 (18)5.2.1布线的原则与焊接 (18)5.2.2 硬件调试与测试 (19)5.3 软件调试 (19)5.3.1 软件测试仪器 (19)5.3.2 软件调试与测试 (19)5.4 联调 (20)5.5测试结果分析与结论 (21)第六章总结 (22)参考文献 (23)附录A (24)附录B (26)致谢 (28)第一章前言1.1系统开发背景及现状当今世界,知识更新的速度越来越快。
基于AT89C51单片机的多功能电子万年历的设计论文

基于AT89C51单片机的多功能电子万年历的设计AT89C51 SCM-BASED ELCTRONIC DESIGN CALENDAR毕业论文学院名称泸州职业技术学院系部名称电子工程系专业名称应用电子技术2012年12月10日摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。
系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,利用proteus仿真,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。
万年历采用直观的数字显示,可以在1602上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。
此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。
关键字:AT89C51;电子万年历; DS1302;1602目录摘要 (01)第一章绪论 (03)1.1 课题研究的背景 (03)1.2课题解决的主要容 (03)第二章系统的总体设计 (04)2.1系统硬件电路设计 (04)2.1.1系统硬件结构 (04)2.2单片机及其附属电路 (05)2.2.1 MCS-51系列单片机 (05)2.1.2 MCS-51系列单片机的工作条件电路 (08)2.1.3 DS1302 (09)2.1.4 LCD1602显示电路 (10)2.1.5调节电路 (12)第三章系统的软件设计 (12)3.1主程序 (12)3.2 LCD1602的驱动程序 (13)3.3 DS1302的驱动程序 (14)第四章万年历的设计结论 (14)4.1 万年历工作原理 (14)4.2 万年历结构原理图 (15)致 (16)参考文献 (16)附录 (17)附录【1】仿真图片 (17)附录【2】程序代码................................. 17-25第一章绪论1.1 课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
基于AT89C51单片机的多功能电子万年历的设计_毕业设计

本科毕业设计(论文)基于AT89C51单片机的多功能电子万年历的设计AT89C51 SCM-BASED ELCTRONICDESIGN CALENDAR学生姓名学院名称信电工程学院专业名称电子信息工程技术指导教师年月日摘要本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。
系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。
万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。
此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。
关键字AT89C51;电子万年历; DS1302目录第一章引言................................................................................................. 错误!未定义书签。
1.1课题研究的背景 (1)1.2课题的研究目的与意义 (1)1.3课题解决的主要内容 (1)第二章系统的总体设计 (2)2.1系统方案的构想与确定 (2)2.2 器件的选用 (2)2.2.1单片机的选择 (2)第三章系统硬件的设计 (4)3.1系统硬件电路设计 (4)3.1.1系统硬件框图 (4)3.1.2 AT89C51单片机 (4)3.1.3 8位移位寄存器74LS164(串行输入,并行输出) (8)3.1.4 ds1302 (12)第四章系统的软件设计 (15)4.1 主程序 (15)4.2 从1302读取日期和时间程序 (16)4.3系统源代码 (16)第五章 PROTEUS使用 (29)5.1编程环境PROTEUS (29)5.2用PROTEUS ISIS对电子万年历的硬件电路设计 (29)5.3用PROTEUS ISIS进行电子万年历的仿真测试 (33)结论 (36)致谢 (37)参考文献 (38)附录............................................................................................................... 错误!未定义书签。
基于单片机的万年历设计

物理与电子工程学院2011级本科课程设计摘要电子万年历是一种非常广泛的日常计时工具,它不仅能够对时间技术,还能够对日期、温度、湿度等进行显示,所以在现代社会受到广泛应用。
本设计是一个基于AT89C51单片机的多功能日历显示系统,本设计能显示公历年、月、日,以及时、分、秒、温度、星期等信息,而且还具有日期调整、时间校准以及温度采集等功能。
系统所用的时钟日历芯片DS13O2和数字式温度传感器DS18B2O具有高性能、低功耗、接口简单的特点,使本系统电路简化,编程方便,同时功能也很强。
釆用AT89C51单片机的万年历系统可以很好的改善传统采用模拟电路引起的计时不准确,不可靠,一致性差等问题。
本文设计是用单片机为主控制,通过电路仿真而实现的。
在Proteus7软件绘制硬件电路原理图,用Keil软件进行编程与调试,最终生成hex文件,载入单片机,从而实现仿真效果。
本文设计经过最终调试,能够正确显示年、月、日、周、时、分、秒以及温度等所需信息,并能正常使用对日期与时间的调整与校正功能。
系统使用16O2LCD 液晶屏显示信息,界面简洁、直观、易于操作。
关键词:万年历;单片机:AT89C51; DS1302: DS18B20目录1引言 (1)1.1研究的目的和意义 (1)1.2本系统主要研究的内容 (1)2系统方案论证 (2)2. 1控制部分的选择方案与论证 (2)2. 2显示部分的选择方案与论证 (2)2. 3时钟芯片的选择方案与论证 (2)2.4温度传感器的选择方案与论证 (3)2.5电路设计最终方案系统原理及总体结构图 (3)3系统设计 (4)3.1系统硬件仿真原理图 (4)3.2单片机89C51控制模块的设计 (4)3.3 LCD液晶显示模块设计 (7)3. 4 DS1302时钟模块的设计 (9)3.5 DS18B20温度采集模块的设计 (12)4系统调试 (15)4.1硬件调试 (15)4.2软件调试 (15)5结论 (15)参考文献 (16)物理与电子工程学院2011级本科课程设讣17物理与电子工程学院2011级本科课程设计1引言人类的日常生活离不开时间,任何具有周期变化的自然现象都可用来测量时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
. . .. . . 单片机应用系统设计课题:基于AT89C51单片机的多功能电子万年历的设计姓名:班级:学号:指导老师:日期:.. .专目录一.绪言 (3)二.系统总体方案设计 (3)三.硬件系统设计: (4)四.系统软件设计 (5)五.设计总结 (8)六.参考文献 (8)七.附录 (9)一.绪论随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。
万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。
因此,研究万年历及扩大其应用,有着非常现实的意义。
本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。
二.系统总体方案设计1.系统设计硬件框图2.实现的基本原理在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给2.硬件原理图四.系统软件设计仿真过程1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。
3、检查所画电路运行图,确保没有错误以后,加载源程序。
4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。
调节开关进行时间的调节。
当秒的显示间隔快与或慢与实际间隔时,调节石英晶体震荡器的频率参数,从而使秒的间隔达到标准。
然后检查电路其它问题,并对其的各参数进行调整,使之正确。
仿真结果通过对源程序的编译,改正了其中的很多错误,然后运行,保证源程序的正确性。
然后按原理图选择正确合理的电器元件,画出正确的电路图,加载源程序运行,顺利实现了单片机数字电子钟的“小时”、“分钟”、“秒”的显示。
1主程序流程图设计2显示模块流程图基本显示模块设计的重点是由显示代码取得相应的段码、显示段码数据的串行发送,程序流程如图1-11所示。
其中时个位的段码必须加上小数点,即带小数点显示时个位,目的是以小数点符代替时间分割符“-”。
软件秒脉冲发生器其实质是利用了定时器0的定时溢出中断,将它设定为100ms溢出中断,则10次中断的时间正好为1s。
将时间参数设计为100ms的原因有两个:1)根据系统时钟主频为6M的特点,16位定时器最大定时时间为65536×2M(M 为机器周期,这里是2μS),即131ms,取整数100便于计次数;2)如取的太短,如10ms,则定时器频繁中断,干扰系统正常运行效果。
有了秒脉冲发生器,10次中断为1s,秒指示灯闪亮1次,秒变量单元加1,60后分变量单元加1,如果为60分则时变量单元加1。
任何一个变量的变化,则显示刷新一次(更新)。
上述思想的实现均集成在定时器0的中断子程序中。
该设计显示模块流程图如图运行结果学无止境,我们现在所做的一切都还只是一个开始。
主要参考资料:[1] 林志琦.基于Proteus的单片机可视化软硬件仿真[M].:航空航天大学,2006.9[2] 周润景,丽娜.基于PROTEUS的电路及单片机系统设计与仿真[M].:航空航天大学,2006.5[3] 靖武,周灵彬.单片机系统的PROTEUS设计与仿真[M].:电子工业,2007.4[4] 周润景,丽娜.PROTEUS入门实用教程[M].:机械工业,2007.9[5] 戴俊峰.嵌入式系统大屏幕LED点阵显示器[J].现代电子技术,2004,27(19):68-89,72.[6] 寿鹏.基于嵌入式系统的LED信息显示技术研究[J].现代电子技术,2005(1):15-47.[7] 楼然苗,光飞.51系列单片机设计实例[M].:航空航天大学,2003.3[8] 楼然苗,光飞.单片机课程设计指导[M].:航空航天大学,2007.7[9] 贾东耀,汪仁煌. 数字温度传感器在仓库温度检测系统的应用[J]. 传感器世界,2001.[10] DALLAS DS18B20数据手册[Z]..maximic.[11]付旭,方康玲.利用VB6.0实现PC机与单片口通讯[J].微计算机信息,2002,18(10):30-31[12] 江全,丽,岑红蕾.Visual Basic串口通信与测控应用技术实战详解[M].:人民邮电,2007.[13] 法国Humirel公司.HS1101使用说明手册.[14] 太阳人电子.SMC1602A LCM使用说明手册.附录:;*****************************;* 万年历程序*;*****************************;67H(高两位年)66H(低两位年)65H(月)64H(星期);63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日);显示缓冲单元CH~7BH(4CH~4BH)年低位,AH~79H(4AH~49H)月,;78H(48H)星期,H~76H(47H~46H)日,H~74H(45H~44H)时,;73H72H(43H~42H)分,H~70H(41H~40H)秒,EH~5DH(55H~54H)农历年;5CH~5BH(53H~52H)农历月,AH~59H(51H~50H)农历日;闰年标志为F0,定时器T1为调整时候闪烁用; LCALL GETWEEK; MOV 78H,WEEkSCLK BIT P3.2IO BIT P3.3RST BIT P3.4TIME_YEAR DATA 66HTIME_MONTH DATA 65HWEEK DATA 64HTIME_DAY DATA 63HHOUR DATA 62HMINTUE DATA 61HSECOND DATA 60HDS1302_ADDR DATA 32HDS1302_DATA DATA 31Hstart_year EQU 01; 定义查询表起始年份,01--199 表示1901-2099 年week_byte1 DATA 3AHWEEK_BYTE2 DATA 3BHWEEK_BYTE3 DATA 3CHWEEK_BYTE4 DATA 3DHWEEK_BYTE5 DATA 3EHCONvert_year DATA 6dhCONvert_month DATA 6eh ;BIT7 为1 表示闰月CONvert_date DATA 6fhtemp_Byte1 DATA 68htemp_Byte2 DATA 69htemp_Byte3 DATA 6Ahtemp_Byte4 DATA 6Bhtemp_Byte5 DATA 6Ch; RS EQU P3.0; RW EQU P3.1; E EQU P3.5ORG 0000HAJMP STARTORG 0003HRETIORG 000BHLJMP INTT2ORG 001BHLJMP INTT1ORG 30H;************************************;* 主程序*;************************************start:mov R1,#254h ;清RAM 128单元mov r0,#2mov a,#0clear:mov r0,ainc r0djnz r1,clearmov r0,AMOV R1,AMOV R7,#10 ;计数器初始计数值..SETB EA ;打开总中断; MOV T2CON,#0;MOV T2MOD,#0; MOV TH2,#0;MOV TL2,#0;SETB TR2MOV SCON,#00H ;串行输出,方式MOV TMOD,#11H ;计数器,方式;计数器,方式MOV TL1,#00H ;计数器初值65.5MS中断一次MOV TH1,#00HMOV TH0,#3CH ;计数器50MS中断一次MOV TL0,#0B0HCLR P0.6MOV DS1302_ADDR,#8EHMOV DS1302_DATA,#00H ;允许协LCALL WRITEMOV DS1302_ADDR,#90HMOV DS1302_DATA,#0A6H ;1302充电,充电电流.1mAlcall writeSETB ET0 ;打开秒闪定时器SETB TR0main1: MOV DS1302_ADDR,#8DH ;READ OUT YEARLCALL READMOV TIME_YEAR,DS1302_DATAMOV DS1302_ADDR,#8BH ;READ OUT WEEKLCALL READMOV WEEK,DS1302_DATAMOV DS1302_ADDR,#89H ;READ OUT MONTHLCALL READMOV TIME_MONTH,DS1302_DATAMOV DS1302_ADDR,#87H ;READ OUT DAYLCALL READMOV TIME_DAY,DS1302_DATAMOV DS1302_ADDR,#85H ;READ OUT HOURLCALL READMOV HOUR,DS1302_DATA.. MOV DS1302_ADDR,#83H ;READ OUT MINTUE LCALL READMOV MINTUE,DS1302_DATAMOV DS1302_ADDR,#81H ;READ OUTSECONDLCALL READMOV SECOND,DS1302_DATAMOV R0,TIME_YEAR ;年分离,送显示缓存LCALL DIVIDEMOV 7BH,R1MOV 4BH,R1MOV 7CH,R2MOV 4CH,R2MOV 78H,WEEKMOV 48H,WEEKMOV R0,TIME_MONTH ;月分离,送显示缓存LCALL DIVIDEMOV 79H,R1MOV 49H,R1MOV 7AH,R2MOV 4AH,R2MOV R0,TIME_DAY ;日分离,送显示缓存LCALL DIVIDEMOV 76H,R1MOV 46H,R1MOV 77H,R2MOV 47H,R2MOV R0,HOUR ;小时分离,送显示缓存LCALL DIVIDEMOV 74H,R1MOV 44H,R1MOV 75H,R2MOV 45H,R2MOV R0,MINTUE ;分分离,送显示缓存LCALL DIVIDEMOV 72H,R1MOV 42H,R1MOV 73H,R2MOV 43H,R2MOV R0,SECOND ;秒分离,送显示缓.存LCALL DIVIDEMOV 70H,R1MOV 40H,R1MOV 71H,R2MOV 41H,R2LCALL GENGXIN ;更新农历程序MOV R0,CONVERT_MONTH ;农历月分离,送显示缓存LCALL DIVIDEMOV 5BH,R1MOV 52H,R1MOV 5CH,R2MOV 53H,R2MOV R0,CONVERT_DATELCALL DIVIDEMOV 59H,R1MOV 50H,R1MOV 5AH,R2MOV 51H,R2LCALL GETWEEKMOV 78H,WEEKLCALL DISPLAYGOON:JNB P1.1,SETGG ;调整日历;JNB P1.4,QIDONG ;启动秒钟指示灯; LCALL QIDONGAAA: JNB F0,SSSCLR P1.0 ;闰月,则p1.0清,指示灯亮LJMP MAIN1SSS: SETB P1.0 ;非闰月,则p1.0置位,指示灯灭LJMP MAIN1SETGG: LJMP SETGQIDONG: LCALL DISPLAY ;秒钟指示灯开启/关闭;JNB P1.4,QIDONG; LCALL QIDONGCPL 30H ;30JB 30H,ONCLR TR0CLR ET0AJMP QDOUTON: SETB TR0SETB ET0QDOUT: AJMP AAA;*****************************...;* 秒灯闪烁程序*;*****************************INTT2: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低位初值修正MOV TL0,A ;重装初值(低位修正值)MOV A,#3CH ;高位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高位修正值)SETB TR0 ;开启定时器T0CLR PSW.4DJNZ R7,INTT2OUTMOV R7,#10CPL 20HJB 20H,S1SETB P0.7 ; 秒指示灯闪烁AJMP INTT2OUTS1:CLR P0.7INTT2OUT: POP PSW ;出栈POP ACCSETB ET0RETI;*********************************;* 写程序*;*********************************WRITE: CLR SCLKNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8WRITE1: RRC A ;送地址给NOPNOPCLR SCLKNOPNOPNOPMOV IO,CSETB SCLK ;送入地址在时钟上升沿有效..NOPNOPNOPNOPDJNZ R4,WRITE1CLR SCLKNOPMOV A,DS1302_DATAMOV R4,#8WRITE2: RRC ANOP ;送数据给,时钟上升沿,数据输入CLR SCLKNOPNOPMOV IO,CNOPNOPNOPSETB SCLKNOPNOPDJNZ R4,WRITE2CLR RSTRET;*******************************;* 读程序*;*******************************READ: CLR SCLKNOPNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8READ1: RRC ANOPMOV IO,CNOPNOPNOPSETB SCLK ;送入地址在时钟上升沿有效NOPNOPNOP..;CLR SCLKCLR SCLKNOPNOPDJNZ R4,READ1MOV R4,#8READ2: CLR SCLKNOPNOPNOPMOV C,IONOPNOPNOPNOPNOP ;从ds1302中读取数据,时钟下降沿有效RRC ANOPNOPNOPNOPSETB SCLKNOPDJNZ R4,READ2MOV DS1302_DATA,ACLR RSTRET;*******************************;* 公历设置程序*;*******************************SETG: CLR TR0CLR ET0SETB TR1SETB ET1CLR 08HCLR 09HCLR 0AHCLR 0BHCLR 0CHCLR 0DHCLR 0EHCLR 0FHMOV DS1302_ADDR,#8EHMOV DS1302_DATA,#00H ;允许写..LCALL WRITEMOV DS1302_ADDR,#80HMOV DS1302_DATA,#80H ;1302停止振荡LCALL WRITEGWAIT: LCALL DISPLAYJNB P1.1,GWAITSETG1: LCALL DISPLAYJNB P1.1,SETGMONJNB P1.3,GADDYEARJNB P1.4,GDECYEARJNB F0,SSSYEARCLR P1.0 ;闰月,则p1.1清,指示灯亮LJMP SETG1SSSYEAR: SETB P1.0AJMP SETG1SETGMON: AJMP SETG2GADDYEAR: MOV R7,66H ;年加LCALL ADD1MOV 66H,AGADDYEAR1: LCALL GETWEEK ;年加同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#8CH ;年值送MOV DS1302_DATA,66HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,66HLCALL DIVIDE ;年分离送显示缓冲MOV 4BH,R1MOV 7BH,R1MOV 4CH,R2MOV 7CH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT1: LCALL DISPLAYJNB P1.3,WAIT1AJMP SETG1.. GDECYEAR: MOV R7,66H ;年减LCALL DEC1MOV 66H,ALCALL GETWEEK ;年减同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#8CH ;年值送MOV DS1302_DATA,66HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,66HLCALL DIVIDE ;年分离送显示缓冲MOV 4BH,R1MOV 7BH,R1MOV 4CH,R2MOV 7CH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT2: LCALL DISPLAYJNB P1.4,WAIT2AJMP SETG1SETG2: SETB 0AH ;调月时闪标志GWAIT3: LCALL DISPLAYJNB P1.1,GWAIT3SETG3: LCALL DISPLAYJNB P1.1,SETGDAYJNB P1.3,GADDMONTHJNB P1.4,GDECMONTHJNB P1.2,JUMPYEARJNB F0,SSSMONTHCLR P1.0 ;闰月,则p1.1清,指示灯亮LJMP SETG3SSSMONTH: SETB P1.0AJMP SETG3JUMPYEAR: LCALL DISPLAYCLR 0AHJNB P1.2,JUMPYEARAJMP SETG1..SETGDAY: AJMP SETG4GADDMONTH: MOV R7,65H ;月加LCALL ADD1MOV 65H,ACJNE A,#13H,GADDMONTH1MOV 65H,#01HGADDMONTH1: LCALL GETWEEK ;月加同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#88H ;月值送MOV DS1302_DATA,65HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,65HLCALL DIVIDE ;月分离送显示缓冲MOV 79H,R1MOV 49H,R1MOV 7AH,R2MOV 4AH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT4: LCALL DISPLAYJNB P1.3,WAIT4AJMP SETG3GDECMONTH:MOV R7,65H ;月减LCALL DEC1MOV 65H,ACJNE A,#00H,GDECMONTH1MOV 65H,#12HGDECMONTH1: LCALL GETWEEK ;月减同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#88H ;月值送MOV DS1302_DATA,65HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITE..MOV R0,65HLCALL DIVIDE ;月分离送显示缓冲MOV 79H,R1MOV 49H,R1MOV 7AH,R2MOV 4AH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT5: LCALL DISPLAYJNB P1.4,WAIT5AJMP SETG3SETG4: SETB 0BH ;调日时闪标志GWAIT6: LCALL DISPLAYJNB P1.1,GWAIT6SETG5: LCALL DISPLAYJNB P1.1,SETGHOURJNB P1.3,GADDDAYJNB P1.4,SETGDDAYJNB P1.2,JUMPMONTHJNB F0,SSSDATECLR P1.0 ;闰月,则p1.1清,指示灯亮LJMP SETG5SSSDATE: SETB P1.0AJMP SETG5JUMPMONTH: LCALL DISPLAYCLR 0BHJNB P1.2,JUMPMONTHAJMP SETG3SETGHOUR: AJMP SETG6SETGDDAY: AJMP GDECDAYGADDDAY: MOV A,65HCJNE A,#01H,FEBLCALL MMONTH ;一月日加AJMP GADDDAY1FEB: CJNE A,#02H,MARCHMOV R3,66H ;二月日加LCALL ZH ;BCD码转换成HEXMOV A,R3..JZ RFEBMOV R7,63H ;平年二月有天LCALL ADD1MOV 63H,ACJNE A,#29H,FEB1MOV 63H,#01FEB1: AJMP GADDDAY1RFEB: MOV R7,63H ;闰年二月有天LCALL ADD1MOV 63H,ACJNE A,#30H,FEB2MOV 63H,#01FEB2: AJMP GADDDAY1MARCH: CJNE A,#03H,APRILLCALL MMONTH ;三月加AJMP GADDDAY1APRIL: CJNE A,#04H,MAYLCALL LMONTH ;四月加AJMP GADDDAY1MAY: CJNE A,#05H,JUNELCALL MMONTH ;五月加AJMP GADDDAY1JUNE: CJNE A,#06H,JULYLCALL LMONTH ;六月加AJMP GADDDAY1JULY: CJNE A,#07H,AUGUSTLCALL MMONTH ;七月加AJMP GADDDAY1AUGUST: CJNE A,#08H,SEPTEMBERLCALL MMONTH ;八月加AJMP GADDDAY1SEPTEMBER:CJNE A,#09H,OCTOBERLCALL LMONTH ;九月加AJMP GADDDAY1OCTOBER: CJNE A,#10H,NOVEMBERLCALL MMONTH ;十月加AJMP GADDDAY1NOVEMBER: CJNE A,#11H,DECEMBERLCALL LMONTH ;十一月加AJMP GADDDAY1DECEMBER: CJNE A,#12H,ERRORLCALL MMONTH ;十二月加AJMP GADDDAY1..ERROR: AJMP WAIT7GADDDAY1: LCALL GETWEEKLCALL YMD ;转换农历月日MOV DS1302_ADDR,#86H ;日值送MOV DS1302_DATA,63HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,63HLCALL DIVIDE ;日分离送显示缓冲MOV 76H,R1MOV 46H,R1MOV 77H,R2MOV 47H,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT7: LCALL DISPLAYJNB P1.3,WAIT7AJMP SETG5;*****************************************************************************************GDECDAY: mov A,65HCJNE A,#01H,DFEBLCALL DMMONTH ;一月日减AJMP GDECDAY1DFEB: CJNE A,#02H,DMARCHMOV R3,66H ;二月日减LCALL ZH ;BCD码转换成HEXMOV A,R3JZ DRFEBMOV R7,63H ;平年二月有天LCALL DEC1MOV 63H,ACJNE A,#00H,DFEB1MOV 63H,#28HDFEB1: AJMP GDECDAY1DRFEB: MOV R7,63H ;闰年二月有天LCALL DEC1MOV 63H,ACJNE A,#00H,DFEB2..MOV 63H,#29HDFEB2: AJMP GDECDAY1DMARCH: CJNE A,#03H,DAPRILLCALL DMMONTH ;三月减AJMP GDECDAY1DAPRIL: CJNE A,#04H,DMAYLCALL DLMONTH ;四月减AJMP GDECDAY1DMAY: CJNE A,#05H,DJUNELCALL DMMONTH ;五月减AJMP GDECDAY1DJUNE: CJNE A,#06H,DJULYLCALL DLMONTH ;六月减AJMP GDECDAY1DJULY: CJNE A,#07H,DAUGUSTLCALL DMMONTH ;七月减AJMP GDECDAY1DAUGUST:CJNE A,#08H,DSEPTEMBERLCALL DMMONTH ;八月减AJMP GDECDAY1DSEPTEMBER:CJNE A,#09H,DOCTOBERLCALL DLMONTH ;九月减AJMP GDECDAY1DOCTOBER:CJNE A,#10H,DNOVEMBERLCALL DMMONTH ;十月减AJMP GDECDAY1DNOVEMBER:CJNE A,#11H,DDECEMBERLCALL DLMONTH ;十一减加AJMP GDECDAY1DDECEMBER: CJNE A,#12H,DERRORLCALL DMMONTH ;十二月减AJMP GDECDAY1DERROR: AJMP WAIT8GDECDAY1: LCALL GETWEEK..LCALL YMD ;转换农历月日MOV DS1302_ADDR,#86H ;日值送MOV DS1302_DATA,63HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,63HLCALL DIVIDE ;日分离送显示缓冲MOV 76H,R1MOV 46H,R1MOV 77H,R2MOV 47H,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT8: LCALL DISPLAYJNB P1.4,WAIT8AJMP SETG5SETG6: SETB 0CH ;调小时时闪标志GWAIT9: LCALL DISPLAYJNB P1.1,GWAIT9SETG9: LCALL DISPLAYJNB P1.1,SETG10JNB P1.3,GADDHOURJNB P1.4,GDECHOURJNB P1.2,JUMPDATEAJMP SETG9JUMPDATE: LCALL DISPLAYCLR 0CHJNB P1.2,JUMPDATEAJMP SETG5GADDHOUR: MOV R7,62H ;小时加LCALL ADD1MOV 62H,ACJNE A,#24H,GADDHOUR1MOV 62H,#00HGADDHOUR1: MOV DS1302_ADDR,#84H ;小时值送MOV DS1302_DATA,62HLCALL WRITEMOV R0,62HLCALL DIVIDE ;小时分离送显示缓冲..MOV 74H,R1MOV 44H,R1MOV 75H,R2MOV 45H,R2WAIT10: LCALL DISPLAYJNB P1.3,WAIT10AJMP SETG9GDECHOUR: MOV R7,62H ;小时减LCALL DEC1MOV 62H,ACJNE A,#99H,GDECHOUR1MOV 62H,#23HGDECHOUR1: MOV DS1302_ADDR,#84H ;小时值送MOV DS1302_DATA,62HLCALL WRITEMOV R0,62HLCALL DIVIDE ;小时分离送显示缓冲MOV 74H,R1MOV 44H,R1MOV 75H,R2MOV 45H,R2WAIT11: LCALL DISPLAYJNB P1.4,WAIT11AJMP SETG9SETG10: SETB 0DH ;调分时闪标志GWAIT12: LCALL DISPLAYJNB P1.1,GWAIT12SETG11: LCALL DISPLAYJNB P1.1,SETGOUTJNB P1.3,GADDMINTUEJNB P1.4,GDECMINTUEJNB P1.2,JUMPHOURAJMP SETG11JUMPHOUR: LCALL DISPLAYCLR 0DHJNB P1.2,JUMPHOURAJMP SETG9GADDMINTUE: MOV R7,61H ;分加LCALL ADD1MOV 61H,ACJNE A,#60H,GADDMINTUE1MOV 61H,#00HGADDMINTUE1: MOV DS1302_ADDR,#82H ;分值送..MOV DS1302_DATA,61HLCALL WRITEMOV R0,61HLCALL DIVIDE ;分分离送显示缓冲MOV 72H,R1MOV 42H,R1MOV 73H,R2MOV 43H,R2WAIT13: LCALL DISPLAYJNB P1.3,WAIT13AJMP SETG11GDECMINTUE: MOV R7,61H ;分减LCALL DEC1MOV 61H,ACJNE A,#99H,GDECMINTUE1MOV 61H,#59HGDECMINTUE1: MOV DS1302_ADDR,#82H ;分值送MOV DS1302_DATA,61HLCALL WRITEMOV R0,61HLCALL DIVIDE ;分分离送显示缓冲MOV 72H,R1MOV 42H,R1MOV 73H,R2MOV 43H,R2WAIT14: LCALL DISPLAYJNB P1.4,WAIT14AJMP SETG11SETGOUT: LCALL DISPLAYJNB P1.1,SETGOUTLCALL GENGXINMOV DS1302_ADDR,#80HMOV DS1302_DATA,#00H ;1302晶振开始振荡LCALL WRITEMOV DS1302_ADDR,#8EHMOV DS1302_DATA,#80H ;禁止写入LCALL WRITECLR 08HCLR 09HCLR 0AHCLR 0BHCLR 0CH..CLR 0DHCLR ET1CLR TR1 ;关闭定时器SETB ET0SETB TR0LJMP MAIN1;***********************************;* 闪动调时程序*;***********************************INTT1: PUSH ACCPUSH PSWGFLASH: CPL 0FHJB 0FH,GFLASH1MOV 7CH,4CH ;全部显示MOV 7BH,4BH;MOV A,4AH;CJNE A,#0,TMONTH;MOV 4AH,#0BHTMONTH:MOV 7AH,4AHMOV 79H,49HMOV 78H,WEEK;MOV A,47H;CJNE A,#0,TDATE;MOV 47H,#0BHTDATE: MOV 77H,47HMOV 76H,46H;MOV A,45H;CJNE A,#0,THOUR;MOV 45H,#0AHTHOUR:MOV 75H,45HMOV 74H,44HMOV 73H,43HMOV 72H,42HMOV 71H,41HMOV 70H,40H; MOV 50H,59H ;农历月日; MOV A,5AH; CJNE A,#0,TNDATE; MOV 5AH,#0BH; TNDATE:MOV 51H,5AH..; MOV 52H,5BH; MOV A,5CH; CJNE A,#0,TNMONTH; MOV 5CH,#0BH; TNMONTH:; MOV 53H,5CHGFLASHOUT: POP PSWPOP ACCRETIGFLASH1: JB 0AH,GFLASH2 ;调年闪MOV 7CH,#0AHMOV 7BH,#0AH;MOV 78H,#0AH ;调年时星期闪;MOV 50H,#0AH ;农历月日闪烁; MOV 51H,#0AH; MOV 52H,#0AH; MOV 53H,#0AHAJMP GFLASHOUTGFLASH2: JB 0BH,GFLASH3 ;调月闪MOV 7AH,#0AHMOV 79H,#0AH;MOV 78H,#0AH ;调月时星期闪;MOV 50H,#0AH ;农历月日闪烁;MOV 51H,#0AH;MOV 52H,#0AH; MOV 53H,#0AHLJMP GFLASHOUTGFLASH3: JB 0CH,GFLASH4 ;调日闪MOV 77H,#0AHMOV 76H,#0AH;MOV 78H,#0AH ;调日时星期闪;MOV 50H,#0AH ;农历月日闪烁;MOV 51H,#0AH;MOV 52H,#0AH;MOV 53H,#0AHLJMP GFLASHOUTGFLASH4: JB 0DH,GFLASH5 ;调小时闪MOV 75H,#0AH..MOV 74H,#0AHLJMP GFLASHOUTGFLASH5: ;调分钟闪MOV 73H,#0AHMOV 72H,#0AHLJMP GFLASHOUT;*********************************;* 加程序*;*********************************ADD1: MOV A,R7ADD A,#01HDA ARET;*********************************;* 减程序*;*********************************DEC1: MOV A,R7ADD A,#99HDA ARET;*********************************;* 大小月加调整程序*;*********************************MMONTH: MOV R7,63H ;大月日加LCALL ADD1MOV 63H,ACJNE A,#32H,MGOOUTMOV 63H,#01HMGOOUT: RETLMONTH:MOV R7,63H ;小月日加LCALL ADD1MOV 63H,ACJNE A,#31H,LGOOUTMOV 63H,#01HLGOOUT:RET;*********************************;* 大小月减调整程序*;*********************************DMMONTH:MOV R7,63H ;大月日减LCALL DEC1..MOV 63H,ACJNE A,#00H,DMGOOUTMOV 63H,#31HDMGOOUT: RETDLMONTH:MOV R7,63H ;小月日减LCALL DEC1MOV 63H,ACJNE A,#00H,DLGOOUTMOV 63H,#30HDLGOOUT:RET; ***************************; * 公历年月日推算星期*; ***************************; 以下子程序用于从当前公历日期, 推算星期,; 入口:time_yeAr,time_month ,time_date , 定义公历年月日,BCD 码, 其中月的;BIT7 表示世纪,0 表示20 世纪,1 表示19 世纪, 与PCF8563 一致; 出口time_week, 0-6 表示星期日- 星期六, 与PCF8563 一致, 程序不改变入口数据; 使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3GetWeek: MOV A,time_yearMOV B,#16DIV ABMOV week_Byte1,BMOV B,#10MUL ABADD A,week_Byte1MOV week_Byte1,A ;temp_Byte1= 年MOV A,time_monthJB ACC.7,getw02MOV A,#100ADD A,week_Byte1MOV week_Byte1,A ;20 世纪年+100MOV A,time_monthCLR ACC.7getw02: JNB ACC.4,getw04ADD A,#10CLR ACC.4getw04: MOV week_Byte2,A ;temp_Byte2= 月MOV A,time_dayMOV B,#16DIV ABMOV week_Byte3,BMOV B,#10.MUL ABADD A,week_Byte3MOV week_Byte3,A ;temp_Byte3= 日MOV A,week_Byte1;ANL A,#03hJNZ getw10 ; 非闰年转移MOV A,week_Byte2CJNE A,#3,getw06getw06: JNC getw10 ; 月大于2 转移DEC week_Byte3 ; 份小于等于2, 又是闰年, 日减1 getw10: MOV A,week_Byte2;LCALL get_CorreCt ; 取月校正表数据ADD A,week_Byte1MOV B,#7DIV AB ;B 放年加校正日数之和后除7 的余数不先做这一步; 有可能数据溢出MOV A,week_Byte1ANL A,#0fChRR ARR A ; 以上年除4 即闰年数ADD A,BADD A,week_Byte3MOV B,#7DIV ABMOV week,BMOV A,WEEKCJNE A,#0,GOBACKMOV B,#07HGOBACK:MOV WEEK,BRETget_COrreCt:MOVC A,A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5.。