各类传感器使用小结

这篇博客总结了作者在学习过程中使用过的几种传感器,包括MQ-2、土壤湿度检测、光敏电阻传感器,以及DS18B20、DHT11和MPU6050。尽管部分传感器的.c和.h文件相同,只需修改函数名和端口选择,但在调用时要注意端口配置和初始化。对于DS18B20、DHT11和MPU6050,需要计算和调用预写好的程序,确保数组长度足够且正确配置传感器模块。
摘要由CSDN通过智能技术生成

通过一段时间的学习, 先后使用过几种传感器, 发现有些传感器的源代码其实都是相同的。
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);
}

以下是另外三种传感器: DS18B20DHT11MPU6050, 都需要计算再调用, 好在有现成写好的程序, 我们应用的时候只需要调用就好, 调用的时候注意端口配置和相应的传感器模块初始化, 调用时定义的数组长度和发送时的长度一定要够长。
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值