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

合集下载

基于89C51设计的电子万年历

基于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单片机的电子万年历的设计

基于51单片机的电子万年历的设计
3.3
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单片机的多功能电子万年历的设计

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

1. 前言1.1 课题研究背景伴随着科技的快速发展,时间的流逝,从观察太阳、摆钟到现在电子钟,人类不断的研究,不断的创新纪录。

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

二十一世纪的今天,最具有代表性的计时产品就是电子数字万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对较稳定的机械振荡频率源使钟表的走时差从分级缩小至秒级,代表性的产品是带有摆或摆轮游丝的机械钟或者表。

第二次革命则是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,也使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子数字万年历),使计时产品的走时日差从分级缩小至1/600万秒,从原有的传统指针计时的方式发展成为人们日常更为熟悉的夜光数字显示方式,直观明了,并且增加了全自动日期、星期、温度以及其他日常附属带来了钟表计时业界跨跃性的进步。

国产的电子万年历有很多种,总体上来说以研究多功能电子数字万年历为主,使万年历除了原有的显示时间,日期等基本功能之外,还具有闹铃,报警等功能。

商家生产的电子数字万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计为软硬件相结合的一组设计。

在软件设计过程中,应对硬件部分有相关了解,有助于对设计题目的更深了解和软件设计。

要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片之外,利用AT89系列单片机制成万年历电路,采用软硬件结合的方法,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。

AT89C51单片机是由ATMEL公司推出的一种小型单片机。

95年出现在中国市场。

主要特点为采用了Flash存贮器技术,降低了制造成本,其软硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

1 / 331.2课题研究目的与意义二十一世纪是数字化技术高速发展的时期,同时单片机在数字化高速发展的时期扮演着非常重要的地位。

基于51单片机的万年历_毕业设计

基于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单片机的多功能电子万年历的设计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单片机的多功能电子万年历的设计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引言人类的日常生活离不开时间,任何具有周期变化的自然现象都可用来测量时间。

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

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

. . .. . . 单片机应用系统设计课题:基于AT89C51单片机的多功能电子万年历的设计姓名:班级:学号:指导老师:日期:.. .专目录一.绪言 (3)二.系统总体方案设计 (3)三.硬件系统设计: (4)四.系统软件设计 (5)五.设计总结 (8)六.参考文献 (8)七.附录 (9)一.绪论随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。

由其是单片机技术的应用产品已经走进了千家万户。

电子万年历的出现给人们的生活带来的诸多方便。

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。

万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。

诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。

因此,研究万年历及扩大其应用,有着非常现实的意义。

本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。

二.系统总体方案设计1.系统设计硬件框图2.实现的基本原理在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给2.硬件原理图四.系统软件设计仿真过程1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。

3、检查所画电路运行图,确保没有错误以后,加载源程序。

4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。

基于51单片机的万年历设计流程

基于51单片机的万年历设计流程

基于51单片机的万年历设计流程
基于51单片机的万年历设计流程可以分为以下几个步骤:
1. 确定需求:首先,你需要明确你的万年历需要有哪些功能。

例如,是否需要显示日期、时间、星期,是否需要闹钟功能,是否需要手动或自动校准等。

2. 选择硬件:选择合适的单片机作为主控制器。

常用的单片机有8051系列,如AT89C51、AT89S52等。

此外,还需要选择适当的显示模块、按键模块、实时时钟模块等。

3. 设计硬件电路:根据选择的硬件设备,设计电路原理图和PCB图。

需要
考虑单片机的引脚连接、电源供给、时钟源、外部扩展等问题。

4. 编写软件程序:根据硬件电路和需求,编写相应的软件程序。

这包括初始化程序、主程序、中断服务程序等。

5. 调试和测试:将编写好的程序下载到单片机中,进行实际测试。

根据测试结果,对程序进行调试和修改,直到满足设计要求。

6. 生产:完成调试后,就可以进行批量生产了。

在生产过程中,还需要对产品进行质量检测,确保每个产品都能正常工作。

