云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 改基于AT89C51的电子万年历的设计 - 卢巧曲 - 20112568 - 电子信息工程(职教本科)

改基于AT89C51的电子万年历的设计 - 卢巧曲 - 20112568 - 电子信息工程(职教本科)

  • 62 次阅读
  • 3 次下载
  • 2025/6/25 20:12:44

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

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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。 编写读写字节函数需要参考如下图所示的时序图,上半部分是读单字节的时序,下半部分是

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com