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

下载本文档

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

文档简介

1、1 课题背景1.1 系统设计1.2 总体方框图2 设计方案简述2.1 DS18B20数字温度传感器2.1.1 DS18B20的性能特点错误!未定义书签。.2 .2DS18B20的管脚分布2.2.3 DS18B20的内部结构和工作方式2.3 AT89C52 单片机2.0 型 LCD1.1.1 1602型 LCD 的特性1.1.2 1602型 LCD 的操作控制2.5 DS1302 模块分析2.6 zigbee无线发送模块1.1 温度采集模块1.2 单片机控制系统1.3 温度和时间显示模块1.4 软件设计1.4.1 DS18B20的温度采集程序1.5 系统主程序4 设计结果及分析4.1 测试环境及

2、工具4.2 测试方法和测试结果5 总结附录一 系统总电路图 附录二 实验结果测试图附录三 系统源代码摘要本次单片机课程设计本人设计了智能数字温度计,其功能主要有,可以测试温度, 精确到小数点后三位;其次还附加了时钟功能,其可以显示秒到年的具体时间;并且本 人还利用了 zigbee无线传输模块,将采集到的温度值无线发送到电脑上。具体设计 在下面详细分析。关键词:温度计;ds18b20, zigbeei块,ds1302 , 89c521课题背景1.1 系统设计本课程设计的任务是设计一个数字温度计。由于在生产生活中都有很多领域需要测量温度,所以温度计的好坏即测量灵敏度,测温范围,稳定度以及实用性和适

3、用性就显 得尤为重要。传统温度计通常利用固体、液体、气体受温度的影响而热胀冷缩等的现象 为设计的依据,因此这种方法无论从设计原理还是视觉读数都有很大的误差。本次课程 设计以DS18B20作为数字温度传感器,其具有线性优良、性能稳定、灵敏度高、抗干 扰能力强、使用方便等优点,可以大大提高测量温度的精度,并且该设计还具备了无线 传输功能,采集到的温度可实时地传送到电脑,有利于对温度设备的远程监控,和远程 控制,这是未来智能设备(包括智能家居)的发展方向。001.2 总体方框图2 设计方案简述2.1 数字温度计设计方案论证由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度

4、变化的电压或电流采集过来,进行 A/D 转换后, 就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D 转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。2.1.2 方案二进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较

5、简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。2.2 DS18B20 数字温度传感器DS18B20温度传感器是美国DALLAS半导体公司生产的DS18B20型单线智能温度传感器,属于新一代适配微处理器的智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12 位的数字值读数方式。可广泛用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。它具有体积小,接口方便,传输距离远等特点。2.2.1 DS18B20的性能特点DS18B20从功能和技术的角度来说有以下性能特点:采用单总线专用技术,既可通过串行口线,也

6、可通过其它I/O 口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9 位二进制数,含符号位)测温范围为-55至+125,测量分辨率最小为0.0625内含 64 位经过激光修正的只读存储器ROMDS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只 三极管的集成电路内IICPU,同时可传送适配各种单片机或系统机测量结果直接输出数字温度信号,以“一线总线”串行传送给CRC校验码,具有极强的抗干扰纠错能力用户可分别设定各路温度的上、下限适应电压范围宽,3.05.5V,在寄生电源方式下可由数据线供电2.2.2 DS18B20的管脚分布独特的一线接口,只需要一条口线通信

7、 多点能力,简化了分布式温度传感应用 无 需外部元件 可用数据总线供电,电压范围为 3.0 V至5.5 V无需备用电源 测量温度范 围为-55C至+125C,华氏相当于是-10 °F至+85 °F范围内精度为± 0.5 °F。其引脚排列见图2和表1。12 3图2 DS18B20的管脚分布图表1 DS18B20的管脚分布说明2.3.3 DS18B20的内部结构和工作方式DS1820主要包括寄生电源、厅P名称引脚功能描述1Vcc可选择的Vcc弓1脚。当工作于寄生电 源时,此引脚必须接地。2DQ数据输入/输出引脚。开漏单总线接 口引脚。当被用着在寄生电源卜,也

