单片机万年历实训报告

合集下载

多功能电子万年历实训报告

多功能电子万年历实训报告

一、引言随着科技的发展,电子产品在我们的日常生活中扮演着越来越重要的角色。

作为电子信息专业的一名学生,我深知理论与实践相结合的重要性。

为了提高自己的动手能力和解决实际问题的能力,我参加了本次多功能电子万年历的实训项目。

通过本次实训,我不仅掌握了单片机的基本原理和编程方法,还学会了如何将理论知识应用于实际项目中。

二、实训目的1. 熟悉单片机的硬件结构和编程方法。

2. 掌握电子万年历的设计原理和实现方法。

3. 提高动手能力和解决实际问题的能力。

4. 培养团队协作和沟通能力。

三、实训内容本次实训主要围绕多功能电子万年历的设计与实现展开,主要包括以下几个方面:1. 硬件设计:选择合适的单片机作为核心控制单元,设计电路图,并焊接电路板。

2. 软件设计:编写程序,实现万年历的基本功能,如显示日期、时间、星期、闰年判断、闹钟等。

3. 温度采集:使用DS18B20温度传感器采集环境温度,并在LCD1602显示屏上显示。

4. 按键控制:设计按键电路,实现时间校准、闹钟设置、温度显示等功能。

四、实训过程1. 硬件设计:- 选择AT89C52单片机作为核心控制单元,因为它具有低功耗、高性能的特点。

- 设计电路图,包括晶振电路、复位电路、时钟电路、按键电路、LCD1602显示电路、温度传感器电路等。

- 焊接电路板,确保电路连接正确。

2. 软件设计:- 使用Keil软件编写程序,实现万年历的基本功能。

- 编写时间显示、闹钟、温度显示等模块的程序。

- 编写按键扫描程序,实现时间校准、闹钟设置、温度显示等功能。

3. 温度采集:- 使用DS18B20温度传感器采集环境温度。

- 将温度数据转换为数字信号,并在LCD1602显示屏上显示。

4. 按键控制:- 设计按键电路,实现时间校准、闹钟设置、温度显示等功能。

- 编写按键扫描程序,检测按键状态,并执行相应的操作。

五、实训结果经过努力,我成功完成了多功能电子万年历的设计与实现。

该万年历具有以下功能:1. 显示年、月、日、星期、时、分、秒。

单片机实训报告万年历

单片机实训报告万年历

一、实训目的随着科技的发展,单片机在各个领域的应用越来越广泛。

本次实训旨在通过万年历的设计与实现,让学生深入了解单片机的编程与应用,提高学生的实践能力和创新意识。

通过万年历的设计,使学生掌握单片机的基本原理、编程技巧以及相关外设的使用。

二、实训内容本次实训以AT89C51单片机为核心,结合DS1302时钟芯片、LCD1602液晶显示屏和独立键盘,设计并实现一个具有年、月、日、星期、时分秒显示以及闰年判断功能的万年历。

三、实训步骤1. 需求分析- 显示当前日期和时间,包括年、月、日、星期、时分秒。

- 判断闰年,正确显示2月的天数。

- 允许用户通过按键调整日期和时间。

- 具有电源掉电保护功能,保证数据不丢失。

2. 硬件设计- 核心模块:AT89C51单片机- 时钟模块:DS1302时钟芯片,提供精确的日期和时间。

- 显示模块:LCD1602液晶显示屏,用于显示日期、时间和星期。

- 按键模块:独立键盘,用于调整日期和时间。

- 电源模块:锂电池,提供稳定的电源。

3. 软件设计- 主程序:负责初始化硬件、读取时间、显示时间和日期、处理按键输入等。

- 时钟模块:读取DS1302芯片中的时间,并进行处理。

- 显示模块:将时间、日期和星期显示在LCD1602液晶显示屏上。

- 按键处理模块:根据按键输入调整日期和时间。

4. 程序编写- 使用C语言进行程序编写,利用Keil软件进行编译和烧录。

5. 调试与测试- 对程序进行调试,确保功能正常。

- 对万年历进行测试,验证其准确性。

四、实训结果经过设计、编程、调试和测试,成功实现了万年历的功能。

万年历能够准确显示当前日期和时间,并具有闰年判断功能。

用户可以通过按键调整日期和时间,且在电源掉电的情况下,万年历仍能保持时间。

五、实训心得1. 实践出真知:通过本次实训,深刻体会到理论知识与实践应用相结合的重要性。

只有将所学知识运用到实际项目中,才能真正掌握单片机的编程与应用。

单片万年历的实训报告

单片万年历的实训报告

一、实训背景与目的随着科技的发展,单片机技术在各个领域得到了广泛应用。

万年历作为一种实用的电子设备,在日常生活中有着重要的地位。

本实训旨在通过设计并实现单片万年历,提高学生对单片机应用能力的掌握,加深对嵌入式系统设计、编程及调试的理解,培养解决实际问题的能力。

二、实训内容1. 万年历系统需求分析万年历系统应具备以下功能:(1)实时显示当前日期和时间;(2)具备闰年判断功能;(3)提供闰年、平年、大月、小月的判断;(4)提供日历查询功能;(5)提供闹钟功能。

2. 硬件设计万年历系统硬件主要由以下模块组成:(1)单片机:选用STC89C52单片机作为核心控制器;(2)实时时钟模块:选用DS1302实时时钟芯片,用于获取当前日期和时间;(3)显示模块:选用LCD1602液晶显示屏,用于显示日期和时间;(4)按键模块:选用独立按键,用于设置日期和时间、查询日历、设置闹钟等;(5)蜂鸣器:用于闹钟提示。

3. 软件设计万年历系统软件主要由以下部分组成:(1)主程序:负责初始化系统、处理按键输入、显示日期和时间、查询日历、设置闹钟等功能;(2)时钟模块:负责读取DS1302芯片的当前日期和时间,并更新显示;(3)日历模块:负责判断闰年、平年、大月、小月,并计算日期;(4)闹钟模块:负责设置闹钟时间,并在设定时间到来时触发蜂鸣器。

三、实训过程1. 硬件搭建根据设计方案,搭建万年历系统硬件电路,包括单片机、实时时钟模块、显示模块、按键模块和蜂鸣器等。

