DS18B20传感.docx
- 文档编号:18298767
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:15
- 大小:1.90MB
DS18B20传感.docx
《DS18B20传感.docx》由会员分享,可在线阅读,更多相关《DS18B20传感.docx(15页珍藏版)》请在冰点文库上搜索。
DS18B20传感
1.1温度传感器DS18B20
选择从大家很熟悉且常用的温度传感器DS18B20开始。
逐步建立自己的无线传感网!
传感器介绍:
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
实物如图所示:
图3.95DS18B20外观
实现平台:
ZigBee传感器节点;
图3.97ZigBee传感器器节点
图3.98DS18B20硬件电路图
实验现象:
节点通过采集DS18B20温度信息,实时发送到协调器。
协调器通过串口打印和液晶显示方式展示当前温度。
实验讲解:
ZigBee要完成采集温度传感器信息再发送到协调器的过程,必须在协议栈上完成所有代码的编程。
实际上,我们可以在裸机(不带协议栈)的基础上成功驱动起传感器,然后再加载到协议栈上面。
这样会有事半功倍的效果。
下面我们就来看看如何把裸机上成功驱动的传感器添加到协议栈代码上,并实现数据传输。
实验过程:
分三个步骤,如下:
一:
在裸机上完成对DS18B20的驱动。
二:
将程序添加到协议栈代码中
三:
将数据打包并按指定的方式发送给指定设备。
一:
在裸机上完成对DS18B20的驱动。
相信大家都接触过51单片机对DS18B20温度读取的编程。
CC2530裸机驱动DS18B20也是这样的道理。
只要我们掌握好单片机C语言编程以及了解传感器的原理就可以轻松应对。
打开配套程序下裸机文件夹—温度传感器DS18B20下的工程文件,看到主函数如下:
(代码取用模块化编程,其他函数请看工程文件)
/**************************************/
/*Zigbee学习例程*/
/*例程名称:
温度传感器DS18B20*/
/*建立时间:
2012/10/1*/
/*描述:
将采集到的温度信息通过串口打印到
串口调试助手。
**************************************/
1.#include"iocc2530.h"
2.#include"uart.h"
3.#include"ds18b20.h"
4.#include"delay.h"
5.voidInitial()//系统初始化
6.{
7.CLKCONCMD=0x80;//选择32M振荡器
8.while(CLKCONSTA&0x40);//等待晶振稳定
9.UartInitial();//串口初始化
10.P0SEL&=0xbf;//DS18B20的io口初始化
11.}
12.voidmain()
13.{
14.chardata[5]="temp=";//串口提示符
15.Initial();
16.while
(1)
17.{
18.Temp_test();//温度检测
/*******温度信息打印***********/
19.UartTX_Send_String(data,5);
20.UartSend(temp/10+48);
21.UartSend(temp%10+48);
22.UartSend('\n');
23.
24.Delay_ms(1000);//延时函数使用定时器方式,延时1S
25.}
26.}
我们来看主函数:
第15行:
进行一些初始化工作。
第18行:
在大循环中,检测温度。
第19~22行:
通过串口打印温度信息
简单几行代码,就完成了对DS18B20的读取。
大家可以在工程里进入具体
函数看代码,理解DS18B20的读取过程。
实验现象如图3.11.1D所示:
图3.99
二:
将程序添加到协议栈代码中
有了基础实验的代码,我们的实验就完成了一大半了。
至少证明CC2530可以驱动起我们想要的传感器。
接下来我们需要做的工作就是移植到协议栈z-stack上面,这个过程要注意的是要了解协议栈上的IO口用途和晶振工作频率。
首先理清一下思路,我们要实验的功能是终端设备读取DS18B20温度信息,通过点播方式发送到协调器,协调器通过通常打印出来。
在串口调试助手上面显示。
这就实现了无线温度采集。
(使用点播的原因是终端设备有针对性地发送数据给指定设备,不想广播和组播可能会造成数据冗余,关于点播内容请参考《zigbee实战演练》点播章节,这里不再累赘。
)
1)我们将裸机程序里面的DS18B20.c和DS18B20.h文件复制到SAMPLEAPP-Source文件夹下。
图3.100
2)在协议栈的APP目录树下点击右键--Add--添加DS18B20.C文件
3)整个实验以点播为依托,我们实验也就是在点播例程的基础上完成,故函数编程也是像以前一样在SAMPLEAPP.C上进行。
我们先包含DS18B20.h文件。
图3.102添加头文件
4)初始化传感器引脚P0.6
图3.103
4)借用周期性点播函数,1s读取温度传感器1次,通过液晶显示和串口打印并点对点发送给协调器。
代码如下,如图3.104所示:
uint8T[5];//温度+提示符
Temp_test();//温度检测
T[0]=temp/10+48;
T[1]=temp%10+48;
T[2]='';
T[3]='C';
T[4]='\0';
/*******串口打印*********/
HalUARTWrite(0,"temp=",5);
HalUARTWrite(0,T,2);
HalUARTWrite(0,"\n",1);
/*******LCD显示*********/
HalLcdWriteString("Thetempis:
",HAL_LCD_LINE_3);//LCD显示
HalLcdWriteString(T,HAL_LCD_LINE_4);//LCD显示
图3.104
5)DS18B20.c文件需要修改一个地方。
打开改文件,将原来的延时函数改成协议栈自带的延时函数,保证时序的正确。
同时要包含#include"OnBoard.h"。
去掉#include"uart.h";
图3.106
另外,协议栈里面是要求每个定义了的函数都必须在文件添加声明,否则报错。
所以给ds18b20.c里面的文件都添加声明:
voidDs18b20Delay(uintk);
voidDs18b20InputInitial(void);//设置端口为输入
voidDs18b20OutputInitial(void);//设置端口为输出
ucharDs18b20Initial(void);
voidDs18b20Write(ucharinfor);
ucharDs18b20Read(void);
voidTemp_test(void);//温度读取函数
图3.107
三:
将数据打包并按指定的方式发送给指定设备。
在上一个步骤,我们完成了DS18B20基于协议栈的驱动,接下来,我们就用以前的知识,实现数据发送和接收就可以了。
在EndDevice的点播发送函数中将温度信息发送出去,代码如下,如图所示:
voidSampleApp_SendPointToPointMessage(void)
{
uint8T[2];//温度
T[0]=temp/10+48;//格式转换
T[1]=temp%10+48;
if(AF_DataRequest(&Point_To_Point_DstAddr,
&SampleApp_epDesc,
SAMPLEAPP_POINT_TO_POINT_CLUSTERID,
2,
T,
&SampleApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS)==afStatus_SUCCESS)
{
}
else
{
//Erroroccurredinrequesttosend.
}
}
图3.108
协调器代码如下,如图3.11.1M所示:
case
SAMPLEAPP_POINT_TO_POINT_CLUSTERID:
HalUARTWrite(0,"Tempis:
",8);//提示接收到数据
HalUARTWrite(0,&pkt->cmd.Data[0],2);//ASCII码发给PC机
HalUARTWrite(0,"\n",1);//回车换行
break;
图3.109
实验结果及图片:
观察终端设备将协调器连接到电脑,观察从终端发来的信息。
以终端方式下载到开发板,当连接上协调器时,可以看到串口打印出温度传感器信息。
如图所示:
图3.111
同时协调器收到终端发送来的信息:
图3.112
结语:
至此,我们完成了对DS18B20温度数据的无线采集,也就是从初始化、采集到打包发送的过程。
相信看完后你对传感器的应用不再陌生了。
从这章开始,会带领你一步步组建自己的传感器网络。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 传感