你好,墙上挂的数码挂墙电子万年历价格只有上调、设置、退出、喇叭,怎么调年份啊?我给调到2021年调不回来了

电子钟怎么调整时间_百度知道
电子钟怎么调整时间
我有更好的答案
电子钟调整时间步骤:以常见电子数码信息台历钟为例,上部有四个按钮分别是修改、设置移动、闹钟和退出。修改时间和日期,按下设置移动按钮,钟面年份开始闪烁;再按设置移动按钮,月份开始闪烁;再按设置移动按钮,日期开始闪烁;再按设置移动按钮,小时开始闪烁,按下修改按钮,可向上增加时间;再按设置移动按钮,分钟数字开始闪烁,按下修改按钮,可向上增加分钟。上述调整如修改按钮长按不放,可快进增加数字。完成调整后,按下退出按钮,就进入正常显示。各种电子钟设置方法基本相似,有五个按钮的,修改有上调、下调两个按钮。万年历显示信息分上下两部分,屏幕上半部分固定显示时间,下半部分轮流显示日期、星期、温度、农历日期以及24节气。信息轮流显示的时间间隔固定为5秒,不可调整。万年历配备两组闹钟。系统有备用电池,在断电的情况下依然可以保证正确计时,保持时间视电池电量而定,通常短时间断电不会出现时间丢失的情况。
电子钟也叫做数码万年历,而一般数码万年历调节器有四个键,分别为:退出、流水(下调)、上调、设置。一、先按一下“设置”键(进入时间设置状态,同时年份“闪烁”,可按“上调”或“流水(下调)”键修改年份,修改好后按“设置”键将闪烁位移到公历“月”,按“上调”或“流水(下调)”键修改月份;用同样的方法可对日、时、分、秒进行设置;星期、农历月、日将自动跟随公历的变化而变化。 二、再按“设置”或“退出”键退出时间设置,回到正常时间状态。
本回答被提问者和网友采纳
1、先按一下“调整”按钮,数字开始闪动。2、想调哪一个数就多按几次,按到的这个数就会闪动。3、再用“上调”、或者“下调”来调整。4、在正常的显示下,按一下“闹钟”按钮,会在“开”和“关”之间转换。5、按一下“喇叭”按钮,会在“开”和“关”的功能切换。6、最后按复位。
1条折叠回答
为您推荐:
其他类似问题
您可能关注的内容
鱼肝油的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置: >>
基于单片机的万年历的设计(毕业论文)
青海民族大学毕 业 论 文 ( 设 计 )论文题目:基于 51 单片机的万年历的设计 青海民族大学毕业论文摘 要随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电 产品陆续出现在我们的生活中。日历是人们不可或缺的日常用品。但一般日历都为 纸制用品,使用不便,寿命不长。本文借助电路仿真软件 Protues 对基于 AT89S51 单片机的电子万年历的设计方法及仿真进行了全面的阐述。该电子万年历在硬件方 面主要采用 AT89C51 单片机作为主控核心,由 DS1302 时钟芯片提供时钟、1602LCM 点阵液晶显示屏显示。时间、日期调整由三个按键来实现,并可对闹铃开关进行设 置。日历能显示阳历和阴历年、月、日以及星期、时、分、秒。 此万年历具有读取 方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表 的发展趋势,具有广阔的市场前景 关键词:单片机 万年历 可调 DSAbstractWith the rapid development of world economy and the forthcoming of information era, many kinds of mini-type intelligent domestic electric appliances appear in our life one after another. Calendars are necessary daily goods in people’s life. This paper mainly discuss the design and simulation of electronic calender based on AT89S51 with the help of Protues. On the hardware side, the electronic calendar using AT89C51 microcontroller as the main control center, clock provided by the DS1302 clock chip , 1602LED dot matrix LCD display. Time and date adjusting is carried out by three keys,which can also set the alarm clock.To sum up the calendar has read convenient, direct display, functional diversity, simple circuit, low cost, and many other advantages, conform to the trend of the development of electronic instruments, and has a broad market prospect. words: Key words: SCM perpetual calendar DS1 万年历设计目 录 前 言 ...............................................1 1. 方案设计 .........................................21.1 系统基本方案选择和论证 .......................... 21.1.1 单片机芯片的选择 ..................................... 2 1.1.2 显示模块选择方案和论证 ............................... 2 1.1.3 时钟芯片选择方案与论证 ............................... 21.2 电路设计最终方案决定 ............................ 32.系统的硬件设计与实现 2.系统的硬件设计与实现 ................................ 4 系统的硬件设计与2.1 电路设计框图 .................................... 4 2.2 系统硬件概述 .................................... 4 2.2.1 AT89C52 概述 ............................... 4 2.2.2 DS1302 概述 ................................ 6 2.2.3 12684 概述 ................................. 73. 系统的软件设计 ..................................... 83.1 程序流程框图 .................................... 8 3.2 从 1302 读取日期和时间流程图 ..................... 9 3.3 时间调整程序流程图 ............................. 104.系统测试 4.系统测试 ............................................ 104.1 硬件测试 ........................................ 10 4.2 软件测试 ........................................ 115.结论 5.结论 ................................................ 11 参考文献 .............................................. 12 致 谢 ................................................ 13 附 录 ................................................ 142 青海民族大学毕业论文前 言在日新月异的 21 世纪里,时间对现代人来说更加紧迫,从观太阳、摆钟到现在 电子钟,时间的记录方式在不断的更新进步。然而,随着社会、科技的发展,集直 观性,精度高,寿命长,功能全等为一体的记录方式更为人们所需求。在电子产业 高速发展这一时代背景下,大规模集成电路大量出现,电子钟也因读取方便、显示 直观、功能多样、电路简洁等诸多优点随之诞生,它的出现极大地影响了人们的生 活,我们的时间记录更为全面和科学。因此,对万年历的研究与探索是具有相当重 要的现实意义和实用价值。 电子万年历属于小型智能电子产品,既可广泛应用于家庭,也可应用于银行、医 院、学校等公共场所。它利用单片机进行控制,因为单片机具有高可靠性、高性价 比、低电压、低功耗等一系列优点;利用 DS1302 实时时钟芯片进行记时,因为其具 有高性能、低功耗、带 RAM 的实时时钟电路,可对年、月、日、周日、时、分、秒 进行计时,同时具有闰年补偿功能等优点;利用 12864 液晶显示,因为其具有显示 功能强大、价格便宜等特点,再外加一些基本系统即可实现时间的调整和显示。因 此,电子万年历制作既有市场前景,又能培养单片机的运用能力,无论从实用价值, 还是从培养能力的角度来看这都是很有意义的毕业设计课题。 本万年历的设计要实现公历年、月、日,农历年、月、日,星期,时、分、秒, 显示公历节日,农历节日,生日,时间段提醒以及节日、生日与时间段的交替显示, 并在开机时设置显示作者的相关信息。最终在老师的指导和同学们的帮助下,经过 自己的努力完成了这个课题,并从中提高了实践动手、团结合作和综合运用理论知 识进行工程实践的能力。1 万年历设计1.方案设计 1.方案设计1.1 系统基本方案选择和论证1.1.1 单片机芯片的选择 本设计采用 AT89C52 芯片作为硬件核心,该芯片内有 4K 字节的在线编程 Flash 存储器,可以擦写 1000 次,具有掉电模式,而且具有掉电状态下的中断恢复功能, 对设计开发非常实用。 1.1.2 显示模块选择方案和论证 方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组 成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所 以不用此种作为显示。 方案二:LED 数码管显示 数码管具有低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防 高(低)温,操作简单方案等优点。但由于数码管动态扫描需要借助 74LS164 移位 寄存器进行移位,该芯片在电路调试时往往会有很多障碍,所以不采用 LED 数码管 作为显示。 方案三:LCD12864 液晶显示 此液晶具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影象稳定不 闪烁等优势和可视面积大,画面效果好,分辨率高,抗干扰能力强等特点,并且能 够方便的显示文字和数字。 所以最终选择 LCD12864。 1.1.3 时钟芯片选择方案与论证 方案一:不使用芯片,采用单片机的定时计数器 这种方法直接采用单片机定时计数器提供信号,模拟时钟的时, 分,秒。如:利2 青海民族大学毕业论文用 AT80C52 芯片,定时器用工作方式 1,每 50ms 产生一个中断,循环 20 次,即 1s 周期。 每一个周期加 1,那么 1min 为 60 个周期,1h 就是 60*60=3600 个周期。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但实现的时间误差较大,所以不采用此 方案。 方案二:并行接口时钟芯片 DS12887 采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具 有操作速度快,编程方便的优点。但是对于 80C52 单片机来说,低位地址线要通过锁 存器输出,还要地址译码器,而且并行口芯片的体积相对较大。 方案三:串行接口时钟芯片 DS1302 采用 DS1302 时钟芯片实现时钟, DS1302 是美国 DALLAS 公司推出的一种高性能、 低功耗、带 RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计 时,具有闰年补偿功能,工作电压为 2.5V~5.5V。采用三线接口与 CPU 进行同步通 信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据。DS1302 内部有一 个 31×8 的用于临时性存放数据的 RAM 寄存器。DS1302 是 DS1202 的升级产品,与 DS1202 兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓 细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程 的充电功能,并且可以关闭充电功能。采用普通 32.768kHz 晶振。 所以,最终选择串行时钟芯片 DS1302。1.2 电路设计最终方案决定综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用 AT89C52 作为主控制系统;DS1302 提供时钟;12864 液晶屏作为显示。3 万年历设计2.系统的硬件设计与实现 2.系统的硬件设计与实现2.1 电路设计框图单片机主控模块从 DS1302 时钟模块读取时间,通过片内芯片处理,将显示结果 通过 PO 口床送至 12684 液晶显示模块显示出最终的界面;同时,单片机主控模块对 键盘进行扫描,有按键按下时进入调整状态,并在 12684 液晶上显示状态。2.2 系统硬件概述2.2.1 AT89C52 概述 AT89C52 功能特性概述:8K 字节 Flash 闪速存储器,256 字节内部 RAM,32 个 I/O 口线,3 个 16 位定时器/计数器,一个 6 向量两级中断结构,一个全双工串行通 信口,片内振荡器及时钟电路;可降至 0Hz 的静态逻辑操作,并支持两种软件可选 的节电工作模式;空闲方式停止 CPU 的工作,但允许 RAM,定时/计数器,串行通信 口及中断系统继续工作;掉电方式保存 RAM 中的内容,但振荡器停止工作并禁止其 他所有部件工作直到下一个硬件复位。 AT89C52 的引脚定义及功能: Vcc :接+5V 电源 Vss :接地4 青海民族大学毕业论文XTAL1 和 XTAL2:时钟引脚,外接晶体引线端。当使用芯片内部时钟时,此两引 脚端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。RST:复位输入。当振荡器工作时,RST 引脚出现两个机器周期以上高电平将使 单片机复位。WDT 溢出将使引脚输出高电平,设置 SFR AUXR 的 DISRT0(地址 8EH)可打开或关闭该功能。DISRT0 位缺省为 RESET 输出高电平打开状态。 ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存器允许)输 出脉冲用于锁存地址的低 8 位字节。即使不访问外部存储器,ALE 仍以时钟振荡频率 的 1/6 输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。 PSEN:程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当 AT89C51 由外部程序存储器取指令(或数据)时,每个机器周期两次 PSEN 有效,即输出两个 脉冲。当访问外部数据存储器,没有两次有效的 PSEN 信号。 EA/VPP: 外部访问允许。 欲使 CPU 仅访问外部程序存储器 (地址为 0000H―FFFFH) , EA 端必须保持低电平(接地) 。需要注意的是:如果加密位 LB1 被编程,复位时内部 会锁存 EA 端状态。如 EA 端为高电平(接 Vcc 端) ,CPU 则执行内部程序存储器中的 指令。Flash 存储器编程时,该引脚加上+12V 的变成电压 Vpp. PO P1 P2 P3 口:四个 I/O 口,其中 P3 口还具有第二功能: 端口引脚 P3.0 第二功能 RXD(串行输入口) 端口引脚 P3.4 第二功能 T0(定时/计数器 0)P3.1TXD(串行输出口)INT 0 (外中断 0) INT 1 (外中断 1)P3.5T1(定时/计数器 1)WR (外部数据存储器写通道)P3.2 P3.3P3.6 P3.7RD (外部数据存储器读通道)5 万年历设计AT89C52 管脚图及控制电路:2.2.2 DS1302 概述 DS1302 功能特性概述:提时钟计数功能,可以对秒、分钟、小时、日、月、年、 星期的计数;年计数可达到 2100 年;有 31*8 位的额外数据暂存寄存器;采用三线 接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或 RAM 数据;内部有一个 31×8 的用于临时性存放数据的 RAM 寄存器;具有主电源/后背电 源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 AT89C52 的引脚定义及功能: Vcc1:备用电源 Vcc2:主电源 X1 和 X2:振荡源,外接 32.7、68KHz 晶振 I/O:串行数据输入端(双向) SCLK:输入端 RST:复位端6 青海民族大学毕业论文DS1302 管脚图及控制电路:2.2.3 12684 概述 12684 功能特性概述:显示内容 128×64 点;全屏点阵;2M ROM 总共提供 8192 个汉字(16×16 点阵) ;16K ROM 总共提供 128 个字符(16×8 点阵) ;工作温度:-20 ―70 摄氏度,存储温度:-30―80 摄氏度。 引脚定义及功能: VSS:电源地 VDD:电源正 V0:液晶显示器驱动电器(可调) RS:RS=“H” ,表示 DB0―DB7 为显示数据;RS=“L” ,表示 DB0―DB7 为控制指 R/W:R/W=“H” ,E=“H” ,数据被督导 DB0―DB7;R/W=“1” ,E=“H→L” ,DB0―DB7 的数据被写到 IR 或 DR DB1-7:数据线 PSB:串并口选择 NC:空脚 RST:复位脚 VOUT:倍压输出脚 LEDA/K:背光电源,A 正 K 负7 万年历设计12864 管脚图及控制电路3.系统的软件设计 3.系统的软件设计 系统的该系统的软件设计方法与硬件设计相对应,按整体功能分成多个不同的程序模 块,分别进行设计、编程和调试,最后通过主程序将各程序模块连接起来。电子万 年历的程序主要包括 3 个方面的内容:一是 DS1302 从单片机中读取数据进行计数, 二是利用按键进行时间的调整,三是单片机中读取 DS1302 中的数据驱动 LED12684 显示时间。3.1 程序流程框图主程序流程框图如下图所示,12864,DS1302 的数据读取及指令写入函数均已在 各自的头文件中完成,在主程序中只须引用即可。8 青海民族大学毕业论文读取日期和时间流程图 3.2 从 1302 读取日期和时间流程图9 万年历设计3.3 时间调整程序流程图4.系统测试 4.系统测试4.1 硬件测试在 Protues 仿真结束后,于焊接板上完成了硬件组装。在调试硬件时遇到过很 多问题,但只要细心、认真检查这些问题都是可以避免的,主要问题及解决办法现 列如下: (1) 接通电源后 LCD12864 没有正确的显示。在不通电状态下用万用表检测电路 是否正常连接,在检查回路时没有发现问题,怀疑是单片机驱动电路有问题,加载 了所有端口的 LED 的驱动程序,所有端口都能正常工作,排除是单片机驱动电路有 问题这一可能性;再次对电路进行检查发现排阻太小,换成 10K 的排阻后,LCD 正常 显示。 (2) 电路工作一段时间之后有的芯片发热严重。经查发现原来是有尖锐的管脚10 青海民族大学毕业论文刺破邻近的漆包线造成短路,断掉该线并再次连接可解决问题。 (3) 接通后液晶正常显示了,但是在时间位置全部显示“?”号,初步判断是时 间未正确读取,经过仔细用万用表检查,发现 DS302 接地端接触不良,解决后显示 正常。4.2 软件测试(1)程序烧入后,开机画面正常,可是一进入显示界面就有未知符号出现,后 又恢复正常,且调时也没问题。初步判断与显示程序无关,经过反复调试,发现是 开机画面结束后为对 12864 液晶进行初始化,最后修改后问题得以解决。 (2)修改时间、日期时农历没有自动对应上。把不相关的程序暂时屏蔽,地农 历的子程序独立调试,发现在调用农历自动更新时,对十进制和十六进制处理不好, 所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后 解决了此问题。5.结论 5.结论通过对电子万年历的设计,从中不仅学习到了新知识,还丰富了许多的设计经 验。例如进行程序编写时,由于思路的不清晰,导致程序问题不断出现,还不知从 何而解,最后静下心来,仔细理了一下编程思路,再一步一步往下编写,遇到问题 一个一个解决,这样既锻炼自己又节约了时间。经过这一个多月的努力,从开始准 备资料到硬件电路的制作,再到毕业论文的完成,其中有问题不能得以解决的烦恼, 也有收获新知的快乐。而且,经过这次设计真的理解了理论与实践的差别,没有扎 实的理论,实践过程要走很多弯路,而实践中又会遇到很多理论上不曾提到过的问 题。所有,我们要有脚踏实地,认真严谨,实事求是的学习态度,也要有不怕困难、 坚持不懈、吃苦耐劳的精神去面对困难。11 万年历设计参考文献杨子文.单片机原理及应用 .西安:西安电子科技大学出版社,2006 彭伟.单片机 C 语言程序设计实训 100 例.北京:电子工业出版社,2009 阎石.数字电子技术基础.北京:高等教育出版社,2006 陈正振.电子电路设计与制作.广西:广西交通职业技术学院信息工程系,2007 胡汉才.单片机原理与接口技术.北京:清华大学出版社,2004 何小艇.电子系统设计[M].杭州:浙江大学出版社,2007 李光飞.单片机课程设计实例指导.北京:北京航空航天大学出版社,2004. 马忠梅.单片机的 C 语言应用程序设计.北京:北京航空航天大学出版社,2003 侯玉宝.基于 proteus 的 51 系列单片机设计与仿真.北京:电子工业出版社,2008 郭荣生.电子技术实验与实践济南:中国石油大学出版社,2007 王法能.单片机原理及应用.北京:科学出版社 200412 青海民族大学毕业论文致 谢我的大学生活将随着这个毕业论文而随之结束,在大学这四年的学习和生活中, 我不仅学到了丰富的专业知识,还学会了怎么为人处世,怎么面对困难,怎么奋发 向上,怎么学会关心别人。在学校期间,有太多的感动让我们怀念,有太多的人让 我们难忘,有太多的笑声与快乐。总之,有太多太多值得怀念的东西,它将是我们 一生宝贵的财富。 在这个毕业设计阶段,我学习到了新知识,丰富了实践经验,还对我们这个专 业的工艺流程有了更深刻的理解,对我们毕业后从事本专业工作打下了结实的基础。 因为这个过程,我们就拥有了比别人更多的专业体验,在面试中我们就比别人多了 一个砝码。 在大学最后的这个阶段,经过一个月的努力终于完成了电子万年历设计,在 此要感谢的人有很多,首先感谢学校提供的优越实验环境,使我能全身心的投入到 我的设计中。感谢物理与电子工程学院,有大量量参考文献供我们查阅。感谢我的 指导老师孙老师给我的仔细检查和改正。感谢同我一起探讨学习的同学们。还要感 谢实验室老师的大力支持,当印制电路板生成后,借出各种调试工具,使系统在最 短的时间里调试成功,使本系统能顺利实现。13 万年历设计附 录元器件明细表: 附录一 元器件明细表: 元件名称 AT89C52 DS1302 LCD12864 排阻(10K) 排阻(10K) 按钮 附录二 仪器设备清单 仪器名称 RFRF-2148USB 智能编程器 附录三 电路原理图 数量 1个 仪器名称 EDA 实验箱 数量 1个 数量 1个 1个 1个 1个 5个 元件名称 10K 电阻 22UF 电解电容 30PF 电容 12M 晶振 32.768k 32.768k 晶振 数量 1个 1个 2个 1个 1个14 青海民族大学毕业论文附录四 PCB 图附录五 实物图15 万年历设计附录六 程序清单#include &reg52.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int uchar sec,min,hour,day,month,year, void DelayUs2x(unsigned char t) { while(--t); } void DelayMs(unsigned char t) { while(t--) { //大致延时 1mS DelayUs2x(245); DelayUs2x(245); } } void delay(uint ms) // 延时子程序 { uint a,b,c; //ms=1000 为 1.015s for(a=2;a&0;a--) for(b=46;b&0;b--) for(c=c&0;c--); } sbit sbit sbit sbit sbit sbit sbit sbit RS = P2^4; RW = P2^5; E = P2^6; RES = P2^1; PSB = P2^0; sclk=P1^0; I_O=P1^1; rst=P1^2;//1302 串行时钟 //1302 数据端口 //1302 复位16 青海民族大学毕业论文sbit sbit sbit sbitk1=P3^4; k2=P3^5; k3=P3^6; k4=P3^7;//功能健 //时间加 //时间减 //确定键 //单片机 P0&------& 液晶 DB0-DB7#define DataPort P0uchar code DayCode1[9]={0x00,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; uint code DayCode2[3]={0x111,0x130,0x14e}; uchar LunarMonth,LunarDay,LunarY bit c_ uchar code YearCode[300]= { 0x0C,0x96,0x45, 0x4d,0x4A,0xB8, 0x0d,0x4A,0x4C, 0x0d,0xA5,0x41, 0x25,0xAA,0xB6, 0x05,0x6A,0x49, 0x7A,0xAd,0xBd, 0x02,0x5d,0x52, 0x09,0x2d,0x47, 0x5C,0x95,0xBA, 0x0A,0x95,0x4e, 0x0B,0x4A,0x43, 0x4B,0x55,0x37, 0x0A,0xd5,0x4A, 0x95,0x5A,0xBf, 0x04,0xBA,0x53, 0x0A,0x5B,0x48, 0x65,0x2B,0xBC, 0x05,0x2B,0x50, 0x0A,0x93,0x45, 0x47,0x4A,0xB9, 0x06,0xAA,0x4C, 0x0A,0xd5,0x41, 0x24,0xdA,0xB6, 0x04,0xB6,0x4A, 0x69,0x57,0x3d, 0x0A,0x4e,0x51, 0x0d,0x26,0x46, 0x5e,0x93,0x3A, 0x0d,0x53,0x4d, 0x05,0xAA,0x43, //2000 //2001 //2002 //2003 //2004 //2005 //2006 //2007 //2008 //2009 //2010 //2011 //2012 //2013 //2014 //2015 //2016 //2017 //2018 //2019 //2020 //2021 //2022 //2023 //2024 //2025 //2026 //2027 //2028 //2029 // 303 306 309 312 315 318 321 324 32717 万年历设计0x36,0xB5,0x37, 0x09,0x6d,0x4B, 0xB4,0xAe,0xBf, 0x04,0xAd,0x53, 0x0A,0x4d,0x48, 0x6d,0x25,0xBC, 0x0d,0x25,0x4f, 0x0d,0x52,0x44, 0x5d,0xAA,0x38, 0x0B,0x5A,0x4C, 0x05,0x6d,0x41, 0x24,0xAd,0xB6, 0x04,0x9B,0x4A, 0x7A,0x4B,0xBe, 0x0A,0x4B,0x51, 0x0A,0xA5,0x46, 0x5B,0x52,0xBA, 0x06,0xd2,0x4e, 0x0A,0xdA,0x42, 0x35,0x5B,0x37, 0x09,0x37,0x4B, 0x84,0x97,0xC1, 0x04,0x97,0x53, 0x06,0x4B,0x48, 0x66,0xA5,0x3C, 0x0e,0xA5,0x4f, 0x06,0xB2,0x44, 0x4A,0xB6,0x38, 0x0A,0xAe,0x4C, 0x09,0x2e,0x42, 0x3C,0x97,0x35, 0x0C,0x96,0x49, 0x7d,0x4A,0xBd, 0x0d,0x4A,0x51, 0x0d,0xA5,0x45, 0x55,0xAA,0xBA, 0x05,0x6A,0x4e, 0x0A,0x6d,0x43, 0x45,0x2e,0xB7, 0x05,0x2d,0x4B, 0x8A,0x95,0xBf,//2031 //2032 //2033 //2034 //2035 //2036 //2037 //2038 //2039 //2040 //2041 //2042 //2043 //2044 //2045 //2046 //2047 //2048 //2049 //2050 //2051 //2052 //2053 //2054 //2055 //2056 //2057 //2058 //2059 //2060 //2061 //2062 //2063 //2064 //2065 //2066 //2067 //2068 //2069 //2070 //207118 青海民族大学毕业论文0x0A,0x95,0x53, 0x0B,0x4A,0x47, 0x6B,0x55,0x3B, 0x0A,0xd5,0x4f, 0x05,0x5A,0x45, 0x4A,0x5d,0x38, 0x0A,0x5B,0x4C, 0x05,0x2B,0x42, 0x3A,0x93,0xB6, 0x06,0x93,0x49, 0x77,0x29,0xBd, 0x06,0xAA,0x51, 0x0A,0xd5,0x46, 0x54,0xdA,0xBA, 0x04,0xB6,0x4e, 0x0A,0x57,0x43, 0x45,0x27,0x38, 0x0d,0x26,0x4A, 0x8e,0x93,0x3e, 0x0d,0x52,0x52, 0x0d,0xAA,0x47, 0x66,0xB5,0x3B, 0x05,0x6d,0x4f, 0x04,0xAe,0x45, 0x4A,0x4e,0xB9, 0x0A,0x4d,0x4C, 0x0d,0x15,0x41, 0x2d,0x92,0xB5,//2072 //2073 //2074 //2075 //2076 //2077 //2078 //2079 //2080 //2081 //2082 //2083 //2084 //2085 //2086 //2087 //2088 //2089 //2090 //2091 //2092 //2093 //2094 //2095 //2096 //2097 //2098 //2099}; /***复位 1302***/ void reset1302() { sclk=0; rst=0; rst=1; } /***向 1302 写入 1 字节***/ void wrieteByte1302(uchar add) { for(i=0;i&8;i++) { I_O=0; if(add&0x01)I_O=1; sclk=0;19 万年历设计sclk=1; add&&=1; } } void writeClkBye(uchar add,uchar num) { reset1302(); wrieteByte1302(add); wrieteByte1302(num); } /***1302 初始化***/ void init1302() { reset1302(); writeClkBye(0x8e,0); reset1302(); writeClkBye(0x90,0xaa); reset1302(); writeClkBye(0x80,00); reset1302(); writeClkBye(0x82,0x12); reset1302(); writeClkBye(0x84,0x12); reset1302(); writeClkBye(0x86,0x04); reset1302(); writeClkBye(0x88,0x03); reset1302(); writeClkBye(0x8a,0x07); reset1302(); writeClkBye(0x8c,0x12); reset1302();//允许写入//慢充电//秒初值//分// 时// 日// 月// 星期// 年20 青海民族大学毕业论文} /***检测忙位***/ void Check_Busy() { RS=0; RW=1; E=1; DataPort=0 while((DataPort&0x80)==0x80);//忙则等待 E=0; } /***写命令***/ void Write_Cmd(unsigned char Cmd) { Check_Busy(); RS=0; RW=0; E=1; DataPort=C DelayUs2x(5); E=0; DelayUs2x(5); } /****写数据***/ void Write_Data(unsigned char Data) { Check_Busy(); RS=1; RW=0; E=1; DataPort=D DelayUs2x(5); E=0; DelayUs2x(5); } /****液晶屏初始化***/ void Init_ST7920() { DelayMs(40); //大于 40MS 的延时程序 PSB=1; //设置为 8BIT 并口工作模式 DelayMs(1); //延时 RES=0; //复位 DelayMs(1); //延时 RES=1; //复位置高 DelayMs(10);21 万年历设计Write_Cmd(0x30); //选择基本指令集 DelayUs2x(50); //延时大于 100us Write_Cmd(0x30); //选择 8bit 数据流 DelayUs2x(20); //延时大于 37us Write_Cmd(0x0c); //开显示(无游标、不反白) DelayUs2x(50); //延时大于 100us Write_Cmd(0x01); //清除显示,并且设定地址指针为 00H DelayMs(15); //延时大于 10ms Write_Cmd(0x06); //指定在资料的读取及写入时, 设定游标的移动方向及指定显示的 移位,光标从右向左加 1 位移动 DelayUs2x(50); //延时大于 100us } /****从 1302 读取***/ uchar ReadByte1302() { uchar RB uchar TempB RByte=0x00; I_O=1; for(i=0;i&8;i++) { sclk=1; sclk=0; TempByte=(uchar)I_O; TempByte&&=7; RByte&&=1; RByte|=TempB } return RB } uchar read1302(uchar add) { reset1302(); wrieteByte1302(add); ReadByte1302(); num=ReadByte1302(); }22 青海民族大学毕业论文void LCDTestWord(bit i, uchar word) { if(i==0) { Write_Cmd(word); //i=0;则写入指令 } else { Write_Data(word); //i=1;则写入数据 } } /***向 LCD 发送一个字符串即写汉字***/ void LCDSendWord(uchar *p) { while(*p&0) { Write_Data(*p); p++; } } /***往 LCD 上填写 年 月 日 小时 分钟 秒 星期以及它们的 数据***/ void DisplayYear() { year=readd); //从 1302 的 0X8D 处读出年数据 LCDTestWord(0,0x81); //写指令 在第一行第二个字符位置显示 年 LCDTestWord(1,(year/16)+0x30); //写数据 LCDTestWord(1,year%16+0x30); //写数据 LCDTestWord(0,0x82); //写指令 第一行第三个字符位置 LCDSendWord(&年&); //显示 年 LCD DDRAM 第一行地址为 80-87, //第二行为 90-97,第三行为 88-8F,第四行为 98-9F } void DisplayMonth() { month=read); //从 1302 中读取月份数据 LCDTestWord(0,0x83); //写命令 if(month/16!=0) { LCDTestWord(1,(month/16)+0x30); //写数据 } else { LCDTestWord(1,0x20); //写数据 } LCDTestWord(1,month%16+0x30); //写数据23 万年历设计LCDTestWord(0,0x84); LCDSendWord(&月&); }//写指令 //显示 月void DisplayDay() { day=read); //从 1302 中读取日期数据 LCDTestWord(0,0x85); if(day/16!=0) { LCDTestWord(1,(day/16)+0x30); } else { LCDTestWord(1,0x20); } LCDTestWord(1,day%16+0x30); LCDTestWord(0,0x86); LCDSendWord(&日&); } void DisplayWeek() { week=(readb))%16; //从 1302 中读取星期数据 LCDTestWord(0,0x95); LCDSendWord(&星期&); LCDTestWord(0,0x97); if(week==7) {LCDSendWord(&日&);} if(week==6) {LCDSendWord(&六&);} if(week==5) {LCDSendWord(&五&);} if(week==4) {LCDSendWord(&四&);} if(week==3) {LCDSendWord(&三&);} if(week==2) {LCDSendWord(&二&);} if(week==1) {LCDSendWord(&一&);} //显示星期一到星期日 }void DisplayHour() { hour=read); LCDTestWord(0,0x90);24 青海民族大学毕业论文LCDTestWord(1,(hour/16)+0x30); LCDTestWord(1,hour%16+0x30); } void DisplayMin() { min=read); LCDTestWord(0,0x91); LCDTestWord(1,0x3a); LCDTestWord(1,(min/16)+0x30); LCDTestWord(1,min%16+0x30); LCDTestWord(1,0x3a); } void DisplaySec() { sec=read); LCDTestWord(0,0x93); LCDTestWord(1,(sec/16)+0x30); LCDTestWord(1,sec%16+0x30); } void UpDate() { DisplayYear(); //显示年 DisplayMonth(); //显示月 DisplayDay(); //显示日 DisplayWeek(); //显示星期 DisplayHour(); //显示时 DisplayMin(); //显示分 DisplaySec(); //显示秒 } void SetTime(uchar count) { unsigned char address, unsigned char max, LCDTestWord(0,0x98); LCDSendWord(&设置&); if(count==5) {LCDSendWord(&秒钟 if(count==4) {LCDSendWord(&分钟 if(count==3) {LCDSendWord(&小时 if(count==6) {LCDSendWord(&星期 if(count==2) {LCDSendWord(&日期 if(count==1) {LCDSendWord(&月份 if(count==0) {LCDSendWord(&年份//写入分割号 ://写入分割号 :&);address=0x81; &);address=0x83; &);address=0x85; &);address=0x8b; &);address=0x87; &);address=0x89; &);address=0x8d;25max=59;mini=0;} max=59;mini=0;} max=23;mini=0;} max=7;mini=1;} max=31; mini=1;} max=12;mini=1;} max=99;mini=0;} 万年历设计item=read1302(address);//读取 DS1302 某地址上的数值赋给 item item=(item/16)*10+item%16; if(k2==0) //加 item++; //数加 1 if(k3==0) //-减 item--; //数减 1 if(item&max) item= //查看数值有效范围 if(item&mini) item= writeClkBye(0x8e,0x00); item=(item/10)*16+item%10; writeClkBye(address-1,item); //将调整好的 item 值写入 DS1302 UpDate(); } /*键盘扫描*/ void keyscan () { if (k1==0) // 设置时间 { DelayMs(10); //按键消抖 if(k1==0&&w==0) //当是正常状态时就进入调时状态 { w=1; //进入调时 SetTime(next); //调整 } if(k1==0&&w==1) //当是调时状态 本键用于调整下一项 { next++; if(next&=7) {next= 0;} SetTime(next); //调整 } while(k1==0); //等待键松开 } if(k4==0) // 当在调时状态时就退出调时 { DelayMs(10); //按键消抖 if(k4==0&&w==1) { w=0;next=0;26 青海民族大学毕业论文Write_Cmd(0x01); //清除 LCD 的显示内容 } while(k4==0); //等待键松开 } if (k2==0) //加调整 { DelayMs(10); //按键消抖 if(k2==0&&w==1) { SetTime(next); //调整 } while(k2==0); //等待键松开 } if (k3==0) //减调整 { DelayMs(10); //按键消抖 if(k3==0&&w==1) { SetTime(next); //调整 } while(k3==0); //等待键松开 } } /***开机画面***/ void welcome() { LCDTestWord(0,0x81); LCDSendWord(&万年历设计&); LCDTestWord(0,0x91); LCDSendWord(&指导:…&); LCDTestWord(0,0x89); LCDSendWord(&制作:…&); LCDTestWord(0,0x99); LCDSendWord(&阳光总在风雨后&); } bit GetMoonDay(uchar LunarMonth,uint TableAddr) { switch (LunarMonth) //LunarMonth 指向农历月份 { case 1: { temp=YearCode[TableAddr]&0x08; //1 月,对应年份表里第一字节的 BIT3 位 if (temp==0) return(0); //为 0,月小27 万年历设计casecasecasecasecasecasecaseelse return(1); //为 1,月大 } 2: { temp=YearCode[TableAddr]&0x04; //2 月,对应年份表里第一字节的 BIT2 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 } 3: { temp=YearCode[TableAddr]&0x02; //3 月,对应第一字节的 BIT1 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 } 4: { temp=YearCode[TableAddr]&0x01; //1 月,对应第一字节的 BIT0 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 } 5: { temp=YearCode[TableAddr+1]&0x80; //5 月,对应第二字节的 BIT7 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 } 6: { temp=YearCode[TableAddr+1]&0x40; //6 月,对应第二字节的 BIT6 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 } 7: { temp=YearCode[TableAddr+1]&0x20; //7 月,对应第二字节的 BIT5 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 } 8: { temp=YearCode[TableAddr+1]&0x10; //8 月,对应第二字节的 BIT4 位28 青海民族大学毕业论文if (temp==0) return(0); else return(1); } case 9: {//为 0,月小 //为 1,月大temp=YearCode[TableAddr+1]&0x08; //9 月,对应第二字节的 BIT3 位 if (temp==0) return(0); //为 0,月小 else return(1); //为 1,月大 case } 10: { temp=YearCode[TableAddr+1]&0x04; if (temp==0) return(0); else return(1); } 11: { temp=YearCode[TableAddr+1]&0x02; if (temp==0) return(0); else return(1); } 12: { temp=YearCode[TableAddr+1]&0x01; if (temp==0) return(0); else return(1); } 13: { temp=YearCode[TableAddr+2]&0x80; if (temp==0) return(0); else return(1); }//10 月,对应第二字节的 BIT2 位 //为 0,月小 //为 1,月大case//11 月,对应第二字节的 BIT1 位 //为 0,月小 //为 1,月大case//12 月,对应第二字节的 BIT0 位 //为 0,月小 //为 1,月大case//13 月,对应第三字节的 BIT7 位 //为 0,月小 //为 1,月大} } void Conversion(uchar year,uchar month,uchar day) { uchar temp1,temp2,temp3,MonthP;//temp3,temp4 分别表示春节距元旦的天数 uint temp4,TableA //公历日离元旦的天数 bit flag2,flag_y; temp1=year/16; //BCD-&hex 先把数据转换为十六进制 高位 temp2=year%16; //低位 year=temp1*10+temp2; //把 年 数据 转换成 16 进制 temp1=month/16; //月份 高位 temp2=month%16; //月份 低位29 万年历设计month=temp1*10+temp2; //把 月 数据 转换成 16 进制 temp1=day/16; //日期 高位 temp2=day%16; //日期 低位 day=temp1*10+temp2; //把 日 数据 转换成 16 进制 TableAddr=year*0x03; //定位数据表地址 LCDTestWord(0,0x80); LCDSendWord(&20&); temp1=YearCode[TableAddr+2]&0x60; //取当年春节所在的公历月份 年份表中第 三字节 BIT6-5 表示春节的公历月份 temp1=_cror_(temp1,5); //循环右移 5 位,得到 春节所在的公历月份 temp2=YearCode[TableAddr+2]&0x1f; //取当年春节所在的公历日 年份表中第 三字节 BIT4-0 表示当年春节所在的公历日 if(temp1==0x01) // 计算当年春年离当年元旦的天数,春节只 会在公历 1 月或 2 月 temp3=temp2-1; //假如春节在公历 1 月, 则元旦离春节的天数 为 temp2-1 天 else temp3=temp2+0x1f-1; //假如春节在公历 2 月, 则无旦离春节的天数 为 temp2+0x1f-1 天 if (month&10) temp4=DayCode1[month-1]+day-1; //0 到 8 月某日距元旦的天数 else temp4=DayCode2[month-10]+day-1; //9 月开始的某一天距元旦的天数 if ((month&0x02)&&(year%0x04==0)) //如果公历月大于 2 月并且该年的 2 月为闰月, 天数加 1 temp4+=1; //计算机出公历日距元旦的天数和春节距元旦的 天数,则是为了比较公历日是在春节前还是春节后 //如果 temp3&temp4 则 公历日在春节之前 if (temp4&=temp3) //公历日在春节后或就是春节当日使用下面 代码进行运算 { temp4-=temp3; //公历日离春节的天数 因为公历日在春节 后 所以为 temp4-temp3 month=0x01; MonthP=0x01; //LunarMonth 为月份指向,公历日在春节前 或就是春节当日 LunarMonth 指向首月 flag2=GetMoonDay(MonthP,TableAddr); //检查该农历月为大小还是小月,大月返回 1, 小月返回 0 flag_y=0; if(flag2==0) //GetMoonDay()函数返回的是 030 青海民族大学毕业论文{temp1=0x1d;} //小月 29 天 else //GetMoonDay()函数返回的是 1 {temp1=0x1e;} //大月 30 天 temp2=YearCode[TableAddr]&0xf0; //年份数据表中第 1 字节 BIT7-4 为闰月, 为 0 则这年无闰月,如为 1,表示有闰月 temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,如为 0,则该年无闰月 BIT3-0 表示阴历 1 到 4 月的大小 1 为大 0 为小 while(temp4&=temp1) { temp4-=temp1; MonthP+=1; if(month==temp2) { flag_y=~flag_y; if(flag_y==0)month+=1; } else month+=1; flag2=GetMoonDay(MonthP,TableAddr); if(flag2==0)temp1=0x1d; else temp1=0x1e; } day=temp4+1; } else { //公历日在春节前使用下 面代码进行运算 temp3-=temp4; //公历日离春节的天数 因为公历日在春 节前 所以为 temp3-temp4 if (year==0x00){year=0x63;} else year-=1; TableAddr-=0x03; month=0x0c; temp2=YearCode[TableAddr]&0xf0; //格式第一字节 BIT7-4 位表示闰月月份,为 0,则无闰月,BIT3-0 对应阴历第 1-4 月的大小, temp2=_cror_(temp2,4); if (temp2==0)MonthP=0x0c; else MonthP=0x0d; // /* MonthP 为月份指向,如果当年有闰月,一年有十三个月,月指向 13,无闰月指向 12*/ flag_y=0; flag2=GetMoonDay(MonthP,TableAddr); if(flag2==0)temp1=0x1d; else temp1=0x1e; while(temp3&temp1) { temp3-=temp1;31 万年历设计MonthP-=1; if(flag_y==0)month-=1; if(month==temp2)flag_y=~flag_y; flag2=GetMoonDay(MonthP,TableAddr); if(flag2==0)temp1=0x1d; else temp1=0x1e; } day=temp1-temp3+1; } c_moon=1; temp1=year/10; temp1=_crol_(temp1,4); temp2=year%10; LunarYear=temp1|temp2; temp1=month/10; temp1=_crol_(temp1,4); temp2=month%10; LunarMonth=temp1|temp2; temp1=day/10; temp1=_crol_(temp1,4); temp2=day%10; LunarDay=temp1|temp2; } void Displaynongli() { uchar LunarYearD,ReY Conversion(year,month,day); LCDTestWord(0,0x88); //显示在 LCD 的 0X94 位置上 LCDSendWord(&农历&); LCDTestWord(1,LunarMonth/16+0x30); //农历月十位 LCDTestWord(1,LunarMonth%16+0x30); //农历月个位 LCDSendWord(&月&); LCDTestWord(1,LunarDay/16+0x30); //农历日十位 LCDTestWord(1,LunarDay%16+0x30); //农历日个位 LunarYearD=(LunarYear/16)*10+LunarYear%16; //农历年转换成 10 进制数 ReYear=LunarYearD%12; //农历年模 12,取余运算 switch(ReYear) { case 0: LCDTestWord(0,0x8e);LCDSendWord(&龙年&); //余 0 即整除 农历 龙年32 青海民族大学毕业论文case case case case case case case case case case case }1: LCDTestWord(0,0x8e);LCDSendWord(&蛇年&); 2: LCDTestWord(0,0x8e);LCDSendWord(&马年&); 3: LCDTestWord(0,0x8e);LCDSendWord(&羊年&); 4: LCDTestWord(0,0x8e);LCDSendWord(&猴年&); 5: LCDTestWord(0,0x8e);LCDSendWord(&鸡年&); 6: LCDTestWord(0,0x8e);LCDSendWord(&狗年&); 7: LCDTestWord(0,0x8e);LCDSendWord(&猪年&); 8: LCDTestWord(0,0x8e);LCDSendWord(&鼠年&); 9: LCDTestWord(0,0x8e);LCDSendWord(&牛年&); 10:LCDTestWord(0,0x8e);LCDSendWord(&虎年&); 11:LCDTestWord(0,0x8e);LCDSendWord(&兔年&);//蛇年} /***主程序***/ main() { k1=1; k2=1; k3=1; k4=1; Init_ST7920(); welcome(); delay(3000); init1302(); Init_ST7920(); while(1) { DisplayYear(); DisplayMonth(); DisplayDay(); DisplayWeek(); DisplayHour(); DisplayMin(); DisplaySec(); Displaynongli(); keyscan(); } }//显示年 //显示月 //显示日 //显示星期 //显示时 //显示分 //显示秒 //显示农历 //键盘扫描33
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 电脑数码万年历调表 的文章

 

随机推荐