万年历(单片机)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.
单片机万年历设计
报告
题目:基于51单片机万年历设计院(系):机械与电子工程学院班级:09应用电子技术2班学生名:
指导老师:
时间:2011-5-4
目录
摘要 (1)
第一章绪论 (4)
第二章设计要求与方案论证 (5)
2.1 设计要求 (5)
2.1.1 基本要求 (5)
2.1.2发挥部分 (6)
2.2 系统基本方案选择和论证 (7)
2.2.1 芯片的选择 (7)
2.2.2 显示模块选择方案和论证 (8)
2.2.3 时钟信号的选择方案和论证 (8)
2.3 电路设计最终方案决定 (8)
第三章系统的硬件设计与实现 (10)
3.1 万年历电路设计框图 (10)
3.2 系统硬件概述 (10)
3.3 硬件电路结构的设计 (11)
3.3.1 单片机主控制模块的设计 (11)
3.3.2 显示模块的设计 (12)
3.3.3时间调整电路的设计 (14)
3.3.4 主控芯片原理及其说明 (14)
3.3.5 复位电路的选择 (18)
第四章系统的软件设计 (19)
第五章系统调试 (21)
5.1软件调试 (21)
5.2硬件调试 (21)
5.3实物调试 (21)
结论 (22)
设备选择 (24)
参考文献 (25)
附录 (26)
摘要
万年历是对年、月、日、周、时、分、秒,数字显示及到时提醒的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得万年历的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便。

最常见的数字钟通常使用单片机模块控制,一种用单片机原理实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

本次设计就是通过用单片机为主控制,通过电路仿真而实现。

首先使用Proteus 7 Professional软件进行绘制硬件电路图,用keil软件进行编程与调试,最终生成hex文件,传入单片机内部,从而实现仿真效果。

此次设计的万年历具有显示年、月、日、周、时、分、秒及对各日期与时间的调整、校正功能。

整个时钟通过简易的键盘来实现各个功能,界面简洁、直观、易于操作。

关键词:万年历、仿真、单片机、Proteus 7 Professional、keil
Abstract
Calendar is the year, month, day, week, hours, minutes, seconds, digital display and to remind the timing device, widely used for personal family, stations, terminals and other public places, the office has become essential daily necessities of life, because the development of digital integrated circuits and the extensive application of quartz crystal oscillators, making Precision of calendar, far more than old-fashioned clocks, digital watches and living to the people has brought great convenience.
The most common single chip modules typically use digital clock control, a theory with a single chip to achieve the hours, minutes, seconds, timing devices, compared with the mechanical clock has a higher accuracy and intuitive, and no mechanical devices, with more more long life, it has been widely used.
The design is by using a microcontroller-based control, achieved through circuit simulation.Proteus 7 Professional software is the first to use the hardware circuit diagram drawn using keil software programming and debugging the resulting hex file, the incoming internal microcontroller, in order to achieve simulation results.
The design of the calendar with shows year, month, day, week, hours, minutes, seconds and date and time of each adjustment, calibration.The clock
through a simple keyboard to realize various functions, the interface simple, intuitive, easy to operate.
Keywords:calendar, simulation,single chip, Proteus 7 Professional, keil
第一章绪论
20世纪末,单片机技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS 化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。

下面是单片机的主要发展趋势。

单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。

单片机模块中最常见的是万年历,万年历是一种用单片机原理实现年、月、日、周、时、分、秒,计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

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

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

因此,研究数字时钟及扩大其应用,有着非常现实的意义。

第二章设计要求与方案论证
2.1 设计要求
2.1.1 基本要求
(1)在不采用专用时钟模块的前提下,设计并制作万年历。

(2)准确显示:时、分、秒(24小时制)
(3)显示星期
(4)显示公历
(5)时间、日期、星期可调节
(6)断电记忆功能
2.1.2发挥部分(1)闹钟功能(2)显示阴历(3)显示24节气(4)其他
2.2 系统基本方案选择和论证
本时钟的设计具体有两种方法。

一是通过单纯的数字电路来实现;二是使用单片机来控制实现。

本次设计选取了较为简单的单片机控制;而选择这一方法后还要进行各个芯片的选择。

以下是我在这次设计中所用的方案。

