单片机课程设计智能电子钟的设计

更新时间:2024-04-14 03:35:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

湖南文理学院

课程设计报告

课程名称: 嵌入式系统课程设计 专业班级: 建智11102班 学号34号 学生姓名: 李光 指导教师: 杨智 完成时间: 2014年 6月 5日 报告成绩:

评阅意见: 评阅教师 日期

湖南文理学院制

嵌入式系统课程设计

智能电子钟

嵌入式系统课程设计

摘 要

电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用AT89C51芯片作为核心,,显示模块采用1602 LCD显示屏,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。

该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。 关键词:电子时钟;1602LCD;AT89C51;DS1302

Abstract

Electronic clock is mainly using electronic technology to clock electronic, digital, has the clock precision, small volume, friendly interface, extensible characteristic such as being strong of performance, widely applies in the middle of the life and work. In addition, in the life and industrial and agricultural production, often need to temperature, which requires the electronic clock has the versatility. This design mainly in order to achieve a normal display clock/calendar, with regular alarm of the multi-function electronic clock. In this paper, the current development of electronic clock method has carried on the comparison and analysis, finally identified by single chip microcomputer technology to realize multi-function electronic clock. This design using AT89C51 chip as the core, six LED digital tube display, using real-time calendar clock chip DS1302 to complete the basic function of the clock/calendar. This method has the advantage of simple circuit, reliable performance, good real-time, accurate time, the operation is simple, programming easily. The electronic clock can be applied to general life and work, also can be modified, increase performance, add new functions, so as to bring to people's life and work more convenient.

I

嵌入式系统课程设计

II

嵌入式系统课程设计

目 录

摘 要 .......................................................................................................................................... I 目 录 .............................................................................................................................................. II 第1章 总体设计方案 ................................................................................................................... 1 1.1 设计要求..........................................................................................................................1

1.2 方案设计 .......................................................................................................................... 1 1.3 系统框图 .......................................................................................................................... 2 1.4核心芯片简介 ................................................................................................................... 2

1.4.1 DS1302简介 .......................................................................................................... 2 1.4.2 AT89C51简介 ........................................................................................................ 3

第2章 智能电子钟软硬件电路的设计 ....................................................................................... 3

2.1 硬件设计 .......................................................................................................................... 3

2.1.1 复位电路设计 ....................................................................................................... 3 2.1.2 DS1302与单片机的接口设计 .............................................................................. 5 2.1.3 LED显示设计 ....................................................................................................... 5 2.1.4 电源设计 ............................................................................................................... 7 2.1.5 按键开关设计 ....................................................................................................... 8 2.1.6 时钟电路的设计 ................................................................................................... 8 2.1.7 电路总原理图设计 ............................................................................................... 9 2.2 软件设计 .......................................................................................................................... 9

2.2.1 流程图 ................................................................................................................... 9 2.2.2实时时钟芯片1302读/写数据流程图 ............................................................... 12

2.2.3LCD显示子程序流程图.......................................................................................12 第3章 proteus仿真与调试 ........................................................................................................ 12

3.1 电路的仿真 ................................................................................................................... 13 3.2 软件调试 ....................................................................................................................... 13 总 结 ........................................................................................................................................... 14 参考文献 ....................................................................................................................................... 15 附录 ............................................................................................................................................. 15

III

嵌入式系统课程设计

第1章 总体设计方案

1.1设计要求

以AT89C51单片机为核心,制作一个LCD显示的智能电子钟: (1) 计时:秒、分、时、天、周、月、年。 (2) 闰年自动判别。

(3) 五路定时输出,可任意关断(最大可到16路)。 (4) 时间、月、日交替显示。 (5) 自定任意时刻自动开/关屏。

(6) 计时精度:误差≤1秒/月(具有微调设置)。

(7) 键盘采用动态扫描方式查询。所有的查询、设置功能均由功能键K1、K2完成

1.2 方案设计

