7天快速入門Zigbee:傳感器實例
1. 概述
這篇文章給出了基於 Z-Stack Mesh 1.0.0 協議棧的“DS18B20”溫度傳感器的驅動代碼。
2. 代碼分析
———————————————————————– 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 ———————————————————————–
#ifndef __DS18B20_H__
#define __DS18B20_H__
extern unsigned char Ds18b20Initial(void);
extern unsigned char ReadDs18B20(void);
extern float floatReadDs18B20(void);
#endif