7. 后期维护:在产品上市后,可能需要对产品进行维护或升级。

例如,如果用户在使用过程中发现了问题,或者有新的需求,就需要对产品进行改进或升级。

以上是基于51单片机的万年历设计的基本流程,但具体的步骤可能会根据具体的需求和硬件设备有所不同。

Proteus仿真设计基于单片机AT89C51的电子万年历

Proteus仿真设计基于单片机AT89C51的电子万年历

0引言Proteus是由英国Labcenter electronics公司开发的EDA 工具软件,自1989年出现至今已有近二十年的历史,在全球广泛使用。

该软件集成了高级原理布图、混合模式SPICE电路仿真、PCB设计以及自动布线来实现一个完全的电子设计系统。

它是一种混合电路的仿真工具,能对模拟电路、数字电路、单片机及其外围电路进行动态仿真。

Proteus软件主要由两个模块组成:ARES和ISIS。

前者主要用于PCB自动或人工布线;后者主要绘制电路原理图,并可进行相应的仿真。

作为一款EDA仿真软件,Proteus有着丰富的元件库。

Labcenter公司与相关的第三方软件公司共同开发了8000多个模拟和数字电路中常用的SPICE模型以及各种动态元件(基本元件如电阻、电容、各种二极管、三极管、MOS管、555定时器等;74系列TTL元件和4000系列CMOS 元件;存储芯片包括各种常用的ROM、RAM、EEPROM;还有常见I2C器件等)。

此外该软件还支持微处理器的仿真(支持许多通用的微控制器,如PIC系列、AVR系列、8051系列等;同时它还支持ARM、PLD及各种外围芯片的仿真),并能与常用的编译器,如Keil、IAR、Proton等进行协同调试。

整个过程与真实的硬件调试极其相似,在动态外设支持下的实时输入和输出为实验者提供了一个最接近现实的调试环境。

本文以基于AT89C51单片机的电子万年历为例,介绍使用Proteus进行单片机应用系统仿真设计的方法。

1Proteus和Keil C51整合构建单片机实验仿真环境Proteus和Keil构建单片机实验仿真环境时,常用的方法有如下两种:(1)Keil C51与Proteus离线联合使用①通过Keil C51编辑、修改、编译源程序并生成HEX等单片机能识别的文件;②运行Proteus,将HEX文件与原理图中的单片机(MCU)进行绑定即可。

(2)Keil C51与Proteus7.0在线联合仿真调试①在计算机(PC)上安装好TCP/IP协议;②下载并安装软件Proteus VSM a GDI Driver(即vdmag-di.exe),完成后Keil文件夹下的TOOLS.INI文件中的[C51]字段的最后两行增加了TDRV2=BIN\VDM51.DLL(用于两个软件的联接)和BOOK1=HLP\VDMAGDI.HLP(帮助文档);③进入Keil C51的开发环境建立一个工程文件,在选中“Target”的情况下选择Project→Options for target;④在“Debug”选项卡中选择左边的“Use”,在下拉框中选“Proteus VSM Simulator”,再点击“Setting”设置通信接口,在Host后面添上“127.0.0.1”、端口号Port为8000,如果不Proteus仿真设计基于单片机AT89C51的电子万年历The Design and Simulation Method of Electronic Perpetual Calendar Based on AT89C51Using Proteus Software王怀平王仁波胡开明Wang Huaiping Wang Renbo Hu Kaiming(东华理工大学,江西抚州344000)(East China Institute of Technology,Jiangxi Fuzhou344000)摘要:Proteus是英国Labcenter electronics公司开发的一款EDA工具软件,该软件能够对模拟电路、数字电路、单片机及其外围电路进行动态仿真。

基于AT89C51单片机设计的电子万年历

基于AT89C51单片机设计的电子万年历