2. 软件编写使用C语言编写万年历系统软件,包括主程序、时钟模块、日历模块和闹钟模块等。

3. 调试与优化对万年历系统进行调试,修复程序中的错误,并对系统性能进行优化。

四、实训结果经过设计和调试,成功实现了一个功能完善的单片万年历系统。

系统能够实时显示当前日期和时间,具备闰年判断、日历查询、闹钟等功能。

用户可以通过按键设置日期和时间、查询日历、设置闹钟等。

五、实训总结1. 收获通过本次实训,我掌握了以下知识和技能:(1)熟悉了单片机系统硬件设计及搭建;(2)掌握了C语言编程及调试技巧;(3)了解了嵌入式系统设计及开发流程;(4)提高了解决实际问题的能力。

单片机万年历实习报告

单片机万年历实习报告

一、实习背景随着科技的发展,单片机技术逐渐成为电子领域的主流技术之一。

为了提高自己的实践能力,加深对单片机原理的理解,我参加了单片机万年历的实习项目。

本次实习以AT89C51单片机为核心,结合LCD1602液晶显示屏,设计并实现了一个功能完善的万年历。

二、实习目的1. 熟悉单片机的基本原理和编程方法,掌握单片机的应用技术。

2. 学会使用LCD1602液晶显示屏,了解其工作原理和驱动方法。

3. 掌握万年历的设计与实现方法,提高自己的动手能力和实际操作技能。

4. 培养团队合作精神,提高自己的沟通能力和组织协调能力。

三、实习内容1. 硬件设计(1)选用AT89C51单片机作为核心控制器。

(2)使用LCD1602液晶显示屏显示日期、星期等信息。

(3)选用DS1302实时时钟模块获取当前时间。

(4)选用按键模块实现用户交互功能。

2. 软件设计(1)编写程序实现万年历的基本功能,包括日期显示、星期显示、时间设置等。

(2)编写程序实现实时时钟模块的初始化、数据读取和更新。

(3)编写程序实现按键模块的扫描和处理。

(4)编写程序实现LCD1602液晶显示屏的初始化、数据写入和显示控制。

3. 调试与优化(1)对硬件电路进行调试,确保电路连接正确,各模块工作正常。

(2)对软件程序进行调试,修复程序中的错误,优化程序性能。

(3)调整程序参数,使万年历显示效果更佳。

四、实习过程1. 硬件电路搭建根据设计要求,我首先搭建了万年历的硬件电路。

首先,将AT89C51单片机、LCD1602液晶显示屏、DS1302实时时钟模块和按键模块连接起来。

然后,对电路进行测试,确保各模块正常工作。

2. 软件编程在硬件电路搭建完成后,我开始编写软件程序。

首先,编写程序实现万年历的基本功能,包括日期显示、星期显示、时间设置等。

然后,编写程序实现实时时钟模块的初始化、数据读取和更新。

接着,编写程序实现按键模块的扫描和处理。

最后,编写程序实现LCD1602液晶显示屏的初始化、数据写入和显示控制。

万年历时钟实训报告

万年历时钟实训报告

一、实训目的本次万年历时钟实训的主要目的是通过实际操作,学习万年历时钟的设计与制作,掌握万年历时钟的原理和制作方法,提高动手实践能力和创新思维。

实训过程中,我们学习了万年历时钟的硬件组成、软件编程、电路设计等知识,并对万年历时钟进行了实际制作。

二、实训内容1. 万年历时钟硬件组成万年历时钟主要由以下几部分组成:(1)单片机:作为万年历时钟的核心控制器,负责处理时间、日期、温度等数据,并控制整个时钟的运行。

(2)DS1302实时时钟模块:用于存储和提供当前时间、日期等信息。

(3)DS18B20温度传感器:用于检测环境温度。

(4)LCD12864液晶显示屏:用于显示时间、日期、温度等信息。

(5)按键:用于设置和调整时间、日期、温度等信息。

2. 万年历时钟软件编程万年历时钟的软件编程主要包括以下几部分:(1)主程序:负责初始化硬件设备,处理时间、日期、温度等数据,控制LCD显示。

(2)时钟模块:负责读取DS1302模块中的时间、日期信息,并实现时钟功能。

(3)温度模块:负责读取DS18B20传感器中的温度信息,并实现温度显示功能。

(4)按键处理模块:负责处理按键输入,实现时间、日期、温度的设置和调整。

3. 万年历时钟电路设计万年历时钟的电路设计主要包括以下几部分:(1)单片机与DS1302模块的连接:通过I2C接口连接单片机与DS1302模块,实现时间、日期信息的读取和写入。

(2)单片机与DS18B20传感器的连接:通过1-Wire接口连接单片机与DS18B20传感器,实现温度信息的读取。

(3)单片机与LCD12864显示屏的连接:通过SPI接口连接单片机与LCD12864显示屏,实现显示信息的输出。

(4)按键与单片机的连接:通过GPIO接口连接按键与单片机,实现按键输入的处理。

三、实训过程1. 硬件准备首先,准备好万年历时钟所需的硬件设备,包括单片机、DS1302模块、DS18B20传感器、LCD12864显示屏、按键等。

温度万年历的单片机实现实验报告

温度万年历的单片机实现实验报告

目录一、温度万年历设计的目的和意义 (1)二、电路设计方案 (1)三、原理设计 (1)四、方案结构图 (3)五、温度万年历1602驱动及显示的详细设计 (6)六、心得与总结 (14)一、温度万年历设计的目的和意义随着社会的发展,信息量的不断提升以前对信息交换的要求提高,温度万年历的发展以及投入市场变得非常有必要。

本设计是基于51单片机并模拟日常所用的日历,而51系列单片机是各单片机中最为典型和最有代表性的一种。

通过本次设计,学习和巩固了单片机指令编程的相关知识,熟悉单片机各部件的组成及其功能。

本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。

传统的电子日历大都体积大,功耗大,显示不准确等特点。

为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。

另外本设计具有显示实时温度的功能。

传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。

本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。

最后,温度和时间都将通过LCD1602液晶显示器进行显示。

测试表明系统达到了设计要求的各项功能,各部分工作正常。