2.2.1 芯片的选择
方案一:采用AT89C51芯片,其为高性能CMOS 8位单片机,该芯片内含有4k bytes的可反复擦写的只读程序存储器(PEROM)、128 bytes的随机存取数据存储器(RAM)、32位可编程I/O口线、2个16位定时/计数器、6个中断源、可编程串行UART通道及低功耗空闲和掉电模式,但是由于AT89C51芯片可擦写的空间不够大,且中断源提供的较小,为防止运行过程中出现不必要的问题,我们不选用AT89C51。

方案二:采用AT89C52芯片,它除了具备AT89C51的所有功能与部件外,其最大的优势就是AT89C52提供了8K字节可擦写Flash闪速存储器空间、8个中断源、及256*8字节内部存储器(RAM),解决了我们对可反复擦写的Flash 闪速存储器空间大小与中断源的不够问题的担心。

2.2.2 显示模块选择方案和论证
方案一:采用LED数码管显示,显示较为清楚,且经济实惠,直观易懂,且在软件实现上也较容易,为实现其功能也比较容易。

方案二:采用LCD,电路比较简单,虽然在软件设计上也相对简单,具有低功耗功能,但程序比较繁琐,难以设计。

因此,在设计中我采用的显示模块是LED数码管显示。

2.2.3 时钟信号的选择方案和论证
方案一:直接采用单片机定时计数器提供的秒信号,使用程序实现年、月、日、周、时、分、秒计数。

采用此种方案可减少芯片的使用,节约成本,实现的时间误差较小,在软件中比较容易仿真,但程序设计较为复杂。

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

且硬件电路连接较为简单,程序设计容易实现。

2.3 电路设计最终方案决定
综上各方案所述,并且经过我们队友的多番讨论,对此次万年历的方案选定为: 采用AT89C52作为主控制系统; 并由单片机定时计数器直接提供时钟的秒信号; LED数码管作为显示电路,来实现本次设计的所有功能。

第三章系统的硬件设计与实现
3.1 万年历电路设计框图
图(3-1)电路设计框图
3.2 系统硬件概述
本设计用AT89C51作为核心控制部分,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路也由AT89C52单片机提供,减少芯片的使用,节约成本,它可以对年、月、日、周、日、时、分、秒进行计时,具有闰年补偿功能。

外接晶振电路与复位电路,74LS138作为位选扩展电路,P0口接七个开关作为时间调整部分,以两个四位数码管作为显示部分,开关控制显示时间与日期,P2口作为段选,
P1口作为位选部分。

具体框图如图(3-1)所示。

3.3 硬件电路结构的设计
3.3.1 单片机主控制模块的设计
此次单片机数字时钟的设计采用AT89C52为主控制芯片,并由其定时器提供时钟,利用LED数码管进行时间按显示。

下图为用Proteus软件画的总原理图:
图(3-3-1)仿真总电路图
3.3.2 显示模块的设计
LED数码管分为共阴和共阳两种,以利用AT89C51的P2口作为LED显示的段选部分,以P1口的P1.0、P1.1、P1.2、三个口作为显示部分的位选,通过三八译码器扩展为八位的位选分别接在两个四位数码管的位选部分。

详细电路图如(3-3-2)两图所示:
图(3-3-2)时间显示
图(3-3-2)月份显示
3.3.3时间调整电路的设计
采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下时间/星期键两个四位数码管显示时间和星期,按下年/月/日键两个数码管显示日期,按下调整键可以对时间和日期进行调节,值加键表示加,值减键表示减,换位表示选择所要调节的位置,确认按键按下,时间调节结束。

所连线路和单片机接口仿真图如图3所示:
图(3-3-3)按键电路
3.3.4 主控芯片原理及其说明
1 主控制芯片AT89C52的原理及说明
AT89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含8k bytes的可反复擦写的只读程序存储器(PEROM)和蔼可亲256 bytes 的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C52单片机适合于许多
较为复杂控制应用场合。

