关于51单片机驱动DS18B20代码的感想
首先使用单总线驱动DS18B20有三个步骤
这里我们经常使用的是初始化和功能命令字,对于第二项,是为了区分多个单总线器件使用的,所有我们有时候,就直接选择,跳过ROM Command,这里的意思是写一个跳过的ROM COMMAND,不是直接就不写,因为规定了必须要写
ROM COMMAND
这里就写一个使用到的0xCC,一共有5个,大家可以去看一下文档
FUNCTION COMMAND
这里我们经常使用到的是第一个和第二个
- 第一个进行启动转换,将温度的数据存储到存储器中
- 第二个就是执行读操作,将存储器中的数据进行取出,当然可以读取的数据不止,Byte0和Byte1,也可以将剩下的也读取到。
对于有些寄存器的功能我现在我不是特别清楚,我们最经常使用的寄存器,就是Byte0和Byte1。
其中存放的内容就是对应转换的温度数据
以上图片就是关于Byte0和Byte1的位权,感觉还是很一目了然的。
时序的一些注意事项
初始化时序
- 首先需要将总线进行拉低,维持低电平时间大于480us
- 然后释放总线(也就是将电平拉高),维持时间大于60us
- 然后DS18B20就会产生一个应答信号(将总线进行拉低,维持时间>60us,小于240us)
- 这时候,我们可以进行检测总线上的值,看器件是否被初始化(当然也可以忽略)
写时序
写一时序
- 首先需要先将总线进行拉低,产生一个下降沿
- 然后在15us之内将总线进行拉高
- 然后再维持大于45us的时间
写零时序
- 首先将总线进行拉低,产生一个下降沿
- 然后维持低电平60us时间
对于要写的数据,一定要在写信号之后的15us之内,送到总线上,因为DS18B20是在15-60us之间进行采样的
读时序
- 首先还是将总线进行拉低(大约维持时间1us)
- 然后DS18B20就会将数据送到总线上(只有在15us之内,才能保证数据是有效的)
- 所以我们需要在15us之内将总线上的数据进行取走
下面就是根据时序写的驱动代码
/* *单总线驱动程序*SL: single line *单总线协议是先写入低位数据,再写入高位数据
*/#include"intrins.h"
#include"reg52.h"
sbit DQ = P1^4;void Delay5us() //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 12;while (--i);
}
void Delay20us() //@12.000MHz
{unsigned char i;_nop_();_nop_();i = 57;while (--i);
}void Delay500us() //@12.000MHz
{unsigned char i, j;i = 6;j = 211;do{while (--j);} while (--i);
}//初始化单总线
bit init_onewire()
{bit init_flag = 1;DQ = 1;Delay20us();DQ = 0;Delay500us(); DQ = 1; Delay500us(); //等待DS18B20进行检测init_flag = DQ;return init_flag;
}//向DS18B20写入一个byte的数据
void write_onewire(unsigned char dat)
{unsigned char i;for(i=0; i<8; i++){DQ = 0;DQ = dat & 0x01; Delay20us();Delay20us();DQ = 1; dat >>= 1;}Delay5us();
}unsigned char read_onewire()
{unsigned char example, i;for(i=0; i<8; i++){DQ = 0;example >>=1;DQ = 1; //模拟释放总线 if(DQ)example |= 0x80; Delay20us();Delay20us();}return example;
}
float r_temperature_f( )
{unsigned int temp1 , temp2 ;float temperature ;//init_ds18b20( );init_onewire();//Write_DS18B20( 0xcc );//Write_DS18B20( 0x44 );write_onewire(0xcc);write_onewire(0x44);Delay500us();//init_ds18b20( ) ;init_onewire();//Write_DS18B20( 0xcc ) ;//Write_DS18B20( 0xbe ) ;write_onewire(0xcc);write_onewire(0xbe);temp1 = read_onewire( ) ;temp2 = read_onewire( ) ;temp2 <<= 8 ;temp2 |= temp1 ;temperature = temp2 * 0.0625 ;return temperature ;
}
这其实只是我的个人理解,如果有错误,还请大家指出,欢迎留言
关于51单片机驱动DS18B20代码的感想相关推荐
- 51单片机驱动DS18B20温度传感器测量温度
51单片机驱动DS18B20温度传感器测量温度 1.DS18B20温度传感器介绍: 2.51单片机驱动DS18B20测量温度 1.DS18B20温度传感器介绍: ①引脚定义 引脚 符号 说明 1 GN ...
- K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示
K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...
- 51单片机驱动——LCD1602
51单片机驱动--LCD1602 1.描述 51单片机控制LCD1602屏幕显示测量数据.固定字符串等,大家复制过去可以直接使用,相关注释我已标明. 2.子文件 LCD1602.c #include ...
- 使用51单片机驱动YM12232B型液晶显示屏
这是一个使用51单片机驱动YM12232B 液晶显示器的例子,本人水平有限,仅供参考. 本实例中将使用51单片机控制YM12232B LCD分别在主窗口和副窗口中显示"科"和&qu ...
- 基于51单片机驱动A4988实现步进电机逆时针转动
基于51单片机驱动A4988实现步进电机逆时针转动 一.简介 二.接线 典型接线图 实际接线 三.部分代码 引脚定义 定时器初始化 主函数 四.实验现象 五.注意事项 一.简介 A4988 是一款完全 ...
- 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)
基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...
- 基于51单片机驱动ADXL346 (LCD1602显示)
基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...
- 51单片机驱动AHT10温湿度传感器
51单片机驱动AHT10温湿度传感器 AHT10温湿度传感器 AHT10参数 工作原理 数据转换 驱动 接线 驱动代码 实验结果 AHT10温湿度传感器 AHT10是新一代温湿度传感器,传感器输出经过 ...
- 基于51单片机的DS18B20温度控制加热降温系统设计
基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...
最新文章
- Activity全屏问题
- 企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
- AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次
- Get传递的最大长度
- php manager如何安装目录,宝塔面板安装OneManager-php – Onedrive的列表索引和管理程序...
- 【面向对象】第一单元总结——表达式求导
- Java机器学习库ML之三Sampling(采样)
- c++ 结构体构造函数使用总结 附一道经典模拟题
- html中div不在火狐居中,Firefox嵌套CSS中div标签居中问题解决方法
- sort qsort的区别
- [css] 当拿到一个新的项目,让你对这个项目的css做下架构设计,你该如何下手?
- 科兴生物董事长:两针建立免疫记忆 三针后抗体提升十倍
- asp.net页面事件:顺序与回传
- 常用位操作技巧(Golang)
- Lenovo E46A-Win 7_无线灯亮但无法启动(耽误3天以上您信吗.....)问题: wlan autoconfig 依赖服务或组无法启动...
- 窗体程序计算一元二次方程
- TMS320F28335 和 VS1003B 之间的通信
- 计算机房档案管理,机房档案管理制度
- Wps文档目录页码加小括号?
- Cookies的SameSite属性