当前位置:首页 > 改基于AT89C51的电子万年历的设计 - 卢巧曲 - 20112568 - 电子信息工程(职教本科)
DS1302共有7位,最高控制逻辑位位7为1时,数据将被写入DS1302。因此,最高位必须为1。第六位如果为1则表示存取RAM数据,如果为0时表示存取日历时钟数据。最高两位为10表示要读写CLOCK数据(如果为11则表示读/写RAM数据)最后一位为1表示读(RD)其余5位A4A3A2A1A0为00000表示访问的是秒(SEC)寄存器,可见,该函数将从秒开始读取7字节数据,分别是秒,分,时,周,月,日,年。函数中地址每次递增2,这是因为CLOCK寄存器地址第0位为读/写位,在GetTime中保持为1,最低地址从第一位开始,该位每次递增1时,相当于地址递增2。 控制字节总是从最低位开始输出的。在控制指令输入的下一个SCLK信号到来时数据输入从最低位开始,数据被写入DS1302。
编写读写字节函数需要参考如下图所示的时序图,上半部分是读单字节的时序,下半部分是写单字节的时序,由图可知,无论读/写DS1302都要先写入地址字节,而且在写入地址字节时数据都是由低位到高位逐位写入的,读取也是一样的。定时器T0每100ms进入一次,判断闹钟标志位(Alarm_Flag)是否为1,如果是1则调用Disp_Current_AlarmTime()函数,进入闹钟响应模式,如果为0,则会进入switch分支语句,根据Adjust_Index的值调用不同来显示函数:
下图为时钟芯片DS1302的读写信号图,上半个图为读字节时序图,下半个图为写字节时序图,由图可知不论是读字节还是写字节,前半部分都是一样的,都要进行写信息,其区别主要表现在后半部分的SCLK边沿触发方式不一样。
图3.3读写信号的时序图
3.4整体电路框图及流程图
12
该设计的硬件电路图主要由按键模块、DS1302时钟模块、晶振电路、LCD1602组成。整个工作过程是:当整个电路上电时,单片机按照设定的程序开始工作并对端口进行初始化,读取DS1302的时间。判断按键是否被按下,如果被按下就执行相应的程序,如果按键没有被按下,就执行Gettime程序,并且由DS1302提供时钟信号,最后用显示芯片LCD1602显示出来。该整体电路框图主要分为4个模块,原理图的右下方由4个开关和3个与非门组成的模块是按键中断模块,该模块主要是负责时钟的判断、调整以及闹钟的检测等基本功能;原理图左下方是时钟模块,主要由一块DS1302时钟芯片和一块石英晶体串联2个电容组成,其主要作用是为单片机提供时钟信号,另外还有一个LED灯,当闹钟响应时LED灯就会发光闪烁;原理图右上角是一款显示芯片LCD1602,顾名思义,其作用就是将时间,日期显示出来其整体电路框图和流程图如下所示:
开始 端口初始化 读取DS1302时间 延时 星期及闰年的计算 闹钟检测 Y 执行相应按键 中断 N 图3.4 主程序流程图
13
图3.4 整体电路框图
4.软件设计
4.1 LCD1602显示
将LCD1602的相关代码编写为“LCD1602.h”头文件中,在该头文件中包含了对LCD1602向LCD写数据、向LCD写指令,以及LCD的初始化,其中被“main.c”调用最多的是在LCD上显示字符串,对于Display_LCD_String(uchar P,uchar *s)参数P是1602显示地址位置,*s是字符串的首地址,将字符串送到指定位置显示。 void Display_LCD_String(uchar P,uchar *s) { }
14
uchar i; Set_LCD_POS(P); for(i=0;i<16;i++) { }
Write_LCD_Data(s[i]); DelayMS(1);
4.2星期的计算及闰年的计算
求自2000.1.1开始的任何一天是星期几,函数没有通过求出总天数后再求星期几,因为求总天数可能会越出uint的范围,而是分3段计算,先计算年份,然后是当前月份,日,最后将计算结果存入DateTime[5]
void RefreshWeekDay() {
uint i,d,w=5;
//已知1999.12.31是周五
for(i=2000;i<2000+DateTime[6];i++) { } d=0;
d=isLeapYear(i)?366:365; w=(w+d)%7;
for(i=1;i //———————— 判断是否为闰年 //———————— uchar isLeapYear(uint y) { } MonthsDays[2]=isLeapYear(2000+DateTime[6]) ? 29:28; return(y%4==0 && y0!=0) || (y@0==0); d+=DateTime[3]; DateTime[5]=(w+d)%7+1; 15
共分享92篇相关文档