利用zigbee的无线单片机温度计课程设计2_第1页
利用zigbee的无线单片机温度计课程设计2_第2页
利用zigbee的无线单片机温度计课程设计2_第3页
利用zigbee的无线单片机温度计课程设计2_第4页
利用zigbee的无线单片机温度计课程设计2_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

- - 目目 录录 1 课题背景课题背景 1.1 系统设计 1.2 总体方框图 2 设计方案简述设计方案简述 2.2DS18B20 数字温度传感器 2.2.1 DS18B20 的性能特点 2.2 .2DS18B20 的管脚分布 2.2.3 DS18B20 的内部结构和工作方式 2.3 AT89C52 单片机 2.4 1602 型 LCD 2.4.1 1602 型 LCD 的特性 2.4.2 1602 型 LCD 的操作控制 2.52.5 DS1302DS1302 模块分析模块分析 2.6 zigbee 无线发送模块无线发送模块 3.1 温度采集模块温度采集模块 3.2 单片机控制系统 3.3 温度和时间显示模块 3.4 软件设计 3.4.1 DS18B20 的温度采集程序 3.4.2、时钟显示子程序 3.5 系统主程序 4 设计结果及分析设计结果及分析 4.1 测试环境及工具 4.2 测试方法和测试结果 5 总结总结 附录一附录一 系统总电路图系统总电路图 附录二附录二 实验结果测试图实验结果测试图 I 附录附录三三 系统源代码系统源代码 摘摘 要要 本次单片机课程设计本人设计了智能数字温度计,其功能主要有,可以测试温度,本次单片机课程设计本人设计了智能数字温度计,其功能主要有,可以测试温度, 精确到小数点后三位;其次还附加了时钟功能,其可以显示秒到年的具体时间;并且精确到小数点后三位;其次还附加了时钟功能,其可以显示秒到年的具体时间;并且 本人还利用了本人还利用了 zigbee 无线传输模块,将采集到的温度值无线发送到电脑上。无线传输模块,将采集到的温度值无线发送到电脑上。 。 。 。具体设。具体设 计在下面详细分析。计在下面详细分析。 关键词:温度计;温度计;ds18b20,zigbee模块,模块,ds1302 ,89c5289c52 1 课题背景 1.1 系统设计系统设计 本课程设计的任务是设计一个数字温度计。由于在生产生活中都有很多领域需要 测量温度,所以温度计的好坏即测量灵敏度,测温范围,稳定度以及实用性和适用性 就显得尤为重要。传统温度计通常利用固体、液体、气体受温度的影响而热胀冷缩等 的现象为设计的依据,因此这种方法无论从设计原理还是视觉读数都有很大的误差。 本次课程设计以 DS18B20 作为数字温度传感器,其具有线性优良、性能稳定、灵敏度 高、抗干扰能力强、使用方便等优点,可以大大提高测量温度的精度,并且该设计还 具备了无线传输功能,采集到的温度可实时地传送到电脑,有利于对温度设备的远程 监控,和远程控制,这是未来智能设备(包括智能家居)的发展方向。 。 。 1.2 总体方框图 现将系统模块总体设计框图列于下图 1 中: 图 1 总体设计方框图 2 设计方案简述 2.12.1数字温度计设计方案论证数字温度计设计方案论证 2.1.12.1.1方案一方案一 由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随 被测温 度变化的电压或电流采集过来,进行A/D 转换后,就可以用单片机进行数据的处 理,在显示 电路上,就可以将被测温度显示出来,这种设计需要用到A/D 转换电路,其中还 涉及到电阻 与温度的对应值的计算,感温电路比较麻烦。而且在对采集的信号进行放大时容 易受温度的 影响出现较大的偏差。 2.1.22.1.2 方案二方案二 进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这 单 片 机 控 制 系 统 LCD 显示模块 温度采集 模块 复位电路 晶振电路 按键控制 电路 过温报警 读取 ds1302 时钟 Zigbee 无线发送温度到电脑 III 是非常 容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接 读取被测 温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接 口便于系统 的再扩展,满足设计要求。 从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性 高,软件设 计也比较简单,故采用了方案二。 2.2 DS18B20 数字温度传感器 DS18B20 温度传感器是美国 DALLAS 半导体公司生产的 DS18B20 型单线智能温 度传感器,属于新一代适配微处理器的智能温度传感器,与传统的热敏电阻等测温元件相 比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现 9-12 位的数字 值读数方式。可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统 和大型设备中。它具有体积小,接口方便,传输距离远等特点。 2.2.1 DS18B20 的性能特点 DS18B20 从功能和技术的角度来说有以下性能特点: 采用单总线专用技术,既可通过串行口线,也可通过其它 I/O 口线与微机接口,无 须经过其它变换电路,直接输出被测温度值(9 位二进制数,含符号位) 测温范围为-55至+125,测量分辨率最小为 0.0625 内含 64 位经过激光修正的只读存储器 ROM DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一 只三极管的集成电路内 适配各种单片机或系统机 测量结果直接输出数字温度信号,以“一线总线”串行传送给 CPU,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力 用户可分别设定各路温度的上、下限 适应电压范围宽,3.05.5V,在寄生电源方式下可由数据线供电 2.2.2 DS18B20 的管脚分布 独特的一线接口,只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为 3.0 V 至 5.5 V 无需备用电源 测量温度 范围为-55至+125,华氏相当于是-10至+85范围内精度为0.5。 其引脚排列见图 2 和表 1。 序号名称引脚功能描述 12 3 图 2 DS18B20 的管脚分布图 表 1 DS18B20 的管脚分布说明 2.3.3 DS18B20 的内部结构和工作方式 DS1820 主要包括寄生电源、温度传感器、64 位激光 ROM 单线接口、存放中间数 据的高速暂存器(内含便笺式 RAM) ,用于存储用户设定的温度上下限值的 TH 和 TL 触发器存储与控制逻辑、8 位循环冗余校验码(CRC)发生器等七部分内部,其内部结 构框图如图 3 所示。 图 3 DS18B20 内部结构 64 位 ROM 的结构开始 8 位是产品类型的编号,接着是每个器件的惟一的序号, 共有 48 位,最后 8 位是前面 56 位的 CRC 检验码。温度报警触发器 TH 和 TL,可通 1Vcc 可选择的 Vcc 引脚。当工作于寄生 电源时,此引脚必须接地。 2DQ 数据输入/输出引脚。开漏单总线接 口引脚。当被用着在寄生电源下, 也可以向器件提供电源。 3GND 地信号。 C 64 位 ROM 和 单 线 接 口 高 速 缓 存 存储器与控制 逻辑 温度传感器 高温触发器 TH 低温触发器 TL 配置寄存器 8 位 CRC 发生器 Vdd V 过软件写入户报警上下限。 DS18B20 温度传感器与单片机的接口电路 DS18B20 可以采用两种方式供电,一 种是采用电源供电方式,此时 DS18B20 的 1 脚接地,2 脚作为信号线,3 脚接电源。 另一种是寄生电源供电方式,单片机端口接单线总线,为保证在有效的 DS18B20 时钟 周期内提供足够的电流,可用一个 MOSFET 管来完成对总线的上拉。本实验采用第一 种。 DS18B20 的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响 很小,用于产生固定频率的脉冲信号送给减法计数器 1;高温度系数晶振随温度变化其 振荡频率明显改变,所产生的信号作为减法计数器 2 的脉冲输入。器件中还有一个计 数门,当计数门打开时,DS18B20 就对低温度系数振荡器产生的时钟脉冲进行计数进 而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先 将55所对应的一个基数分别置入减法计数器 1、温度寄存器中,计数器 1 和温度寄 存器被预置在-55所对应的一个基数值。减法计数器 1 对低温度系数晶振产生的脉冲 信号进行减法计数,当减法计数器 1 的预置值减到 0 时,温度寄存器的值将加 1,减法 计数器 1 的预置将重新被装入,减法计数器 1 重新开始对低温度系数晶振产生的脉冲 信号进行计数,如此循环直到减法计数器计数到 0 时,停止温度寄存器的累加,此时 温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计 数器门仍关闭就重复上述过程,直到温度寄存器值大致等于被测温度值。 由于 DS18B20 的单线通讯功能是分时完成的,它有严格的时隙概念,因此读写时 序很重要。系统对 DS18B20 的各种操作按协议进行,操作协议为:初始化 DS18B20 发复位脉冲写 ROM 功能指令发存储器操作命令处理数据。DS18B20 有六条控 制命令如表 2 所示: 指 令 约定代码 操 作 说 明 温度转换 44H 启动 DS18B20 进行温度转换 读暂存器 BEH 读暂存器 9 个字节内容 写暂存器 4EH 将数据写入暂存器的 TH、TL 字节 复制暂存器 48H 把暂存器的 TH、TL 字节写到 E2RAM 中 重新调 E2RAM B8H 把 E2RAM 中的 TH、TL 字节写到暂存器 TH、TL 字节 读电源供电方式 B4H 启动 DS18B20 发送电源供电方式的信号给主 CPU 表 2 DS18B20 的控制指令 2.32.3 AT89C52AT89C52 AT89C52 是此次课程设计的核心部分。其管脚图如下: AT89C52 管脚图 AT89C52 是低功耗、高性能的 CMOS8 位单片机。片内带有 8KB 的 Flash 存储器,且 允许在系统内改写或用编程器编程。另外,AT89C52 的指令系统和引脚与 80C52 完全兼 容。 AT89C52 各管脚功能如下: VCCVCC:供电电压;GNDGND:接地;P0P0 口口:P0 口为一个 8 位漏级开路双向 I/O 口,每脚 可吸收 8TTL 门电流。;P1P1 口口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器能接收输出 4TTL 门电流;P2P2 口口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部 上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电 流;P3P3 口口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4 个 TTL 门电 流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入;P3 口管脚功能: P3.0P3.0 是 RXD(串行输入口);P3.1P3.1 是 TXD(串行输出口);P3.2P3.2 是/INT0(外部中断 0);P3.3P3.3 是/INT1(外部中断 1);P3.4P3.4 是 T0(记时器 0 外部输入);P3.5P3.5 是 T1(记时器 1 外部输入);P3.6P3.6 是/WR(外部数据存储器写选通);P3.7P3.7 是/RD(外部 数据存储器读选通);P3P3 口同时为闪烁编程和编程校验接收一些控制信号。RSTRST:复位 输入。当振荡器复位器件时,要保持 RST 脚两个机器周期的高电平时间。ALE/PROGALE/PROG: 当访问外部存储器时,地址锁存允许输出电平用于锁存地址的地位字节。/PSEN/PSEN:外部 程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN 有效。 但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。/EA/VPP/EA/VPP:当/EA 保 持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储 器。XTAL1XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2XTAL2:来自反向振 荡器的输出。 2.4 1602 型 LCD 本温度计的读数的显示是通过 1602 型 LCD 实现的,其具有微功耗、体积小、显 示内容丰富、超薄轻巧的特点,常用在袖珍式仪表和低功耗应用系统中。 VII 2.4.1 1602 型 LCD 的特性 1602 型 LCD 归纳起来有以下 6 大特点: +5V 电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有 80 字节显示数据存储器 DDRAM 内建有 192 个 5X7 点阵的字型的字符发生器 CGROM 8 个可由用户自定义的 5X7 的字符发生器 CGRAM 2.4.2 1602 型 LCD 的操作控制 1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字 符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等, 每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B(41H) ,显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看 到字母“A” 。 因为 1602 识别的是 ASCII 码,试验可以用 ASCII 码直接赋值,在单片机编程中还 可以用字符型常量或变量赋值,如A。以下是 1602 的 16 进制 ASCII 码表地址:读的 时候,先读左边那列,再读上面那行,如:感叹号!的 ASCII 为 0x21,字母 B 的 ASCII 为 0x42。 附加功能模块附加功能模块 2.52.5 DS1302DS1302 模块分析模块分析 DS1302 的 RST 是复位/片选线,通过把 RST 输入驱动置高电平来启动所有的数据 传送。当 RST 为高电平时,所有的数据传送被初始化,允许对 DS1302 进行操作。如 果在传送过程中 RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。 其管脚图如下: DS1302 管脚图 各引脚功能:Vcc1 为后备电源,VCC2 为主电源,X1 和 X2 是振荡源, SCLK 为输入端 RST 输入有两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄 存器;其次,RST 提供终止单字节或多字节数据的传送手 Ds1302 部分电路图 2.6 zigbee 无线发送模块无线发送模块 Zigbee 是基于 IEEE802.15.4 标准的低功耗个域网协议。根据这个协议规定的技术是 一种短距离、低功耗的无线通信技术,ZigBee 节点所属类别主要分三种,分别是协调器 (Coodinator)、路由器(Router)、终端(End Device)。统一网络中至少需要一个协调器, 也只能有 1 个协调器,负责各个节点 16 位地址分配(自动分配) 。理论上可以连上 65536 个节点,可以实行多方组网。 IX 3 详细设计 3.1 温度采集模块 温度采集模块的核心即是温度传感器 DS18B20,其接线方法和引脚排列已在上文 详述。因此可以设计出图 5 所示温度采集模块电路图。 图 5 温度采集模块 本次设计所采用的温度传感器为 Dallas 半导体公司的数字化温度传感器,它是世 界上第一片支持“一线总线”接口的温度传感器。 “一线器件”体积更小、适用电压更宽、 更经济。并且分辨率设定,及用户设定的报警温度存储在 EEPROM 中,掉电后依然保 存。 DSl8B20 数字温度计提供 9 位(二进制)温度读数,指示器件的温度信息经过单线接 口送入 DSl8B20 或从 DSl8B20 送出,因此从主机 CPU 到 DSl8B20 仅需一条线,当 DS18B20 接收到温度转换命令后,开始启动转换。转换完成后的温度值就以 16 位带符 号扩展的二进制补码形式存储在高速暂存存储器的第 1、2 字节。单片机可以通过单线 接口读出该数据,读数据时低位在先,高位在后,数据格式以 0.0625LSB 形式表 示。 当符号位 S0 时,表示测得的温度值为正值,可以直接将二进制位转换为十进制; 当符号位 S1 时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数 值。 3.2 单片机控制系统 单片机控制系统的电路图如图 6 所示,这样便实现了对 DS18B20 的信息采集、反 馈以及对 LCD 的控制。 图 6 单片机控制模块 3.3 温度和时间显示模块 温度显示和时间显示都主要是通过 1602 型 LCD 实现,1602 型 LCD 采用标准的 16 脚接口,其中: 第 1 脚:VSS 为电源地 第 2 脚:VDD 接 5V 电源正极 第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对 比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比 度)。 第 4 脚:RS 为寄存器选择,高电平 1 时选择数据寄存器、低电平 0 时选择指令寄 存器。 第 5 脚:RW 为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第 6 脚:E(或 EN)端为使能(enable)端。 第 714 脚:D0D7 为 8 位双向数据端。 第 1516 脚:空脚或背灯电源。15 脚背光正极,16 脚背光负极。 显示电路是使用的 LCD1602 液晶显示,这种显示最大的优点就是使用字符型显示, 可以显示两行,第一行显示日期与当前时间,第二行显示当前温度,当 DS18B20 出现 显示错误时第二行温度不显示会出现错误提示,此款液晶功耗低,操作方便,显示相 当清晰。 XI 图 7 显示模块电路图 3.4 软件设计 本章从设计思路、软件系统框图出发,先介绍整体的思路后,再逐一分析各模块 程序算法的实现,最终编写出满足任务需求的程序。 3.4.1 DS18B20的温度采集程序 DS18B20 器件要求采用严格的通信协议,以保证数据的完整性。该协议定义了几种信 号类型:复位脉冲,应答脉冲时隙;写 0,写 1 时隙;读 0,读 1 时隙。与 DS18B20 的通信,是通过操作时隙完成单总线上的数据传输。发送所有的命令和数据时,都是 字节的低位在前,高位在后。 该模块的系统流程 开始 初始化 温度转换命令 读18B20温度 存储 返回 图 8 温度采集模块的系统流程图 计算温度子程序计算温度子程序 计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的 判定,其程序流程图下图所示。 开始 温度零下? 温度值取补码置“”标志 计算小数位温度 BCD 值 计算整数位温度 BCD 值 结束 置“+”标志 N Y XIII DS18B20 的初始化 1.先将数据线置高电平 “1”。 2.延时(该时间要求的不是很严格,但是尽可能的短一点) 3.数据线拉到低电平 “0”。 4.延时 750 微秒(该时间的时间范围可以从 480 到 960 微秒)。 5.数据线拉到高电平 “1”。 6.延时等待(如果初始化成功则在 15 到 60 毫秒时间之内产生一个由 DS18B20 所返回的低电平 “0”。据该状态可以来确定它的存在,但是应注意不能无 限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。 7.若 CPU 读到了数据线上的低电平 “0”后,还要做延时,其延时的时间从发出 的高电平算起(第 5 步的时间算起)最少要 480 微秒。 8.将数据线再次拉高到高电平 “1”后结束。 3.4.2、时钟显示子程序时钟显示子程序 3.5 系统主程序 首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根 据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。 采用 C 语言编写代码, 鉴于篇幅限制及 DS18B20 的应用已经规范和成熟, 本文仅 就主程序流程图和显示子程序流程图及其代码进行说明。主程序流程图主程序通过调 用温度采集子程序完成温度数据采集, 然后调用温度转换子程序转换读取温度数据,调 用显示子程序进行温度显示和判断温度数据。下面给出流程图 开始 初始化 写入时钟初值 读出数据 返回 图 系统流程图 N Y N Y 初始化 调用显示子程序 50mS 到 到? 初次上电 读出温度值温 度 发温度转换开始命令 读出 ds1302 时钟 发时钟转换开始命令 Zigbee 模块将温度发送给电脑 XV 4 设计结果及分析 4.1 测试环境及工具 测试温度:20-50 摄氏度。 (模拟不同温度值环境) 测试仪器及软件:数字万用表,标准温度计 20-100 摄氏度。 4.2 测试方法和测试结果 使电路运行,观察系统硬件检测是否正常。系统自带测试表格数据,观察显示数 据是否相符合即可。 采用温度传感器和温度计同时测量水温变化情况,目测显示电路是否正常。并记 录温度值,与实际温度值比较,得出系统的温度指标。得到下表结果 标准温度()测试温度()误差() 20.2120.250.04 25.1025.32-0.22 35.0235.200.18 39.9739.960.01 45.0044.850.15 50.0049.890.11 平均误差(): 0.1001 表 3 温度测试结果 由此可知该数字温度计的误差在 1%左右。 5 总结和心得 经过一个星期的设计和制作,本人制作的多功能温度计也已完成,挺有收获的。 之前虽然运用过 52 单片机,但多模块功能混合实现还是第一次,本人首先设计了硬件 电路,最后写程序实现了软件的设计。在调试过程中也发现和解决了好些问题。 经过此次课程设计,我真正体会到要理论联系实际,把我们所学的理论知识用到 实际当中,通过多动手去提高自己的技能,光靠理论不动手是提高不了的。还有,程 序一定要多看多模仿着写才有提高。总之,此次课程设计不仅巩固了单片机方面的理 论知识,同时也提高的自己的动手能力、分析问题和解决问题的能力。 参考文献 1张琳娜,刘武发.传感检测技术及应用.中国计量出版社,1999 2马忠梅 籍顺心 张凯 马 岩. 单片机的 C 语言应用程序设计-修订版.北京航空航天 大学出版社,1998.10 3胡汉才.单片机原理及接口技术.清华大学出版社,1996 4阎石.数字电子技术基础.北京航空航天大学出版社,2006. 5黄河.基于 DS18B20 的单总线数字温度计.国防工业出版社,2002 6 彭泓. 汪玉凤. 粮仓温湿度智能控制系统J. 中国科技信息 , 2006 7童诗白,华程英.模拟电子技术基础(第四版)M.北京:高等教育出版社,2009. 附录一 系统总电路图 图附一 系统总电路图 XVII 附录二 实验结果测试图 1.时钟显示时钟显示 2.温度显示温度显示 3.温度通过无线模块发送到电脑温度通过无线模块发送到电脑 附录三 系统源代码 1 主函数部分主函数部分 #include #include “stdio.h“ #include “ds1302.h“ #include “18b20.h“ #include “delay.h“ #include “1602.h“ #define overtemp 50 sbit P20=P20;/定义锁存使能端口 段锁存 sbit P21=P21;/ 位锁存 sbit P35 = P35;/这是为了关闭开发板上的点阵实际应用去掉 sbit S17=P04;/独立按键 sbit S18=P05; sbit S19=P06; sbit S20=P07; sbit feng=P20; bit ReadTimeFlag;/定义读时间标志 bit SetFlag; /更新时间标志位 XIX unsigned char time_buf216; unsigned int ReadTemperature(void); unsigned char KeyScan(void); void Init_Timer0(void);/定时器初始化 void UART_Init(void); /*- 主函数 -*/ void main (void) unsigned char i,a=1,num,b=0,c=0; int temp1; unsigned char temp16;/定义显示区域临时存储数组 float temperature; char displaytemp16;/定义显示区域临时存储数组 CD_Init(); /初始化液晶 DelayMs(20); /延时有助于稳定 LCD_Clear(); /清屏 Init_Timer0(); /定时器 0 初始化 Ds1302_Init(); /ds1302 初始化 UART_Init(); /串口初始化 Ds1302_Read_Time(); /首次读取时间 if(time_buf12+time_buf17)=0) /如果所有参数都为 0,写入一个初始值 Ds1302_Write_Time(); while (1) /主循环 num=KeyScan(); switch(num) case 1:a+;if(a=3)a=1; break; /选择显示 case 2:b+;if(b=7)b=0; break;/b 为 1,2,3,4,5,6,时分别对 分时日周月年加调 case 3:c+;if(c=7)c=0; break;/b 为 1,2,3,4,5,6,时分别对 分时日周月年 /case 4: / break; /分减 1 default:break; if(num=4) if(c=0) switch(b) case 2:time_buf14+;if(time_buf14=24)time_buf14=0; Ds1302_Write_Time();break; /正常时间 小时加 1 case 1:time_buf15+;if(time_buf15=60)time_buf15=0; Ds1302_Write_Time();break;/分加 1 case 3:time_buf13+;if(time_buf13=32)time_buf13=1; Ds1302_Write_Time();break; /日 加 1 case 4:time_buf17+;if(time_buf17=8)time_buf17=1; Ds1302_Write_Time();break; /周加 1 case 5:time_buf12+;if(time_buf12=13)time_buf12=1; Ds1302_Write_Time();break; /月加 case 6:time_buf11+;if(time_buf11=100)time_buf11=12; Ds1302_Write_Time();break; /年加 default:break; if(b=0) switch(c) case 2:time_buf14-;if(time_buf14=255)time_buf14=23; Ds1302_Write_Time();break; / 小时减 1 case 1:time_buf15-;if(time_buf15=255)time_buf15=59; Ds1302_Write_Time();break;/分减 1 case 3:time_buf13-;if(time_buf13=255)time_buf13=31; Ds1302_Write_Time();break; /日减 1 case 4:time_buf17-;if(time_buf17=255)time_buf17=7; Ds1302_Write_Time();break; /zhou case 5:time_buf12-;if(time_buf12=255)time_buf12=12; Ds1302_Write_Time();break; /yue jian 1 case 6:time_buf11-; Ds1302_Write_Time();break; /nian jian default:break; if(SetFlag) /如果接收到串口信息则更新时钟 for(i=0;i 1; /写入数据:d for (i = 0; i 1; RST_CLR;/停止 DS1302 总线 /*- 从 DS1302 读出一字节数据 -*/ unsigned char Ds1302_Read_Byte(unsigned char addr) unsigned char i; unsigned char temp; RST_SET; /写入目标地址:addr addr = addr | 0x01;/最低位置高 for (i = 0; i 1; /输出数据:temp for (i = 0; i 1; if (IO_R) temp |= 0x80; else temp SCK_SET; SCK_CLR; RST_CLR;/停止 DS1302 总线 return temp; /*- 向 DS1302 写入时钟数据 -*/ void Ds1302_Write_Time(void) unsigned char i,tmp; for(i=0;i8;i+) /BCD 处理 tmp=time_buf1i/10; time_bufi=time_buf1i%10; time_bufi=time_bufi+tmp*16; Ds1302_Write_Byte(ds1302_control_add,0x00);/关闭写保护 Ds1302_Write_Byte(ds1302_sec_add,0x80);/暂停 /Ds1302_Write_Byte(ds1302_charger_add,0xa9);/涓流充电 Ds1302_Write_Byte(ds1302_year_add,time_buf1);/年 Ds1302_Write_Byte(ds1302_month_add,time_buf2);/月 Ds1302_Write_Byte(ds1302_date_add,time_buf3);/日 Ds1302_Write_Byte(ds1302_day_add,time_buf7);/周 Ds1302_Write_Byte(ds1302_hr_add,time_buf4);/时 Ds1302_Write_Byte(ds1302_min_add,time_buf5);/分 Ds1302_Write_Byte(ds1302_sec_add,time_buf6);/秒 Ds1302_Write_Byte(ds1302_day_add,time_buf7);/周 Ds1302_Write_Byte(ds1302_control_add,0x80);/打开写保护 /*- 从 DS1302 读出时钟数据 -*/ void Ds1302_Read_Time(void) unsigned char i,tmp; time_buf1=Ds1302_Read_Byte(ds1302_year_add);/年 time_buf2=Ds1302_Read_Byte(ds1302_month_add);/月 XXV time_buf3=Ds1302_Read_Byte(ds1302_date_add);/日 time_buf4=Ds1302_Read_Byte(ds1302_hr_add);/时 time_buf5=Ds1302_Read_Byte(ds1302_min_add);/分 time_buf6=(Ds1302_Read_Byte(ds1302_sec_add)/秒 time_buf7=Ds1302_Read_Byte(ds1302_day_add);/周 for(i=0;i8;i+) /BCD 处理 tmp=time_bufi/16; time_buf1i=time_bufi%16; time_buf1i=time_buf1i+tmp*10; /*- DS1302 初始化 -*/ void Ds1302_Init(void) RST_CLR;/RST 脚置低 SCK_CLR;/SCK 脚置低 Ds1302_Write_Byte(ds1302_sec_add,0x00); 3.1602 驱动部分驱动部分 #include “1602.h“ #include “delay.h“ sbit RS = P23; /定义端口 sbit RW = P22; sbit EN = P21; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P1 /*- 判忙函数 -*/ bit LCD_Check_Busy(void) DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort /*- 写入命令函数 -*/ void LCD_Write_Com(unsigned char com) while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数 -*/ void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数 -*/ XXVII void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数 -*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数 -*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数 -*/ void LCD_Init(void) LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Wr

温馨提示

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

评论

0/150

提交评论