二、电路设计方案采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD 液晶显示屏作为显示。

三、原理设计1.基本原理:本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD液晶显示屏显示。

同时还添加了提醒功能,通过蜂鸣器实现。

2.总体框图图13. 单元电路设计◆ 单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O 口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O 口(P0、P1、P2、P3),每一条I/O 线都能独立地作输出或输入。

制作电子万年历实训报告

制作电子万年历实训报告

一、引言随着科技的飞速发展,电子产品的普及和应用越来越广泛。

电子万年历作为一种常见的电子设备,不仅可以显示年、月、日、星期、时、分等信息,还可以实现闹钟、定时显示等功能。

为了提高我们的实践能力和创新能力,本次实训我们选择制作一款基于单片机的电子万年历。

二、实训目的1. 掌握电子万年历的基本原理和设计方法。

2. 熟悉单片机的编程和应用。

3. 培养团队协作能力和动手实践能力。

三、实训内容1. 硬件设计本实训所使用的硬件主要包括以下部分:- 单片机:AT89C52- 时钟模块:DS1302- 显示模块:LCD1602- 遥控模块:1838V- 按键模块:S1(设置键)、S2(上调键)、S3(下调键)、S4(复位键)硬件电路图如下:![电子万年历电路图](https:///5Q6zQ8Q.png)2. 软件设计本实训所使用的软件主要包括以下部分:- 单片机编程:C语言- 显示程序:LCD1602驱动程序- 遥控程序:1838V遥控接收程序软件流程图如下:![电子万年历软件流程图](https:///0Q7y8yJ.png)3. 功能实现本实训所实现的电子万年历具有以下功能:- 显示年、月、日、星期、时、分等信息。

- 遥控操作:设置时间、星期、日期等。

- 定时显示:定时显示当前时间。

- 停电自动计时:采用DS1302时钟模块,停电后可继续计时。

四、实训过程1. 硬件搭建首先,我们根据电路图搭建了电子万年历的硬件电路。

在搭建过程中,我们注意了以下几点:- 确保电路连接正确,避免短路或开路。

- 选择合适的元器件,确保电路性能稳定。

- 对电路进行测试,确保电路正常工作。

2. 软件编程接下来,我们使用C语言对单片机进行编程。

在编程过程中,我们遵循以下步骤:- 分析功能需求,确定程序结构。

- 编写程序代码,实现各项功能。

- 调试程序,确保程序运行正常。

3. 测试与优化在完成软件编程后,我们对电子万年历进行测试。

在测试过程中,我们发现以下问题:- 遥控操作不稳定。

单片机实训总结报告万年历

单片机实训总结报告万年历

一、引言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。

为了提高我们的实践能力和专业技能,我们选择了单片机实训作为课程的一部分。

在实训过程中,我们以万年历为例,通过学习单片机原理、编程和应用,实现了万年历的设计与制作。

本文将详细总结万年历实训的整个过程。

二、实训目标1. 掌握单片机的基本原理和编程方法;2. 熟悉万年历的设计与制作流程;3. 提高动手实践能力和团队合作精神;4. 培养创新思维和解决问题的能力。

三、实训内容1. 单片机原理及编程实训初期,我们学习了单片机的基本原理,包括CPU、存储器、输入输出接口等。

通过学习,我们了解了51单片机的结构、工作原理和指令系统。

在此基础上,我们学习了C语言编程,掌握了Keil软件的使用方法。

2. 万年历设计与制作万年历的设计与制作分为以下几个步骤:(1)需求分析:确定万年历的功能,包括显示年、月、日、星期、时分秒、农历、公历、节假日等。

(2)硬件设计:选择合适的单片机、显示屏、按键等硬件设备。

本实训选用AT89C51单片机、LCD1602显示屏和按键。

(3)软件设计:编写万年历的程序,实现功能需求。

程序主要包括以下几个模块:1)时钟模块:实现时分秒的计时功能;2)日期模块:实现年、月、日的显示和计算;3)星期模块:根据日期计算星期;4)农历模块:根据公历日期计算农历日期;5)节假日模块:显示节假日信息;6)按键模块:实现用户交互功能。

(4)调试与优化:对万年历程序进行调试,确保功能正常运行。

同时,对程序进行优化,提高运行效率。

3. 实训成果展示经过一段时间的努力,我们成功完成了万年历的设计与制作。

以下为万年历的部分功能展示:(1)显示当前日期、时间、星期和温度;(2)显示农历日期和节假日信息;(3)通过按键调整时间、日期和温度;(4)具有闹钟功能,可设置闹钟时间。

四、实训总结1. 提高了单片机编程能力:通过万年历的设计与制作,我们掌握了C语言编程方法,熟悉了Keil软件的使用。

万年历实训报告

万年历实训报告

一、任务目的通过万年历的设计与制作,进一步熟悉单片机内部定时器、I/O口、中断、提高实践能力二、设计要求用单片机设计一个功能实用,使用简便万年历,具体要求:根据提供的单片机键盘接口模块电路,加上必要的外部电路,设计出万年历的硬件电路,编写软件,用Proteus进行仿真实验,然后进行实物的软硬件调试,并撰写符合要求的实训报告。

三、系统硬件电路设计可分为最小系统、键盘电路、显示部分等几个单元电路,要求画出各部分电路图,写出工作原理。

这是仿真总图1、最小系统:最小系统包括时钟电路和复位电路。

时钟信号的产生:在MCS-51系列单片机内部有一个高增益反相放大器,其输入端引脚为XTAL1,其输出端引脚为XTAL2。

只在XTAL1和 XTAL2之间跨接晶振和微调电容,就可以构成一个稳定的自激振荡器。

复位电路,可分为上店复位电路和按键复位电路,在电子琴设计中采用的是按键复位电路。

该电路用RESET键实现复位,此时电源经两个电阻分压,在RST 端产生一个复位高电平2、按键电路:因为显示数码有限,所以就用P2_7口来判断,即当P2_7=0时显示时分秒;P2_7=1显示年月日。

而三个按钮分别是年月日或时分秒对应的加法按钮。

端,而P1口是段码输入端,来进行动态扫描。