实时时钟芯片具备年、月、日、时、分、秒计时功能和多点计时功能,计时数据的更新每秒自动进行一次,不需程序干预。计算机可通过中断或查询方式读取计时数据进行显示,因此计时功能的实现无需占用CPU的时间,程序简单。此外,实时时钟芯片多数带有锂电池做后备电源,具备永不停止的计时功能;具有可编程方波输出功能,可用做实时测控系统的采样信号等;有的实时时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据,由于功能完善,精度高,软件程序设计相对简单,且计时不占用CPU时间,因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。

利用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时及秒表计时。该方案节省硬件成本,且能使设计者对单片机的指令系统能有更深入的了解,从而掌握单片机应用技术MCS-51汇编语言程序设计方法,因此,本系统设计采用此种软件控制方法来实现计时。而由于Atmel公司的AT89C51是一种自带4KB Flash存储器的低电压、高性能的CMOS 8位微处理器。该器件采用Atmel高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出引脚相兼容。AT89C51将多功能8位CPU和闪存集成在单个芯片中,是一种高效的微控制器,使用也更方便,寿命更长,可以反复擦除

1

嵌入式系统课程设计

1000次。形成了功能强大、使用灵活和具有较高性能价格比的微控制器。它的功能强大,而且也比较容易购买,故本设计中所选的单片机为AT89C51单片机。

1.3 系统框图

按照系统设计功能的要求,初步确定系统由主控模块、时控模块、及显示模块和键盘接口模块共4个模块组成。主控芯片使用51系列AT89C51单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DS1302。采用DS1302作为计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备电源(2.5~5.5V电源,再2.5V时耗电小于300nA),而且DS1302可以编程选择多种充电电流来为后备电源进行慢速充电,可以保证后备电源基本不耗电。显示模块采用普通的液晶显示屏(LCD)设计框图如图1.1所示。

电源 定时电时钟芯片 DS1302 AT89C51 LCD显示电按键 实时时 钟/日历 图1.1 设计方案框图

1.4核心芯片简介

1.4.1 DS1302简介

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达

2

嵌入式系统课程设计

2.5~5.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

1.4.2 AT89C51简介

AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

第2章 智能电子钟软硬件电路的设计

2.1 硬件设计

该设计的硬件电路由主控部分(单片机AT89C51)、计时部分(实时时钟芯片DS1302)、显示部分(八段数码管)、电源部分(三端稳压器7805)、时钟电路5个部分组成。各部分之间相互协作,构成一个统一的有机整体,实现数字时钟的功能。各部分的硬件电路设计如下。设计总电路图见2.1.7。

2.1.1 复位电路设计

单片机AT89C51作为主控芯片,控制整个电路的运行。单片机外围需要一个复位电路,

3

嵌入式系统课程设计

复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。该设计采用含有二极管的复位电路,复位电路可以有效的解决电源毛刺和电源缓慢下降(电池电压不足)等引起的问题,在电源电压瞬间下降时可以使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。复位电路的设计图如图2.1所示:

图2.1 单片机复位电路图

AT89C51具有在系统可编程功能,可以很方便的改写单片机存储器内的程序不需要把芯片中从工作环境中剥离,把AT89C51下载口接入电路,可使电路实现该功能。AT89C51需要接入一个普通12MHz晶振,为其提供稳定的时钟脉冲。

4

嵌入式系统课程设计

2.1.2 DS1302与单片机的接口设计

时钟芯片DS1302与单片机AT89C51的接口是由3条线来完成的,单片机AT89C51的P1.0与时钟芯片的数据传输端相连,P1.1用来作为DS1302输入时钟SCLK控制端,P1.2控制DS1302的复位输入端。DS1302接标准32.768KHz石英晶振。DS1302与单片机的接口电路如图2.2所示。

图2.2 DS1302与AT89C51连接图

2.1.3 LCD显示设计

(1) 工业字符型液晶,1602是指显示的内容为16*2,能同时显示两行,每行16个字符。常见的1602字符液晶有两种,一种显示绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上绝大多数基于HD44780液晶芯片控制,原理是完全相同的。本课题所用1602液晶模块,显示屏是蓝色背光白色字体。如图2.5所示

