智能仪表课程设计-秒表、时钟计时器,万年历的设计.doc_第1页
智能仪表课程设计-秒表、时钟计时器,万年历的设计.doc_第2页
智能仪表课程设计-秒表、时钟计时器,万年历的设计.doc_第3页
智能仪表课程设计-秒表、时钟计时器,万年历的设计.doc_第4页
智能仪表课程设计-秒表、时钟计时器,万年历的设计.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中国计量学院 课程设计 课程设计名称: 智能仪表课程设计 题目 : 秒表/时钟计时器,万年历的设计 指导教师 : 班级 : 07自动化2班 姓名 : 时间 : 2010/06/152010/07/1 2010年 7月 30 日目 录1、简介- 2 -2、设计目的- 2 -3、设计要求- 2 -4、系统方案- 3 -4.1电路设计:- 3 -4.2 系统硬件概述- 3 -4.2.1 主控制器at89s52- 3 -4.2.2时钟电路ds1302- 4 -4.2.3 显示驱动lcd1602- 5 -4.2.4 键盘接口- 6 -4.2.5 时钟电路- 7 -4.3 系统软件设计- 9 -4.3.1 程序设计- 9 -4.3.2 程序流程图- 10 -4.3.3阳历程序的设计- 11 -4.3.4 时间调整程序设计- 11 -4.3.5阴历程序设计- 13 -5结论- 15 -6设计心得- 16 -参考文献- 16 -附录- 16 -1、简介随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如星期、日期等,电子万年历诞生了,它集时间、日期、星期功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。该电子万年历主要采用at89s52单片机作为主控核心,由ds1302时钟芯片提供时钟、lcd动态扫描显示屏显示。at89s52单片机功耗小,有较强抗干扰能力;ds1302时钟芯片是美国dallas公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且ds1302的使用寿命长,误差小;数字显示是采用的lcd1602显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和对应农历等信息。此外,该电子万年历还具有时间校准等功能。2、设计目的智能仪表课程设计是自动化专业的专业实践课程。本课程的目的是通过“秒表/时钟计时器,万年历”的设计过程,结合所学课程,使学生掌握目前自动化仪表的一般设计要求、工程设计方法、开发及设计工具的使用方法,通过这一设计实践过程,锻炼学生的动手能力和分析、解决问题的能力;积累经验,培养一丝不苟的工作态度和对所学知识的综合应用能力。 3、设计要求 1、 用六位led数码管或lcm液晶显示模块显示时、分、秒;2、 以24h计时方式计时;3、 使用按键开关可实现时分调整;4、 秒表/时钟/万年历转换功能;5、 带有一定的扩展功能:、省电模式功能;、可查万年历(包括农历)功能;4、系统方案4.1电路设计:图示为电子万年历电路设计原理图,系统由主控制器at89s52、时钟电路ds1302、显示电路及键扫描电路组成。 图 4.1 秒表/时钟计时器,万年历电路图4.2 系统硬件概述4.2.1 主控制器at89s52at89s52单片机采用高性能的静态80s51设计,并采用先进工艺制造,还带有非易失性flash程序存储器。它是一种高性能、低功耗的cmos微处理芯片,市场应用最多。其主要特点如下:8kb flash rom,可以擦除1000次以上,数据保存10年。 256字节内部ram; 电源控制模式; 时钟可停止和恢复; 空闲模式; 掉电模式; 6个中断源; 4个中断优先级; 4个8位i/o口; 全双工增强型tuar; 3个16位定时/计数器:t0、t1(标准80c51)和增加的t2(捕获和比较) 全静态工作方式:024mhz 4.2.2时钟电路ds1302 ds1302的性能特性: 实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行比较; 用于高速数据暂存的31*8位ram; 最少引脚的串行i/o; 2.55.5v电压工作范围; 2.5v时耗小于300na; 用于时钟或ram数据读/写的单字节或多字节(脉冲方式)数据传送方式; 简单的三线接口; 可选的慢速充电(至vcc1)的能力。ds1302在任何数据传送时必须先初始化,把rst脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在sclk的上升沿被访问到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。如果在传送过程中置rst脚为低电平,则会终止本次数据传送,并且i/o引脚变为高阻态。上电运行时,在vcc2.5v之前,rst脚必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。ds1302的控制字如表所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到ds1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取ram数据。位51(a4a0)指示操作单元的地址。最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。为了提高对32个地址寻址能力(地址/命令位15=逻辑1),可以把时钟/日历或ram寄存器规定为多字节(burst)方式。位6规定时钟或ram,而位0规定读或写。在时钟/日历寄存器中的地址931或ram寄存器中的地址31不能存储数据。在多字节方式下,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写ram时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至ram。表2.1 ds1302控制字 ds1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。其日历、时间寄存器及其控制字如上表所示,其中奇数为读操作,偶数为写操作。时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,ds1302停止振荡,进入低功耗的备份方式,通常在对ds1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。 am-pm/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(2023h)。 ds1302的晶振选用32768hz,电容推荐值为6pf。因为振荡频率较低,也可以不接电容,对计时精度影响不大。4.2.3 显示驱动lcd16021.位数多,可显示32位,32个数码管体积相当庞大了。2.显示内容丰富,可显示所有数字和大、小写字母。3.程序简单,如果用数码管动态显示,会占用很多时间来刷新显示,而1602自动完成此功能。1602采用标准的16脚接口,其中:(模块背面有标注)第1脚:vss为地电源第2脚:vdd接5v正电源第3脚:v0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10k的电位器调整对比度(建议接地,弄不好有的模块会不显示)第4脚:rs为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:rw为读写信号线,高电平时进行读操作,低电平时进行写操作。第6脚:e端为使能端,当e端由高电平跳变成低电平时,液晶模块执行命令。第714脚:d0d7为8位双向数据线。第1516脚:空脚(有的用来接背光)4.2.4 键盘接口键盘在单片机系统中是一个很重要的部件。为了输入数据、查询和控制系统的工作状态,都要用到键盘,键盘是人工干预计算机的主要手段。键盘可分为编码和非编码键盘两种。编码键盘采用硬件线线路来实现键盘编码,每按下一个键,键盘能自动生成按键代码,键数较多,而且还具有去抖动功能。这种键盘使用方便,但硬件较复杂,pc机所用的键盘就属于这种。非编码键盘仅提供按键开关工作状态,其他工作由软件完成,这种键盘键数较少,硬件简单,一般在单片机应用系统中广泛使用。此处主要介绍该类非编码键盘及其与mcs51型单片机的接口。1按键开关去抖动问题按键开关在电路中的连接如图所示。按键未按下时,a点电位为高电平5v;按键按下时,a点电位为低电平。a点电位就用于向cpu传递按键的开关状态。但是由于按键的结构为机械弹性开关,在按键按下和断开时,触点在闭合和断开瞬间还会接触不稳定,引起a点电平不稳定,如图2-11b所示,键盘的抖动时间一般为510ms,抖动现象会引起cpu对一次键操作进行多次处理,从而可能产生错误。因此必须设法消除抖动的不良后果。图2.3 键操作和键抖动消除抖动的不良后果的方法有硬、软件两种。为了节省硬件,通常在单片机系统中,一般不采用硬件方法消除键的抖动,而是用软件消除抖动的方法。根据抖动特性,在第一次检测到按键按下后,执行一段延时510ms让前延抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认真正有键按下。当检测到按键释放后,也要给510ms的延时,待后延抖动消失后才转入该键处理程序。2键盘扫描控制方式在单片机应用系统中,对键盘的处理工作仅是cpu工作内容的一部分,cpu还要进行数据处理、显示和其他输入输出操作,因此键盘处理工作既不能占用cpu太多时间,又需要cpu对键盘操作及时作出响应。cpu对键盘处理控制的工作方式有以下几种:1. 程序控制扫描方式程序控制扫描方式是在cpu工作空余,调用键盘扫描子程序,响应键输入信号要求。2. 定时控制扫描方式定时控制扫描方式是利用定时/计数器每隔一段时间和生定时中断,cpu响应中断后对键盘进行扫描,并在有键闭合时转入该键的功能子程序。3. 中断控制扫描方式中断控制扫描方式是利用外部中断源,响应输入信号。当无按键按下时,cpu执行正常工作程序。当有按键按下时,cpu立即产生中断。在中断服务子程序中扫描键盘,判断是哪一个键被按下,然后执行该键的功能子程序。这种控制方式克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高cpu运行效率,但要占用一个宝贵的中断资源。图即工作于中断方式的矩阵式键盘接口电路。在初始化时p1.4p1.7置输出0,p1.0p1.3置为输入态,p1.0p1.3分别接至与门各输入端。当有键闭合时=0,cpu中断后,在中断服务子程序中,再完成键识别和键功能处理。本设计提供了解4个按钮的小键盘,向p1口输出低电平,如果有键盘断按下什么键。在有键按下后,有一定的延时,防止键盘抖动。通过程序的扫描,判断按键,并切换到不同的功能模式中。4.2.5 时钟电路ds1302工作方式简介及数据操作原理ds1302可以对年、月、日、星期、时、分、秒进行计时, 且具有闰年补偿功能, 工作电压宽达2.55.5v。采用三线接口与cpu进行同步通信, 并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个33x8的用于临时性存放数据的ram寄存器。ds1302是的ds1202升级产品, 与ds1202兼容, 但增加了主电源/后背电源双电源引脚, 同时提供了对后背电源进行涓细电流充电的能力。ds1302时钟芯片包括实时时钟/日历和31字节的静态ram。它经过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。时钟的运行可以采用24时或带am/pm的12小时格式。采用三线接口与cpu进行同步通信,并可采用突发方式一次传送多字节的时钟信号或ram数据。ds1302有主电源/后备电源双电源引脚:vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电磁备份;vcc1在双电池系统中提供主电源。在这种运行方式中,vcc1里连接到后备电源,以便在没有主电源的情况下能保存时间信息以及数据。ds1302由vcc1或vcc2中较打大者供电。当vcc2(vcc1+0.2v)时,vcc2给ds1302供电;当vcc2vcc1时,ds1302由vcc1供电。 图2.5 ds1302ds1302在任何数据传送时必须先初始化,把rst脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在sclk的上升沿被访问到。在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。如果在传送过程中置rst脚为低电平,则会终止本次数据传送,并且i/o引脚变为高阻态。上电运行时,在vcc2.5v之前,rst脚必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。ds1302的控制字如图所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到ds1302中。位6如果为0,则表示存取日历时钟数据;为1则表示存取ram数据。位51(a4a0)指示操作单元的地址。最低有效位(位0)如果为0,则表示药进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。为了提高对32个地址寻址能力(地址/命令位15=逻辑1),可以把时钟/日历或ram寄存器规定为多字节(burst)方式。位6规定时钟或ram,而位0规定读或写。在时钟/日历寄存器中的地址931或ram寄存器中的地址31不能存储数据。在多字节方式下,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写ram时,为了传送数据不必写所有的31字节,不管是否谢了全部31字节,所写的每一字节都将传送至ram。ds1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。其日历、时间寄存器及其控制字如下表所示,其中奇数为读操作,偶数为写操作。表2.3 ds1302控制字 时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,ds1302停止振荡,进入低功耗的备份方式,通常在对ds1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。 am-pm/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(2023h)。 ds1302的晶振选用32768hz,电容推荐值为6pf。因为振荡频率较低,也可以不接电容,对计时精度影响不大。4.3 系统软件设计4.3.1 程序设计电子万年历的程序主要包括3个方面的内容:一是ds1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是单片机中读取的数据进行代码转换并驱动lcd显示时间。4.3.2 程序流程图开始全局变量初始化定时器初始化ds1302初始化彩屏初始化开机动画mode=0mode=2mode=1部分按键扫描部分按键扫描读取ds1302时钟显示数码转化及lcd显示按键键值处理按键键值处理部分按键扫描显示数码转化及lcd显示显示数码转化及lcd显示按键键值处理 图11 程序流程图 4.3.3阳历程序的设计因为使用了时钟芯片ds1302,阳历程序只需从ds1302各寄存器中读出年、周、月、日、小时、分、秒等数据,再处理即可。在首次对ds1302进行操作之前,必须对它进行初始化,然后从ds1302中读出数据,再经过处理后,送给显示缓冲单元。阳历程序流程图见图4-3-3所示开 始初始化ds13021302开始振荡从1302中读出年、周、月、日、小时、分、秒将bcd码高低位分离,送显示缓冲单元图4-3-3 阳历程序流程图4.3.4 时间调整程序设计调整时间用三个调整按钮,一个作为移位、控制用,一个作为加用,一个作为减一调整。分别定义为控制按钮、加按钮、减一按钮。时间调整程序流程图如图4-3-4所示:控制键有效,进入年调整程序等待按键程序加键有效分加1控制键有效,进入月调整程序控制键有效,进入日调整程序控制键有效,进入时调整程序控制键有效,进入分调整程序等待按键程序加键有效时加1等待按键程序加键有效日加1等待按键程序加键有效月时加1等待按键程序加键有效年加1控制键有效,跳出时间调整程序,进入主循环程序图4-3-4 时间调整程序流程图4.3.5阴历程序设计阴历程序的实现是要靠阳历日期来推算的。要根据阳历来推算阴历日期,首先要设计算法。推算方法是,根据阳历当前日期在一年中的天数来计算阴历日期。阳历一个月不是30天就是31天(2月除外,闰年2月为29天,平年2月为28天)。阴历一年有12个月或13个月(含闰月),一个月为30天或29天。如果把一个只有29天的月称为小月,用1为标志,把30天的月称为大月,用0为标志,那么12位二进制就能表示一年12个月的大小。如果有闰月,则把闰月的月份作为一个字节的高4位,低4位表示闰月大小,大月为0,小月为1,这样一个字节就包括了所有闰月的信息。阴历春节和阳历元旦相差的天数也用一个字节表示。总共用4字节就可以存储一年中任何一天阳历和阴历的对应关系的有关数据,例如2004年的阴历和阳历对应关系如表4-3-5-1所示。表4-3-5-1 2004年的阴历和阳历对应关系表月份123456789101112闰2月大小小大大大小大小大小大小大小二进制0111010101010天数 293030302930293029302930十六进制4252212004年的春节和元旦差21天,这样2004年的信息表示为:21,42h,52h,21h。其中表示12个月大小信息的字节,第4位和第7位不用,第1个字节为十进制,其它的都为十六进制。按此方法,50年的阳历和阴历对应关系表总共使用200字节。有了算法和数据以后,就可以设计软件了。先要根据当前阳历的日期,算出阳历为该年中的第几天。图4-3-5-2为计算阳历中任何一天在该年中为第几天的程序流程图。置阳历总天数为0当前月为1月?总天数中加入该月天数月数加1与当前月同?总天数中加入号数当前号数是总天数计算阳历天数结束,总天数中的数据为当前日期在阳历年中为第几天ynny图4-3-5-2 计算阳历天数程序流程图计算出当前阳历日期为该年中的第几天后,再减去阳历该年春节和元旦的日差,如果够减,则相减的结果就是阴历在该年中的总第几天了。根据该数据就可以推算出具体的当前阴历日期;如果不够减,则表示当前阴历年为阳历年的前一年。这种情况下,根据实际,当前阴历日期会处于阴历11月或12月,此时春节和元旦的日差减去前面计算出的当前阳历日期在阳历年为第几天的数据,其结果表示当前阴历日期离春节的天数。计算出的阳历天数为该年的第几天,存放在寄存器r2和r3中。计算出天数后,如果大于#ffh,则把#ffh存放在r2中,余值存放在r3中。也就是说在用寄存器r2和r3表示的天数信息中,r2充当主寄存器,数据先存满r2,再存r3。在整个转换程序中,这里面的数据不能被覆盖。计算出阳历总天数后,就可以根据它来推算阴历日期。推算方法是,先用总天数减去春节和元旦的日差,如果结果为1,则该天正好是春节(因为春节在元旦之后,在计算春节和元旦的日差时,假设元旦为0天,春节为n天,则日差为n。而前面计算的阳历总天数是该天在该年中的第几天,是以元旦为1而得到的,与计算春节和元旦日差的这样方法相比,其数值少了1,所以要在原来本应该以0作为该天就是春节的依据的基础上加1,所以以1作为该天是春节的标志);如果结果小于1,则阴历应该是阳历的前一年;如果结果大于1,说明阳历和阴历为同一年。再根据查表所得的该年的阴历的闰年和大小月的信息,就可以推算出该天的阴历日期了。图4-3-5-3为由总天数推算出阴历日期的程序流程图。程序入口r2减1个月天数 够减?下个月为闰月?减去闰月天数月加1月份为当前正在减的月份的前一个月的最后一天月份为当前正在减的月份,号数为r2中的值r2=0?r3=0?r2=r2+r3r3=0yyyynnnn图4-3-5-3 推算阴历日期的程序流程图5结论本设计硬件电路较简单,所用器件较少,电路中使用了at89s52单片机、ds1302时钟芯片、lcd1602液晶显示器等主要芯片,实现了预计功能。在对芯片的管脚功能和用法有充分的了解后,根据设计要求设计硬件电路,包括单片机控制电路、时钟电路、键盘扫描电路、显示电路。然后通过软件编程,实现了对年、月、日、时、分、秒、星期、闰年和阴历的自动调整,用按键进行控制,用液晶模块进行显示,实现切换等功能。电子万年历可以正常显示时间并进行时间调整,基本完成了预期要实现的目标。6设计心得 硬件电路乍看起来很简单,但是要把电路完全焊接正确也是相当困难的,它需要我们仔细,认真。 在软件联合调试上,也会出现这样那样的问题,往往会有程序的死角或是许多错误,通过细心的调试,学到了很多,也学到了一些编程的技巧。做编程的工作不但锻炼了我们编程的能力,更培养了细心、严谨的作风,我觉得对以后的工作中很有用。脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助 经过几天的程序设计和硬件设计,我感触颇深的是解决问题的方法、技巧。在这几天中,我们遇到许许多多问题,对待问题要多方法处理,多角度处理。通过这几天的课程设计,我们不但增强了实践能力和协作精神,而且懂得了联系实际的重要性,也懂得了什么叫团队合作,这对我们以后的学习和工作不无裨益。当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。参考文献1 赵亮.单片机c语言编程与实例,人民邮电出版社2 王伟高性能、低功耗带ram实时时钟芯片ds1302(上),电子世界3 王伟高性能、低功耗带ram实时时钟芯片ds1302(下),电子世界4 楼然苗,李光飞mcs51系列单片机设计实例,北京:北京航天航空大学出版社附录元件清单: at89s52一片;1602显示屏一块;开关5个;10k电阻6个;25pf电容2个;24m晶振一个;发光二极管一个;排线插针若干;单片机程序/名称:秒表时钟万年历/版本:v2.2.0/时间:2010年7月1日/作者:alexander/*#include#include#include#include#includesbit blo= p20;/背光开关控制unsigned int back_light=1500;/用于背光控制unsigned char year_l;/农历年unsigned char month_1;/农历月unsigned char day_l; /农历天bitleap_month;/农历闰月unsigned char year_s=10;/日历查询阳历年unsigned char month_s=6;/日历查询阳历月unsigned char day_s=29;/日历查询阳历日unsigned char week_s;/日历查询星期unsigned char time_buf7 = 10,4,7,1,11,59,55;/年周月日时分秒unsigned char mode; /显示状态unsigned char set_calendar;/日历时钟界面设置键键值bit add_one;bit sub_one;unsigned char serch_select;/日历查询界面设置键键值bit add_one_s;bit sub_ont_s;unsigned char num_10ms;/定时器产生10ms的个数unsigned char sec_w; /秒表秒数unsigned char min_w; /秒表分钟unsigned char hour_w;/秒表小时bitrun;/秒表启动bit stop;/秒表停止bit pause;/秒表暂停void delayus(unsigned char us);/delay usvoid delayms(unsigned char ms);/delay msvoid delays(unsigned char s); /delay svoid inittimer0(void); /定时器初始化void inittimer1(void);void main()inittimer0();blo=0;initlcd();delayms(20);ds1302_init();/ds1302_write_time();ds1302_read_time();lcd_animation();dispcalender();inittimer1();while(1)while(mode=0)ds1302_read_time();dispcalender();keysetscan();while(!(set_calendar=0)keyaddscan();keyaddturn();keysubscan();keysubturn();keysetscan();dispcalender();keymodescan();while(mode=1)keyserchselect_scan();displunar();keyaddscan();keyaddturn();keysubscan();keysubturn();keymodescan();while(mode=2)dis_10ms();if(num_10ms=100)sec_w+ ;num_10ms=0;dispwatch_d();if(sec_w=60)min_w+ ;sec_w=0;if(min_w=60)hour_w+ ;min_w=0;keypausescan();keysubscan();keyaddscan();if(run=1)tr0 = 1;run=0;if(pause)if(tr0 =0)num_10ms=0;/定时器产生10ms的个数sec_w=0;/秒表秒数min_w=0;/秒表分钟hour_w=0;/秒表小时dispwatch_d();if(tr0 =1)tr0 = 0;pause=0;if(stop)tr0 = 0;stop=0;keymodescan();/*/* 函数声明 */*/void delayus(unsigned char us)/delay us/ unsigned char uscnt;/ uscnt=us1;/* crystal frequency in 12mhz*/ while(-us);/*/void delayms(unsigned char ms)/delay ms while(-ms) delayus(250); delayus(250); delayus(250); delayus(250); void delays(unsigned char s)/delay s while(-s) delayms(250); delayms(250); delayms(250); delayms(250); void inittimer0(void) tmod = 0x01; th0 = 0x0d8; tl0 = 0x0f0; ea = 1; et0 = 1;/tr0 = 1;void inittimer1(void) tmod |= 0x10; th1 = 0x63; tl1 = 0x0c0; ea = 1; et1 = 1; tr1 = 1;void timer0interrupt(void) interrupt 1 th0 = 0x0d8; tl0 = 0x0f0; num_10ms+;void timer1interrupt(void) interrupt 3 th1 = 0x63; tl1 = 0x0c0;if(back_light=1) back_light-;if(back_light=0)blo=1;elseblo=0;void lunarcalendar(int year,char month,char day)unsigned intlunar_temp; int spring_ny,sun_ny,staticdaycount; char index;bit flag; /spring_ny 记录春节离当年元旦的天数。 /sun_ny 记录阳历日离当年元旦的天数。/用于判断日期是在春节前还是春节后/春节在阳历1月20到2月20号之间 if( (lunarcalendartable(year-2000)*3+2) & 0x60) 5) = 1)/春节在阳历的一月份 spring_ny = (lunarcalendartable(year-2000)*3+2) & 0x1f) - 1; else/春节在阳历的二月份 spring_ny = (lunarcalendartable(year-2000)*3+2) & 0x1f) - 1 + 31; sun_ny = monthaddmonth-1 + day - 1; if( (!(year % 4) & (month 2)/2000年到2099年不存在被4整除而不是400倍数 sun_ny+; /staticdaycount记录大小月的天数 29 或30 /index 记录从哪个月开始来计算。 /flag 是用来对闰月的特殊处理。 /判断阳历日在春节前还是春节后 if (sun_ny = spring_ny)/阳历日在春节后(含春节那天) year_l=year-2000; sun_ny -= spring_ny; month = 1; index = 1; flag = 0;lunar_temp=lunarcalendartable(year-2000)*3;/获取每月有几天表放入lunar_temp中lunar_temp=lunar_temp&0x0f;lunar_temp=lunar_temp8;lunar_temp+=lunarcalendartable(year-2000)*3+1;lunar_temp=lunar_temp7; if( (lunar_temp& (0x1000 (index-1) ) =0) staticdaycount = 29; else staticdaycount = 30; while(sun_ny = staticdaycount) sun_ny -= staticdaycount; index+;/农历月份加一 if(month = (lunarcalendartable(year-2000)*3 & 0xf0) 4) )/农历闰月情况 flag = flag;/闰月处理 if(flag = 0) month+; else month+; if( (lunar_temp& (0x1000 (index-1) ) =0) staticdaycount=29;/小月 else staticdaycount=30;/大月 day = sun_ny + 1; else/阳历日在春节前 倒序算 /spring_ny 记录春节离当年元旦的天数。/sun_ny 记录阳历日离当年元旦的天数。 year_l=year-2001; spring_ny -= sun_ny; year-; month = 12;lunar_temp=lunarcalendartable(year-2000)*3;/获取没个月有几天表放入lunar_temp中lunar_temp=lunar_temp&0x0f;lunar_temp=lunar_temp8;lunar_temp+=lunarcalendartable(year-2000)*3+1;lunar_temp=lunar_temp7; if ( (lunarcalendartable(year-2000)*3 & 0xf0) 4) = 0)/判断有无闰月 index = 12; else index = 13; flag = 0; if( ( lunar_temp & (0x1000 (index-1) ) =0) staticdaycount = 29; else staticdaycount = 30; while(spring_ny staticdaycount) spring_ny -= staticdaycount; index-; if(flag = 0) month-; if(month = (lunarcalendartable(year-2000)*3 & 0xf0) 4) flag = flag; if( ( lunar_temp & (0x1000 (index-1) ) =0) staticdaycount = 29; else staticdaycount = 30; day = staticdaycount - spring_ny + 1; / year_1= day; month_1= month;day_l=day; if(month = (lunarcalendartable(year-2000)*3 & 0xf0) 4)/判断是否在农历闰月里面 leap_month=1; else leap_month=0;unsigned char calclulate_week(unsigned char year,unsigned char month,unsigned char day)unsig

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论