With the improvement of people's living standard and life rhythm accelerate, the time requirements of increasingly high, precision digital timing consumption demand is increasing.The production of electronic calendar has many kinds, general to study of multi-function electronic calendar, the calendar in addition to the original display time, date and other basic functions, also has the alarm, alarm and other functions. Business production of electronic calendar from the quality, price, and practical considerations, constantly improve the design of the electronic perpetual calendar, making it more with the market.The design for the software, hardware with a combination of a set of design. In software design, the hardware part should have relevant knowledge, which helps to design a deeper understanding, contribute to software design. Basic to understand some of the main devices of the basic functions and role. In addition to using integrated clock chip, and adopts the scheme of MCU, using AT89series single-chip microcomputer made perpetual calendar circuit, use a combination of hardware and software methods, control of LED digital tube output, are used to show the year, month, day, hours, minutes and seconds, the main point is: the hardware circuit is simple, the installation convenient and easy to realize, the software design is unique, reliable. AT89C51 is offered by the ATMEL a small microcontroller. 95 years in China market. Its main characteristics is the Flash memory technology, reduces the manufacturing cost of the hardware, software, fully compatible with the MCS-51, can very quickly by the Chinese majority of user acceptance. This paperintroduces the design of the electronic perpetual calendar based on AT89C51.1 design schemesThis article proposed one kind based on the AT89C51MCU calendar design, the program to AT89C51single-chip microcomputer as a controlling core, and the clock chip DS1302, keyboard, LED display modules and hardware system. In the hardware system with a separate keyboard and LED display, can display a wealth of information, according to the needs of users at any time on time calibration, choice of time, to sum up this calendar is convenient, intuitive display, multiple functions, simple circuit, low cost and many other advantages, comply with the development trend of electronic instrumentation, has broad market prospect.2 functional requirementsElectronic calendar can dynamically display the year, month, day, week, hour, minute, second.3 technical feasibilityWith the domestic large scale integrated circuits, the microprocessor and its peripheral chip had rapid development. Integrated technology most recent development is one of the CPU and peripheral chips, such as program memory, data memory, parallel I/O port, serial I/O port, timer / counter, an interrupt controller and other control components are integrated in a chip, made of monolithic computer ( Single-Chip Microcomputer ). But in recent years the introduction of some high-end chip also includes many special function unit, such as A/D, D/A converter, modem, communicationcontroller, phase locked loop, DMA, PWM floating-point unit, output control unit, PWM output when the dead programmable control function. Therefore, so long as the external expansion circuit and the necessary channel interface can make all kinds of computer application systems, such as industrial production line control system of household appliances, as the main controller, distributed control system terminal node or as its main control node up relay used, data acquisition system, automatic testing system. The appearance of single chip microcomputer, and the technology in the field of such rapid development, and the single chip computer application system formed by the following characteristics: (1) single chip computer application system has higher reliability. The reliability of the obtained in addition to rely on the chip itself the high reliability and application have the least connection, also can be conveniently made of soft, hardware technology. (2) extension of the system, system configuration is typical, specification, easy to scale a variety of application system, application system has high utilization coefficient of soft, hardware. (3) in the form of application system is a computer system, a considerable measure, control functions are realized by software, so with flexible features, do not have to change the hardware system can properly change system function. (4) have superior performance, price ratio.The 4 chip selectThe main control chip using51 Series MCU clock chip using AT89C51, American DALLAS company introduced a high performance, low power consumption, with the RAM real-time clock DS1302. Using DS1302 asthe timing chip, can achieve accurate timing. More importantly, DS1302can be in a very small current back-up power supply (2.5~ 5.5V power supply,2.5V power consumption less than 300nA), and DS1302 Can be programmed to select a variety of charging current to power for slow charge, can guarantee the basic power backup power supply.Display driver using MAX7219, MAX7219 is a microprocessor and a common cathode eight eight LED digital tube display, graph bar / column chart displays or64 dot matrix display interface small serial input / output chip. Sheet including BCD decoder, multiple scan controller, word and bit drive and 8x 8static RAM. External resistor only need one set all LED displays current field. MAX7219 and microprocessor only three wires to connect, each show has an address by the digital microprocessor write. Allow users to choose each BCD decoding or not decoding. Users can also choose to shutdown mode, the digital brightness control, from 1 to8to select the scan number and LED displays for all the test mode. Display module using ordinary common cathode four in one of the eight LED digital tube.The 5 display driver MAX7219(1) MAX7219 and single chip computer is connected with three wires ( DIN, CLK, LOAD ), using16 bit data serial shift receiving mode(2) eight LED display, graph bar / column chart displays or64 dot matrix display(3) including a BCD decoder, multiple scan controller, word and bit drive and 8x 8static RAM(4) may choose to shutdown mode, the digital brightness control, from 1 to8to select the scan number and LED displays for all the test mode(5) can drive8LED display(6) the internal RAM address 01~ 08H respectively corresponding to DIG0 ~DIG7.(7) scan register ( address:0BH ) the register in the D0 ~ D3 bits of data of the set value is 0 ~ 7H, set the value of said display dynamic scanning digital from 1 to8.(8) stop register ( address:0CH ) when D0=0, MAX721is in a halt state; when D0=1, in a normal working state.(9) showed the test register ( address:0FH ) when D0=0, MAX7219according to a set pattern in normal work; when D0=1, in beta status. In this state, regardless of the MAX7219in what mode, all of the LED will be the maximum brightness display.(10) the brightness register ( address:0AH ) luminance can use the hardware and software of the two methods to regulate brightness registers in the D0 ~D3can control LED display.LED display register by an internal8x 8static RAM, the operator can direct positioning of individually addressable register, to refresh and keep the data, as long as more than 2 V ( V + for + 5V ).Control register includes: decoding mode, display brightness adjustment, scan limits ( select scan digits), shutdown and display the test register.6 DS1302working mode and data operation principleDS1302can be years, months, days, weeks, when, minutes and seconds for time, and has a leap year compensation function, wide voltage up to 2.5~5.5V. Using a three wire interface synchronization with CPU communication, and may use a burst mode a transmission of multiple byte clock signal or RAM data. DS1302has a33x8for temporary storage of data RAM register. DS1302 is a DS1202 upgrade products, compatible with DS1202, but the increase of main power supply dual power supply pins / back to back, while providing a power supply current trickle charging capability.DS1302 clock chip includes a real time clock / calendar and31 bytes of static RAM. It passes through a simple serial interface and communication. Real time clock / calendar with seconds, hours, days, weeks, months and years of information. For less than 31days at the end of the month and the date is automatically adjusted, also includes a leap year correction function. The operation of the clock can be used with AM/PM24< > or12 hour format. Using a three wire interface synchronization with CPU communication, and may use a burst mode a transmitted byte clock signal or RAM data.DS1302 in any transmission of data must be initialized, the RST foot placement is high, then the8 bits of the address and command words into the shift register, the data at the rising edge of SCLK was access to. At the beginning of the 8clock cycle, the command byte loaded into the shift register, another clock cycle during a read operation when the output data, in a write operation for writing data. The number of clock pulses in single byte mode for8+8, in multiple byte mode for8+ bytes, the maximum is 248bytes. If the transmissionof the mid-mounted RST feet for low level, it will terminate the data transmission, and the I/O pin into a high resistance state. Power on run time, the Vcc ≥2.5V, RST foot must be kept low level. Only when the SCLK is low, can be set to high level RST.DS1302 total of12 registers, which has 7registers and calendar, clock, stored data bits for BCD code.Clock seconds pause: register bit7bit clock pause a definition. When it is 1, DS1302stops oscillating, entering the low power backup, usually in the DS1302write operation (such as entering a clock adjustment procedures ), oscillation stopped. When it is 0, the clock will start.AM-PM/12-24hour: hour register bit7is defined as 12or 24hour mode select bit. It is in high level,12hour. In this way, a5 for the second10 hours of bits (20 ~ 23h).The crystals DS1302choose 32768Hz, capacitor recommended values for6pF. Because of low frequency, can also be connected capacitor, the timing precision effect.The 7endingWhen I finally finished all the typing, typesetting, proofreading, drawing the task after all very tired, but at the same time looking at the computer screen graduation design manuscript my heart is sweet, I feel it all worth it.I will never forget this unforgettable several months. I am here to find information on the day, in the face of countless books list, the most memorable is each time finding information on the thrill and excitement. I'm from data collection, to master a lot ofmicrocomputer and its interface application knowledge, let me for what I have learned to consolidate and improve, and let me on the SCM new technology knowledge. Throughout the process, I learned new knowledge, the growth of knowledge. In the future days, I still have to continue to enrich themselves, for in the academic field dosomethinpreviouslyunreleased.Stand on solid ground, serious learning attitude, seek truth from facts, not afraid of difficulties, unremittingly, hard-working spirit is my in this design the maximum benefits. I think this is a willpower, is to my actual ability of a promotion, also for my future study and work of great help.随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

