以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟_第1页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟_第2页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟_第3页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟_第4页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 电子系统设计实验报告电子系统设计实验报告 实验名称以 DS1302 实时时钟芯片和液晶显示屏 CD1602 为基础设计的电子钟 院 系 别班号实验日期2009 6 25 到 28 实验人姓名学号 实验目的 实验目的 1 能够以 DS1302 实时时钟芯片和液晶显示屏 CD1602 为基础设计一款电子钟 2 熟悉 DS1302 芯片的工作过程 3 熟悉 CD1602 芯片的工作过程 4 可以进行必要的扩展 如用第三 DS18B20 新品进行温度采集和显示 5 熟悉掌握 51 的 c 程序的编写 6 掌握用 Proteus 进行系统设计仿真验证 实验仪器 仪表目录实验仪器 仪表目录 1 DS1302 实时时钟芯片 1 片 2 LCD1602 液晶显示屏 1 个 3 80C52 芯片 1 片 5 DS18B20 芯片一片 6 晶振 电容 电阻 开关各若干等 7 proteus 仿真软件 8 Keil C51 PC 机 实验设计任务实验设计任务 以 DS1302 实时时钟芯片和液晶显示屏 LCD1602 为基础设计一个电子钟 要求 时间 和日期可调整 按键采用 3 个按键 至少在 Proteus 上调试通过 扩展 闹钟和重要日期提 醒功能 增加蜂鸣器 闹铃音乐功能 实验步骤实验步骤 1 打开 Keil 软件 新建一个工程文件 选择好芯片 并记得在 Options for Target 1 的 Output 选项中 将 Create HEX Fil 选项勾起来 2 将编写的程序保存成 C 的形式 3 编译保存好的 C 文件 并根据提示修改程序中的错误 直到编译成功为止 4 打开 proteus 软件 画出实验电路图 5 在 89C52 中 载入原来已生成的 HEX 文档 2 6 按下运行键 对 Proteus 进行软件仿真 观察运行结果 原理 结果及分析原理 结果及分析 一 设计方案原理与设计特点分析一 设计方案原理与设计特点分析 电子钟总的设计模块 各个模块电路原理分析 1 DS1302 时钟采集模块 时钟采集模块 1 1 电路原理图 1 2 DS1302 分析 首先 DS1302 是 DALLAS 公司推出的涓流充电时钟芯片 内含有一个实时时钟 日历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信实时时钟 日历电路提供秒分时日 日期月年的信息每月的天数和闰年的天数可自动调整时钟操作 DS1302 芯片广脚介绍 X1 X2 为 32 768KHz 晶振管脚 GND 为地 RST 复位脚 I O 数据输入 输出引脚 SCLK 串行时钟 Vcc1 Vcc2 电源供电管脚 与单片机连接的信号 线为 DS1302 SCLK 接 P1 6 实时时钟时钟线引脚 DS1302 IO 接 P1 7 实时时钟数据线引脚 DS1302 RST 接 P1 5 实时时钟复位线引脚 特别注意 DS1302 芯片在读取或写入数据时 都是一位一位传送的 并且每传送一位 SCLK 信号线要有一个负跳变 即单片机对 SCLK 咬先送高电平 再送低电平 数据时通 过 IO 进行传送的 1 3 数据处理子程序流程图 温度采集模块 DS1302 时钟 采集模块 89C52CPU 控制模块 按键处理模块 LCD 显示模块 3 否 是 因为 DS1302 芯片在读取或写入数据时 都是一位一位传送的 并且每传送一位 SCLK 信号线要有一个负跳变 所以在对 DS1302 具体某地址进行一字节数据的写入或读 取时 都要调用实时时钟写入一字节 内部函数 DS1302InputByte 和实时时钟读取一字节 内部函数 DS1302OutputByte 两个函数 2 按键处理模块 按键处理模块 2 1 按键连线图 其中按键 1 为模式键 按键 2 为加 1 键 按键 3 为减 1 键 与单片机连线如下 mode 连接 P3 0 设定修改位数 是否调用时间获取子 程序 DS1302 GetTime 调用 Read1302 函数 读取各个时间参 数 并存放于 ReadValue 变量中 对 ReadValue 数据进行转换 转换 成十进制数 并赋给 Time 指针中 调用年份转换成可供 lcd 显示的字 段子程序 DateToStr 时间转换成可供 lcd 显示的字段子 程序 TimeToStr 结束 4 plus 连接 P3 3 加键 dec 连接 P3 6 减键 2 2 按键扫描子程序流程图 否 否 否 否 是 是 是 是 是 否 否 是 是 2 3 加减键处理子程序流程图 否 是 否 是 否 否 是 是 是 Mode 键是否按下 将 mode 按键次数存放于变 量 mode num 中 mode n um 1 mode n um 2 mode nu m 3 mode n um 5 mode nu m 4 mode n um 7 mode nu m 6 移动光标 并返回 判断是否为修改 模式 判断是否为加一 键 判断 num 1 转减一键程序 判断 num 2 判断 num 3 5 否 否 是 是 是 减 1 子程序与加 1 子程序区别只在于修改数值处理不一样 其他都一样 3 LCD 显示模块显示模块 3 1 LCD 显示模块电路原理图 修改 year 值 并返回 修改 mouth 值 并返回 修改 day 值 并返回 判断 num 6 判断 num 5 判断 num 4 修改秒值 并返 回 修改分值 并返 回 修改小时值 并 返回 6 3 2 LCD1602 芯片以及连线分析 液晶显示器是一种功耗极低的被动式显示器件 1602 广脚介绍 D0 D7 数据传送引 脚 VSS 为接地线 VDD 为电源线 VEE 为 LCD 驱动电压调节 由此可以调节显示亮度 RS 为寄存器选择信号 高电平选择数据寄存器 低电平选择指令寄存器 RW 为读写控制 信号 高电平读 低电平写 EN 使能信号 读状态下高电平有效 写状态下下降沿有效 RS 连接 P2 0 寄存器选择信号 RW 连接 P2 1 读写控制信号线 EN 连接 P2 2 使能信号线 3 3LCD 初始化程序流程图 在初始化过程中 要反复调用到 write com 函数 此函数实现向 lcd 写入命令的功能 要特别注意写命令和写数据的 RS RW EN 时序问题 4 温度采集显示模块 温度采集显示模块 4 1 温度采集显示模块的原理图 4 2DS18B20 芯片以及连线分析 DSl820 数字温度计提供 9 位 二进制 温度读数 指示器件的温度 信息经过单线接口 送入 DSl820 或从 DSl820 送出 因此从主机 CPU 到 DSl820 仅需一条线 和地线 DSl820 的电源可以由数据线本身提供而不需要外部电源 DS18B20 广脚说明 VCC 为电源线 DQ 为数据线 GND 为地线 数据线 DQ 与单 片机 P1 0 相连接 写指令 0 x38 显 示模式设置 写指令 显示光 标 写指令 光标移 动 清屏 7 4 3 温度采集显示模块子程序流程图 在此程序中 要特别注意初始化 写和读取数据时的时序处理 首先 初始化中 主 机总线先发送一复位脉冲 最短为 480us 的低电平信号 接着刻释放总线并进入接收状态 DSl8b20 在检测到总线的上升沿之后 等待 15 60us 接着 DS18b20 发出存在脉冲 低电 平 持续 60 240 us 写数据时序 当主机总线先从高拉至低电平时 就产生写时间隙 读 书序 主机总线先从高拉至低电平时 总线只须保持低电平 l7ts 之后 再将总线拉高 产 生读时间隙 5 总原理图以及主程序流程图 总原理图以及主程序流程图 5 1 总的原理图 直接向 18b20 发送温 度变换命令 读取温度寄存器的温 度值 读高八位 读低八位 进行读取数据处理 得出温度存放于变量 temp 中 8 5 2 主程序流程图 二 二 Proteus 仿真结果 仿真结果 初始化 lcd 重复进行按键扫描 移动光标并显示温度 移动光标并显示时间 移动光标并显示日期 从 DS1302 读取日期 和时间 初始化 DS1302 初始化内部定时器 9 三 实验数据计算处理 性能分析三 实验数据计算处理 性能分析 1 数据计算处理 数据计算处理 1 1 计算星期数的算法 days today day 1 2 today month 3 today month 1 5 today year today year 4 today year 100 today year 400 7 由年月日计算星期 用以显示星期数 1 2 加减键对时间日期改变处理算法 对于年月日 时分秒来说 每个变量的最大值和最小值都不一样 所以当年月份时分 秒改变时 进行处理的算法也不一样 年没有最大值 所以不用采取 封顶 措施 每次 年加一处理时 直接自加 而对于月份来说 月份是不能超过 13 的 所以当月份自加到 13 时要重新置 1 具体处理见程序 在每个语句后 我都有分析注释出来 1 3 时分秒进位算法 当秒 分达到 60 时 向分进位 且秒数置零 从新开始计数 当时达到 24 时 也一 样处理 1 4 年月日进位算法 因为每个月份的天数都不同 所以事先先设定一数组 dayofmonth 31 28 31 30 31 30 31 31 30 31 30 31 用以判定 12 个月的最大值 接着判断天 数 当超过本月最大天数时 月份加一 且天数要置 1 月份判断比较简单 只要超过 12 年份就加 1 月份置 1 2 性能分析 性能分析 首先 lcd 能够正确的显示 1302 芯片上面的时间和日期 其次 可以通过三个按键 K1 K2 和 K3 键对电子钟进行时间和日期的调整 按 K1 键 进行校时 可以分别对时及分进行单独校时 使其校正到标准时间 校时时需要校正哪一位哪 一位就闪烁 按 K2 键是对闪烁位进行加一的操作 按 K3 键是对闪烁位进行减一的操作 多次按 K1 键 当全部闪烁位全闪烁完毕时 就可以退出调整模式 但是 时间和日期显示正确 但温度显示错误 温度不能正常显示的主要原因是 10 DS18b20 的数据传输不正确 不过到现在为止 还没改正过来 四 实验过程中故障分析与故障排除的描述四 实验过程中故障分析与故障排除的描述 故障一 因为自己的知识有限 所以坦诚的说 源代码都是从网上载的 但是我载了 2 个程序 一个是运用 1602 以及 18b20 和按键处理显示时间以及温度 另一个程序是单运 用 ds1302 和 1602 显示时间而没有按键处理 所以我做的工作就是这么把这两个程序结合 起来 实现显示和调整时间的功能 这里的故障排除过程 目的是在有按键调整时间的程序中 要添加 DS1302 功能 首先 要在主程序的 c 文件中 添加 include DS1302 h 语句 并在 main 主函数中 加入 Initial DS1302 语句 进行 DS1302 的初始化 并且添加以下语句 Initial DS1302 初始化 DS1302 DateToStr 从 DS1302 读取日期 TimeToStr 从 DS1302 读取时间 显示的程序也要有所改变 display string CurrentTime DateString 显示日期 此时参数传递过程是先将 DS1302 内部的时间和日期通过 DS1302 GetTime 函数读取出来 存放到 Time 中 日期通过 DateToStr 函数将 Time 中的数据传到 DateString 数组中 而时 间通过 imeToStr 函数将 Ti me 中的数据传到 TimeString 数组中 最后通过 display string 函 数显示出来 故障二 通过上面两个函数的合并后 发现编译一直出错 如下图所示 后来发现 我只是在前面加入头文件 DS1302 h 但是忘记把这个文件放在工程目录下 所以该工程一直找不到 结果一直出错 故障三 当修改完程序后 按下按键时 发现什么反应都没有 后来又在排查了程序 感觉程序都没错 但是就是没反应 偶然之间 发现要长按按键 就可以实现按键调整时 间的功能 因为在按键扫描程序中 设置了软件防抖动功能 所以要长按按键 才能调整 时间 故障四 温度显示错误 因为时间有限 前面整合两个程序就花了太多的时间 来不 及再调整温度显示模块 自己推测 应该是中间函数参数传递出现错误 在主程序的 main 函数中 显示温度是 display string 00 0C 语句 所以温度一直显示 00 0C 事后有时间会 再进行参数调整 故障五 在实验开始时 感觉不懂如何运用 proteus 就连对 C52 进行程序烧写时 都 不知道如何才能生成 Hex 文档 万事开头难 只能踏踏实实一步一步学习 后来请教同学 才知道在 Options for Target 1 的 Output 选项中 要将 Create HEX Fil 选项勾起来才可以 五 实验结论以及体会五 实验结论以及体会 实验结论 实验结论 1 在该电子钟的设计中修改定时或调整时间时采用了闪烁 在编程上 首先进行了初 始化定义了程序的入口地址以及中断的入口地址 在主程序的开始定义了一组固定单元用来 存储计数的秒 分 时以及定时时间的序号等 其次 时 分 秒显示用了软件译码 查表 的 方式 再用了一段固定的程序段进行进制转化 最后 用查询方式对按键进行判断 若有键按 下 则进行软件延时消抖 避免了抖动引起的干扰 执行相应的定时 选时或调时程序段 对当 前时间或定时时间修改后又返回到最初的显示程序段 如此循环下去 11 2 在硬件上 选用 DS1302 LCD1602 相结合 首先 DS1302 内含有一个实时时钟 日 历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信实时时钟 日历电路提供秒 分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作 这样读取数据简单 其次 选用 LCD1602 进行显示时 数据位串行输入 接口连线少 低功耗 显示清晰 并 且本实验的电子钟即要实现时间的现实 还要实现日期的现实 所以若是运用数码管进行 显示的话 就算运用动态显示 所占用的 IO 口多 并且所需的数码管个数多 硬件复杂 3 proteus 是一个非常好用的仿真软件 其具有强大的电路原理图绘制功能 且可以 实现模拟电路仿真 数字电路仿真 单片机及其外围电路组成的系统仿真 键盘 LCD 系 统仿真等多种功能 和 keil 联合使用时可以检测所编写的程序的正确与否 将 keil 和 proteus 联合起来使用是实现电子设计制作的初步阶段 可避免在实际的硬件操作中因为电 路原理图或向单片机烧录的程序有误而造成的难以修改的为题 实验心得 实验心得 1 通过本次实验 因为之前接触到的电子系统设计不多 所以一开始 感觉难以入手 就算上网载了很多程序 也看不懂 后来请求同学的帮助 了解了要对各种芯片编写程序 时首先应找到该芯片的数据手册 根据数据手册上的说明 时序要求及流程图编写对应程 序 2 其次 再次巩固了 Keil C51 工程文件的建立 程序编写以及编译的掌握程度 最 重要的是 因为只是水平有限 要自己编写 C 程序很难 但在此实验中 最大的收获莫过 于看懂别人的程序 分析之后 自己拼凑编写以实现不同的功能 并且掌握了 52C 程序的 编写过程 3 掌握了 Proteus 的使用方法 从实际操作中认识到 Proteus 在仿真方面的优越性 激 发了自己学习 Proteus 的兴趣 4 因为自己要修改程序 所以单单花费在程序分析的时间就很多 为了更好的理解程 序 我把每句主要程序的后面都注释了该语句的意思 详情可以见程序清单 发现注释语 义的工作量也是非常大的 写实验报告时 每个模块的流程图都是自己画的 用 WORD 文档画图真的很麻烦 而且不是很美观 因为时间比较仓促 流程图写的条理性不够 不 过相信以后多多练习 就可以做得更好 5 在这次实验中我遇到了很多故障 不过通过各种渠道 比如网络 请教同学 老师 等等 解决了一些故障 虽然没有全部解决 但能在短短一周内通过此次作业 实现电子 钟的功能 还是有点成就感的 在解决这些问题的过程中发现网络确实是一个很好的学习 平台 利用前人的经验可以提高自己的解决实际问题的能力 通过这一个多礼拜的学习实 践 使我对所学的知识进行了系统的复习和巩固 在以前学习中不够清晰的概念得到了更 好的理解 相信通过不断的学习 能使自己扬长补短 六 程序清单六 程序清单 1 主程序 主程序 include include lcd1602 h 包含头文件 直 接引用显示文件 include ds18b20 h include DS1302 h define uchar unsigned char define uint unsigned int define TIMER0 COUNT 0 xEE11 sbit mode P3 0 设定修改位数 sbit plus P3 3 加键 sbit dec P3 6 减键 uchar count s1num timer0 tick count 0 typedef struct char hour char minute 12 char second time typedef struct uint year uchar month char day date time now 10 20 0 显示时间初始值 date today 2009 1 8 char code dayofmonth 31 28 31 30 31 30 31 31 30 3 1 30 31 设定月份数组 用以判定 12 个 月的最大值 char code weekday 7 4 Week1 Week2 Week3 Week4 Week5 Week6 Week7 设定行星期显示数 uchar monthday uchar year uchar month if month 2 else return dayofmonth month 1 非闰年时的该月份天数 void display week 由年月日计算星期 用以显示星期数 char days days today day 1 2 today month 3 today month 1 5 today year today year 4 today year 100 today year 400 7 display string static void timer0 initialize void timer0 initialize EA 0 设置不接受所有中断 timer0 tick 0 TR0 0 关闭 Timer0 TMOD 0X01 设置 Timer0 为模式 2 16 位工作模式 TL0 TIMER0 COUNT 设置 Timer0 低八位数值 TH0 TIMER0 COUNT 8 设置 Timer0 高八位数值 PT1 1 设置 Timer0 的优先级为最高 ET0 1 设置接受 Timer0 的中断 TR0 1 启动 Timer0 EA 1 设置系统接受中断 void write time uchar add uchar number 写时间 gotoxy 2 add display data number void write riqi uchar add uchar number 写日期 gotoxy 1 add display data number void keyscan 按键扫描程序 uchar mode num 设定 mode num 来判断是哪一位要修改 当 mode num 为 零时 为非修改模式 if mode 0 修改位 的选择 delay 5 延时 if mode 0 当外部按键 mode 没按下一次时 都使 mode num 自加 即 mode num 表示为按键 mode 按下的次数 mode num while mode TR0 0 write com 0 x0f if mode num 1 gotoxy 1 4 13 当 当 mode num 为 1 时 为年份改变位 光标移到 1 4 if mode num 2 gotoxy 1 7 当 mode num 为 2 时 为 月份改变位 光标移到 1 7 if mode num 3 gotoxy 1 10 当 mode num 为 3 时 为 日期改变位 光标移到 1 10 if mode num 4 gotoxy 2 2 当 mode num 为 4 时 为小时改变位 光标移到 2 2 if mode num 5 gotoxy 2 5 当 mode num 为 5 时 为 分钟改变位 光标移到 2 5 if mode num 6 gotoxy 2 8 当 mode num 为 6 时 为秒数改变 位 光标移到 2 8 if mode num 7 当 mode num 为 7 时 退出修改模式 mode num 0 非修 改模式时 将 mode num 置零 有助于判 断是否为修改模式 write com 0 x0c TR0 1 if mode num 0 为修改模式时 加减键的处理子程序 if plus 0 当加键为零 即外部触发一次时 进行以下处理 delay 5 延时 if plus 0 延时再次判断 加键 防止抖动 while plus if mode num 1 当为年份改变时 年份自加一 并且显示 修改后的日期 today year write riqi 1 today year 100 因为年份主要 是最后两位在改变 所以除以 100 来计算 年份值 除以 100 求得的商值为十位 write riqi 3 today year 100 余数为个位 gotoxy 1 12 display week 因为改变日期都会改变周数 所以要重新 显示 gotoxy 1 4 if mode num 2 以下处理同上 today month if today month 13 today month 1 特 别注意 月份不能超过 12 当为 13 时 要 将月份置 1 write riqi 6 today month gotoxy 1 12 display week gotoxy 1 7 if mode num 3 以下处理同上 today day if today day monthday today year today mont h 特别要判断每个月份的最大值 不 能超过此数 超过后要将天数置一 today day 1 write riqi 9 today day gotoxy 1 12 display week gotoxy 1 10 if mode num 4 以下处理同上 now hour if now hour 24 14 now hour 0 小时不能超过 24 write time 1 now hour gotoxy 2 2 if mode num 5 以下处理同上 now minute if now minute 60 now minute 0 write time 4 now minute gotoxy 2 5 if mode num 6 以下处理同上 now second if now second 60 now second 0 write time 7 now second gotoxy 2 8 if dec 0 减键的处理和加 键处理处理相反 delay 5 if dec 0 while dec if mode num 1 today year write riqi 1 today year 100 write riqi 3 today year 100 gotoxy 1 12 display week gotoxy 1 4 if mode num 2 today month if today month 0 today month 12 要注 意月份的最小值为 1 当减为零时 要讲月 份置为 12 write riqi 6 today month gotoxy 1 12 display week gotoxy 1 7 if mode num 3 today day if today day 0 当天数减为 0 时 要重 新赋值 为上一个月的最大值 today day monthday today year today month write riqi 9 today day gotoxy 1 12 display week gotoxy 1 10 if mode num 4 now hour if now hour 0 now hour 23 当小时数小于 0 时 要重 新赋值 置为 23 write time 1 now hour gotoxy 2 2 if mode num 5 now minute if now minute 0 now minute 59 注意点同上 write time 4 now minute gotoxy 2 5 15 if mode num 6 now second if now second 8 设置 Timer0 高八位数值 TR0 1 count if count 30 display temp 延时 当 count 30 时 显示温度 并延时 if count 200 当 count 自加 到 200 时 开始判断此时时 分 秒的值 并进行转换 count 0 now second if now second 60 当秒达 到 60 时 向分进位 且秒数置零 now second 0 now minute if now minute 60 当分达到 60 时 向时进位 且分数置零 now minute 0 now hour if now hour 24 当时达到 24 时 向天进位 且时数置零 now hour 0 today day if today day monthday today year today mont h 判断天数 当超过本月最大天数时 向月份进位 且天数置一 today day 1 today month if today month 13 判断月份 当月 份超过 12 时 向年份进位 月份置一 today month 1 today year write riqi 6 today month 在位置 6 处 向 lcd 写月份 16 write riqi 9 today day 在位置 9 处 向 lcd 写天数 gotoxy 1 12 display week write time 1 now hour 在位置 1 处 向 lcd 写时数 write time 4 now minute 在位置 4 处 向 lcd 写分数 write time 7 now second 在位置 7 处 向 lcd 写秒数 void main SYSTEMTIME CurrentTime init lcd 初始化 lcd timer0 initialize 初始化内部定时 器 Initial DS1302 初始化 DS1302 DateToStr 从 DS1302 读取日期 TimeToStr 从 DS1302 读取时间 gotoxy 1 1 display string CurrentTime DateString 显示日期 display week 显示周几 gotoxy 2 1 display string CurrentTime TimeString 显示时间 gotoxy 2 10 display string 00 0C 显示温 度 while 1 keyscan 2 lcd1602 头文件程序 头文件程序 define uchar unsigned char define uint unsigned int sbit rs P2 0 寄存器选择信号 sbit rw P2 1 读写控制信号线 sbit lcden P2 2 使能信号线 define lcd mode 0 x38 definedisplay cursor 0 x0f defineundisplay cursor 0 x0c char code int to char 0123456789 void delay uint x 延时程序 uint a b for a x a 0 a for b 10 b 0 b void write com uchar com 写命令 P0 com 写命令 记住时序问题 rs 0 rs 要为低电平 lcden 0 使 lcd 使能端产生一个正脉 冲 delay 10 lcden 1 delay 10 lcden 0 void write date uchar date 写数据 P0 date 将数据送到 P0 口准备传 送出 rs 1 写数据时 rs 要为高电 17 平 lcden 0 使 lcd 使能端产生一个正脉 冲 delay 10 lcden 1 delay 10 lcden 0 void init lcd void 初始化 lcd1602 delay 15 write com lcd mode 模式设置 delay 20 write com undisplay cursor 显示光 标 delay 20 write com 0 x06 光标移动 delay 20 write com 0 x01 清屏 delay 20 void display string char p 写字符串 while p write date p delay 20 p void gotoxy uchar x uchar y 设置移动坐标 if x 1 write com 0 x80 y else write com 0 xc0 y void display data char number 显示数 据 uchar x y x number 10 将取得的数据转换成 十进制 y number 10 write date int to char x write date int to char y 3 ds1302 头文件程序头文件程序 ifndef REAL TIMER DS1302 2003 7 21 define REAL TIMER DS1302 2003 7 21 sbit DS1302 CLK P1 6 实时时钟时钟线引脚 sbit DS1302 IO P1 7 实时时钟数据线引脚 sbit DS1302 RST P1 5 实时时钟复位线引脚 sbit ACC0 ACC 0 sbit ACC7 ACC 7 typedef struct SYSTEMTIME unsigned char Second unsigned char Minute unsigned char Hour unsigned char Week unsigned char Day unsigned char Month unsigned char Year unsigned char DateString 9 unsigned char TimeString 9 SYSTEMTIME 定义的时间类型 define AM X X define PM X X 12 18 转成 24 小时制 define DS1302 SECOND0 x80 时钟芯片的寄存器位置 存放时间 如 0 x80 放的的秒数 define DS1302 MINUTE0 x82 define DS1302 HOUR0 x84 define DS1302 WEEK0 x8A define DS1302 DAY0 x86 define DS1302 MONTH0 x88 define DS1302 YEAR0 x8C define DS1302 RAM X 0 xC0 X 2 用于计算 DS1302 RAM 地址的宏 RAM 命令控制字地址 0 xC0 0 xFD void DS1302InputByte unsigned char d 实时时钟写入一字节 内部函数 unsigned char i ACC d for i 8 i 0 i DS1302 IO ACC0 将 IO 线上的数据存放在 ACC 中 DS1302 CLK 1 特别注意 DS1302 写一数据时 CLK 要产生一负脉冲 DS1302 CLK 0 ACC ACC 1 每次移位一位 unsigned char DS1302OutputByte void 实时时钟读取一字节 内部函数 unsigned char i for i 8 i 0 i ACC ACC 1 将前一个下降沿读出的数据右移一位 从而读出该次读出的数放入 ACC7 ACC7 DS1302 IO DS1302 CLK 1 DS1302 CLK 0 SCLK 下降沿读出 DS1302 的数 return ACC void Write1302 unsigned char ucAddr unsigned char ucDa 其中 Addr 为 DS1302 地址 ucData 为要写的数据 DS1302 RST 0 写数据时 要注意 RST 产生一上升沿 CLK 为低电平 DS1302 CLK 0 DS1302 RST 1 DS1302InputByte ucAddr 地址 命令 DS1302InputByte ucDa 写 1 字节数据 DS1302 CLK 1 DS1302 RST 0 unsigned char Read1302 unsigned char ucAddr 读取 DS1302 某地址的数据 unsigned char ucData DS1302 RST 0 DS1302 CLK 0 DS1302 RST 1 DS1302InputByte ucAddr 0 x01 地址 命令 ucData DS1302OutputByte 读 1 字节数据 DS1302 CLK 1 DS1302 RST 0 return ucData void DS1302 SetProtect bit flag 是否写保护 if flag Write1302 0 x8E 0 x80 0 x8E 控 制字节地址 bit7 WP WP 1 禁止数据写 19 入 DS1302 else Write1302 0 x8E 0 x00 WP 0 允许写入 DS1302 void DS1302 SetTime unsigned char Address unsigned char Value 设置时间函 数 DS1302 SetProtect 0 Write1302 Address Value 10 Second ReadValue 将 ReadValue 数据 的第 4 5 6 位取出 实际上就是秒数的 十位 但是以二进制的形式表示 所以要 进行移位 向右移四位 在乘以 10 在加 上 ReadValue 变量中秒数的 将十六进制 的数化成十进制数表示 并放在 Time Second 中 ReadValue Read1302 DS1302 MINUTE Time Minute ReadValue 同上 ReadValue Read1302 DS1302 HOUR Time Hour ReadValue 同上 ReadValue Read1302 DS1302 DAY Time Day ReadValue 同上 ReadValue Read1302 DS1302 WEEK Time Week ReadValue 同上 ReadValue Read1302 DS1302 MONTH Time Month ReadValue 同上 ReadValue Read1302 DS1302 YEAR Time Year ReadValue 同上 void DateToStr SYSTEMTIME Time 年份转换成可供 lcd 显示的字段子程序 Time DateString 0 Time Year 10 0 Time DateString 0 中存放的就是要显 示年的十位 Time DateString 1 Time Year 10 0 Time DateString 1 中存放的就是要 显示年的个位 Time DateString 2 年和月份之间用 分开 Time DateString 3 Time Month 10 0 Time DateString 3 中存放的就是要 显示月份的十位 Time DateString 4 Time Month 10 0 Time DateString 4 中 存放的就是要显示月份的个位 Time DateString 5 Time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论