简易万年历的设计.doc_第1页
简易万年历的设计.doc_第2页
简易万年历的设计.doc_第3页
简易万年历的设计.doc_第4页
简易万年历的设计.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

漳州师范学院漳州师范学院 简易万年历的设计 姓 名 学 号 系 别 物理与电子信息工程系 专 业 电子信息科学与技术 年 级 10 级 指导教师 白炳良 2013 年 6 月 目录目录 1 设计任务 5 1 1 设计任务 5 1 2 设计要求 6 2 设计方案 6 2 1 设计思路 6 2 2 方案比较与论证 6 2 2 1 数码管显示模块 6 2 2 2 温度传感器的选择 6 2 2 3 时钟计时的选择 7 2 3 系统结构框图 7 3 各功能模块设计 8 3 1 显示模块原理 8 3 2 参数计算 9 3 3 独立式按键模块 9 3 4 时钟模块 10 3 4 1 DS1302特性介绍 10 3 4 2 DS1302引脚介绍 10 3 4 3 DS1302有关日历 时间的寄存器 10 3 4 4 DS1302控制字介绍 11 3 4 5 DS1302单字节读写时序介绍 11 3 4 6 DS1302操作指令介绍 12 3 4 7 DS1302与单片机接口电路 13 3 5 温测模块 13 3 5 1 单总线介绍 13 3 5 2 DS18B20特性介绍 13 3 5 3 DS18B20管脚介绍 14 3 5 4 DS18B20内部结构 14 3 5 5 DS18B20温度转化示例 14 3 5 6 DS18B20时序介绍 15 3 5 7 DS18B20操作步骤 16 3 5 8 DS18B20与单片机的接口电路 17 3 6 总系统原理图 17 4 软件设计 18 4 1 I O 口分配 18 4 2 按键扫描 18 5 流程图 19 5 1 主程序流程图 19 5 2 WORK0 模块流程图 19 5 3 WORK1 模块流程图 20 5 4 WORK2 模块流程图 20 5 5 获取温度子程序流程图 21 5 6 按键扫描 22 5 7 中断服务子程序 22 5 8 显示方式 1 22 5 9 初始化 DS1302 子程序流图 23 5 10 温显模块子程序流图 24 5 11 读取时间模块子程序流图 24 6 程序代码 25 6 1 主程序部分 25 6 2 包含文件部分 33 6 3 包含文件部分 35 7 调试要点 43 7 1 硬件调试 43 7 2 软件调试 43 7 3 结果分析及设计工作总结 43 8 参考文献及附件 43 8 1 参考文献 43 8 2 元器件清单 44 8 3 PCB 版图 44 8 4 实物图 正面 45 8 5 实物图 背面 45 摘要摘要 单片机就是微控制器 是面向应用对象设计 突出控制功能的芯片 单 片机接上晶振 复位电路和相应的接口电路 装载软件后就可以构成单片机应 用系统 将它嵌入到形形色色的应用系统中 就构成了众多产品 设备的智能 化核心 本设计就是应用单片机强大的控制功能制作而成的电子万年历 该电 子万年历包括两大功能 可显示年 月 日 时 分 实时监测环境温度 具 有超低温的报警功能 且报警的上下限值可由用户自定义设置 关键字关键字 单片机 DS18B20 DS1302 共阳数码管 1 设计任务设计任务 1 1 设计任务设计任务 利用单片机 时钟芯片 DS1302 温度传感器 DS18B20 数码管等 实现日期 时间 温度的显示 即一个简单的万年历 1 2 设计要求设计要求 1 通过 DS1302 计时 时间可调并在数码管上显示出来 2 通过 DS18B20 检测当前环境温度 精读为 0 5 3 具有超温报警功能 2 设计方案 2 1 设计思路设计思路 本设计由 DS18B20 作为温度检测的核心 检测一次当前温度所 耗费的时间大约在 100ms 750ms 之间 随着检测精度的增加 耗费 时间在方位内逐渐增加 所以利用软件延时的方法来实现温检 并且 具有超温和低温的报警功能 其温度报警的上下限值可根据用户喜好 进行更改 时钟部分使用专用计时芯片 DS1302 可精确显示年 月 日 时 分 秒 2 2 方案比较与论证方案比较与论证 2 2 1 数码管显示模块数码管显示模块 方案一 单片机输出数据经译码芯片 CD4511 进行译码后直接驱动 数码管 数码管公共端接 9012 三极管扩流 并通过单片机 I O 口控制三 极管的选通 实现动态显示 方案二 有单片机的 I O 口直接驱动数码管的段码 数码管的公共端 接 9012 三极管 通过灌电流的方式点亮数码管 也需通过单片机 I O 口 控制三极管的选通 实现动态显示 由于所需 I O 口由 AT98S52 可直接提供 无须因为 I O 口不够而用 CD4511 来节省 I O 口 方案二又较方案一更容易实惠 所以 我选择方案二 2 2 2 温度传感器的选择温度传感器的选择 方案一 采用热敏电阻作为检测温度的核心元件 由于热敏电阻会 随温度变化而变化 进而其阻值发生变化 再经 555 振荡器变化的脉冲 数传递给单片机进行处理 方案二 采用数字式的集成温度传感器 DS18B20 作为温度检测的核 心元件 由其检测并直接输出数字温度信号给单片机进行处理 对于方案一 采用热敏电阻作为温度检测元件 有价格便宜 元件 易购的优点 但热敏电阻对温度的细微变化不太敏感 并且由于热敏电 阻的 R T 关系的非线性 其自身电阻对温度的变化存在较大误差 而且 在人体所处环境温度变化过程中难以检测到小的温度变化 但作为本次 设计虽已能满足基本要求 但为了更深入的学习 所以放弃该方案 对于方案二 由于数字式集成温度传感器 DS18B20 的高度集成化 大大降低了外接放大转化等电路的误差因数 温度误差变得很小 并且 由于其检测温度的原理与热敏电阻检测的原理有着本质的不同 使得其 温度分辨力极高 温度值在器件内部转化成数字量直接输出 简化了系 统程序设计 又由于该温度传感器采用先进的单总线技术 与单片机的 接口变得非常简洁 抗干扰能力强 虽然芯片原理复杂 但是可以对时 序的理解更深入一步 所以选择此方案 2 2 3 时钟计时的选择时钟计时的选择 方案一 AT89S52 单片机内部带有定时 计数功能 此定时功能是通 过对外部晶振的脉冲进行计数 从而达到计时功能 只要使用 11 0592 的晶振就能实现零误差的计时 因此可以利用此功能实现计时 但因为 只有单一的计时功能要实现 万年历 的功能需要较复杂的程序 而且 如果单片机掉电无法继续进行计时 所以使用不便 方案二 DS1302 是美国 DALLAS 公司推出的一种高性能 低功耗的实时时 钟芯片 附加 31 字节静态 RAM 采用 SPI 三线接口与 CPU 进行通信 并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据 实时时 钟可提供秒 分 时 日 星期 月和年 一个月小与 31 天时可以自动 调整 且具有闰年补偿功能 工作电压宽达 2 5 5 5V 采用双电源供电 主电源和备用电源 可设置备用电源充电方式 提供了对后备电源进 行涓细电流充电的能力 利用单片机强大的控制功能就可实现实时计时 的功能 而且消耗的系统资源少 程序简单 综合上述两种方案 宜采用方案二实现实时计时功能 2 3 系统结构框图系统结构框图 AT89S52 单片机在模式键 设置键的控制下 由 P0 口输出数据 通 过 P2 0 P2 1 P2 2 P2 3 进行选通 用数码管显示信息 系统框图 图 2 3 系统总框图 3 各功能模块设计各功能模块设计 3 1 显示模块显示模块原理原理 由单片机 AT89S52 的引脚 P0 口输出温度 时间等数据信息 通过 片选信号 P2 0 P2 1 P2 2 P2 3 就可在相应的数码管进行显示 当位 选信号 P2 0 为低电平时 P1 口送出数据也为低电平就点亮数码管 电流 灌进单片机 多位 LED 显示 为了简化电路 降低成本 将所有位的段 选线并联在一起 由一个 8 位 I O 口控制 而共阳极公共端分别接一个 9012 由相应的 I O 口线控制 9012 实现各位数码管的分时选通 段选 码 位选码每送入一次后延时 5MS 因人的视觉暂留时间为 0 1S 100MS 所以每位显示的时间不能超过 20MS 并保持延时一段 时间 以造成视觉暂留效果 给人看上去每个数码管总在亮 电路如 图 3 1 所示 由于采用的是共阳极数码管 所以要让段码点亮需把 I O 口置 0 例如 段码 a 到 h 对应的 I O 口是 P0 0 到 P0 7 则要让数码管显示 0 到 9 对应的 16 进值如图 3 2 所示 AT89S52 键盘 18B20 DS1302 晶振 数码管 蜂鸣器 LED 电源 Q 0 90 12 Q 1 90 12 Q 2 90 12 Q 3 90 12 a b R 047 0 R 147 0 R 247 0 R 347 0 R 447 0 R 547 0 R 647 0 R 747 0 V CCV CCV CCV CC R 84K 7R 94K 7R 10 4K 7 R 11 4K 7 P 00 P 01 P 02 P 03 P 04 P 05 P 06 P 07 c d e f g h a b c d e f g h a b c d e f g h a b c d e f g h C S0C S1C S2C S3 位位位位位位 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u1 SM 4 11 00 6 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u2 SM 4 11 00 6 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u3 SM 4 11 00 6 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u4 SM 4 11 00 6 a b c d e f g h 图 3 1 显示电路 图 3 2 码表 3 2 参数计算参数计算 由于 I O 口高电平约等于 5V 使用灌电流的方式驱动数码管 故选 用 PNP 型三极管 9012 数码管能正常工作的段电流为 3mA 10 mA 压 降为 1 7V 三极管发射极和集电极的压降为 0 3V 因此限流电阻的压 降为 3 0V 所以选用限流电阻的阻值 R 470 欧 3 3 独立式按键模块独立式按键模块 独立式按键是直接用 I O 口线构成的单个按键电路 其特点是每个 hgfedcba16 进制 0110000000XC0H 1111110010XF9H 2101001000XA4H 3101100000XB0H 4100110010X99H 5100100100X92H 6100000100X82H 7111110000XF8H 8100000000X80H 9100100000X90H c110001100XC6H 101111110XBFH L110001110XC7H H100010010X89H 500 10 5 mA V R 按键单独占用一根 I O 口线 每个按键的工作不会影响其它 I O 口线的 状态 独立式按键的典型应用如 图 3 3 所示 独立式按键电路配置灵活 软件结构简单 但每个按键必须占用一 根 I O 口线 因此 在按键较多时 I O 口线浪费较大 但本设计只用到 四个按键 顾采用独立式按键电路 K 0 K 1 K 2 K 3 P 24 P 25 P 26 P 27 位位位位 图 3 3 独立式按键电路 3 4 时钟模块时钟模块 DS1302 通过三根口线实现与单片机的通信 因 DS1302 功耗很小 即使电源掉电后通过 3V 的纽扣电池仍能维持 DS1302 精确走时 3 4 1 DS1302 特性介绍特性介绍 DS1302 是美国 DALLAS 公司推出的一种高性能 低功耗的实时时 钟芯片 附加 31 字节静态 RAM 采用 SPI 三线接口与 CPU 进行通信 并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据 实时时 钟可提供秒 分 时 日 星期 月和年 一个月小与 31 天时可以自动 调整 且具有闰年补偿功能 工作电压宽达 2 5 5 5V 采用双电源供电 主电源和备用电源 可设置备用电源充电方式 提供了对后备电源进 行涓细电流充电的能力 3 4 2 DS1302 引脚介绍引脚介绍 各引脚的功能为 1 Vcc2 5V 电源 当 Vcc2 Vcc1 0 2V 时 由 Vcc2 向 DS1302 供电 当 Vcc2 Vcc1 时 由 Vcc1 向 DS1302 供电 2 和和 3 X1 X2 是外接晶振脚 32 768KHZ 的晶振 4 地 GND 5 CE RST 复位脚 6 I O 数据输入输出口 7 SCLK 串行时钟 输入 8 Vcc1 备用电池端 3 4 3 DS1302 有关日历 时间的寄存器有关日历 时间的寄存器 寄存器的说明如下 1 秒寄存器 81h 80h 的位 7 定义为时钟暂停标志 CH 当初始上 电时该位置为 1 时钟振荡器停止 DS1302 处于低功耗状态 只有 将 秒寄存器的该位置改写为 0 时 时钟才能开始运行 2 小时寄存器 85h 84h 的位 7 用于定义 DS1302 是运行于 12 小时 模 式还是 24 小时模式 当为高时 选择 12 小时模式 在 12 小时模式 时 位 5 是 当为 1 时 表示 PM 在 24 小时模式时 位 5 是第二个 10 小时位 3 控制寄存器 8Fh 8Eh 的位 7 是写保护位 WP 其它 7 位均置 为 0 在对任何的时钟和 RAM 的写操作之前 WP 位必须为 0 当 WP 位为 1 时 写保护位防止对任一寄存器的写操作 也就是说在电路上 电的初始态 WP 是 1 这时是不能改写上面任何一个时间寄存器的 只有首先将 WP 改写为 0 才能进行其它寄存器的写操作 3 4 4 DS1302 控制字介绍控制字介绍 位位 7 必须是逻辑 1 如果它为 0 则不能把数据写入到 DS1302 中 位位 6 如果为 0 则表示存取日历时钟数据 为 1 表示存取 RAM 数 据 位位 5 至位至位 1 A4 A0 指示操作单元的地址 位位 0 最低有效位 最低有效位 为 0 表示要进行写操作 为 1 表示进行读操 作 读数据 读数据 读数据时在紧跟 8 位的控制字指令后的下一个 SCLK 脉冲的下降 沿 读出 DS1302 的数据 读出的数据是从最低位到最高位 写数据 写数据 控制字总是从最低位开始输出 在控制字指令输入后的下一个 SCLK 时钟的上升沿时 数据被写入 DS1302 数据输入也是从最低 位 0 位 开始 位 0 最低有效位 为 1 表示进行读操作 如为 0 表示要进行写操作 控制字后 SCLK 下降沿 读数据 SCLK 上升沿写 数据 3 4 5 DS1302 单字节读写时序介绍单字节读写时序介绍 DS1302 的数据读写是通过 I O 串行进行的 当进行一次读写操作时 最少得读写两个字节 第一个字节是控制字节 就是一个命令 告诉 DS1302 是读还是写操作 是对 RAM 还是对 CLOK 寄存器操作 以及操 作的址 第二个字节就是要读或写的数据了 单字节写 在进行操作之前先得将 CE 也可说是 RST 置高电平 然后单片机将控制字的位 0 放到 I O 上 当 I O 的数据稳定后 将 SCLK 置高电平 DS1302 检测到 SCLK 的上升沿后就将 I O 上的数据读取 然 后单片机将 SCLK 置为低电平 再将控制字的位 1 放到 I O 上 如此反 复 将一个字节控制字的 8 个位传给 DS1302 接下来就是传一个字节的 数据给 DS1302 当传完数据后 单片机将 CE 置为低电平 操作结束 单字节读操作的一开始写控制字的过程和上面的单字节写操作是一 样 但是单字节读操作在写控制字的最后一个位 SCLK 还在高电平时 DS1302 就将数据放到 I O 上 单片机将 SCLK 置为低电平后数据锁存 单机机就可以读取 I O 上的数据 如此反复 将一个字节的数据读 入单片机 读与写操作的不同就在于 写操作是在 SCLK 低电平时单片机将数 据放到 IO 上 当 SCLK 上升沿时 DS1302 读取 而读操作是在 SCLK 高电平时 DS1302 放数据到 IO 上 将 SCLK 置为低电平后 单片机就可 从 IO 上读取数据 3 4 6 DS1302 操作指令介绍操作指令介绍 操作说明 操作说明 1 首先要通过 8EH 将写保护去掉 将日期 时间的初值写时各个寄 器 2 然后就可以对 80H 82H 84H 86H 88H 8AH 8CH 进行初值 的写入 同时也通过秒寄存器将位 7 的 CH 值改成 0 这样 DS1302 就 开始走时了 3 将写保护寄存器再写为 80H 防止误改写寄存器的值 4 不断读取 80H 8CH 的值 将它们格式化后显示到数码管上 3 4 7 DS1302 与单片机接口电路与单片机接口电路 V cc2 1 X 1 2 X 2 3 G ND 4 R ST 5 I O 6 SC L K 7 V cc 8 U 1 D S1 30 2 V CC V CC X T2 32 76 8H Z R 14 5K R 15 5K P 32 P 33 P 34 1 2 JP1 3V 位位位位 3 5 温测模块温测模块 DS18B20 通过单总线实现与单片机的通信 每个 DS18B20 都有一 个唯一的序列号 可以方便的实现组网检测 3 5 1 单总线介绍单总线介绍 1 单总线即只有一根数据线 系统中的数据交换 控制都由这根线完成 2 单总线通常要求外接一个约为 4 7K 10K 的上拉电阻 这样 当总线 闲置时其状态为高电平 3 5 2 DS18B20 特性介绍特性介绍 DS18B20 单线数字温度传感器 即 一线器件 其具有独特的优点 1 采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现 微处理器与 DS18B20 的双向通讯 单总线具有经济性好 抗干扰能 力强 适合于恶劣环境的现场温度测量 使用方便等优点 使用户可 轻 松地组建传感器网络 为测量系统的构建引入全新概念 2 测量温度范围宽 测量精度高 DS18B20 的测量范围为 55 125 在 10 85 C 范围内 精度为 0 5 C 3 在使用中不需要任何外围元件 4 支持多点组网功能 多个 DS18B20 可以并联在惟一的单线上 实现 多 点测温 5 供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电 源 因此 当数据线上的时序满足一定的要求时 可以不接外部电源 从而使系统结构更趋简单 可靠性更高 6 测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9 12 位 7 负压特性电源极性接反时 温度计不会因发热而烧毁 但不能正常作 8 掉电保护功能 DS18B20 内部含有 EEPROM 在系统掉电以后 它 仍可保存分辨率及报警温度的设定值 9 DS18B20 具有体积更小 适用电压更宽 更经济 可选更小的封装方 式 更宽的电压适用范围 适合于构建自己的经济的测温系统 因此 也 就被设计者们所青睐 3 5 3 DS18B20 管脚介绍管脚介绍 DS18B20 的管脚排列 1 GND 为电源 地 2 DQ 为数字信号输入 输出端 3 VDD 为外接供电电源输入端 在寄生 电源接线方式时接地 3 5 4 DS18B20 内部结构内部结构 DS18B20 内部结构主要由四部分组成 64 位光刻 ROM 温度 传感器 非挥发的温度报警触发器 TH 和 TL 配置寄存器 光刻 ROM 中的 64 位序列号是出厂前被光刻好的 它可以看作是 该 DS18B20 的地址序列码 64 位光刻 ROM 的排列是 开始 8 位 地址 28H 是产品类型标号 接着的 48 位是该 DS18B20 自身 的序列号 并且每个 DS18B20 的序列号都不相同 因此它可以看作是 该 DS18B20 的地址序列码 最后 8 位则是前面 56 位的循环冗余校验 码 CRC X8 X5 X4 1 由于每一个 DS18B20 的 ROM 数据都各 不相同 因此微控制器就可以通过单总线对多个 DS18B20 进行寻址 从而实现一根总线上挂接多个 DS18B20 的目的 DS18B20 中的温度传感器完成对温度的测量 用 16 位二进制形式提 供 形式表达 其中 S 为符号位 3 5 5 DS18B20 温度转化示例温度转化示例 3 5 6 DS18B20 时序介绍时序介绍 DS18B20 的一线工作协议流程是 初始化 ROM 操作指令 存储器操作指令 数据传输 其工作时序包括 1 初始化时序 2 写时序 3 读时序 初始化时序 初始化时序 主机首先发出一个 480 960 微秒的低电平脉冲 然后释放总线变为 高电平 并在随后的 480 微秒时间内对总线进行检测 如果有低电平出 现说明总线上有器件已做出应答 若无低电平出现一直都是高电平说明 总线上无器件应答 做为从器件的 DS18B20 在一上电后就一直在检测总线上是否有 480 960 微秒的低电平出现 如果有 在总线转为高电平后等待 15 60 微秒后将总线电平拉低 60 240 微秒做出响应存在脉冲 告诉主机本器 件已做好准备 若没有检测到就一直在检测等待 写操作 写操作 写操作就是主机发出各种操作命令 但各种操作命令都是向 DS18B20 写 0 和写 1 组成的命令字节 接收数据时也是从 DS18B20 读 取 0 或 1 的过程 写周期最少为 60 微秒 最长不超过 120 微秒 写周期 一开始做为主机先把总线拉低 1 微秒表示写周期开始 随后若主机想写 0 则继续拉低电平最少 60 微秒直至写周期结束 然后释放总线为高电 平 若主机想写 1 在一开始拉低总线电平 1 微秒后就释放总线为高电 平 一直到写周期结束 而做为从机的 DS18B20 则在检测到总线被拉底 后等待 15 微秒然后从 15us 到 45us 开始对总线采样 在采样期内总线为 高电平则为 1 若采样期内总线为低电平则为 0 读操作 读操作 对于读数据操作时序也分为读 0 时序和读 1 时序两个过程 读时序 是从主机把单总线拉低之后 在 1 微秒之后就得释放单总线为高电平 以让 DS18B20 把数据传输到单总线上 DS18B20 在检测到总线被拉低 1 微秒后 便开始送出数据 若是要送出 0 就把总线拉为低电平直到读 周期结束 若要送出 1 则释放总线为高电平 主机在一开始拉低总线 1 微秒后释放总线 然后在包括前面的拉低总线电平 1 微秒在内的 15 微秒 时间内完成对总线进行采样检测 采样期内总线为低电平则确认为 0 采样期内总线为高电平则确认为 1 完成一个读时序过程 至少需要 60us 才能完成 3 5 7 DS18B20 操作步骤操作步骤 1 每次读写前对 DS18B20 进行复位初始化 复位要求主 CPU 将 数据线下拉 500us 然后释放 DS18B20 收到信号后等待 16us 60us 左右 然后发出 60us 240us 的存在低脉冲 主 CPU 收到此信号后表示 复位成功 2 发送一条 ROM 指令 3 发送存储器指令 3 5 8 DS18B20 与单片机的接口电路与单片机的接口电路 V DD 3 I O 2 G ND 1 U 3 D S18B 20 R 20 4K 7 V CC C 1 0 1U F P31 位位位位位位 3 6 总系统原理图总系统原理图 单片机 AT89S52 9 脚为复位输入端 上电复位 只要 RST 引脚上 有大于二个机器周期以上的高电平 单片机 AT89C2051 即复位 按键从单片机 AT89S52 的 P2 4 P2 5 P2 6 P2 7 口接入 当按键 被按下时 相应的输入口就会输入低电平 0 单片机 AT89S52 的 XTAL1 脚 XTAL2 脚接一个由 12M 晶振和 10pf 组成的振荡电路 为单片机提供相应的时序 X T1 12 M C 810 pf C 910 pf E 1 10 uf S1 SW PB R 18 10 k R 17 33 0 V DD 3 I O 2 G ND 1 U 3 D S1 8B 20 R 20 4K 7 C 1 0 1U F R ES R ES V CC V CC V CC C S0 C S3 C S1 C S2 Q 4 90 12 V CC R 19 3 3K P30 V CC 12 L S1 R 16 5 1K D 1 L ED Q 0 90 12 Q 1 90 12 Q 2 90 12 Q 3 90 12 12 34 56 78 9 10 IS P1 M O S I R ES SC K M ISO V CC 位位位位位位 位位位位位位位位位 位位位位 P 24 P 25 P 26 P 27 P 10 P 11 P 12 P 13 P 14 P 15 P 16 P 17 K 0 K 1 K 2 K 3 P 24 P 25 P 26 P 27 位位位位 V CC V CC P 10 P 11 P 12 P 13 P 14 P 15 P 16 P 17 R 13 2K R 12 10 0 V CC P 30 P 31 P 36 P 37 V cc2 1 X 1 2 X 2 3 G ND 4 R ST 5 I O 6 SC L K 7 V cc 8 U 1 D S1 30 2 V CC V CC X T2 32 76 8H Z R 14 5K R 15 5K P 35 P 36 P 37 P 32 P 33 P 34 1 2 JP1 3V 位位位位 位位位位 位位位位位位 USB位位 P 00 P 01 P 02 P 03 P 04 P 05 P 06 P 07 12 34 JP2 帽帽 D 2 L ED D 3 L ED a b R 047 0 R 147 0 R 247 0 R 347 0 R 447 0 R 5 47 0 R 647 0 R 747 0 V CCV CCV CCV CC R 84K 7R 94K 7R 10 4K 7 R 11 4K 7 P 00 P 01 P 02 P 03 P 04 P 05 P 06 P 07 c d e f g h a b c d e f g h a b c d e f g h a b c d e f g h C S0C S1C S2C S3 位位位位位位 CPU位位位位位 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u1 SM 4 11 00 6 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u2 SM 4 11 00 6 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u3 SM 4 11 00 6 a bf c g d e dp a 7 b 6 c 4 d 2 e 1 f 9 g 10 dp 5 com 3 com 8 sh u4 SM 4 11 00 6 a b c d e f g h M O S I M ISO SC K V CC 1 G ND 2 POW E R R 21 4 7K G ND 1 V CC 2 V O 3 R S 4 R W 5 E 6 D B0 7 D B1 8 D B2 9 D B3 10 D B4 11 D B5 12 D B6 13 D B7 14 B G V C C 15 B G G N D 16 LCD 1602 L CD L CD 16 02 P 32 P 33 P 34 P 35 E A V PP 31 X 1 19 X 2 18 R ES ET 9 R D P3 7 17 W R P3 6 16 P32 IN T0 12 P33 IN T1 13 P34 T0 14 P35 T1 15 P10 1 P11 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8 P00 39 P01 38 P02 37 P03 36 P04 35 P05 34 P06 33 P07 32 P20 21 P21 22 P22 23 P23 24 P24 25 P25 26 P26 27 P27 28 PSE N 29 A LE PRD G 30 P31 TX D 11 P30 RX D 10 V CC 40 G ND 20 IC 6 A T8 9C 52 4 软件设计软件设计 主程序主要起到一个导向和决策功能 控制程序的走向 本系统在主 程序中运用模块化结构 所有控制量集中处理 提高了处理效率 并在 RAM 建立各控制量的映射 方便各功能模块的编程及修改 运用散转结 构 可实现无扰动重入 本设计主要有以下几个模块 温显模块 时钟 显示模块 时钟修改模块 操作说明 上电复位后进入温显模块 按 K1 键可进入温度报警值上 下限的设置 按 K0 可进行模块间的转换 按一次 K0 进入时钟模块 按 K0 两次进入时钟修改模块 4 1 I O 口分配口分配 1 P2 0 P2 1 P2 2 P2 3 作为个位 十位 百位 千位数码管片选 2 P2 4 P2 5 P2 6 P2 7 作为按键接口 3 P0 0 到 P0 7 作为段码 a 到 g 的输出口 4 2 按键扫描按键扫描 本设计采用定时器中断延时去抖的方法来进行按键的有效扫描判断 5 流程图流程图 5 1 主程序流程图主程序流程图 5 2 work0 模块流程图模块流程图 mode 0 mode 1 获取温度 根据键状态进行功能散转 Work0 温显和温 报模块 同时置位 延时方式标志位 Work1 时间显示 同时清零延时方式 标志位 Work2 调时模块 在调整完毕后进入 Work1 按键扫描 显示方式 1 清定时标志位 重装定时初值 按键扫描 显示方式 2 初始化 DS1302 读取时间 开始 初始化 延时方式标 志位 1 N Y N 5ms 到 Y mode 2 入口 根据键状态值进行功能散转 温显模式 修改高温报警值 修改低温报警值 返回 cnt1 0 cnt1 1 cnt1 2 5 3 work1 模块流程图模块流程图 5 4 work2 模块流程图模块流程图 msta 0 msta 1 月份显示模块 msta 2 时间显示模块 星期显示模块 入口 年份显示模块 返回 根据键状态值进行功能散转 msta 3 设置时间预处理 即将当 前时间值送给修改缓冲单 元 入口 根据键状态值进行功能散转 msta1 2 msta1 3 msta1 0 msta1 1 返回 修改小时 高两位数码管 位闪 按 K2 与 K3 键修改 修改分钟 低两位数码管 位闪 按 K2 与 K3 键修改 修改月份 高两位数码管 位闪 按 K2 与 K3 键修改 修改日 低两位数码管位 闪 按 K2 与 K3 键修改 修改年份 高两位显示 20 低两位数码管位闪 按 K2 与 K3 键修改 修改星期 低两位数码管 位闪 按 K2 与 K3 键修改 修改完毕 将修改信息写 入到 DS1302 芯片中 msta1 4 msta1 5 msta1 6 msta1 7 5 5 获取温度子程序流程图获取温度子程序流程图 入口 初始化 DS18B20 跳过 ROM 温度转换 初始化 DS18B20 跳过 ROM 读取温度 读低 8 位 读高 8 位 将取出的数据转换成 温度值 分为整数部 分和小数部分 将整数部分送显缓存 将小数部分按 0 5 精 度处理 将温度值转换为 BCDma3 yongyu 温度 报警时温度比较实用 返回 5 6 按键扫描按键扫描 5 7 中断服务子程序中断服务子程序 5 8 显示方式显示方式 1 入口 读键 保存键值 有键 开定时中断延时去抖 提取键前沿 关定时中断 返回 N Y 入口 重装中断定时初值 保存变化的键状态 返回 显示个位 dsw 1 关数码管 i 3 根据状态字进行散转 入口 i 0 返回 显示十位 dsw 2 显示百位 dsw 3 显示千位 dsw 0 dsw 0 dsw 1 dsw 2 dsw 3 5 9 初始化初始化 DS1302 子程序流图子程序流图 Y N 入口 允许初始化标 志位 1 写保护关 写入年份 写入月份 写入日 写入小时 写入分钟 写保护开 允许初始化标志 位清零 返回 N Y 5 105 10 温显模块子程序流图温显模块子程序流图 5 11 读取时间模块子程序流图读取时间模块子程序流图 入口 将温度值送显缓 温度值比较 超过上 下限值 则报警 返回 读取分钟 将数据转 换为十进制数据 入口 变量定义 返回 读取小时 将数据转 换为十进制数据 读取日 将数据转换 为十进制数据 读取月份 将数据转 换为十进制数据 读取星期 将数据转 换为十进制数据 读取年份 将数据转 换为十进制数据 6 程序代码程序代码 6 1 主程序部分主程序部分 include 52 单片机头文件 include 52 单片机头文件 include include 52 单片机头文件 define SM PORT P0 输出口定义 define uint unsigned int define uchar unsigned char uchar code table 0 xc0 0 xf9 0 xa4 0 xb0 0 x99 0 1 2 3 数码管 断码表 16 关 17H 18 19L 0 x92 0 x82 0 xf8 0 x80 0 x90 0 x88 0 x83 0 xc6 0 xa1 0 x86 0 x8e 0 xff 0 x89 0 xbf 0 xc7 uchar LBJ buf0 LBJ buf1 HBJ buf0 HBJ buf1 uchar H2 weishan L2 weishan uchar r0 DELAY mode uchar msta BJ L BJ H cnt1 cnt void RDKEY P2 0 xff 扫描第 0 行 ROW0 即 k0 k3 键 r0 P2 r0 r0 r0 将读取到的 k0 k3 键值保存于 KEY0 的低四位 if r0 KEY0 判断是否有键按下 TR0 1 EKEY0 KEY0 时间未到 沿用原来保留的键值 else 未有键按下 TR0 0 EKEY0 0 x00 EKEY0 r0 提取键前沿 KEY0 r0 void disp uchar i for i 0 i 3 i P2 0 xff switch dsw case 0 CS0 0 SM PORT table buf0 显示个位 dsw 1 break case 1 CS1 0 SM PORT table buf1 显示十位 dsw 2 break case 2 if fh 300 CS2 0 else CS2 1 SM PORT table buf2 显示百位 if point flag point 0 else point 1 dsw 3 break case 3 if fh 300 CS3 0 else CS3 1 SM PORT table buf3 显示千位 dsw 0 break default break void disp1 SM PORT 0 xff P2 0 xff switch dsw case 0 if fl 300 CS0 0 else CS0 1 SM PORT table buf0 显示个位 dsw 1 break case 1 if fl 300 CS1 0 else CS1 1 SM PORT table buf1 显示十位 dsw 2 break case 2 if fh 300 CS2 0 else CS2 1 SM PORT table buf2 显示百位 if point flag point 0 else point 1 dsw 3 break case 3 if fh 300 CS3 0 else CS3 1 SM PORT table buf3 显示千位 dsw 0 break default break void Init TMOD 0 x11 设置定时器的工作方式 TH0 65536 20000 256 为定时器 0 装载初值 用中断方式进 行 按键的去抖 TL0 65536 20000 256 TH1 65536 5000 256 为定时器 1 装载初值 TL1 65536 5000 256 EA 1 开总中断 ET0 1 开定时器 0 中断 TR1 1 开定时器 0 LBJ buf1 2 为低温报警值赋初值 22 度 在主程 序中可修改 LBJ buf0 2 HBJ buf1 3 为高温报警值赋初值 35 度 在主程 序中可修改 HBJ buf0 5 FMQ 1 关闭蜂鸣器和 LED DELAY mode 1 工作模式赋初值 1 其中 mode 1 表示 程序使用软件延时 此时使用 DS18B20 进行温度测量 作为温度计使用 mode 0 时 使用 定时器延时 程序每隔 5ms 执行一次 此时作为时钟 TZtime flag1 0 Second buf 0 x00 Minute buf 0 x00 Hour buf 0 x12 Day buf 0 x16 Week buf 0 x01 Month buf 0 x06 Year buf 0 x13 void wenxian DELAY mode 1 BJ L LBJ buf1 BJ L 4 BJ L BJ L LBJ buf0 BJ H HBJ buf1 BJ H BJ H temp16h BJ L cnt if cnt 50 FMQ FMQ cnt 0 else FMQ 1 void XG LBJ 修改低温报警值 DELAY mode 1 point flag 0 buf3 19 buf2 18 buf1 LBJ buf1 buf0 LBJ buf0 fl 300 0 H2 weishan if H2 weishan 60 H2 weishan 0 fh 300 fh 300 if EK2 if LBJ buf0 LBJ buf0 else if LBJ buf1 LBJ buf1 LBJ buf0 9 if EK3 if LBJ buf0 9 LBJ buf0 else if LBJ buf1 9 LBJ buf1 LBJ buf0 0 void XG HBJ 修改高温报警值 DELAY mode 1 point flag 0 buf3 17 buf2 18 buf1 HBJ buf1 buf0 HBJ buf0 fl 300 0 H2 weishan if H2 weishan 60 H2 weishan 0 fh 300 fh 300 if EK2 if HBJ buf0 HBJ buf0 else if HBJ buf1 HBJ buf1 HBJ buf0 9 if EK3 if HBJ buf0 9 HBJ buf0 else if HBJ buf1 9 HBJ buf1 HBJ buf0 0 void work0 if EK1 cnt1 if cnt1 3 cnt1 0 switch cnt1 case 0 fh 300 0 wenxian 温度显示子程序 具有超温和低 温报警功能 break case 1 XG LBJ 修改低温报警值 break case 2 XG HBJ 修改高温报警值 break default break void work1 if EK1 msta if msta 4 msta 0 fh 300 0 fl 300 0 switch msta case 0 time show break case 1 month show break case 2 year show break case 3 week show break default break void work2 if EK1 msta1 if msta1 8 msta1 0 f300 switch msta1 case 0 set begin break case 1 Hour set break case 2 Minute set break case 3 Month set break case 4 Day set break case 5 Year set break case 6 Week set break case 7 set over break default break void main Init 程序的初始化 while 1 if DELAY mode get temperature RDKEY disp 获得温度 else while TF1 TF1 0 TH1 65536 5000 256 TL1 65536 5000 256 RDKEY disp1 Initial DS1302 DS1302 GetTime if EK0 mode if mode 3 mode 0 switch mode case 0 work0 break case 1 msta1 0 DELAY mode 0 point flag 0 work1 break case 2 work2 DELAY mode 0 break default break void exter0 interrupt 1 定时器 0 中断 TH0 65536 20000 256 送初值 TL0 65536 20000 256 KEY0 r0 时间到 保存键值于 KEY0 和 KEY1 6 2 包含文件包含文件部分部分 ifndef DS18B20 H define DS18B20 H define uint unsigned int 宏定义 define uchar unsigned char 宏定义 sbit DS18B20 DQ P3 1 uchar a1 a2 a3 uchar Temp L Temp H 用于读取 18B20 中温度 的高 8 位和低八位数值 uchar tempint tempdf temp16h 温度整数部分和小数部分 void delay us uchar i 延时时间为 2 i 微秒 while i void Init DS18B20 DS18B20 DQ 1 先将数据线置高电平 1 delay us 1 稍微延时 DS18B20 DQ 0 先将数据线置低电平 0 delay us 250 延时 500us 该时间范围可以在 480 960us 之间 DS18B20 DQ 1 数据线拉到高电平 1 delay us 30 延时等

温馨提示

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

评论

0/150

提交评论