基于51单片机的电子万年历系统的设计

基于51单片机的电子万年历系统的设计

参考内容
一、引言
单片机是现代电子设备中的重要组成部分,广泛应用于各种嵌入式系统设计。 51单片机作为一种经典的微控制器,因其结构简单、易于编程、可靠性高等优点, 被广泛用于各种领域,如智能家居、工业控制、物联网等。万年历作为一种日常 生活中常见的计时工具,具有显示日期、时间、星期、月份等功能,对于人们的 日常生活和工作有着重要的作用。本次演示将介绍一种基于51单片机的万年历设 计。
二、系统设计
1、硬件设计
基于51单片机的万年历设计需要硬件和软件的配合实现。硬件部分主要包括 51单片机、显示模块、按键输入模块和时钟芯片等。其中,51单片机作为主控制 器,负责处理各种数据和控制信号;显示模块用于显示日期、时间等信息;按键 输入模块用于用户输入操作;时钟芯片则为系统提供实时时间。
基于51单片机的电子万年历系 统的设计
目录
01 一、概述
03 三、软件设计
02 二、硬件设计 04 四、系统调试与优化
目录
05 五、应用场景及前景
07 参考内容
06 六、结论
随着科技的不断发展,单片机已经成为现代于51单片机的电子万年历系统设计具有广泛的实际应用价值。 本次演示将详细介绍这种系统的设计过程和实现方法。
感谢观看
首先需要进行硬件搭建,包括选择合适的单片机、显示模块、按键输入模块 和时钟芯片等,并将其连接起来。需要注意的是,在搭建硬件时需要考虑各个模 块之间的接口和连接方式,以确保系统能够正常工作。
2、软件编程
在硬件搭建完成后,需要进行软件编程。首先需要进行系统初始化,包括对 单片机进行初始化和对显示进行清屏处理。然后需要进行按键处理和时钟数据处 理,以实现用户输入和实时时间的读取。最后需要进行显示处理,将处理后的数 据显示到显示模块上。

