通过一段时间的学习, 先后使用过几种传感器, 发现有些传感器的源代码其实都是相同的。
MQ-2 传感器, 土壤湿度检测传感器, 光敏电阻传感器都是一样的.c源文件和.h头文件, 需要注
意的地方以光敏电阻传感器为例
GuangMin.h 文件:
#ifndef __GuangMin_H__
#define __GuangMin_H__
extern uint16 ReadLightData(void);//读取光强数据
#endif
//需要什么名字就怎么声明。
GuangMin.c 文件:
#include <ioCC2530.h>
#include "OnBoard.h"
#define HAL_ADC_DEC_064 0x00 /* Decimate by 64 : 8-bit resolution */
#define HAL_ADC_DEC_128 0x10 /* Decimate by 128 : 10-bit resolution */
#define HAL_ADC_DEC_256 0x20 /* Decimate by 256 : 12-bit resolution */
#define HAL_ADC_DEC_512 0x30 /* Decimate by 512 : 14-bit resolution */
#define HAL_ADC_DEC_BITS 0x30 /* Bits [5:4] */
#define HAL_ADC_CHANNEL_5 0x05 //在这里定义端口, 使用端口: P0_5
uint16 ReadLightData(void);
//读取光敏强度数据:
uint16 ReadLightData( void )
{
uint16 reading = 0;
P0DIR &= ~0x20; // 设置 P0.5 为输入方式
asm("NOP");asm("NOP");
/* Clear ADC interrupt flag */
ADCIF = 0;
ADCCON3 = (0x80 | HAL_ADC_DEC_064 | HAL_ADC_CHANNEL_5); //HAL_ADC_CHANNEL_5-->P0_5
/* Wait for the conversion to finish */
while ( !ADCIF );
asm("NOP");asm("NOP");/* Read the result */
reading = ADCL;
reading |= (int16) (ADCH << 8);
reading >>= 8;
return reading;
}
其实 MQ-2、 土壤湿度检测和光敏电阻传感器的.h文件和.c 文件都一样, 不一样的地方就是函数名字不同, 以及端口选择不同, 其他部分都是一样的。 在 EndDevice.c 中调用传感器时记得加: #include “GuangMin.h”并且在初始化的时候记得初始化端口功能选择 PxSEL(默认选择通用 IO 口, 但当使用多个传感器时就必须得配置对应端口)
数据发送部分也都一样:
void GenericApp_SendTheMessage(void)
{
char str[9];
uint16 value;
osal_memset(str,0,9);
value = ReadLightData();
sprintf(str,"BRI:%03d",value);
afAddrType_t my_DstAddr;
my_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
my_DstAddr.endPoint = GENERICAPP_ENDPOINT;
my_DstAddr.addr.shortAddr = 0x0000;
AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,
GENERICAPP_CLUSTERID,
8, //计算长度
str, //指向变量的地址
&GenericApp_TransID,
AF_DISCV_ROUTE,
AF_DEFAULT_RADIUS);
HalLedBlink(HAL_LED_2,0,50,500);
}
以下是另外三种传感器: DS18B20、 DHT11 和 MPU6050, 都需要计算再调用, 好在有现成写好的程序, 我们应用的时候只需要调用就好, 调用的时候注意端口配置和相应的传感器模块初始化, 调用时定义的数组长度和发送时的长度一定要够长。
DS18B20 传感器的头文件和源文件如下:
DS18B20.h 文件:
#ifndef __DS18B20_H__
#define __DS18B20_H__
extern unsigned char Ds18b20Initial(void);
extern unsigned char ReadDs18B20(void);
extern float floatReadDs18B20(void);
#endif
DS18B20.c 文件:
#include"iocc2530.h"
#include"OnBoard.h"
#include "ds18b20.h"
#define Ds18b20IO P0_7 //温度传感器引脚
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");
asm("NOP");
}
}
void Ds18b20InputInitial(void)//设置端口为输入
{
P0DIR &= 0x7f;
}
void Ds18b20OutputInitial(void)//设置端口为输出
{
P0DIR |= 0x80;
}
//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); // 启动温度转换
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()