万年历电子系统设计方案
电子万年历课程设计

电子万年历课程设计一、课程目标知识目标:1. 学生能够理解电子万年历的基本原理和组成部分。
2. 学生掌握电子万年历的日期、时间设置及调整方法。
3. 学生了解电子万年历在不同场合的应用和功能。
技能目标:1. 学生能够独立完成电子万年历的组装和调试。
2. 学生通过实际操作,学会使用编程软件编写简单的程序,实现电子万年历的基本功能。
3. 学生具备分析电子万年历故障并进行排除的能力。
情感态度价值观目标:1. 学生培养对电子万年历的兴趣,激发学习电子技术和编程的热情。
2. 学生在合作学习中,培养团队协作能力和沟通表达能力。
3. 学生认识到电子万年历在现代生活中的重要作用,增强对科技创新的认识。
课程性质:本课程为实践性较强的信息技术课程,结合电子技术和编程知识,培养学生的动手能力和创新能力。
学生特点:五年级学生具备一定的电子技术基础和编程兴趣,好奇心强,喜欢动手操作。
教学要求:教师应关注学生的个体差异,采用分层教学,引导学生主动探索、实践,提高学生的综合素养。
在教学过程中,注重目标分解,确保学生能够达到预期学习成果。
二、教学内容1. 电子万年历的原理与结构- 介绍电子万年历的组成及工作原理- 分析电子万年历的核心元件及其功能2. 电子万年历的组装与调试- 指导学生进行电子万年历的组装- 教授调试方法,确保电子万年历正常运行3. 编程软件的使用- 介绍编程软件的基本操作和功能- 演示如何编写程序,实现电子万年历的基本功能4. 电子万年历的应用与拓展- 讲解电子万年历在不同场合的应用- 探讨电子万年历的拓展功能及其实现方法5. 故障分析与排除- 分析电子万年历可能出现的故障- 教授排除故障的方法和技巧教学内容安排与进度:第一课时:电子万年历原理与结构介绍第二课时:电子万年历组装与调试第三课时:编程软件使用及基本程序编写第四课时:电子万年历应用与拓展第五课时:故障分析与排除教材章节关联:本教学内容与课本第四章“电子时钟与万年历”相关,涉及电子万年历的原理、组装、编程及应用等方面的知识。
项目四 电子万年历系统设计

21 22 23 24 25 26 P2.5 27 P2.6 28 P2.7
RXD TXD ALE/P PSEN
10 11 30 29
4.2单片机与LCD液晶显示模块接口
#include <reg51.h>
#define uchar unsigned char
sbit LCDEN=P1^5;
//
使能信号,H为读,H跳变
74ABLS16124
CLK GND
8 VMCRC7
194
7AB4LS16124
CLK GND
8 VMCRC7
194
7AB4LS16124
CLK GND
8 VMCRC7
194
74ABLS16124
CLK GND
8 VMCRC7
194
B A
2 1
19 18
X1 X2
9 RESET
17 16
RXD TXD ALE/P PSEN
时钟脉冲,P0.0作为数据输出线。
DS1
DS2
DS3
DS4
DS5
U1
1 2 3 4 5 6 7 8
P10 P11 P12 P13 P14 P15 P16 P17
P00 P01 P02 P03 P04 P05 P06 P07
39 38 37 36 35 34 33 32
dp
8
g7
d
f6
c
ee 5
b
g
f
Y a=4?
N
发送第(4-a)个数码 管的字型码
sent(dispb[4-a])
Y i=8?
N
ch=ch<<1; DIN=CY; CLK=0; CLK=1;
电子万年历的设计