AT89C51控制的电子时钟和日期设计

AT89C51控制的电子时钟和日期设计

AT89C51控制的电子时钟和日期设计“电子日历+电子时钟系统”,日历与时间轮流显示,间隔1秒,系统要求实现以下功能:1、日历显示格式为“××××.××.××”,分别对应“年.月.日”;2、时钟显示格式为“××-××-××”,分别对应“时-分-秒”;3、实现日期和时间可通过键盘调整在按键模块中,按键实现年月日、时分秒的调节功能。

k==1,修改时加1的功能;k==2,修改分加1的功能;k==3,修改秒加1的功能k==5,修改时减1的功能;k==6,修改分减1的功能;k==7,修改秒减1的功能k==9,修改年加1的功能;k==10,修改月加1的功能;k==11,修改日加1的功能k==13,修改年减1的功能;k==14,修改月减1的功能;k==15,修改日减1的功能当显示时分秒时按下k==0键,此时只显示时分秒,此时可以修改时分秒,当再次按下k==8时返回交替显示当显示年月日时按下k==4键,此时只显示年月日,此时可以修改年月日,当再次按下k==8时返回交替显示在交替显示时,同样可以修改年月日、时分秒#include<reg52.h>unsigned char k,a;unsigned int nian=2012,yue=05,ri=25,shi=10,fen=30,miao=20;//电子日历和电子时钟系统显示的初始化unsigned char flag;void shuma_xianshi();//年月日显示函数声明void shuma_xianshi1(); //时分秒显示函数声明void tiaoshi();//调节年月日、时分秒函数声明void delay();//延时函数声明unsigned char getkey1();//扫描键盘值函数声明void nianyuetiaozheng();//年月的调整函数声明void main()//主函数程序{TMOD=0X01;//定时器T0模式1TH0=0X4C;//设置定时器初值TL0=0X00;EA=1;//开总中断ET0=1;TR0=1;while(1){tiaoshi();//"调节年月日、时分秒函数"的调用nianyuetiaozheng();//"年月的调整函数"的调用if(miao%2) //判断年月日、时分秒的交替轮流显示;当秒为奇数时显示时分秒,当秒为偶数时显示年月日{if(k==0){ EA=0;//在显示时分秒时,若按键0按下时停止计数,此时只显示时分秒while(1){shuma_xianshi1(); //时分秒显示函数tiaoshi();//"调节年月日、时分秒函数"的调用if(k==9)nian=(--nian);;//在显示时分秒时,假如说有按键9按下,年++不起作用if(k==10)yue=(--yue); //在显示时分秒时,假如说有按键10按下,月++不起作用if(k==11)ri=(--ri); //在显示时分秒时,假如说有按键11按下,日++不起作用if(k==13)nian=(++nian); //在显示时分秒时,假如说有按键13按下,年--不起作用if(k==14)yue=(++yue);//在显示时分秒时,假如说有按键14按下,月--不起作用if(k==15)ri=(++ri); //在显示时分秒时,假如说有按键15按下,日--不起作用if(k==8)break; //在显示时分秒时,假如说有按键8按下,此时返回到年月日、时分秒的交替显示nianyuetiaozheng();//"年月的调整函数"的调用} EA=1; //开启总中断}shuma_xianshi1();//显示时分秒}else{if(k==4){ EA=0;//在显示年月日时,若按键4按下时停止计数,此时只显示年月日while(1){shuma_xianshi();//年月日显示函数tiaoshi();if(k==1)shi=(--shi);//在显示年月日时,假如说有按键1按下,时++不起作用if(k==2)fen=(--fen);//在显示年月日时,假如说有按键2按下,分++不起作用if(k==3)miao=(--miao);//在显示年月日时,假如说有按键3按下,秒++不起作用if(k==5)shi=(++shi);//在显示年月日时,假如说有按键5按下,时--不起作用if(k==6)fen=(++fen);//在显示年月日时,假如说有按键6按下,分--不起作用if(k==7)miao=(++miao);//在显示年月日时,假如说有按键7按下,秒--不起作用if(k==8)break;//在显示年月日时,假如说有按键8按下,此时返回到年月日、时分秒的交替显示nianyuetiaozheng();//"年月的调整函数"的调用} EA=1; //开启总中断}shuma_xianshi();//显示年月日}}}void shuma_xianshi()//年月日显示函数{P0=0X80|(nian/1000); //年的千位数字delay();P0=0X90|(nian%1000/100);//年的百位数字delay();P0=0Xa0|(nian%100/10);//年的十位数字delay();P0=0Xb0|(nian%10); //年的个位数字delay();P0=0Xc0|(yue/10);delay();P0=0Xd0|(yue%10);delay();P0=0Xe0|(ri/10);delay();P0=0Xf0|(ri%10);delay();}void shuma_xianshi1()//时分秒显示函数{P0=0X80|(shi/10);delay();P0=0X90|(shi%10);delay();P0=0Xb0|(fen/10);delay();P0=0Xc0|(fen%10);delay();P0=0Xe0|(miao/10);delay();P0=0Xf0|(miao%10);delay();}void tiaoshi()//调节年月日、时分秒函数{k=getkey1();//当有键按下时,取键盘的值if(k==1)//按键1按下时,实现小时的++{TR0=0;shi++ ;if(shi==24)shi=0;TR0=1;}if(k==2)//按键2按下时,实现分钟的++{TR0=0;fen++;if(fen==60)fen=0;TR0=1;}if(k==3)//按键3按下时,实现秒的++ {TR0=0;miao++;if(miao==60)miao=0;TR0=1;}if(k==5)//按键5按下时,实现小时的-- {TR0=0;shi--;if(shi==-1)shi=23;TR0=1;}if(k==6)//按键6按下时,实现分钟的-- {TR0=0;fen--;if(fen==-1)fen=59;TR0=1;}if(k==7)//按键7按下时,实现秒的-- {TR0=0;miao--;if(miao==-1)miao=29;TR0=1;}if(k==9)//按键9按下时,实现年的++ {TR0=0;nian++;if(nian==2051)nian=2012;TR0=1;}if(k==10)//按键10按下时,实现月的++{TR0=0;yue++;if(yue==13)yue=1;TR0=1;}if(k==11)//按键11按下时,实现日的++{TR0=0;ri++;if(ri==a)ri=1;TR0=1;}if(k==13)//按键13按下时,实现年的--{TR0=0;nian--;if(nian==2011)nian=2050;TR0=1;}if(k==14) //按键14按下时,实现月的--{TR0=0;yue--;if(yue==0)yue=12;TR0=1;}if(k==15)//按键15按下时,实现日的--{TR0=0;ri--;if(ri==0)ri=(a-1);TR0=1;}}void delay()//延时函数{unsigned char m,n;for(m=0;m<20;m++)for(n=0;n<100;n++);}void time0() interrupt 1 //定时器中断函数{flag++;TH0=0X4C;//重新置入初值TL0=0X00;if(flag==20)//当flag==20时,此时定时时间1秒到{flag=0;miao++;if(miao==60)//当miao==60时,实现fen++{miao=0;fen++;if(fen==60)//当fen==60时,实现shi++{fen=0;shi++;if(shi==24)//当shi==24时,实现ri++{shi=0;ri++;if(ri==31)//当ri==31时,实现yue++{ri=1;yue++;if(yue==13)//当yue==13时,实现nian++{yue=1;nian++;}}}}}}}unsigned char getkey1(void)//扫描键盘值函数{unsigned char temp,k;P2=0xfe; //判断按键0、1、2、3temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xee:k=0;break;case 0xde:k=1;break;case 0xbe:k=2;break;case 0x7e:k=3;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}P2=0xfd;//判断按键4、5、6、7 temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xed:k=4;break;case 0xdd:k=5;break;case 0xbd:k=6;break;case 0x7d:k=7;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}P2=0xfb;//判断按键8、9、10、11 temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xeb:k=8;break;case 0xdb:k=9;break;case 0xbb:k=10;break;case 0x7b:k=11;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}P2=0xf7;//判断按键12、13、14、15 temp=P2;temp=temp&0xf0;if(temp!=0xf0){delay();temp=P2;temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){case 0xe7:k=12;break;case 0xd7:k=13;break;case 0xb7:k=14;break;case 0x77:k=15;break;}while(temp!=0xf0){temp=P2;temp=temp&0xf0;}}return k;}}void nianyuetiaozheng()//年月的调整函数{if(yue==2)//当月份显示为2月份时{if(nian%4==0 && nian%100!=0)//判断是否为闰年{a=30;//当是闰年时,a=30}else{a=29;//当不是闰年时,a=29}}elseif(yue==1|yue==3|yue==5|yue==7|yue==8|yue==10|yue==12){a=32;//当月份显示为1、3、5、7、8、10、12时,a=32 }elseif(yue==4|yue==6|yue==9|yue==11){a=31;//当月份显示为4、6、9、11时,a=31}}。