LCD1602GNDVCCVORSR/WED0D12345678910111213141516 5

1D5D6D7BLABLKD2D3D4 图2.3LCD1602面板

嵌入式系统课程设计

(2)1602引脚介绍

表2.4 1602字符液晶引脚说明 符号 引脚说明 编号 GND VO R/W D0 D2 D4 D6 BLA 电源地 液晶显示对比度调节端 读写选择 数据口 数据口 数据口 数据口 背光电源正 2 4 6 8 10 12 14 16 编号 1 3 5 7 9 11 13 15 符号 VCC RS E D1 D3 D5 D7 BLK 引脚说明 电源正极 数据/命令选择端 使能信号 数据口 数据口 数据口 数据口 背光电源负 各个引脚具体功能说明: 第1脚:GND为地电源。 第2脚:VCC接5V正电源。

第3脚:VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:DB0~DB7为8位双向数据线。 第15~16脚:背光灯电源。 (3)基本操作时序 操作 读状态 写指令 读数据 写数据

表2.5 1602字符液晶读写状态表 输入 输出 RS=L,RW=H,E=H D0~D7=状态字 RS=L,RW=L,D0~D7=指令码,E=高脉无 冲 RS=H,RW=H,E=H D0~D7=数据 RS=H,RW=L,D0~D7=数据,E=高脉冲 无 6

嵌入式系统课程设计

1602液晶控制器芯片内部带有80个8位的RAM缓冲区,其地址和屏幕的对应关系如图2.6示

图2.6

2.1.4 电源设计

时钟芯片DS1302有很宽的工作电压范围,其工作电压为2.5~5.5V。单片机AT89C51的工作电压范围相对较窄,为4.0~5.5V,所以本设计中,给电路接入三端稳压器7805,利用它的稳压功能给电路提供稳定的+5V电压,使电路的工作保持很高的可靠性。在电路中接入一个发光二极管作为指示灯,可以很方便地指示电源与电路是否接通。该设计的电源部分如图2.7所示。

图2.7 电源电路图

7

嵌入式系统课程设计

2.1.5 按键开关设计

2.8键盘设计图

图2.8所示为键盘设计图,本系统采用的是独立式键盘结构,每个按键的工作不会影响其它I/O口线的状态。软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。

2.1.6 时钟电路的设计

使用串行接口时钟芯片DS1302设计时钟电路。该设计方案以单片机AT89S51为主控芯片,以串行时钟芯片DS1302为核心计时芯片,组成数字时钟电路。该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。该设计方案的接口电路如图2.9所

图2.9 DS1302接口电路

8

嵌入式系统课程设计

2.1.7 电路总原理图设计

图2.10 总原理图

2.2 软件设计

电子时钟的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是单片机中读取DS1302中的数据驱动LED数码管显示时间。AT89C51单片机主要I/O口的分配:P10、P11、P12分别接时钟芯片的SCLK、I/O、RST引脚,P13、P14接两个独立按键。

2.2.1 流程图

本次设计的系统软件设计主要包括主程序设计和各个计时子模块、和按键控制子模块程序以及报警模块。主程序主要完成器件的初始化,并判断有无按键按下,并根据判断的结果调用相应的子模块程序;计时子模块程序和日历日期数据子模块程序完成相应的数据采集、处理和保存,按键处理子模块程序完成日期和闹钟的设置,其各流程图如下:

9

嵌入式系统课程设计

开始 K加1程序 K等于0显示日期 K等于 1显示日期 K等于2显示报警时 报警程序 按键程序

返回 图2.11主流程图 10

嵌入式系统课程设计

开 始 控制键有效,进去年调整程序 控制键有效,进入月调整程序 等待按键程序 加键有效 月加1 年加1 年减1 控制键有效,进星期调整程序 等待按键程序 加键有效 减键有效 减键有效 月减1 等待按键程序 加键有效 减键有效 控制键有效,进入日期调整程序 等待按键程序 加键有效 减键有效