四、软件设计#include<at89x51.h>unsigned int hour=0, min=0,sec=0,c=0,r=20, y=3,n=2012;unsigned char led[]={0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90}; void delay(unsigned int x){unsigned int j;while(x--)for(j=0;j<125;j++);}void main(){TMOD = 0x01;TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;EA=1;ET0=1;TR0=1;while(1){ unsigned int q=0;for(q=0;q<50;q++){ if (P2_7==0){P0=0XFE;P1=led[sec%10];delay(1);P0=0XFd;P1=led[sec/10];delay(1);P0=0XFb;P1=led[min%10];delay(1);P0=0Xf7;P1=led[min/10];delay(1);P0=0Xef;P1=led[hour%10];delay(1);P0=0Xdf;P1=led[hour/10];delay(1);}else{P0=0XFE;P1=led[r%10];delay(1);P0=0XFd;P1=led[r/10];delay(1);P0=0XFb;P1=led[y%10];delay(1);P0=0Xf7;P1=led[y/10];delay(1);P0=0Xef;P1=led[n%10];delay(2);P0=0Xdf;P1=led[n%100/10];delay(2);P0=0xbf;P1=led[n%1000/100];delay(2);P0=0x7f;P1=led[n/1000];delay(2);}}if(P2_0==0){delay(1);if(P2_0==0);if(sec==60){min++;}else sec++;}if(P2_1==0){delay(1);if(P2_1==0);if(min==60){hour++;}else min++;} if(P2_2==0){delay(1);if(P2_2==0);if(hour==24){r++;}else hour++;}if(P2_0==0){delay(1);if(P2_0==0);if(y==1||y==3||y==5||y==7||y==8|y==10||y==12){if(r==31){r=1;y++;}else r++;}if(y==2){if(((n%400==0||n%4==0&&n%100!=0))&&r>=29){r=1;y++;}else if(((n%400==1||n%4==1&&n%100!=1))&&r>=28){r=1;y++;}else r++;}if(y==4||y==6||y==9||y==11){if(r==30){r=1;y++;}else r++;}}if(P2_1==0){delay(1);if(P2_1==0);if(y==12){n++;y=1}else(y++);}if(P2_2==0){delay(1);if(P2_2==0);n++;}}}void T0_1() interrupt 1{ TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;c++;if(c==20) { c =0; sec++;}if(sec==60){sec = 0; min++; }if(min==60) { min=0; hour++; }if(hour==24){hour=0;r++;}if(y==1||y==3||y==5||y==7||y==8|y==10||y==12){if(r==31){r=1;y++;} else r++;}if(y==2){if(((n%400==0||n%4==0&&n%100!=0))&&r>=29){r=1;}else if(((n%400==1||n%4==1&&n%100!=1))&&r>=28){r=1;y++;}else r++;}if(y==4||y==6||y==9||y==11){if(r==30){r=1;y++;}else r++;}if(y==12){n++;y=1}else y++;}五、系统调试该万年历要实现以下功能:1、实现正常走时;2、能够校准时间和日期;3、能够自动区分平润年和大小月;在仿真过程中出现的最典型的问题是按下加法按钮要么出现闪烁或抖动,要么就加法跳动数次,经分析与试验得知这是由于延时时间使用不当,于是我们在循环扫描的前面加一个FOR语句循环50次后再扫描是否有键被按下六、心得体会通过此次万年历的设计与制作,获得了丰富的理论知识,极大地提高了实践能力。

万年历实训报告

万年历实训报告

单片机万年历实训报告课程名称:单片机C程序设计专业:电子信息专业班级: 13电信②班学号:1318201姓名:钟善友指导教师:黄丽英/候聪玲时间:2015年1月22日目录一、万年历设计思路操作分析二、硬件特性介绍AT89C51的工作原理功能特性概述主要性能参数三、工作原理万年历工作原理通用LCD162液晶介绍LCD162工作原理四、控制系统设计按键设计LCD162电路软件设计五、控制程序设计六、设计心得万年历设计思路按照功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。

本次设计万年历电路,分组独立计年月日星期时分秒:设计一个单片机控制的日期系统,利用单片机的定时器计数器定时和计数的原理,结合显示电路、LCD 液晶显示器以及按键来设计计数器。

使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂线路,使电路简明易懂,使用按键调整年月日星期时分秒,同时使用C 语言程序控制整个显示,使编程变得更容易,这样通过芯片和显示屏完成设计。

软件采用可读性强的C 语言来写,经过KeilC 编译通过,并最终将十六进制(HEX )文件烧写到单片机中。

程序编写采取模块化、结构化设计。

语言程序可以分为几个主要功能模块程序:驱动程序,定时/计数器程序,键盘中断扫描程序,1602LCD 液晶显示程序。

操作分析以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时间: ● 使用字符型LCD 显示器显示当前时间。

● 显示格式为“年—月—日 星期”● 时时:分分:秒秒●用4个功能键操作来设置当前时间,4个功能键接在P1.0~P1.3引脚上。

功能键K1~K4功能如下。

● K1—进入设置年,月,日,星期,小时,分钟,秒。

● K2—设置所选位的加1。

● K3—设置所选位减1。

● K4—确认完成设置。

程序执行后工作指示灯LCD 闪动,表示程序开始执行,LCD 显示“2015—01—22 4,”,“10:30:10”,然后开始计时。

数字万年历实训报告总结

数字万年历实训报告总结

一、实训背景随着科技的飞速发展,电子产品的普及,人们对信息获取和展示的需求日益增长。

数字万年历作为一种实用性强的电子设备,其设计制作在当今社会具有重要意义。

为了提高自身动手能力、设计能力和创新思维,我参加了本次数字万年历实训课程。

二、实训目的1. 熟悉数字万年历的设计原理和制作流程;2. 掌握电子元器件的选择和电路设计;3. 提高编程能力和嵌入式系统应用能力;4. 培养团队合作精神和创新能力。

三、实训内容1. 硬件设计:根据数字万年历的功能需求,选择合适的电子元器件,如单片机、显示屏、按键等,并设计相应的电路图。

2. 软件设计:编写单片机程序,实现万年历的功能,包括日期显示、星期显示、闰年判断、节假日提醒等。

3. 系统集成:将硬件和软件进行集成,调试并测试系统功能。