三、硬件设计
LED数码管动态 数码管动态 扫描显示模块 AT89S52 主控制 模块 温度采集模块 键盘模块
DS1302时钟模块 时钟模块
主控制系统图
键盘模块
日期和时间的修改由3 个按键构成。 键1为向右移; 键2为加1; 键3为减1。
DS1302的引脚图
返回
ds1302内部结构
温度采集模块
谢谢大家 欣赏
数字式温度传感器DS18B20, 它是数字式温度传感器, 具有测量精度高,电路连 接简单特点,此类传感器 仅需要一条数据线进行数 据传输,使用P0.7与 DS18B20的I/O口连接加一 个上拉电阻,Vcc接电源 ,Vss接地
I/O
vss
vcc
返回
LED动态扫描显示模块 动态扫描显示模块
系统电路图
一.设计要求
具有年、 具有年、月、日、星期、时、分、秒等功 星期、 能; 时间与阴、阳历能够自动关联; 时间与阴、阳历能够自动关联; 具备年、 星期、 具备年、月、日、星期、时、分、秒校准 功能; 功能; 具有温度计功能; 具有温度计功能;
二、基本方案
采用AT89S52作为主控制系统 作为主控制系统 采用 采用DS1302提供时钟 提供时钟 采用 采用数字式温度传感器DS18B20 采用数字式温度传感器 采用LED数码管动态扫描作为显示 数码管动态扫描作为显示 采用
1.
六、总结
通过此次毕业设计, 通过此次毕业设计,我 不仅把知识融会贯通, 不仅把知识融会贯通,而且 丰富了大脑, 丰富了大脑,同时在查找资 料的过程中也了解了许多课 外知识,开拓了视野, 外知识,开拓了视野,认识 了将来电子的发展方向, 了将来电子的发展方向,使 自己在专业知识方面和动手 能力方面有了质的飞跃。 能力方面有了质的飞跃。
基于AT89C51电子万年历的设计与仿真设计方案

基于AT89C51电子万年历的设计与仿真设计方案第一章绪论1.1 课题的背景在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。
为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。
钟表的发展是非常迅速的,从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能——计时功能,只是工作原理不同而已,在人们的使用过程中逐渐发现了钟表的功能太单一,没有更大程度上的满足人们的需求。
随着电子技术的迅速发展,特别是随着大规模集成电路产生而出现的微型计算机,给人类生活带来了极大的方便。
走入家庭,从洗衣机、微波炉到音响、汽车,到处都可以见到单片机应用的踪影。
如果说微型计算机技术的出现使现代科学研究得到了质的飞跃,那么也可以毫不夸的说:“单片机技术的出现则是给现代工业测控领域带来了一次新的工业革命”。
因此,单片机技术的开发和应用水平已经逐步成为一个国家自动化发展水平的标志之一。
万年历是采用数字电路实现对时、分、秒数字显示的计时装置, 随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
它们可以对年、月、日、周日、时、分、秒进行计时,还具有润年补偿等功能,且使用寿命长、误差小、使用方便,电子万年历的出现给人们的生活带来的诸多方便。
目前,国际上的电子万年历正从模拟模式向数字式、由集成化向智能化的方向飞速发展。
1.2 电子万年历的应用电子万年历广泛用于个人家庭,车站,码头办公室等公共场所,成为人们常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。
万年历电子系统设计方案

万年历电子系统设计方案一、设计要求与方案论证1.1 项目设计容、功能、指标:(1)基本要求①具有年、月、日、时、分、秒等功能;②具有自动判别闰年闰月的功能③有一路闹钟( 2 ) 创新要求①具有闹钟功能,时间到后蜂鸣器响,led灯亮。
②设置的时间日期掉电不丢失③具有温度计功能;1.2项目设计方案和比较1.2.1单片机芯片的选择方案和论证:方案一:采用89C51芯片作为硬件核心,采用Flash ROM,部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用STC89C52,片ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用AT89S52作为主控制系统.1.2.2 显示模块选择方案和论证:方案一:采用Lcd液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。
方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示. 方案三:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
由于显示的容较多,采用led数码管不方便,所以采用了LCD液晶作为显示。
1.2.3时钟芯片的选择方案和论证:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
电子万年历系统设计方案