星期减1 星期加1

日加1 日减1

控制键有效,进分钟调整程

控制键有效,进入小时调整程

序 等待按键程

等待按键程序

加键有减键有效

效 加键有减键有 效 分钟加1 分钟减1

小时减1 小时加1

按键有效,跳出时间调整

程序,进入主循环程序

图2.12 时间调整程序流程图

11

嵌入式系统课程设计

2.2.2实时时钟芯片1302读/写数据流程图

开始 变量初始化 使1302不具保护 写1302起始地址 向该位写数据 地址增加 开始 变量初始化 写1302起始地址 将该位数据读出 地址增加 N 数据读完

数据写完 N Y 1302写保护 返回

返回 图2.13 实时时钟芯片1302读/写数据流程图

2.2.3 LCD显示子程序流程图

图2.14 LCD显示子程序流程图

12

嵌入式系统课程设计

第3章 proteus仿真与调试

3.1 电路的仿真

利用keil C51软件编写源程序。在proteus中画好其电路图见附录二。

3.2 软件调试

在硬件调试完毕的基础上,需要进一步完善程序,也就是进入软件调试阶段。在本设计中,软件调试主要分两大部分:实时时钟日历子程序调试、按键子程序调试。将这两部分调试成功,那么整个设计的软件部分也就基本完成了。

13

嵌入式系统课程设计

总 结

本设计利用单片机AT89S51控制串行实时时钟芯片DS1302构成数字时钟电路,实现计时功能。该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片DS1302带有后备电池,具备对后背电源进行涓细电流充电的能力,保证电路断电后仍保存时间和数据信息,这些优点解决了目前常用实时时钟占用单片机资源多以及计时不可靠等缺点。该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的精确性和可靠性有较高要求的场合,提供较好的实时时钟。但是,由于DS1302易受环境影响,会使该电路出现时钟精度不高、时钟混乱等问题,还有待继续研究和改进。

14

参考文献

[1] 单片机原理与应用[M].北京:中南大学出版社,2009,6。

[2] 黄明强.DS1302在单片机系统中的应用[J].保定师范专科学校学报,2004,17。 [3] 赵海兰,朱剑,赵祥伟.DS1302实时显示时间的原理与应用[J].电子技术,2002,1。 [4] 邓红,张越编著.单片机实验与应用设计教程[M].冶金工业出版社,2004,5。 [5] 孙雪梅,范久臣.实时时钟芯片在单片机系统中的应用[J].沈阳教育学院学报,2005,7。

15

附录

源程序

#include #include

#define uchar unsigned char #define uint unsigned int

sbit RS=P2^0; // LCD寄存器选择 sbit RW=P2^1; // LCD读写控制 sbit EN=P2^2; // LCD启动 void DelayMS(uint K) {

uchar i; while(K--) { for(i=0;i<120;i++); } }

//----------读取LCD的状态-------*/ uchar Read_LCD_State() {

uchar state; RS=0; RW=1; EN=1;

DelayMS(2); state=P0; EN=0;

DelayMS(2); return state; }

void LCD_Busy_Wait() {

while((Read_LCD_State()&0x80)==0x80); DelayMS(5); }

void Write_LCD_Command(uchar cmd) {

LCD_Busy_Wait(); RS=0; RW=0; EN=0; P0=cmd; EN=1;

DelayMS(2);

16

EN=0; }

void Write_LCD_Data(uchar dat) {

LCD_Busy_Wait(); RS=1; RW=0; EN=0; P0=dat; EN=1;

DelayMS(2); EN=0; }

void Initialize_LCD1602() //液晶初始化函数 {

Write_LCD_Command(0x38);DelayMS(2); //功能设置,数据长度为8位,双行显示,5×7点阵字体

Write_LCD_Command(0x01);DelayMS(2); //清屏