4. 优化与改进:针对实际运行中存在的问题,对系统进行优化和改进。

四、实训过程1. 硬件设计阶段:在老师的指导下,我了解了数字万年历的基本硬件结构,并学会了如何选择合适的电子元器件。

根据功能需求,我选择了AT89C52单片机作为核心控制单元,并选择了1602液晶显示屏和按键作为输入输出设备。

通过查阅相关资料,我完成了电路图的设计。

2. 软件设计阶段:我学习了C语言编程,并掌握了单片机程序设计的基本方法。

在编写程序时,我实现了以下功能:(1)初始化:设置单片机的工作状态,初始化LCD显示和按键扫描。

(2)日期显示:读取实时日期,并在LCD上显示年、月、日。

(3)星期显示:根据日期计算出星期,并在LCD上显示。

(4)闰年判断:根据年份判断是否为闰年。

(5)节假日提醒:根据预设的节假日信息,在LCD上显示提醒信息。

3. 系统集成阶段:将硬件和软件进行集成,调试并测试系统功能。

在调试过程中,我发现了以下问题:(1)按键响应不及时:经过检查,发现按键扫描程序存在bug,导致按键响应不及时。

经过修改程序,问题得到解决。

(2)LCD显示不清晰:发现LCD显示模块的背光亮度不足,导致显示不清晰。

单片机万年历实训报告

单片机万年历实训报告

单片机万年历实训报告1. 引言本报告旨在介绍单片机万年历的设计和实训过程。

单片机万年历是一种基于单片机技术的电子产品,可以显示日期、时间以及其他相关信息。

本实训目的在于通过设计和制作一个简单的单片机万年历,加深对于单片机的理解和应用。

2. 设计概述2.1 硬件设计在硬件设计方面,我们选择了常见的AVR单片机作为控制器,配合相应的显示器、按键和时钟电路。

主要元件选用的是ATmega16单片机,因为其性能稳定、易于编程且资源丰富。

2.2 软件设计软件设计方面,我们使用C语言编程,通过编写相应的代码实现日期、时间以及其他功能的显示和更新。

同时,为了方便用户操作,我们设计了一些菜单和按键控制功能。

3. 系统结构3.1 硬件结构单片机万年历的硬件结构主要包括以下部分:1.单片机:ATmega16单片机作为核心控制器。

2.显示屏:通过连接数码管或LCD显示器来显示日期、时间等信息。

3.按键:用于用户与系统进行交互,包括设置时间、日期等操作。

4.时钟电路:提供单片机系统所需的时钟信号。

3.2 软件结构单片机万年历的软件结构主要包括以下功能模块:1.时钟模块:实现时钟的初始化、计时和显示功能。

2.日历模块:实现日期的初始化、计算和显示功能。

3.操作模块:处理用户的按键输入,包括设置时间、日期以及其他功能。

4.显示模块:根据当前的日期、时间等信息,将其显示在相应的屏幕上。

4. 功能设计4.1 日期和时间显示在单片机万年历中,最基本的功能之一是显示当前的日期和时间。

通过时钟模块获取当前的时间,再通过日历模块计算日期,并将其显示在屏幕上。

4.2 设置功能为了方便用户对日期和时间进行设置,我们设计了相应的设置功能。

用户可以通过按键进行小时、分钟、月份、日期等的设置,然后通过确认键进行保存。

设置功能能够满足大部分用户对日期和时间的要求。

4.3 闹钟功能为了使单片机万年历具有更多实用性,我们添加了闹钟功能。

用户可以设置闹钟的时间,当时间到达时,系统会发出提示音,并在屏幕上显示相应信息。

数字万年历实验报告

数字万年历实验报告

一、实验目的1. 掌握数字万年历的基本原理和设计方法。

2. 熟悉单片机编程和硬件电路设计。

3. 提高动手能力和问题解决能力。

二、实验原理数字万年历是一种能够显示年、月、日、星期、时、分、秒等信息的电子设备。

它主要由单片机、时钟芯片、显示模块、按键模块等组成。

本实验采用MSP430F149单片机作为核心控制单元,通过编程实现对万年历功能的实现。

三、实验设备1. MSP430F149单片机实验板2. 1602液晶显示屏3. DS1302时钟芯片4. 按键模块5. 电源模块6. 连接线四、实验步骤1. 设计硬件电路根据实验要求,设计万年历的硬件电路。

主要包括以下部分:(1)单片机模块:使用MSP430F149单片机作为核心控制单元。

(2)时钟芯片模块:使用DS1302时钟芯片提供时间基准。

(3)显示模块:使用1602液晶显示屏显示年、月、日、星期、时、分、秒等信息。

(4)按键模块:使用按键模块实现时间调整、功能选择等操作。

2. 编写程序根据硬件电路设计,编写万年历的程序。

主要步骤如下:(1)初始化硬件设备,包括单片机、液晶显示屏、时钟芯片等。

(2)从时钟芯片读取当前时间,并显示在液晶显示屏上。

(3)编写按键处理程序,实现时间调整、功能选择等功能。

(4)编写显示程序,实现年、月、日、星期、时、分、秒等信息的显示。

(5)编写时钟芯片校准程序,实现时间的精确控制。

3. 调试程序将编写好的程序烧录到MSP430F149单片机中,通过调试工具进行调试。

主要调试内容包括:(1)检查液晶显示屏显示是否正常。

(2)检查按键功能是否正常。

(3)检查时间调整、功能选择等功能是否正常。

(4)检查时钟芯片校准是否准确。

五、实验结果与分析1. 实验结果经过调试,万年历实验板能够正常显示年、月、日、星期、时、分、秒等信息,并且可以通过按键进行时间调整、功能选择等操作。

2. 实验分析(1)万年历的硬件电路设计较为简单,主要涉及单片机、时钟芯片、液晶显示屏、按键模块等。

单片机万年历的实训报告

单片机万年历的实训报告

一、实训背景随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。

单片机具有体积小、功耗低、成本低、可靠性高等优点,因此在智能仪表、工业控制、家用电器等领域具有很高的应用价值。

万年历作为一种时间记录工具,在日常生活中有着广泛的应用。

本实训旨在通过单片机万年历的设计与实现,提高学生对单片机编程和硬件应用能力的培养。