8、 可以向器件提供电源。3GND地信号。温度传感器、64位激光ROM单线接口、存放中间数据的高速暂存器(内含便笺式RAM), 用于存储用户设定的温度上下限值的 TH和TL触发器存储与控制逻辑、8位循环冗余3所示。校验码(CRC)发生器等七部分内部,其内部结构框图如图64位ROM的结构开3 DS18B20丙於M器与控制 类型的血I有48位,最后麦位是前面56ROM一 '、卞艮CR军着是不节律的惟一的阡号,共温物瘠轨,可通过软件写入户报警上DS18B201。度传感器与制机的接口电路距18320母乂采所翻触放弋模电,一种是采皿工源供种是寄曲fe源仰方式,半片机端口接单线总线DS18B20的1脚

9、接叫窘2脚作为产线;昼,£,“生,就证甑有戒向低温敏8B20L时钟用期脚拣电源-另一内提供足够的电流,可用个编OSFET管来行弋的上拉。本实验采用第一种DS18B20 白勺测温原理是这这样的很小,用于尹生固定频叼勺脉冲信号送给器件中,减法计低温度系:块H勺力振荡频率岫改变,所产生的信借作为减法计数数器器 2白1;高湿府系数晶振随温磁变化声门,当计数门打开时,DS18B20就对低温度系出e生的日踏超3成温度测量。计数门的开启时间由高温度系数振荡器来决定, 每次测量前,首先将-55C 所对应的一个基数分别置入减法计数器 1、温度寄存器中,计数器1和温度寄存器被预 置在-55C所对应的一个

10、基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1III的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计 数,如此循环直到减法计数器计数到 0时,停止温度寄存器的累加,此时温度寄存器中 的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍关闭就 重复上述过程,直到温度寄存器值大致等于被测温度值。由于DS18B20的单线通讯功能是分时完成的,它有严格的时隙概念,因此读写时 序很重要。系统对DS18B20的各种操作按协议进行,操作协议为:初始化 DS18B20发 复位脉冲写

11、ROM功能指令发存储器操作命令处理数据。DS18B20有六条控制命 令如表2所小:指令约定代码操作说明温度转换44H启动DS18B20S行温度转换读暂存器BEH读暂存器9个字节内容写暂存器P 4EH将数据写入暂存器的TH TL字节复制暂存器48H把暂存器的TH TL字节写到E2RAM中重新调E2RAMB8H把E2RAMfr的TH TL字节写至U暂存器TH TL字节读电源供电方式B4H启动DS18B2映送电源供电方式的信号给主 CPU表2 DS18B20的控制指令2.3 AT89C52AT89C52g此次课程设计的核心部分。其管脚图如下:AT89C52t 脚图AT89C52g低功耗、高性能的CM

12、OS粒单片机。片内带有8KB的Flash存储器,且 允许在系统内改写或用编程器编程。另外,AT89C52的指令系统和引脚与80C52完全兼 容。AT89C52&管脚功能如下:VCC供电电压;GND接地;P0 口: P0 口为一个8位漏级开路双向I/O 口,每脚 可吸收8TTL门电流。;P1 口: P1 口是一个内部提供上拉电阻的 8位双向I/O 口,P1 口缓冲器能接收输出4TTL门电流;P2 口: P2 口为一个内部上拉电阻的8位双向I/O 口, P2 口缓冲器可接收,输出4个TTL门电流,当P2 口被写“1”时,其管脚被内部上拉电 阻拉高,且作为输入。并因此作为输入时,P2 口的管