Write_LCD_Command(0x06);DelayMS(2); //字符进入模式:屏幕不动,字符后移 Write_LCD_Command(0x0c);DelayMS(2); // 显示开,关光标 }

void Set_LCD_Position(uchar pos) {

Write_LCD_Command(pos|0x80); //设置7位的DDRAM地址值 }

void LCD_Display(uchar p,uchar *str) {

uchar i;

Set_LCD_Position(p); for(i=0;i<16;i++) { Write_LCD_Data(str[i]); DelayMS(2); } }

#include #include #include

#define uchar unsigned char #define uint unsigned int

void Initialize_LCD1602(); //液晶初始化函数 void LCD_Display(uchar p,uchar *str); sbit SDA=P1^0; //DS1302数据线 sbit CLK=P1^1; //DS1302时钟线 sbit RST=P1^2; // DS1302 复位线 sbit k1=P3^3; // 选择按键 sbit k2=P3^4; // 加 sbit k3=P3^5; // 减

17

sbit k4=P3^6; // 确定 uchar tcount=0;

uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; // 一年中每个月的天数,二月的天数由年份决定

uchar *Week[]={\周日,周一到周六 // LCD显示缓冲

uchar LCD_DSY_BUFFER1[]={\ %uchar LCD_DSY_BUFFER2[]={\ %uchar DateTime[7];//所读取的日期时间

char Adjust_Index=-1; //当前调节的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)

uchar Change_Flag[]=\分,时,日,月,年)不调节秒和周 //函数声明

void Write_Byte_TO_DS1302(uchar X); // 向DS1302写入一个字节 uchar Read_Byte_FROM_DS1302(); //从DS1302中读取一个字节

uchar Read_Data_FROM_DS1302(uchar addr); //从DS1302指定位置读取数据 , 读数据 void Write_Data_TO_DS1302(uchar addr,uchar dat); // 向DS1302指定位置写入数据, 写数据

void SET_DS1302(); // 设置时间 void GetTime(); // 读取当前时间 void Initialization(); //初始化函数 void main() {

Initialization(); while(1) { if(Adjust_Index==-1) GetTime(); } }

void Initialization() {

Initialize_LCD1602(); //调用液晶初始化函数 IE=0x83; //允许中断 外部0中断和T0中断 IP=0x01; // 设置中断优先级

IT0=0x01; // 设置外部中断的脉冲触发方式 TMOD=0x01; // 设置定时器的工作方式,为方式1 TH0=-50000/256; // 写入初值 TL0=-50000%6; // 写入初值 TR0=1; // 启动定时器 }

void Write_Byte_TO_DS1302(uchar X) // 向DS1302写入一个字节 {

uchar i; for(i=0;i<8;i++) { SDA=X&1;

18

CLK=1; CLK=0; X>>=1; } }

uchar Read_Byte_FROM_DS1302() //从DS1302中读取一个字节 {

uchar i,byte,t; for(i=0;i<8;i++) { byte>>=1; t=SDA; byte|=t<<7; CLK=1; CLK=0; } //BCD码转换 return byte/16*10+byte; }

uchar Read_Data_FROM_DS1302(uchar addr) //从DS1302指定位置读取数据 , 读数据 {

uchar dat; RST=0; CLK=0; RST=1; Write_Byte_TO_DS1302(addr); //向DS1302写入一个地址 dat=Read_Byte_FROM_DS1302(); //在上面写入的地址中读取数据 CLK=1; RST=0; return dat; }

void Write_Data_TO_DS1302(uchar addr,uchar dat) // 向DS1302指定位置写入数据, 写数据 {

CLK=0; RST=1; Write_Byte_TO_DS1302(addr); Write_Byte_TO_DS1302(dat); CLK=1; RST=0; }

void SET_DS1302() // 设置时间 {

uchar i;

Write_Data_TO_DS1302(0x8E,0x00); //写控制字,取消写保护 // 分,时,日,月,年依次写入 for(i=1;i<7;i++) { // 分的起始地址是10000010(0x82),后面依次是时,日,月,周,年,写入地址每

19

次递增2 Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i])); }

