嵌入式学习4——硬件
ds18b20温度传感器的使用
一、传感器分类:
- 数字温度传感器,实现简单,不需要额外转换电路,采集过来的就是数字温度值
- 模拟温度传感器->热敏电阻->AD转换电路->数字值
二、传感器接口:
- GPIO接口:(ds18b20是特殊的单线GPIO接口)
- I2C接口:SCLSDAVCCGND
- SPI接口:SCLK、CS.MOSL、MISO
- ADC接口:板子ADC进行模数转换
- UART接口:GPS
三、ds18b20的主从通信方式
ds18b20的封装形式:
在51上,与dq数据请求线相连接的网络接口是P37,P37通过上拉电阻与VCC相连,说明引脚在空闲状态下处于高电平。
四、ds18b20的通信流程:
复位信号:51单片机复位,问ds18b20在不在
存在信号:“ds18b20"回复一个存在脉冲
每次和ds18b20通信前:必须要复位
1复位or存在、读、写时序图
2(复位函数、读函数、写函数)
#include <reg51.h>
#include "delay.h"//51 单片机复位后 所有特殊功能寄存器都被硬件清 0#define DQ_HIGH (P3 |= (1 << 7))//将DQ引脚拉高
#define DQ_DOWN (P3 &= ~(1 << 7))//将DQ引脚拉低
#define DQ_CHECK ((P3 & (1 << 7)) != 0)//检测DQ引脚电平 P37高电平输出1 低电平输出0//ds18b20复位函数
int de18b20_Reset(void)
{int t = 0;DQ_DOWN; //将引脚拉低Delay10us(70);// 延时70usDQ_HIGH; //将引脚拉高Delay10us(5);// 延时60us//在300us内检测DQ引脚是否被拉低(跳出循环),如果被拉低代表ds18b20回复了一个存在脉冲信号while(DQ_CHECK && t < 30){Delay10us(1);t++;}if(t >= 30){return 0;}//在300us内检测DQ引脚是否被拉高(跳出循环),如果被拉低代表ds18b20回复了一个存在脉冲信号while(!DQ_CHECK && t < 30){Delay10us(1);t++;}if(t >= 30){return 0;}return 1;
}//向ds18b20发送一个字节数据
void write_ds18b20(unsigned char dat)
{int i = 0;//判断发送的数据的8bit是1还是0for(i = 0;i < 8;i++){if(dat & 1 == 1) //bit 1{DQ_DOWN;_nop_();_nop_();//空转延迟1us左右DQ_HIGH;Delay10us(5);}else //bit 0{DQ_DOWN;Delay10us(5);DQ_HIGH;}dat = dat >> 1;//dat右移 始终把要发送的bit放置在最低位 和1比较}
}//从ds18b20读取一个字节数据
unsigned char read_ds18b20(void)
{int i = 0;unsigned char ret = 0;for (i = 0; i < 8;i++){DQ_DOWN;_nop_();_nop_();DQ_HIGH; //拉高才能检测到ds18b20发送了0 _nop_();_nop_();_nop_();if (DQ_CHECK) // 检测到发送的电平为1 代表发送数字1{ret = ret|(1 << i); //把发过来的为1的数字放到指定位置} //发送了0不用管 ret初始化全为0;Delay10us(5);}return ret;
}
3 ds18b20获取数据流程
- (1)复位
- (2)51单片机发送0xCC,代表跳过ROM
- (3)51单片机发送0x44,代表ds18b20开启温度转换
- (4)延时等待(1s)
- (5)复位
- (6)51单片机发送0xCC,代表跳过ROM
- (7)51单片机发送0xBE,代表读取ds18b20发送过来的温度值
- (8)读取温度数据
//获取ds18n20采集到的温度 传递的是两个字节的数据
float get_tempt(void)
{short ret = 0; //两个字节unsigned char tl = 0;//一个字节unsigned char th = 0;//一个字节de18b20_Reset();write_ds18b20(0xCC);write_ds18b20(0x44);Delay1ms(1000);//延时1sde18b20_Reset();write_ds18b20(0xCC);write_ds18b20(0xBE);//先读低位tl = read_ds18b20(); th = read_ds18b20();ret = th << 8; //先把高位放进来ret |= tl; //再把低位放到高位后面接着return ret * 0.0625;//分辨率 展示的是温度
}
4分辨率:ds18b20:
- 9位分辨率:精度±0.5℃
- 10位分辨率:精度±0.25°℃
- 11位分辨率:精度±0.125℃
- 12位分辨率:精度±0.0625℃