13、脚被外部拉低,将输出电流; P3口: P3 口管脚是8个带内部上拉电阻的双向I/O 口,可接收输出4个TTL门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入;P3 口管脚功能:P3.0是RXD(串行输入口); P3.1是TXD(用行输出口); P3.2是/INT0 (外部中断0) ; P3.3 是/INT1 (外部中断1) ; P3.4是T0 (记时器0外部输入);P3.5是T1 (记时器1外部 输入);P3.6是/WR(外部数据存储器写选通);P3.7是/RD (外部数据存储器读选通); P3 口同时为闪烁编程和编程校验接收一些控制信号。RST复位输入。当振荡器复位器件时

14、,要保持RST脚两个机器周期白高电平时间。ALE/PROG当访问外部存储器时,地 址锁存允许输出电平用于锁存地址的地位字节。/PSEN外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次 /PSEN有效。但在访问外部数据存储 器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间 外部程序存储器(0000H-FFFFH ,不管是否有内部程序存储器。XTAL1:反向振荡放大 器的输入及内部时钟工作电路的输入。 XTAL2来自反向振荡器的输出。2.4 1602型 LCD本温度计的读数的显示是通过1602 型 LCD 实现的,其具有微功耗、体积小

15、、显示内容丰富、超薄轻巧的特点,常用在袖珍式仪表和低功耗应用系统中。2.4.1 1602型 LCD 的特性1602型 LCD 归纳起来有以下6大特点:+5V 电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有 80 字节显示数据存储器DDRAM内建有192 个 5X7 点阵的字型的字符发生器CGROM8 个可由用户自定义的5X7 的字符发生器CGRAM2.4.2 1602型 LCD 的操作控制1602液晶模块内部的字符发生存储器(CGROM)已经存储了 160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,

16、每一个字符都有一个固定的代码,比如大写的英文字母“ A” 的代码是01000001B( 41H) ,显示时模块把地址41H 中的点阵字符图形显示出来,我们就能看到字母“A”。因为 1602识别的是ASCII 码,试验可以用ASCII 码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如 'A'。 以下是 1602的 16进制 ASCII 码表地址:读的时候,先读左边那列,再读上面那行,如:感叹号 !的ASCII为0x21,字母B的ASCII为 0x42。附加功能模块2.5 DS1302 模块分析DS1302的RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数

17、据 传送。当RST为高电平时,所有的数据传送被初始化,允许对 DS1302进行操作。如果 在传送过程中RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。其管脚图如下:DS1302管脚图各引脚功能:Vcc1为后备电源,VCC协主电源,X1和X2是振荡源,SCL劭输入端RST 输入有两种功能:首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存 器 ; 其 次 , RST 提 供 终 止 单 字 节 或 多 字 节 数 据 的 传 送 手C7GXDGND133v电池rcC622PuOGND"HC51-1302S7653V-P26P28-GXDDs1302部分电路图2

18、.6 zigbee无线发送模块Zigbee是基于,ZigBee节点所属类别主要分三种,分别是协调器(Coodinator)、路由器(Router)、终端(End Device)。统一网络中至少需要一个协调器,也只能有1个协调器,负责各个节点16位地址分配(自动分配)。理论上可以连上65536个节点,可以实行 多方组网。3详细设计3.1 温度采集模块温度采集模块的核心即是温度传感器 DS18B20,其接线方法和引脚排列已在上文详 述。因此可以设计出图5所示温度采集模块电路图。图5温度采集模块本次设计所采用的温度传感器为 Dallas半导体公司的数字化温度传感器,它是世界 上第一片支持 "

19、;线总线”接口的温度传感器。线器件”体积更小、适用电压更宽、更经济。并且分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DSl8B20数字温度计提供9位(二进制)温度读数,指示器件的温度信息经过单线接 口送入 DSl8B20或从DSl8B20送出,因此从主机 CPU至U DSl8B20仅需一条线,当 DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625C/LSB形式表示。当符号位S=0时,表示测得的温度

20、值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数 值。3.2 单片机控制系统单片机控制系统的电路图如图 6所示,这样便实现了对 DS18B20的信息采集、反 馈以及对LCD的控制。图6单片机控制模块3.3 温度和时间显示模块温度显示和时间显示都主要是通过 1602型LCD实现,1602型LCD采用标准的16 脚接口,其中:第1脚:VSS为电源地第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生 鬼影”,使用时可以通过一个10K的电位器调整对比 度

21、)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄 存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable圃。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。显示电路是使用的LCD1602液晶显示,这种显示最大的优点就是使用字符型显示, 可以显示两行,第一行显示日期与当前时间,第二行显示当前温度,当 DS18B20出现 显示错误时第二行温度不显示会出现错误提示,此款液晶功耗低,操作方便,显示相当 清晰。图7显示模块电路图3.4软件设计本章从设计思

