GPIO驱动的传感器

DS18B20(温度传感器)

其为一款数字温度传感器,测量范围为-55°~125°,本质为一款16位单片机,所以数据位有16位,前5位为符号位,接着7位为整数位,后4位为小数位,由于2^7为126,所以其最大温度为125°,而最小温度为物理性质决定,小数位为4位,所以精度为2^(-4)也就是0.0625°,其有三根引脚,结构图如下:

IO通过主机控制,由于只有一根引脚,只可能用单根线通信的方式来首发数据,选择单总线进行主机与从机数据的收发。

单总线
初始化:

操作:首先将线电位置高,接着将其拉低480us以上,然后释放总线(将其置高)

现象:等待15~60us后,从机会响应一个60~240us的低电平,然后也置高。

发送数据

操作:主机将总线拉低60~120us,表示发送0;拉低1~15us,表示发送1;发送完数据后将总线拉低30us,从机才能接受数据,每次发送时间应该大于60us。

接收数据

操作:主机将总线拉低1~15us,然后释放总线,接着开始读取数据(读取时间尽量靠近拉低的那15us)。

现象:低电平为0,高电平为1.

操作流程:

1.初始化单总线;
2.ROM操作;

一般为跳过ROM(只有一个传感器),即用单总线使主机向从机发送0xCC。

3.功能操作 

一般是温度变化,即发送0x44。

接着读取温度,即发送0xBE

接着就可以接收温度了,即使用总线接收数据,接收两个字节(两个八进制数),一个为LSB,第二个为LSB;将两者合并转换,就可以得到温度了。

ROM与功能指令表:

简单代码编写:

初始化代码
int tem_init(void)
{
	P3_7=1;  //传感器对应GPIO置高
	P3_7=0;
	delay(480); //延时函数延时480us,自己编写
	P3_7=1;
	delay(40);
}

直接读取引脚上的电平,如:int a=P3_7;

若值为0,则初始化成功;

设置功能

首先编写主机(单片机)向从机(DS18B20)发送消息的代码

发送一个bit

int sendbit(unsigned char bit)
{
    P3_7=1;
    P3_7=0;
    if(bit==0)
    {
    delay(100);
    }
    else if(bit==1)
    {
    delay(10);
    }
}

发送一个字节

int sendbyte(int byte)
{
    unsigned char i=0;
    for(i;i<8;i++)
    {
    sendbit(byte&(0x01<<i));
    }
}

根据功能表发送所需功能

sendbyte(0xCC);//跳过ROM
sendbyte(0x44);//变化温度
接收信号

首先接收一个bit

int recvbit(void)
{
    int a;
    P3_7=1;
    P3_7=0;
    delay(14);
    a=P3_7;
    delay(45);//凑出60us,因为一帧数据的收发至少60us
    return a;
}

接收一位数据

int recvbyte()
{
    int i,byte=0;
    for(i=0;i<8;i++)
    {
        	if(Recvbit())
            {
			byte |= 0x01<<i;
		    }
    }
return byte;
}

读取并处理温度

sendbyte(0xBE);//设置读取温度的功能
int showtem()
{
int LSB,MSB,tem;
LSB=recvbyte();
MSB=recvbyte();
tem = (MSB<<8) | LSB;
tem=tem/16.0;//右移,得到10进制温度
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值