图(3-3-4)AT89C52引脚
2 主要性能参数:
与MCS-51产品指令和引脚完全兼容
8k字节可重擦写Flash闪速存储器
1000次擦写周期
全静态操作:0Hz—24MHz
三级加密程序存储器
256×8字节内部RAM
32个可编程I/O口线
3个16位定时/计数器
8个中断源
可编程串行UART通道
低功耗空闲和掉电模式
3 引脚功能
Vcc(40):电源电压GND(20):接地
P0口(32-39):P0口是一个8位双向I/O接口,也即地址/数据总线复用口。

作为输出口用时,每位吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。

在访问外部数据存储器时,这组口线分时转换地址(低8位)和数据总线复用。

P1口(1-8):P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”通过内部的上拉电阻把端口拉到高电平时,此时可作输入口。

作为输入品使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

与AT89C51不同之处是,P1.0和P1.1还可以分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。

P2口(21-28):P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平时,此时可作输入口。

作为输入品使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR 指令)时,P2口送出高8位地址数据。

在访问8位地址的外部数据存储器时,P2口输出P2锁存器的内容。

P3口(10-17):P3是一组带有内部上拉电阻的8位双向I/O口,P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口P3写“1”时,它们被内部上拉电阻拉高并可作为输入端口,此时,被外部拉低的P3口将用上拉电阻输出电流。

P3口除了作为一般的I/O口线外,更重要的用途是它的第二功
能,如下表所示:
表3-3-4 P3口的第二功能
RST(9):复位信号输入端。

当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。

ALE/PROG(30):地址锁存有效信号输出端。

当访问片外程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节,一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的,要注意的是:每当访问外部数据存储器时将跳过一个ALE 脉冲。

PSEN(29):程序存储允许输出端。

是片外程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个周期两次PSEN有效,即输出两个脉冲。

在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

EA/VPP(31):外部访问允许。

欲使CPU仅访问外部程序存储器(地址为
0000H—FFFFH),EA端必须保持低电平(接地),需注意的是:如果加密位LB1被编程,复位时内部会锁EA端状态。

如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。

Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。

XTAL1(19):振荡器反相放大器的及内部时钟发生器的输入端。

XTAL1(18):振荡器反相放大器的输出端。

通过XTAL1、XTAL2外接晶振后,即可构成自激振荡器,驱动内部时钟发生器向主机提供时钟信号。

4 特殊功能寄存器
在AT89C52片内存储器中,80H-FFH共128个单元为特殊功能寄存器(SFR),其中包括B寄存器、累加器、程序状态寄存器(PSW)、定时/计数器控制、中断优级控制寄存器(IP)、P3口锁存寄存器、中断允许控制寄存器(IE)、串行口控制寄存器等。

它们可运用来设置片内电路的运行方式,记录电路的运行状态,MCS-51单片机对特殊功能寄存器采取与片内RAM统一编址的方法,可按字节地址直接寻址。

在已有的基础上AT89C52与AT89C51相比还提供了两个定时/计数器。

定时/计数器2的控制和状态位位于T2CON与T2MOD,该功能的数在自动装载的情况下可装入到寄存器中,提高了效率。

3.3.5 复位电路的选择
目前为止,单片机复位电路主要有四种类型:(1)微分型复位电路;(2)积分型复位电路;(3)比较器型复位电路:(4)看门狗型复
位电路。

方案一:
采用手动复位,该方法线路简单。

在系统运行过程中,有时可能需要对系统进行复位,以避免对硬件经常加电或断电而造成的伤害,
我们可以采用手动复位的方式。

如图3-3-5-1所示:
图3-3-5-1 手动上电复位电路
方案二:
阻容上电自动复位电路,这种电路线路也简单,它利用电容上电压不能突变而是按指数规律上升或下降的特性,产生所需要的复位脉冲。

优点:使用最为普遍且成本低廉的复位电路。

如图3-3-5-2所示:
图3-3-5-2 自动复位电路
总结:这两种方案对设计的影响其实差别不大,根据实验需要选择方案一可手动复位电路。

第四章系统的软件设计
图4-1 程序框图
系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L 软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,得出仿真结果。

系统程序主要包括主程序,读出时钟子程序、计算时间子程序、键盘扫描子程序和显示数据刷新子程序。

主程序流程图如图4-1所示。

第五章系统调试
5.1软件调试
打开程序调试软件keil uVision4,在里面新建一个工程,命名为:万年历.Uv2。