22、路、软件系统框图出发,先介绍整体的思路后,再逐一分析各模块程 序算法的实现,最终编写出满足任务需求的程序。3.4.1 DS18B20的温度采集程序DS18B20器件要求采用严格的通信协议,以保证数据的完整性。该协议定义了几种信号 类型:复位脉冲,应答脉冲时隙;写 0,写1时隙;读0, t卖1时隙。与DS18B20的通 信,是通过操作时隙完成单总线上的数据传输。发送所有的命令和数据时,都是字节的 低位在前,高位在后。该 模 块 的 系 统 流 程VII图8温度采集模块的系统流程图计算温度子程序一,N温度零下?计算温度子程序将RAM中读褊进行BCD码屋换运算,并进行温度值正负的判 定,其程序流程图

23、下图所示。DS18B20的初始1 .先将数据线置高电平“1:2 .延时(该时间要求的不是很严格,但是尽可能Y短一点)3 .数据线拉到低时平置“+”标志DS18B204 .延时750微秒(该时间的日枷四飒例即80s 960微秒),5 .数据线拉到高也平6 .延时等待(如果初始化成功则在15 M 60毫秒时间之内产生一个由所返回的低电平0';"该状态可以来确定的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环讣算吸嗷拄褊理寸BCD)值7 .若CPU读到了数据线上的低电平“10后,还要做延时,典延时的时间从发出的高电平算起(第 5步的时间算起)最少要480微秒。8 .将数

24、据线再次拉高,高电平计算整数位温度BCD值开始223.5系统主程序首先要根据系统的总体功能和键盘设置选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。采用C语言编写代码,鉴于篇幅限制及DS18B20的应用已经规范和成熟,本文仅 就主程序流程图和显示子程序流程图及其代码进行说明。主程序流程图主程序通过调用温度采集子程序完成温度数据采集,然后调用温度转换子程序转换读取温度数据,调用 显示子程序进行温度显示和判断温度数据。下面给出流程图Zigbee模块将温度发送给电脑4设计结果及分析4.1 测试环境及工具测试温度:20-50摄氏度。(模拟不同温度值环境

25、)测试仪器及软件:数字万用表,标准温度计 20-100摄氏度4.2 测试方法和测试结果使电路运行,观察系统硬件检测是否正常。系统自带测试表格数据,观察显示数据 是否相符合即可。采用温度传感器和温度计同时测量水温变化情况,目测显示电路是否正常。并记录 温度值,与实际温度值比较,得出系统的温度指标。得到下表结果标准温度(c)测试温度(C)误差(C)20.2120.250.0425.1025.32-0.2235.0235.200.18139.9739.960.0145.0044.850.1550.0049.890.11平均误差( C):0.1001表3温度测试结果由此可知该数字温度计的误差在 1%左

26、右。5总结和心得经过一个星期的设计和制作,本人制作的多功能温度计也已完成,挺有收获的。之 前虽然运用过52单片机,但多模块功能混合实现还是第一次,本人首先设计了硬件电 路,最后写程序实现了软件的设计。在调试过程中也发现和解决了好些问题。经过此次课程设计,我真正体会到要理论联系实际,把我们所学的理论知识用到 实际当中,通过多动手去提高自己的技能,光靠理论不动手是提高不了的。还有,程序 一定要多看多模仿着写才有提高。总之,此次课程设计不仅巩固了单片机方面的理论知 识,同时也提高的自己的动手能力、分析问题和解决问题的能力。参考文献1张琳娜,刘武发.传感检测技术及应用.中国计量出版社,19992马忠梅

27、籍顺心张凯马岩.单片机的C语言应用程序设计-修订版.北京航空航天 大学出版社,1998.103胡汉才.单片机原理及接口技术.清华大学出版社,19964阎石.数字电子技术基础.北京航空航天大学出版社,2006.5黄河.基于DS18B20勺单总线数字温度计.国防工业出版社,20026彭泓.汪玉凤.粮仓温湿度智能控制系统J.中国科技信息,2006口童诗白,华程英.模拟电子技术基础(第四版)M.北京:高等教育出版社,2009.附录一系统总电路图图附一系统总电路图附录二实验结果测试图1 .时钟显示2 .温度显示3 .温度通过无线模块发送到电脑附录三系统源代码1主函数部分#include<reg52

28、.h>#include "stdio.h"#include "ds1302.h"#include "18b20.h"#include "delay.h"#include "1602.h"#define overtemp 50位锁存sbit P20=P2A0;/定义锁存使能端口段锁存sbit P21=P2A1;sbit P35 = P3A5;/这是为了关闭开发板上的点阵实际应用去掉sbit S17=P0A4;/独立按键sbit S18=P0A5;sbit S19=P0A6;sbit S20=

29、P0A7;sbit feng=P2A0;bit ReadTimeFlag;/ 定义读时间标志bit SetFlag;/更新时间标志位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;/ 定义显示区

30、域临时存储数组float temperature;char displaytemp16;/CD_Init();DelayMs(20);LCD_Clear();Init_Timer0();Ds1302_Init();UART_Init();Ds1302_Read_Time();定义显示区域临时存储数组/初始化液晶/延时有助于稳定/清屏/定时器0 初始化/ds1302 初始化/串口初始化/首次读取时间if(time_buf12+time_buf17)=0) / 如果所有参数都为0,写入一个初始值Ds1302_Write_Time();while (1)num=KeyScan();switch(nu

31、m)/主循环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