电子万年历系统设计方案1.1 STC89C52简介STC89C52完全兼容MCS-51,还有新的功能,比如新增两级中断优先级,多一个外中断,置EEPROM,512B存等。
还支持ISP下载,不用编程器,只要一个MAX232和一些廉价的元件就能写程序,可擦写10万次。
比51起最大的优点能支持在线下载,在线烧写程序,而不必专门买昂贵的编程器,只需要ISP下载线就可以了。
图1 STC功能逻辑图1.2 性能参数STC单片机比51单片机性能有以下优越性:(1) 高抗静电(ESD),6000伏静电测试,直接打在芯片管脚上,安然无恙。
(2) 超强抗干扰,轻松过2KV/4KV,快速脉冲干扰(EFT)。
(3) 超强加密,性能良好。
(4) STC 5V单片机,宽电压,5V - 3.8V给复位信号,正常工作。
(5) STC 单片机,Power 直接在用户系统上用ISP在线下载方式,将用户程序(6) 下载进STC单片机Down,掉电时功耗<0.1uA(C版本)。
(7) I/O 口输入/ 输出口经过特殊处理,很多干扰是从I/O 进去的,每个I/O 均有对VCC,对GND二级管箝位保护。
(8) 单片机部的电源供电系统经过特殊处理,很多干扰是从电源进去的。
图 2 STC89C52引脚图鉴于SCT89C52和AT98C51引脚分布相同,以上仅介绍SCT89C52一些优于AT98C51的性能,在此,就不对单片机多做介绍了,详细参数可以参考SCT89C52 PDF资料图,或者相关书籍,或者上网查阅相关,在此,推荐一官方:.mcu-memory.2 应用系统设计2.1系统功能说明根据家居生活中的实际需要,万年历应该具有如下功能。
1、时间显示时间显示是万年历设计最重要的功能。
万年历应该不仅能准确显示时、分、秒,而且还要能够显示年、月、日和星期。
2、时间调整万年历在第一次使用时,需要根据当前时间进行时间调整,设定起初始时间,设置完成之后,它会在设定值基础上进行准确的计时和显示。
基于51单片机的万年历设计

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。
51 单片机作为核心控制器,负责整个系统的运行和数据处理。
时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。
二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。
2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。
3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。
4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。
三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。
然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。
接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。
2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。
3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。
4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。
四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。
在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。
设置完成后,将新的时间数据保存到时钟芯片中。
五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。
通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。
六、系统调试在完成硬件和软件设计后,需要对系统进行调试。
基于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)附录............................................................................................................... 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
万年历电子系统设计方案一、设计要求与方案论证1.1 项目设计容、功能、指标:(1)基本要求①具有年、月、日、时、分、秒等功能;②具有自动判别闰年闰月的功能③有一路闹钟( 2 ) 创新要求①具有闹钟功能,时间到后蜂鸣器响,led灯亮。
②设置的时间日期掉电不丢失③具有温度计功能;1.2项目设计方案和比较1.2.1单片机芯片的选择方案和论证:方案一:采用89C51芯片作为硬件核心,采用Flash ROM,部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。
方案二:采用STC89C52,片ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。
所以选择采用AT89S52作为主控制系统.1.2.2 显示模块选择方案和论证:方案一:采用Lcd液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。
方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示. 方案三:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。
由于显示的容较多,采用led数码管不方便,所以采用了LCD液晶作为显示。
1.2.3时钟芯片的选择方案和论证:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V围,2.5V时耗电小于300nA,但成本高。
最终确定采用方案一,直接用单片机定时器提供秒信号。
1.2.4温度传感器的选择方案与论证:方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。
此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。
方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。
另外,数字式温度传感器还具有测量精度高、测量围广等优点。
最终采用DS18B20。
1.2.5 掉电不丢失采用EEROM 24C02存储设定的时间日期,实现掉电不丢失。
1.3 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用STC89C52作为主控制系统;单片机计数器提供时钟;数字式温度传感器18B20;LCD液晶屏作为显示;用独立按键控制时间的调整、闹钟的设定。
二.系统的硬件设计与实现2.1 电路设计框图2.2 系统硬件概述本电路是由STC89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由单片机部计数器构成,每计1秒,产生一个终断,提供秒信号;采用E2ROM 1602存储,掉电不丢失;温度的采集由DS18B20构成;显示部份由液晶显示屏1602构成。
2.3 主要单元电路的设计2.3.1单片机主控制模块的设计stc89c52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端. 如图-1 所示图-1 主控制系统2.3.2温度采集模块设计如图-3所示。
采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P2.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,1管脚接地。
图-3 DS18B20温度采集2.3.3部计数器用计数器的工作方式一,采用16位加一计数器, THx8位和TLx8位组成16位加1计数器,计数外部脉冲个数:1~65536(216),计数的最大值为65536,定时时间(若T=1ms):1ms~(65536×T=65.54ms)。
计数器工作原理框图如下2.3.4 显示模块的设计显示模块通过一块16脚的LCD1602组成。
其中1、2脚接地,7、9、11分别接一个I/O口用于控制液晶的显示,13--28接P0的8个I/O口用于数据传输,29、31用于控制液晶的背光。
如下图所示基本操作时序表读写操作时序如图所示:图读操作时序图写操作时序2.3.5 按键模块的设计采用独立按键控制,上拉电阻接Vcc,按键为低电平有效。
2.3.6 蜂鸣器模块的设计蜂鸣器需要用三极管驱动才能工作,高电平有效。
2.3.6 rom模块采用E2ROM 24C02,存储时间设置,可以起到掉电不丢失的作用。
2.3.7 串口下载模块采用芯片max232,在pcb板上设计串口,接单片机的txd和rxd,用于下载程序。
三、系统的软件设计实验程序流程图如下所示:四、调试过程和测试方法调试过程:1、首先在一块单片机开发板上调用相应的模块,调试程序,这主要是软件调试,软件调试正确后,按照原理图将所需模块用DXP软件画pcb板并完成腐蚀和焊接。
2、检测串口是否能够下程序3、检测晶振工作频率是否正常4、检测按键按下前后输出端点评是否正常5、正确下进程序之后,发现液晶显示屏始终无法显示字符,这是调节液晶1602 的5管脚相连的滑动变阻器,直至能够显示字符。
6、在设定时间的时候,光标闪烁显示正在设置的是哪一位,但加上温度显示后,由于温度随时在采样并显示,所以出现了温度与时间抢光标的情况,而更加糟糕的是,由于不同模块间的相互干扰,加上温度后,时间经常会终止,这是用单片机部计数器定时的弊端,如果用时钟芯片,应该可以避免这种现象。
最终只能去掉温度显示模块。
结果测试:最终可以实现年、月、日、时、分、秒的显示和闹钟功能,可以判断闰年闰月,时间可以设定。
按下s1进入时间设定模式,此时再按键s1可以切换要设置的是哪一位,多次按s1,依次可以设定秒、分、时、日、月、年的低2位、年的高2位、时钟的分、时钟的时,按键s2使被设置位的数值增加,按键s3使被设置位的数值减小,按键s4使液晶显示从时间设定模式转换为正常走时模式。
闹钟所设定的时间到后,蜂鸣器响,led灯亮,这里的led 灯代表一个驱动,比如家里的电饭煲,当时间到的时候,可以自动启动,此时按下按键s5,蜂鸣器停止鸣叫,led灯灭。
掉电后,设定的时间不会丢失,再次开机,仍未原关机前的时间。
此外,串口工作正常。
五、参考文献[1] 郭天翔.新概念51单片机C语言教程入门、提高、开发、拓展全..电子工业2009.1[2]罗杰 .电子线路设计实验测试. 电子工业 2008年4月[3] 江志红51单片机技术与应用系统开发案例精选清华大学2008.12[3] 居义单片机课程设计指导清华大学 2009.9[3] 宋戈 51单片机应用开发例大全人民邮电 2008.12附录一、原理图与PCB图附录二、试验程序#include<reg52.h>#define uchar unsigned char#define uint unsigned intbit write=0;sbit sda=P2^3;sbit scl=P2^4;sbit p1=P1;sbit rs=P2^2;sbit rw=P2^1;sbit lcden=P2^0;sbit s1=P1^0;sbit s2=P1^1;sbit s3=P1^2;sbit s4=P1^3;sbit s5=P1^4;sbit rd=P3^7;sbit beep=P2^3;sbit guanjiao=P3^4;sbit deng=P1^5;uchar count,s1num;uint shi1,shi2,shi3,shi4,shi5,shi6; char miao,shi,fen;uint setshi,setfen;uint ri,yue,nian,nian1;uchar code table[]="2012-04-20";uint shi1=0;uint fen1=0;uchar flag;/**************************************AT24C02C芯片*****************************************************/ void flash(){;;}void start() //开始信号{sda=1;flash();scl=1;flash();sda=0;flash(); }void stop() //停止{sda=0;flash();scl=1;flash();sda=1;flash(); }void respons() //应答{uchar i;scl=1;while((sda==1)&&(i<250)) i++; scl=0;flash();}void init(){sda=1;flash();scl=1;flash();}void write_byte(uchar date) {uchar i,t;t=date;for(i=0;i<8;i++){t=t<<1;scl=0;flash();sda=CY;flash();scl=1;flash();}scl=0;flash();sda=1;flash();}uchar read_byte(){uchar i,k;flash();sda=1;flash();for(i=0;i<8;i++){scl=1;flash();k=(k<<1)|sda;scl=0;flash();}return k;}void write_add(uchar address,uchar date) {start();write_byte(0xa0);respons();write_byte(address);respons();write_byte(date);respons();stop();}uchar read_add(uchar address){uchar date;start();write_byte(0xa0);respons();write_byte(address);start();write_byte(0xa1);respons();date=read_byte();stop();return date;}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di(){beep=0;delay(100);beep=1;}void write_(uchar ){rs=0;lcden=0;P0=;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) {rs=1;lcden=0;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date) {uchar sh,ge;sh=date/10;ge=date%10;write_(0x80+0x40+add);write_date(0x30+sh);write_date(0x30+ge);}void write_sfm1(uchar add,uchar date) {uchar sh,ge;sh=date/10;ge=date%10;write_(0x80+add);write_date(0x30+sh);write_date(0x30+ge);}void init0(){uchar num;// P1=0x0f;rd=0;rw=0;lcden=0;count=0;guanjiao=0;init();write_(0x38);write_(0x0c);write_(0x06);write_(0x01);write_(0x80+4);write_date('-'); delay(5);write_(0x80+0x40+2); write_date(':');write_(0x80+7);write_date('-'); delay(5);delay(5);write_(0x80+0x40+5); write_date(':'); delay(5);write_(0x80+0x40+12); write_date(':'); delay(5);miao=read_add(1);fen=read_add(2);shi=read_add(3);ri=read_add(4);yue=read_add(5);nian=read_add(6);nian1=read_add(7);fen1=read_add(8);shi1=read_add(9);write_sfm(6,miao); write_sfm(3,fen);write_sfm(0,shi);write_sfm1(8,ri);write_sfm1(5,yue); write_sfm1(2,nian); write_sfm1(0,nian1); write_sfm(13,fen1); write_sfm(10,shi1); TMOD=0x01;TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;ET0=1;TR0=1;}void keyscan(){if(s1==0){delay(5);if(s1==0){s1num++;while(!s1);di();if(s1num==1){TR0=0;write_(0x80+0x40+6); write_(0x0f);}if(s1num==2){write_(0x80+0x40+3);} if(s1num==3){write_(0x80+0x40+0);} if(s1num==4){write_(0x80+8);}if(s1num==5){write_(0x80+5);}if(s1num==6){write_(0x80+2);}if(s1num==7){write_(0x80);}if(s1num==8){write_(0x80+0x40+13);} if(s1num==9){write_(0x80+0x40+10);} if(s1num==10){s1num=0;TR0=1;write_(0x0c);}}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){while(!s2);di();if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(6,miao); write_(0x80+0x40+6); write_add(1,miao);} if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(3,fen); write_(0x80+0x40+3); write_add(2,fen);} if(s1num==3){shi++;if(shi==24)shi=0;write_sfm(0,shi); write_(0x80+0x40+0);write_add(3,shi);}if(s1num==4){if(((nian1*100+nian)%4==0&&(nian1*100+nian)%100!=0)||(nian1*100+nian)%400==0) {goto ll1;}if(yue==2){ri++;if(ri==29)ri=1;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);goto ll2;}ll1: if(yue==2){ri++;if(ri==30)ri=1;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);}ll2: if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){ri++;if(ri==32)ri=1;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);}if(yue==4||yue==6||yue==9||yue==11) {ri++;if(ri==31)ri=1;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);}}if(s1num==5){yue++;if(yue==13)yue=1;write_sfm1(5,yue);write_(0x80+5);write_add(5,yue);}if(s1num==6){nian++;if(nian==100)nian=0;write_sfm1(2,nian);write_(0x80+2);write_add(6,nian);}if(s1num==7){nian1++;if(nian1==100)nian1=0;write_sfm1(0,nian1);write_(0x80);write_add(7,nian1);} if(s1num==8){fen1++;if(fen1==60)fen1=0;write_sfm(13,fen1); write_(0x80+0x40+13); write_add(8,fen1);}if(s1num==9){shi1++;if(shi1==24)shi1=0;write_sfm(10,shi1); write_(0x80+0x40+10); write_add(9,shi1);}}} if(s3==0){delay(5);if(s3==0){while(!s3);di();if(s1num==1){miao--;if(miao==-1)miao=59;write_sfm(6,miao);write_(0x80+0x40+6);write_add(1,miao);}if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(3,fen);write_(0x80+0x40+3);write_add(2,fen);}if(s1num==3){shi--;if(shi==-1)shi=23;write_sfm(0,shi);write_(0x80+0x40+0);write_add(3,shi);}if(s1num==4){if(((nian1*100+nian)%4==0&&(nian1*100+nian)%100!=0)||(nian1*100+nian)%400==0) {goto lll1;}if(yue==2){ri--;if(ri==-1)ri=28;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);goto lll2;}lll1: if(yue==2){ri--;if(ri==-1)ri=29;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);}lll2: if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) {ri--;if(ri==-1)ri=31;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);}if(yue==4||yue==6||yue==9||yue==11){ri--;if(ri==-1)ri=30;write_sfm1(8,ri);write_(0x80+8);write_add(4,ri);}}if(s1num==5){yue--;if(yue==-1)yue=12;write_sfm1(5,yue); write_(0x80+5);write_add(5,yue);}if(s1num==6){nian--;if(nian==-1)nian=99;write_sfm1(2,nian); write_(0x80+2);write_add(6,nian);}if(s1num==7){nian1--;if(nian1==-1)nian1=99;write_sfm1(0,nian1); write_(0x80+0x40+8); write_add(7,nian1);} if(s1num==8){fen1--;if(fen1==-1)fen1=59;write_sfm(13,fen1); write_(0x80+0x40+13); write_add(8,fen1);}if(s1num==9){shi1--;if(shi1==-1)shi1=23;write_sfm(10,shi1);write_(0x80+0x40+10);write_add(9,shi1);}}}if(s4==0){delay(5);if(s4==0){while(!s4);TR0=1;s1num=0;write_(0x0c);setshi=read_add(8);setfen=read_add(9);}}}if(s5==0){delay(5);if(s5==0){while(!s5);guanjiao=0;flag=0;deng=1;}}}void main(){ init0();while(1){ keyscan();if((shi==shi1)&&(fen==fen1)&&flag){guanjiao=1;deng=0;}if((shi!=shi1)||(fen!=fen1)){flag=1;}if(count==20){ count=0;miao++;if(miao>59){ miao=0;fen++;if(fen>59){fen=0;shi++;if(shi>23){shi=0;ri++;{if(((nian1*100+nian)%4==0&&(nian1*100+nian)%100!=0)||(nian1*100+nian)%400==0) {goto loop1;}if(yue==2){if(ri>28){ri=1;yue++;goto loop2;}}loop1: if(yue==2){if(ri>29){ri=1;yue++;}}loop2: if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(ri>31){ri=1;yue++;}}if(yue==4||yue==6||yue==9||yue==11) {if(ri>30){ri=1;yue++;}}if(yue>12){yue=1;nian++;if(nian>99){nian=0;nian1++;write_sfm1(0,nian1);write_add(7,nian1); }write_sfm1(2,nian);write_add(6,nian); }write_sfm1(5,yue);write_add(5,yue);}write_sfm1(8,ri);write_add(4,ri);}write_sfm(0,shi);write_add(3,shi);}write_sfm(3,fen);write_add(2,fen);}write_sfm(6,miao);write_add(1,miao);}} }void timer0() interrupt 1 {TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++;}。