664
社区成员




1.http://doc.iotlucker.com/zigbee/2063494 关于传感器
2、在学习传感器章节,教程给的是温湿度传感器——DHT11传感器,但是测量温度的误差值较大,我想用MLX90614测量人体温度,网上有STM32和51的参考例程,参考写了CC2530的驱动,但是用不了,麻烦给予技术支持,看下代码哪里有问题?
#include <ioCC2530.h>
#include <stdio.h>
#include "GY906.h"
//GY906 端口定义
#define SCL P1_4 // 时钟线
#define SDA P1_5 // 数据线
#define ACK 0
#define NACK 1 //不应答或否定的应答
#define _SDA_OUT P1DIR |= 0x20 //输出
#define _SDA_IN P1DIR &= ~0x20 //输入
#define _SCL_OUT P1DIR |= 0x10 //输出
//************************************
uchar DataH,DataL,Pecreg;
/***********延时函数************/
void Delay_1u(uint microSecs)
{ while(microSecs--)
{ /* 32 NOPs == 1 usecs 因为延时还有计算的缘故,用了31个nop*/
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");
asm("nop");
}
}
/***************IO口设置***************/
void WriteSDA1(void)//SDA 输出1,相当于51里面的SDA=1
{
P1DIR |= 0x20; //0010 0000 P1_5
SDA = 1;
}
void WriteSDA0(void)//SDA 输出0
{
P1DIR |= 0x20;
SDA = 0;
}
void WriteSCL1(void)//SCL 输出1
{
P1DIR |= 0x10; //0001 0000 P1_4
SCL = 1;
}
void WriteSCL0(void)//SCL 输出0
{
P1DIR |= 0x10;
SCL = 0;
}
void ReadSDA(void)//这里设置SDA对应IO口DIR可以接收数据
{
P1DIR &= 0xDF; //1101 1111
}
/************GY906 发起始位子程序 当SCL为高电平时使SDA产生一个负跳变***********/
void IIC_Start_(void)
{
SDA = 1;
Delay_1u(5);
SCL = 1;
Delay_1u(5);
SDA = 0;
Delay_1u(5);
SCL = 0;
Delay_1u(5);
}
/*************GY906发结束位子程序 当SCL为高电平时使SDA产生一个正跳变***************/
void IIC_Stop_(void)
{
SCL = 0;
Delay_1u(5);
SDA = 0;
Delay_1u(5);
SCL = 1;
Delay_1u(5);
SDA = 1; //拉高数据线
}
//-----------发送一个位---------
void send_bit(uint bit_out)
{
if(bit_out==0)
SDA = 0;
else
SDA = 1;
Delay_1u(2);
SCL = 1;
Delay_1u(6);
SCL = 0;
Delay_1u(6);
}
//---------- 接收一个位----------
uint receive_bit(void)
{
uint Ack_bit;
_SDA_IN;
SDA = 1;
Delay_1u(2);
SCL = 1;
Delay_1u(2);
Ack_bit = SDA;
_SDA_OUT;
SCL = 0;
Delay_1u(3);
return Ack_bit;
}
/***********************发送一个字节********************/
uint tx_byte(uchar dat)
{
uint i,bit_out,Ack_bit;
for (i=0; i<8; i++) //8位计数器
{
if(dat&0x80) //如果最高位为1
{
bit_out=1;
}
else
{
bit_out=0;
}
send_bit(bit_out);
dat=dat<<1;
}
Ack_bit = receive_bit();
return Ack_bit;
}
//---------- 接收一个字节--------
uchar rx_byte(uint ack_nack)
{
uchar i,dat,bit_in;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
bit_in = receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit(ack_nack);
return dat;
}
/*****************读温度数据 ************/
uint memread(void)
{
uint data;
IIC_Start_();
tx_byte(0x00); //Send SlaveAddress ==============================
tx_byte(0x07); //Send Command
//------------
IIC_Start_();
tx_byte(0x01);
DataL=rx_byte(1);
DataH=rx_byte(0);
Pecreg=rx_byte(NACK);
IIC_Stop_();
//data = DataH*256+DataL;
data = (DataH<<8) | DataL; //data=DataH:DataL
return data;
}
float ReadTemp(void)
{
float temp;
temp = memread() *0.02-273.15;
return temp;
}
楼主请问你问题解决了吗?
您好,使用非我方提供的传感器,暂时支持力度较小,需要再耐心等待一下回复,多谢理解^_^