二、实训目的1. 熟悉单片机的基本原理和编程方法;2. 掌握万年历的设计与实现方法;3. 提高学生的动手能力和实践能力;4. 培养学生的创新意识和团队协作精神。

三、实训内容1. 单片机万年历硬件设计(1)单片机核心:选用AT89C51单片机作为核心控制器,其具有丰富的I/O接口,便于与其他外围电路连接。

(2)时钟芯片:选用DS1302时钟芯片,用于存储和提供系统时间,具有年、月、日、时、分、秒等信息。

(3)显示模块:选用LCD1602液晶显示屏,用于显示年、月、日、时、分、秒、星期等信息。

(4)按键模块:选用独立按键,用于设置和调整时间、日期、星期等信息。

(5)温度传感器:选用DS18B20数字温度传感器,用于检测环境温度。

2. 单片机万年历软件设计(1)系统初始化:对单片机进行初始化,设置时钟频率、I/O端口等。

(2)时钟读取与显示:从DS1302时钟芯片读取时间,并在LCD1602显示屏上显示。

(3)按键处理:对按键进行扫描和处理,实现时间、日期、星期等信息的设置和调整。

(4)温度检测与显示:从DS18B20温度传感器读取温度,并在LCD1602显示屏上显示。

(5)温度报警:当温度超过设定值时,通过蜂鸣器发出报警信号。

3. 单片机万年历功能实现(1)显示年、月、日、时、分、秒、星期等信息。

(2)设置和调整时间、日期、星期等信息。

(3)显示环境温度。

(4)温度报警功能。

四、实训结果与分析1. 硬件电路搭建成功,实现了万年历的基本功能。

2. 软件编程完成,实现了万年历的时间显示、按键处理、温度检测与显示、温度报警等功能。

单片机万年历实训报告

单片机万年历实训报告

单片机万年历实训报告一、实训背景随着科技的不断发展,单片机已经成为了现代电子技术中不可或缺的组成部分。

在单片机的应用领域中,万年历也是一个比较重要的应用。

因此,在单片机课程中进行万年历实训,可以帮助学生更好地掌握单片机的编程和应用。

二、实训目标本次实训的主要目标是:1.掌握单片机的基本原理和编程方法;2.了解万年历的基本概念和计算方法;3.设计并实现一个完整的单片机万年历系统。

三、实训内容1.单片机基础知识学习在进行万年历实训之前,需要先学习单片机基础知识。

包括:单片机原理、寄存器操作、IO口操作等。

2.万年历功能分析了解万年历的基本概念和计算方法,包括:闰年判断、月份天数计算等。

3.系统设计与编程根据功能分析,设计并编写程序代码,实现一个完整的单片机万年历系统。

主要包括:时钟模块、显示模块、按键模块等。

4.系统测试与调试完成程序编写后,需要进行系统测试与调试,确保系统稳定可靠。

四、实训成果经过一段时间的学习和实践,我们成功地完成了单片机万年历的设计与实现。

具体成果如下:1.硬件部分硬件部分主要包括:单片机、时钟模块、显示模块、按键模块等。

其中,时钟模块采用DS1302芯片,显示模块采用数码管显示,按键模块采用矩阵按键。

2.软件部分软件部分主要包括:程序代码。

程序代码采用C语言编写,实现了完整的万年历功能。

3.系统测试经过系统测试,我们发现该单片机万年历系统具有较好的稳定性和可靠性。

可以正常地进行日期时间的显示和计算。

五、实训体会通过本次实训,我深刻地认识到了单片机在现代电子技术中的重要作用。

同时也提高了我对单片机编程能力和应用能力。

在实际工作中,我将更加注重对单片机技术的学习和应用。

六、总结本次实训是一次非常有意义的学习经历。

通过对单片机万年历的设计与实现,我们不仅掌握了单片机编程的基本方法,也了解了万年历的基本概念和计算方法。

希望今后能够继续保持学习的热情,不断提高自己的技术水平。

万年历实验报告

万年历实验报告