毕业设计(论文)-基于at89c51单片机万年历的设计[管理资料]

毕业设计(论文)-基于at89c51单片机万年历的设计[管理资料]

四川省高等教育自学考试电子工程专业毕业论文论文题目_基于AT89C51单片机万年历的设计专业________电子工程_______________ 学生姓名________________________准考证号__________________指导老师_______________________2011年08 月23 日摘要自古人们就懂得了怎么样算时间,打草结、挂麻絏、划笔画等。

现在社会的日益进步时间变得更加的珍贵。

传统的钟表误差大、使用寿命不长、要经常的更改时间。

显示不直观,给人们带来了许多的不便。

科技的快速发展,很好的解决的问题。

而多功能电子万年历能很好的解决这些问题,万年历采用软、硬件结合,误差小、使用寿命长,采用直观的数字显示,简捷明了。

本文介绍了基于AT89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。

系统以AT89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。

运用单片机实现公历农历之间的转换,电子闹钟,计时器和对指定日期的查询等功能。

万年历采用液晶显示LCD-12864显示,可以同时显示年、月、日、周几、时、分、秒,农历。

综上所述此电子晚年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景关键字:AT89C51;电子万年历;DS1302 ;公农历转换;电子闹钟;计时器;日期查询目录1 绪论 (5) (5) (5) (5)2 系统的总体设计 (6) (6)器件的选用 (7)单片机的选用 (7)LCD 液晶显示器12864 选用及工作原理 (8)LCD液晶显示概述 (8)LCD模块接口说明 (9)LCD 模块主要硬件构成说明 (9)LCD 指令说明 (11)LCD 读写时序图 (11)LCD 软件初始化 (13)应用举例 (15)公农历转换 (17)3 系统硬件的设计 (20) (20) (20)AT89C51单片机 (20)3. AT89C51单片机与MCS-51完全兼容 (23)实时时钟芯片 DS1302 (25)4 系统的软件设 (29)程序流程图 (30)主程序 (31)读取日期和时间程序 (32)显示子程序 (33) (34)5 PROTEUS使用 (34) (34)ISIS对电子万年历的硬件电路设计 (35)ISIS进行电子万年历的仿真测试 (38)结论 (39)致谢 (40)参考文献 (41)程序 (42)一绪论课题研究的背景随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。

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

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