接着新建文件,编写相应程序。

编写好的各个程序进行编译与连接。

但若是在该过程中,看见我们编好的程序有错误,那么就根据他相应的提示来修改错误,直到该程序能够正确编译为止。

能够正常编译的程序说明没有什么问题了,此时我们在点击相关栏目,让它生成我们在硬件仿真时所需要的.HEX文件。

到此步,我们的软件调试就完成了。

5.2硬件调试
打开Proteus 7 Professional软件,按照方案所选的电路元件来设计整体电路,线把个芯片按一定的位置放好,然后对相应的对象进行连接,连接时需仔细,以免调试时发生错误。

做好之后把编程所生成的。

HEX文件加载到AT89C52中,运行仿真软件,查看运行效果。

如果运行出错那么就根据他相应的提示来修改错误,直到仿真成功为止。

5.3实物调试
(1)按照电路图在万能板上焊好电路
(2)给电路通上电源,打开总电源开关,LED显示是否通电;
(3)电路板上分别有复位、日期、时间、调整、加、减、选位和确定按键,可以对时间和日期进行任意的调整;其中日期或时间按
键按下,数码管分别显示日期和时间;调整按键按下表示对时间开始进行调整,通过选位来确定所要调整的位置,分别可以加和减,最后确定按键按下表示时间调整完成。

(4)用两个四位数码管通过时间和日期按键来切换,可显示时间和日期。

结论
通过本次设计的制作,我较为全面地回顾了所学的硬件知识与软件知识。

同时,单片机原理与应用及电子技术方面的相关知识,在这次设计中得到了较好地实践。

在本次设计中我也学到了很多东西,比如说:我们更好地掌握了Proteus 7 Professional软件进行硬件原理图的绘制、利用KILE软件对我设计的程序的检查与生成.HEX文件及遇到问题怎么解决等。

首先,在这次设计中,在我们遇到过很多我们自己不理解的问题及书本上或是我以前没有看见过的知识点。

在面对这些问题时,我们首先采用的是上网搜寻的方法来查看别人是否和我们一样遇到过相类似的问题,并且查看一下别人是怎样解决这个问题的。

当别人有了解决它问题的方法时,我们在根据别人的提示,想想自己的问题出在哪里,该怎么解决。

当我们还是无法想到解决的办法是,我们就带着自己的问题到图书馆查阅资料,如果我们的问题还是没有解决,我们就带着问题去问我们的指导老师,让他帮我解决。

采用这样的方法,我的很多问题都迎刃而解了!
其次,就是在本次设计过程中,我不但努力解决自己遇到的问题,还积极帮
助同学解决他们遇到的问题。

这样一来,我的知识得到了进一步的巩固,同学的问题也得到了相应的解决,我达到的一举双收的效果,我为此而感到高兴。

最后,让我们觉得这次设计的最大成果是:我们知道了将理论用到实际中时,会遇到很多的问题。

因此,在此时我们一定要先沉着的找出问题出现的原因,在对症下药,来解决问题。

我相信只要我们面对问题沉着、冷静,我们的问题都会被解决。