实验报告实验课程:单片机实验学生姓名:刘士伟胡奕彬邱若生学号:091522102909152210160915221035专业班级:09电科A班一、实验目的:1.熟悉和学习单片机制板过程2. 利用单片机制作一个多功能电子时钟二、实验原理利用单片机的定时中断产生简单的电子时钟,利用单片机的外部中断实现粗略的温控三、实验步骤及过程1、时钟源程序如下:#include <reg52.h>#include <intrins.h>#include"1602.h"#include"DELAY.H"unsigned char data year=11,month=6,date=9,k=1;//年、月、日、星期unsigned char disbuf[16],TempData[6];unsigned char data hour=20,min=10,sec=00,sec20=0; //时、分、秒tab[]=[‘MON,TUE,WED,THU,FRE,SAT,SUN’]void shuchu(){uchar n;for(n=0;n<16;n++){LCD_write_char(n,1, disbuf[n]);}for(n=1;n<6;n++)LCD_write_int(n+7,0,TempData[n]);}void updatetime(void){ disbuf[0] ='2';disbuf[1] ='0';disbuf[2] =year/10+48;disbuf[3] =year%10+48;disbuf[4] =' ';disbuf[5] =month/10+48;disbuf[6] =month%10+48;disbuf[7] ='.';disbuf[8] =date/10+48;disbuf[9] =date%10+48;disbuf[10] =' ';disbuf[11]=hour/10+48;disbuf[12]=hour%10+48;//disbuf[3]=' ';disbuf[14]=min/10+48;disbuf[15]=min%10+48;}void pro_timedate(){sec++;if(sec > 59){sec = 0;min++;if(min>59){min=0;hour++;if(hour>23){hour=0;date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) if (date>31){date=1;month++;} //大月31 天if (month==4||month==6||month==9||month==11)if (date>30){date=1;month++;} //小月30 天if (month==2){if( leap_year()) //闰年的条件{if (date>29) {date=1;month++;}} //闰年2 月为29 天else{if (date>28) {date=1;month++;}} //平年2 月为28 天}if (month>12) {month=1;year++;}if (year>99) year=0;}}}}//Timer0 中断处理程序,秒的产生void timer0() interrupt 1{TH0=0x4C; //Timer0 置10ms 定时初值dc00H(2^16=65536D,dc00H=56320D)TL0=0x00; //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)sec20++;if(sec20 >= 99) //1 秒时间(100*10ms=1000ms=1s){ sec20=0;updatetime ();pro_timedate();shuchu();if(sec&0x01)disbuf[13]=' ';else disbuf[13]=':';}}void main(){TMOD=0X01;TH0=0X4C;TL0=0X00;TR0=1;ET0=1;EA=1;LCD_init();while(1);}2、温控源程序如下:#include "1602.h"#include"DELAY.H"bit ReadTempFlag;//定义读时间标志unsigned char TempData[8]; //存储显示值的全局变量void Init_Timer0(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响//TH0=0x00; //给定初值//TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/ void Timer0_isr(void) interrupt 1{static unsigned int num;TH0=(65536-2000)/256;TL0=(65536-2000)%256;num++;if(num==300){num=0;ReadTempFlag=1;}}void shuchu(){uchar i,j=1;for(i=0;i<6;i++){/*j=1;if (TempData[i]==45){LCD_write_char(i,1,45);j=0;}else{LCD_write_char(i,1,' ');j=0;}if (TempData[i]==46){LCD_write_char(i,1,46);j=0;}*/LCD_write_int(i+7,1,TempData[i]);} }void main (void){unsigned int TempH,TempL,temp;Init_Timer0();LCD_init();LCD_write_string(0,0,"WAIT"); while (1) //主循环{if(ReadTempFlag==1){ReadTempFlag=0;temp=ReadTemperature();if(temp&0x8000){TempData[0]=45;//负号标志temp=~temp; // 取反加1temp +=1;}elseTempData[0]=0;TempH=temp>>4;TempL=temp&0x0F;TempL=TempL*6/10;//小数近似处理if(TempH/100==0)TempData[1]=0;elseTempData[1]=TempH/100; //十位温度if((TempH/100==0)&&((TempH%100)/10==0))//消隐TempData[2]=0;elseTempData[2]=(TempH%100)/10; //十位温度TempData[3]=(TempH%100)%10; //个位温度,带小数点TempData[4]=46;TempData[5]=TempL;TempData[6]=0x39; //显示C符号}LCD_write_string(0,1,"wendu:");LCD_write_string(13,1,"c");shuchu();}}3、实验原理图如下:四、实验心得及体会经过本次的课题设计与研究,我学习了除课本以外的很多知识,掌握的很多实验操作技能。

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

单片机万年历实训报告系部:电气自动化系班级:13电信2班******指导老师:黄丽英、侯聪玲实训时间:2015年1月19日~23日用AT89C51与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与AT89C51 设计可调式电子日历时钟。

1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。

控制程序的编写等。

1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。

方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

但造价较高。

1.3.2 、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。

所以不用此种作为显示。

方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。

所以也不用此种作为显示。

方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。

LCD1602可实现显示2行十六个字符。

1.3.4、电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统;LCD1602液晶带汉字库显示屏作为显示部分。

二、硬件设计2.1、电路设计模块图如图2.3、用proteus仿真软件仿真并抓图。

三、软件设计3.1、画出各个函数流程图。

3.1.1、LCD1602液晶显示控制流程图如图是3.1.2、调时函数控制流程如图实训心得:通过为期一周的单片机实训,是我们对这门课有了许多新的了解,弥补了在课堂上学习的不足。

相信这对我们以后的学习和工作都会有很大的帮助。

我们一定要在最短的时间里对这些不足加以改正! 在试训中有苦有甜,当我们为一个很难攻破的程序找出路时,心情烦躁,感觉自己很不可理喻,当程序一点一点编好后,自己从心底感觉到一点小小的安慰,看着自己的成果。

感觉很欣慰。

总而言之,单片机课程设计对于我们有很大的帮助,我们从中受益匪浅。

