7天快速入门Zigbee:传感器实例

7天快速入门Zigbee:传感器实例



点击左上角的“关注”,定期更新Zigbee最新资讯,总有你想要的信息!

目录

  1. 概述
  2. 代码分析

1. 概述

  这篇文章给出了基于 Z-Stack Mesh 1.0.0 协议栈的“DS18B20”温度传感器的驱动代码。

2. 代码分析

DS18B20.c:

//---------------------------------------- DS18B20.c ----------------------------------------
#include"iocc2530.h"
#include"OnBoard.h"
#include "ds18b20.h"

//温度传感器引脚
#define Ds18b20IO P1_1       

void Ds18b20Delay(unsigned int k);
void Ds18b20InputInitial(void);
void Ds18b20OutputInitial(void);
unsigned char Ds18b20Initial(void);
void Ds18b20Write(unsigned char infor);
unsigned char Ds18b20Read(void);

//时钟频率为32M
void Ds18b20Delay(unsigned int k)
{
  while (k--)
  {
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");  
  }
}

//设置端口为输入
void Ds18b20InputInitial(void)    
{
    P0DIR &= 0xfd;
}

//设置端口为输出
void Ds18b20OutputInitial(void)   
{
    P0DIR |= 0x02;
}

//ds18b20初始化  初始化成功返回0x00,失败返回0x01
unsigned char Ds18b20Initial(void)
{
    unsigned char Status = 0x00;
    unsigned int CONT_1 = 0;
    unsigned char Flag_1 = 1;
    Ds18b20OutputInitial();
    Ds18b20IO = 1;          //DQ复位
    Ds18b20Delay(260);      //稍做延时
    Ds18b20IO = 0;          //单片机将DQ拉低
    Ds18b20Delay(750);      //精确延时 大于 480us 小于960us
    Ds18b20IO = 1;          //拉高总线
    Ds18b20InputInitial();  //设置IO输入
    while((Ds18b20IO != 0)&&(Flag_1 == 1)) //等待ds18b20响应,具有防止超时功能
    {                                      //等待约60ms左右
        CONT_1++;
        Ds18b20Delay(10);
        if(CONT_1 > 8000)Flag_1 = 0;
        Status = Ds18b20IO;
    }
    Ds18b20OutputInitial();
    Ds18b20IO = 1;
    Ds18b20Delay(100);
    
    //返回初始化状态
    return Status;          
}

void Ds18b20Write(unsigned char infor)
{
    unsigned int i;
    Ds18b20OutputInitial();
    for(i=0;i<8;i++)
    {
        if((infor & 0x01))
        {
            Ds18b20IO = 0;
            Ds18b20Delay(6);
            Ds18b20IO = 1;
            Ds18b20Delay(50);
        }
        else
        {
            Ds18b20IO = 0;
            Ds18b20Delay(50);
            Ds18b20IO = 1;
            Ds18b20Delay(6);
        }
        infor >>= 1;
    }
}

unsigned char Ds18b20Read(void)
{
    unsigned char Value = 0x00;
    unsigned int i;
    Ds18b20OutputInitial();
    Ds18b20IO = 1;
    Ds18b20Delay(10);
    for(i=0;i<8;i++)
    {
        Value >>= 1;
        Ds18b20OutputInitial();
        Ds18b20IO = 0;    // 给脉冲信号
        Ds18b20Delay(3);
        Ds18b20IO = 1;    // 给脉冲信号
        Ds18b20Delay(3);
        Ds18b20InputInitial();
        if(Ds18b20IO == 1) Value |= 0x80;
        Ds18b20Delay(15);
    }
    return Value;
}

// 温度读取函数
unsigned char ReadDs18B20(void)
{
    unsigned char V1,V2;   //定义高低8位 缓冲
    unsigned char temp;    //定义温度缓冲寄存器
   
    Ds18b20Initial();
    Ds18b20Write(0xcc);    // 跳过读序号列号的操作
    Ds18b20Write(0x44);    // 启动温度转换
   
    Ds18b20Initial();
    Ds18b20Write(0xcc);    //跳过读序号列号的操作
    Ds18b20Write(0xbe);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
   
    V1 = Ds18b20Read();    //低位
    V2 = Ds18b20Read();    //高位
    temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据
    return temp;
}

//温度读取函数 带1位小数位
float floatReadDs18B20(void)
{
    unsigned char V1,V2;   //定义高低8位 缓冲
    unsigned int temp;     //定义温度缓冲寄存器
    float fValue;
    Ds18b20Initial();
    Ds18b20Write(0xcc);    // 跳过读序号列号的操作
    Ds18b20Write(0x44);    // 启动温度转换
   
    Ds18b20Initial();
    Ds18b20Write(0xcc);    //跳过读序号列号的操作
    Ds18b20Write(0xbe);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
   
    V1 = Ds18b20Read();    //低位
    V2 = Ds18b20Read();    //高位
    //temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据
    temp=V2*0xFF+V1;
    fValue = temp*0.0625;
   
    return fValue;
}

DS18B20.h:

//---------------------------------------- DS18B20.h ----------------------------------------
#ifndef __DS18B20_H__
#define __DS18B20_H__

extern unsigned char Ds18b20Initial(void);
extern unsigned char ReadDs18B20(void);
extern float floatReadDs18B20(void);

#endif




--- End ---
你可能还想看:

> 基于 Z-Stack 3.0.2 的人体热红外传感器 AM312
> Zigbee进阶:功能模块
> 免费的Zigbee抓包神器!比Ubiqua还好用!

你可能感兴趣的:(Zigbee,项目专栏)