设备选择
表1实验所用材料
参考文献
【1】王静霞主编《单片机应用技术(C语言版)》电子工业出版社
【2】杨欣、王玉凤《电子设计从零开始》清华大学出版社
【3】边春远、王志强《MCS-51单片机应用开发实用子程序》人民邮电出版社【4】廖先芸《电子技术实践与实训》高等教育出版社
附录
主程序:
#include<reg52.h>
#include<intrins.h>
unsigned char code duanma[]={ 0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x40}; //共阴的数码管段选
unsigned char data tianshu[ ]={31,28,31,30,31,30,31,31,30,31,30,31}; //每月的天数unsigned char code weima[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; //位码,控制74hc138
unsigned int bdata nian=2011; //初始化时间
unsigned char data jianzhi=16,yue=05,ri=05,zhou=00,shi=21,fen=59,miao=56; unsigned char tshi=21,tfen=00,tmiao=05,t,t1,t2,t3,nri,nyue; //初始化闹钟
unsigned char data huanwei=0;
unsigned char bdata cishu=0,cishu1=0,cishu2=0,cishu3=0,temp[8] ={0};
bit t_or_d=0; // 控制显示时间还是日期标志,只有8个数码管所以只有分开显示了
bit tiaozheng=0; //记录调整按钮的状态
bit key_up=0; //按键抬起标志
sbit P00=P0^0; //按键分配
.
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit S=P1^3;
sbit S1=P1^4;
void delay();
////////////////////主函数////////////////////////
void main()
{
P3=0x00;
while(1)
{
void displayt();
void tdatet();
void displayn() ;
void displayd();
void nz(); //显示闹钟
void display(); //显示temp的内容;
void delay(); //软件延时
void dis_time(); //显示时间
void count_week(); //计算某年月日是星期几
void dis_date(); //显示日期
bit runian( unsigned int ); //判断闰年
void readkey16(); //16键盘扫描,键值保存在jianzhi中void manage_key(); //给相应按键赋予动作
IE=0x82; //打开定时器0中断
TMOD=1; //让定时器0工作在1方式
TH0=0x3C;
TL0=0x1F; //时间常数50ms
TR0=1;
loop:
count_week();
manage_key();
if(!t1)
if(!t2)
{
if(t_or_d)
dis_date(); // 显示日期
else
dis_time(); //显示星期和时间
}
if(S==0)
{
t1=1;
nz(); //显示闹钟}
else
S=0;
if(cishu1==50)
t1=0;
//////////////////////////////////////////////////////////
if(S1==0)
{
t1=1;
tdatet();
} //调试区
else
t2=0;
//////////////////////////////////////////////////////////
goto loop;
}
}
///////////////////按键管理///////////////////////////////
void manage_key()
{
readkey16(); //读取键值
if(jianzhi==0)
t_or_d=0;
if(jianzhi==1)
t_or_d=1;
if(jianzhi==2)
{
if(t_or_d==0) //调整时间时才关闭定时器
TR0=0;
tiaozheng=1;
huanwei=0;
}
if(key_up) // 按键抬起后才做一次动作
{
delay();
if(key_up)
///////////////////调整时间/闹钟/星期////////////////////////
if(t_or_d==0&&tiaozheng==1) //在显示时间状态下调整时间{
if(jianzhi==15)
{
huanwei++; //在时、分、秒之间切换
if(huanwei==4)
huanwei=0;
}
if(S==1&&tiaozheng==1) //在显示闹钟状态下调整闹钟{
t3=1;
}
if(huanwei==0&&S==1&&jianzhi==7) //响应闹钟时加调整
.
{
tshi++;
if(tshi>=24)
tshi=0;
}
if(huanwei==0&&S==1&&jianzhi==11) //响应闹钟时减调整{
tshi--;
if(tshi==0)
tshi=24;
}
if(huanwei==1&&S==1&&jianzhi==7) //响应闹钟分加调整{
tfen++;
if(tfen>=60)
tfen=0;
}
if(huanwei==1&&S==1&&jianzhi==11) //响应闹钟分减调整{
tfen--;
if(tfen==0)
tfen=60;
}
if(huanwei==2&&S==1&&jianzhi==7) //响应闹钟秒加调整{
tmiao++;
if(tmiao>=60)
tmiao=0;
}
if(huanwei==2&&S==1&&jianzhi==11) //响应闹钟秒减调整{
tmiao--;
if(tmiao==0)
tmiao=60;
}
///////////////////调整时间//////////////////////////////
if(!t3)
{
if(huanwei==0&&jianzhi==7) //响应时加调整{
shi++;
if(shi>=24)
shi=0;
}
if(huanwei==0&&jianzhi==11) //响应时减调整{
shi--;
if(shi==0)
shi=24;
}
if(huanwei==1&&jianzhi==7) //响应分加调整{
fen++;
if(fen>=60)
fen=0;
}
if(huanwei==1&&jianzhi==11) //响应分减调整
.
{
fen--;
if(fen==0)
fen=60;
}
if(huanwei==2&&jianzhi==7) //响应秒加调整{
miao++;
if(miao>=60)
miao=0;
}
if(huanwei==2&&jianzhi==11) //响应秒减调整{
miao--;
if(miao==0)
miao=60;
}
if(huanwei==3&&jianzhi==7) //响应星期加调整{
.
zhou++;
if(zhou>=7)
zhou=1;
}
if(huanwei==3&&jianzhi==11) //响应星期减调整
{
zhou--;
if(zhou==0)
zhou=7;
}
}
}
////////////////////////调整日期/////////////////////////////
if(t_or_d==1&&tiaozheng==1) //在显示日期状态下调整日期{
if(jianzhi==15)
{
huanwei++;
if(huanwei==3)
huanwei=0;
}
if(huanwei==0&&jianzhi==7) //响应年加调整nian++;
if(huanwei==0&&jianzhi==11) //响应年减调整nian--;
if(huanwei==1&&jianzhi==7) //响应月加调整{
yue++;
if(yue==13)
yue=1;
}
if(huanwei==1&&jianzhi==11) //响应月减调整{
yue--;
if(yue==0)
yue=12;
}
if(huanwei==2&&jianzhi==7) //响应日加调整{
ri++;
if(ri>tianshu[yue-1])
ri=1;
}
if(huanwei==2&&jianzhi==11) //响应日减调整
{
ri--;
if(ri>tianshu[yue-1])
ri=1;
}
}
if(jianzhi==3)
{
TR0=1;
tiaozheng=0;
}
jianzhi=16;
}
}
/////////////////////计算某年月日是星期几///////////////////////
void count_week()
{
unsigned int week=0;
unsigned char i;
if(runian(nian))
tianshu[1]=29; //闰年二月天数是29天
else
tianshu[1]=28; //平年二月天数是28天
if(nian==2011)
{
for( i=1;i<yue;i++)
week=tianshu[i-1]%7+week;
week=(week+5+ri)%7;
}
if( nian>2011)
{
for( i=0;i<nian-2011;i++)
{
if(runian(2011+i))
week=week+2; //闰年余两天
else
week=week+1; //平年余一天
}
for(i=1;i<yue;i++)
week=tianshu[i-1]%7+week;
week=(week+5+ri)%7;
}
if(nian<2011)
{
for( i=1;i<=2011-nian;i++)
{
if(runian(2011-i))
week=week+2; //闰年余两天else
week=week+1; //平年余一天
}
week=6-(week+2)%7;
for(i=1;i<yue;i++)
week=tianshu[i-1]%7+week;
week=(week+1+ri)%7;
}
if(week==0)
week=7;
zhou=week;
/////////////////计算2011年的阴历////////////////////////////
if(nian==2011)
{
if(yue==1)
{
if(ri<=3) //调试区
{
nri=ri+26;
nyue=yue+10;
}
else
nri=ri-3;
nyue=yue+11;
}
//调试区
.
if(yue==2)
{
if(ri<=2)
{
nri=ri+28;
nyue=yue+10;
}
else
nri=ri-2; //调试区
nyue=yue-1;
}
if(yue==3)
{
if(ri<=4)
{
nri=ri+26;
nyue=yue-2;
}
else //调试区nri=ri-4;
nyue=yue-1;
.
}
if(yue==4)
{
if(ri<=2)
{
nri=ri+27;
nyue=yue-2;
}
else
nri=ri-2; //调试区
nyue=yue-1;
}
if(yue==5)
{
if(ri<=2)
{
nri=ri+28;
nyue=yue-2;
}
else
.
nri=ri-2;
nyue=yue-1;
} //调试区
if(yue==6)
{
if(ri<=1)
{
nri=ri+29;
nyue=yue-2;
}
else
nri=ri-1;
nyue=yue-1;
} //调试区
if(yue==7)
{
if(ri<=30)
{
nri=ri;
nyue=yue-1;
.
}
else
nri=ri-30;
nyue=yue;
}
if(yue==8)
{
if(ri<=28)
{
nri=ri+1;
nyue=yue-1; //调试区}
else
nri=ri-28;
nyue=yue;
}
if(yue==9)
{
if(ri<=26)
{
.
nri=ri+3;
nyue=yue-1;
}
else
nri=ri-26; //调试区
nyue=yue;
}
if(yue==10)
{
if(ri<=26)
{
nri=ri+4;
nyue=yue-1;
}
else
nri=ri-26;
nyue=yue;
}
if(yue==11)
{。

相关文档
最新文档