32、case 1:time_buf15+;if(time_buf15=60)time_buf15=0;Ds1302_Write_Time();break;/ 分加 1case 3:time_buf13+;if(time_buf13=32)time_buf13=1;Ds1302_Write_Time();break; / 日 加 1case 4:time_buf17+;if(time_buf17=8)time_buf17=1;Ds1302_Write_Time();break; / 周加 1case 5:time_buf12+;if(time_buf12=13)time_buf12=1;Ds1302

33、_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; / 小时减 1case 1:time_buf15-;if(time_buf15=255)time_buf15=59;Ds1302_Write_Time();break

34、;/ 分减 1case 3:time_buf13-;if(time_buf13=255)time_buf13=31;Ds1302_Write_Time();break; / 日减 1case 4:time_buf17-;if(time_buf17=255)time_buf17=7;Ds1302_Write_Time();break; /zhoucase 5:time_buf12-;if(time_buf12=255)time_buf12=12;Ds1302_Write_Time();break; /yue jian 1case 6:time_buf11-;Ds1302_Write_Time()

35、;break; /nian jian default:break; if(SetFlag)/如果接收到串口信息则更新时钟 for(i=0;i<8;i+) time_buf1i=time_buf22*i*10+time_buf22*i+1;/ 数据整合,如2 个数 1 和 5 整合成15 Ds1302_Write_Time();/ 接收更新的时间然后写入ds1302SetFlag=0;/时钟信息更新后标志位清零 if(ReadTimeFlag=1) / 定时读取ds1302 定时时间到则标志位置1, 处理过时间参数标志位清零 ReadTimeFlag=0;/标志位清零if(a=1) LCD