Write_Data_TO_DS1302(0x8E,0x80); //写控制字,加写保护 }

//-------------------------------------------------------- // 读取当前时间

//------------------------------------------------------- void GetTime() // 读取当前时间 {

uchar i;

for(i=0;i<7;i++) { DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i); } }

void Format_DateTime(uchar d,uchar *a) {

a[0]=d/10+'0'; a[1]=d+'0'; }

uchar Is_Leapyear(uint year) {

return (year%4==0&&year0!=0)||(year@0==0) ; }

void Refresh_Week_Day() {

uint i,d,w=5; //已知1999年12.31是星期五 for(i=2000;i<2000+DateTime[6];i++) { d=Is_Leapyear(i)?366:365; w=(w+d)%7; } d=0;

for (i=1;i

//保存星期,0-6表示星期日,星期一至星期六,为了与DS1302的星期格式匹配,返回值需要加1

DateTime[5]=(w+d)%7+1; }

void Datetime_Adjust(char X) {

switch(Adjust_Index) { case 6: //年调整,00-99 if(X==1&&DateTime[6]<99) { DateTime[6]++;

20

}

if(X==-1&&DateTime[6]>0) { DateTime[6]--; }

//获取2月天数

MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]]; }

Refresh_Week_Day(); //刷新星期 break;

case 4: //月调整 01-12

if(X==1&&DateTime[4]<12) { DateTime[4]++; }

if(X==-1&&DateTime[4]>1) { DateTime[4]--; } //获取2月天数

MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]]; }

Refresh_Week_Day(); //刷新星期 break;

case 3: // 日调整00-28或00-29或00-30或00-31

//调节之前首先根据当前年份得出该年中2月的天数 MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //根据当前月份决定调节日期的上限

if(X==1&&DateTime[3]

if(X==-1&&DateTime[3]>0) { DateTime[3]--; }

Refresh_Week_Day(); //刷新星期 break;

case 2: // 时调整

if(X==1&&DateTime[2]<23) {

21

DateTime[2]++; } if(X==-1&&DateTime[4]>0) { DateTime[2]--; } break; case 1: // 分调整 if(X==1&&DateTime[1]<59) { DateTime[1]++; } if(X==-1&&DateTime[4]>0) { DateTime[1]--; } break; } }

void T0_INT()interrupt 1 {

TH0=-50000/256; // 写入初值 TL0=-50000%6; // 写入初值 if(++tcount!=2) return; tcount=0; //按指定格式生成待显示的日期时钟 Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5); Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8); Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11); //星期 strcpy(LCD_DSY_BUFFER1+13,Week[DateTime[5]-1]); //时,分。秒 Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5); Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8); Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11); // 显示年、月、日、星期、时、分、秒 LCD_Display(0x00,LCD_DSY_BUFFER1); LCD_Display(0x40,LCD_DSY_BUFFER2); }

void EX_INT0()interrupt 0 {

if(k1==0) { while (k1==0); if(Adjust_Index==-1||Adjust_Index==-1) {Adjust_Index=7;} Adjust_Index--; if(Adjust_Index==5) {Adjust_Index=4;} //跳过对星期的调节

22

LCD_DSY_BUFFER2[13]='['; LCD_DSY_BUFFER2[14]=Change_Flag[Adjust_Index]; LCD_DSY_BUFFER2[15]=']'; }

else if(k2==0) // 加 { while(k2==0); Datetime_Adjust(1); }

else if(k3==0) // 减 { while(k3==0); Datetime_Adjust(-1); }

else if(k4==0) { while(k4==0); SET_DS1302(); LCD_DSY_BUFFER2[13]=' '; LCD_DSY_BUFFER2[14]=' '; LCD_DSY_BUFFER2[15]=' '; Adjust_Index=-1; //操作索引重设为-1,时间继续正常显示 } }

23

附录 电路仿真图

24

本文来源:https://www.bwwdw.com/article/scnp.html

Top