程序代码。

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar a,count,S1num,xqnum;uchar yue,ri,shi,fen,miao;uint nian;sbit lcdrs=P2^5;sbit lcdrw=P2^4;sbit lcden=P2^3;sbit S1=P3^0; //定义键--进入设置sbit S2=P3^1; //定义键--增大sbit S3=P3^2; //定义键--减小sbit S4=P3^3; //定义键--退出设置uchar code table0[]="2015-01-11 SUN";uchar code table1[]="00:00:00";uchar code xingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/**************************************************1602液晶显示器模块*************************************************/void write_com(uchar com) //液晶写指令{lcdrw=0;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar dat) //液晶写数据{lcdrw=0;lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}/********************************************年月日写入1602函数********************************************/void write_sfm(uchar add,uchar dat) //写时分秒函数{uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);}void write_yr(uchar add,uchar dat) //写月日函数{uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}void write_nian(uchar add,uint dat) //写年函数{uint qian,bai,shi,ge;qian=dat/1000;bai=dat%1000/100;shi=dat%100/10;ge=dat%10;write_com(0x80+add);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);}/***************************************************1602初始化***************************************************/void init_lcd() //液晶初始化{lcden=0;nian=2015;yue=1;ri=11;shi=0; //初始shi、fen、miaofen=0;miao=0;write_com(0x38); //设置16x2显示,5x7点阵,8位数据口write_com(0x0c); //设置开显示,不显示光标write_com(0x06); //写一个字符后地址指针加1write_com(0x01); //显示清0,数据指针清0}void init() //初始化函数{init_lcd(); //液晶初始化write_com(0x80); //设置显示初始坐标for(a=0;a<14;a++) //显示年月日初始值{write_data(table0[a]);delay(5);}write_com(0x80+0x40); //设置显示初始坐标for(a=0;a<8;a++) //显示时分秒初始值{write_data(table1[a]);delay(5);}write_nian(0,nian);write_sfm(6,miao); //分别将shi、fen、miao送去液晶显示write_sfm(3,fen);write_sfm(0,shi);count=0;xqnum=0;S1num=0; //初始化全局变量countTMOD=0x01; //设置定时器0工作模式1TH0=(65535-50000)/256; //定时器装初始值TL0=(65535-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0}/**************************************************独立键盘*************************************************/void keyscan(){if(S1==0){delay(5); //确认定义键被按下if(S1==0){S1num++; //定义键S1按下次数记录while(!S1); //释放按键确认if(S1num==1) //S1按下一次时{TR0=0; //关闭定时器write_com(0xc0+7); //光标定位到秒位置write_com(0x0f); //光标闪烁}if(S1num==2) //S1按下两次时{write_com(0xc0+4); //光标定位到分位置}if(S1num==3) //S1按下三次时{write_com(0xc0+1); //光标定位到时位置}if(S1num==4) //S1按下四次时{write_com(0x80+13); //光标定位到星期位置}if(S1num==5) //S1按下五次时{write_com(0x80+9); //光标定位到日位置}if(S1num==6) //S1按下六次时{write_com(0x80+6); //光标定位到月位置}if(S1num==7) //S1按下七次时{write_com(0x80+3); //光标定位到年位置}if(S1num==8) //S1按下八次时{S1num=0; //S1记录按键次数清零TR0=1; //开启定时器write_com(0x0c); //取消光标闪烁}}}if(S1num!=0) //只有定义键按下后S2、S3、S4才有效{if(S2==0){delay(5); //防抖if(S2==0) //确认按键被按下{while(!S2); //释放按键确认if(S1num==1) //S1按下一次时{miao++; //调整秒加1if(miao==60) //满60清零miao=0;write_sfm(6,miao); //每调节一次送液晶显示一次write_com(0x80+0x40+6); //显示位置重新回到调节处}if(S1num==2) //S1按下两次时{fen++; //调整分加1if(fen==60)fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);}if(S1num==3) //S1按下三次时{shi++; //调整时加1if(shi==24)shi=0;write_com(0x80+0x40);write_sfm(0,shi);}if(S1num==4) //星期加调整{xqnum++;if(xqnum==7)xqnum=0;write_com(0x80+0x0b);for(a=0;a<3;a++){write_data(xingqi[xqnum][a]);delay(5);}}if(S1num==5) //日加调整{ri++;if(yue==2){if(nian%400==0){if(ri==30){ri=1;}}if(nian%400!=0){if(ri==29){ri=1;}}}else if(yue<=7){if(yue%2==0&yue!=2){if(ri==31){ri=1;}}else if(yue%2!=0&yue!=2){if(ri==32){ri=1;}}}else if(yue>=8){if(yue%2==0){if(ri==32){ri=1;}}else if(yue%2!=0){if(ri==31){ri=1;}}}write_yr(8,ri);}if(S1num==6) //月加调整{yue++;if(yue==13)yue=1;write_yr(5,yue);}if(S1num==7) //年加调整{nian++;if(nian==2019)nian=2014;write_nian(0,nian);}}}if(S3==0){delay(5);if(S3==0) //确认按键被按下{while(!S3);if(S1num==1){miao--; //调整秒减1if(miao==-1) //减到00后再减重新设置为59miao=59;write_sfm(6,miao);write_com(0x80+0x40+6);}if(S1num==2){fen--; //调整分减1if(fen==-1)fen=59;write_sfm(3,fen);write_com(0x80+0x40+3);}if(S1num==3){shi--; //调整时减1if(shi==-1)shi=23;write_sfm(0,shi);write_com(0x80+0x40);}if(S1num==4){xqnum--; //调整星期减一if(xqnum==-1)xqnum=6;write_com(0x80+0x0b);for(a=0;a<3;a++){write_data(xingqi[xqnum][a]);delay(5);}}if(S1num==5) //调整日{ri--;if(yue==2){if(nian%400==0){if(ri==0){ri=29;}}if(nian%400!=0){if(ri==0){ri=28;}}}else if(yue<=7){if(yue%2==0&yue!=2){if(ri==0){ri=30;}}else if(yue%2!=0&yue!=2){if(ri==0){ri=31;}}}else if(yue>=8){if(yue%2==0){if(ri==0){ri=31;}}else if(yue%2!=0){if(ri==0){ri=30;}}}write_yr(8,ri);}if(S1num==6) //调整月{yue--;if(yue==0)yue=12;write_yr(5,yue);}if(S1num==7) //调整年{nian--;if(nian==2013)nian=2018;write_nian(0,nian);}}}if(S4==0) //退出设置、开启中断{delay(5);if(S4==0){S1num=0;TR0=1;write_com(0x0c);}}}}/**************************************************定时器0*************************************************/void timer0() interrupt 1 //定时器0中断服务程序{TH0=(65535-50000)/256; //重装定时器初始值TL0=(65535-50000)%256;count++; //中断次数累加if(count==20) //20次50毫秒即一秒{count=0;miao++;if(miao==60) //秒加到60时分进位{miao=0;fen++;if(fen==60) //分加到60时时进位{fen=0;shi++;if(shi==24) //时加到24时清0{shi=0;xqnum++;ri++;if(yue==2) //如果是二月{if(nian%400==0) //闰年判断{if(ri==30){ri=1;yue++;write_yr(5,yue);}}if(nian%400!=0) //平年判断{if(ri==29){ri=1;yue++;write_yr(5,yue);}}}else if(yue<=7&yue!=2) //一月到七月{if(yue%2==0) //偶数月(除二月){if(ri==31){ri=1;yue++;}}else if(yue%2!=0) //奇数月{if(ri==32){ri=1;yue++;}}write_yr(5,yue);}else if(yue>=8) //八月到12月{if(yue%2==0) //偶数月(除二月){if(ri==32){ri=1;yue++;if(yue==13) //如果判断月份为12月,则加一后重新定义月份为1{yue=1;nian++;write_nian(0,nian);}write_yr(5,yue);}}else if(yue%2!=0) //奇数月{if(ri==31){ri=1;yue++;write_yr(5,yue);}}}write_yr(8,ri);if(xqnum==7) //星期写入xqnum=0;write_com(0x80+0x0b);for(a=0;a<3;a++){write_data(xingqi[xqnum][a]);delay(5);}}write_sfm(0,shi); //重新写入数据}write_sfm(3,fen); //重新写入数据}write_sfm(6,miao); //重新写入数据}}/*************************************************主函数*************************************************/void main(){init();while(1){keyscan(); //不停的检测按键是否被按下}}。

相关文档
最新文档