36、_Clear();/清屏LCD_Write_Char(13,1,0x01);/ 写入温度右上角点 LCD_Write_Char(14,1,'C'); / 写入字符C/ ReadTempFlag=0; temp1=ReadTemperature() if (a=2) LCD_Clear();/清屏Ds1302_Read_Time();/ 读取时间参数 if(int)time_buf15=0) feng=0; else feng=1;sprintf(temp,"DATE %02d-%02d-%02d %d",(int)time_buf11,(int)time_b

37、uf12,(int)time_buf13,(int)tim e_buf17);/ 年月日周LCD_Write_String(0,0,temp);/ 显示第一行sprintf(temp,"TIME %02d:%02d:%02d",(int)time_buf14,(int)time_buf15,(int)time_buf16);/ 时分秒 LCD_Write_String(0,1,temp);/ 显示第二行 2.ds1302驱动部分#include "ds1302.h"unsigned char time_buf18 = 20,12,12,10,16,55,

38、00,6;/ 空年月日时分秒周unsigned char time_buf8 ;/空年月日时分秒周/*向 DS1302 写入一字节数据*/void Ds1302_Write_Byte(unsigned char addr, unsigned char d) unsigned char i;RST_SET;/写入目标地址:addraddr = addr & 0xFE; /最低位置零for (i = 0; i < 8; i +)if (addr & 0x01)IO_SET;elseIO_CLR;SCK_SET;SCK_CLR;addr = addr >> 1;/写

39、入数据:dfor (i = 0; i < 8; i +)if (d & 0x01)IO_SET;elseIO_CLR;SCK_SET;SCK_CLR;d = d >> 1;RST_CLR;/停止DS1302 总线 /*从 DS1302 读出一字节数据*/unsigned char Ds1302_Read_Byte(unsigned char addr) unsigned char i;unsigned char temp;RST_SET;/写入目标地址:addraddr = addr | 0x01;/最低位置高for (i = 0; i < 8; i +)if

40、(addr & 0x01) IO_SET; elseIO_CLR;SCK_SET;SCK_CLR;addr = addr >> 1;/输出数据:tempfor (i = 0; i < 8; i +)temp = temp >> 1;if (IO_R)temp |= 0x80;elsetemp &= 0x7F;SCK_SET;SCK_CLR;RST_CLR;/停止DS1302 总线return temp;/*向 DS1302 写入时钟数据*/ void Ds1302_Write_Time(void) unsigned char i,tmp;for(i

41、=0;i<8;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(ds130

42、2_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);/

43、周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);/月time_buf3=Ds1302_Read_Byte(ds1302_date_add);/日time_buf4=Ds1302_Read_Byte(ds1302_hr_add);/时

44、time_buf5=Ds1302_Read_Byte(ds1302_min_add);/分time_buf6=(Ds1302_Read_Byte(ds1302_sec_add)&0x7F;/ 秒time_buf7=Ds1302_Read_Byte(ds1302_day_add);/周for(i=0;i<8;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

45、;/SCK 脚置低Ds1302_Write_Byte(ds1302_sec_add,0x00);3.1602 驱动部分#include "1602.h"#include "delay.h"sbit RS = P2A3;定义端口sbit RW = P2 A2;sbit EN = P2A1;# 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

46、 P1/*判忙函数*/bit LCD_Check_Busy(void)DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);/*写入命令函数*/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)whil

47、e(LCD_Check_Busy(); / 忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;/*清屏函数*/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);/表示第一行elseLCD_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);elseLCD_Write_Com(0xC0 + x);LCD_Write_Data( Data);/*初始化函数*/void LCD_Init(vo

温馨提示

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

评论

0/150

提交评论