1. 前言1.1 课题研究背景伴随着科技的快速发展,时间的流逝,从观察太阳、摆钟到现在电子钟,人类不断的研究,不断的创新纪录。

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

二十一世纪的今天,最具有代表性的计时产品就是电子数字万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对较稳定的机械振荡频率源使钟表的走时差从分级缩小至秒级,代表性的产品是带有摆或摆轮游丝的机械钟或者表。

第二次革命则是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,也使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子数字万年历),使计时产品的走时日差从分级缩小至1/600万秒,从原有的传统指针计时的方式发展成为人们日常更为熟悉的夜光数字显示方式,直观明了,并且增加了全自动日期、星期、温度以及其他日常附属带来了钟表计时业界跨跃性的进步。

国产的电子万年历有很多种,总体上来说以研究多功能电子数字万年历为主,使万年历除了原有的显示时间,日期等基本功能之外,还具有闹铃,报警等功能。

商家生产的电子数字万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计为软硬件相结合的一组设计。

在软件设计过程中,应对硬件部分有相关了解,有助于对设计题目的更深了解和软件设计。

要了解一些主要器件的基本功能和作用。

除了采用集成化的时钟芯片之外,利用AT89系列单片机制成万年历电路,采用软硬件结合的方法,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特,可靠。

AT89C51单片机是由ATMEL公司推出的一种小型单片机。

95年出现在中国市场。

主要特点为采用了Flash存贮器技术,降低了制造成本,其软硬件与MCS-51完全兼容,可以很快被中国广大用户接受。

1 / 331.2课题研究目的与意义二十一世纪是数字化技术高速发展的时期,同时单片机在数字化高速发展的时期扮演着非常重要的地位。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.。

相关文档
最新文档