阅读本文之前请先找到DS18B20的中文手册

DS18B20数据手册-中文版 - 知乎 (zhihu.com)

下面先对DS18B20简单进行一些介绍:

学校课程设计中常见的DS18B20的引脚一般为3脚封装,如下图左侧所示:

可以看到,DS18B20的引脚为GND,DQ,VDD。其中GND与VDD的引脚分别接地线和电源就好了,而DQ线是主要的数据传输口,它可以接在P1-P6端口的引脚上,因为数据传输主要靠拉高或者拉低电平,再由单片机判断高低电平,所以接哪个口都可以。

DS18B20测量完温度后会将数据存在温度寄存器中,储存的格式如下:

可以看到,高五位是S,即SIGN,符号位,而低11位用来储存数据,DS18B20的精度逐渐调低时,由BIT0到高位会逐渐未定义(即BIT0未定义时,精度会下降,精度再下降的话,就是BIT1未定义,因为BIT0-BIT3负责记录小数点后的数据)。这里需要注意的是,温度寄存器的数据同样在DS18B20的ScratchPad中,关于ScratchPad是什么,接下来我会详细讲解。

 DS18B20的具体操作:

DS18B20存储温度数据时是分两位字节存储的,两字节16位数据中,高五位为符号位,低十一位为数据位。因此,读取DS18B20的数据需要连续进行两次读一字节的操作,先读低八位,后读高八位。在发送读ScratchPad指令后,传感器会由低到高传送共9字节的数据,我们只需要读取两字节即可读出数据。ScratchPad中默认的字节顺序如下:

(此处可以看到ScratchPad其实就是一个存数据的寄存器,我们需要的数据就在它的BYTE0与BYTE1那里)

而访问DS18B20的事件序列如下所示:

第一步:初始化

第二步:ROM命令(紧跟任何数据交换请求)

第三步:DS18B20功能命令(紧跟任何数据交换请求)

每次对DS18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则DS18B20将不会响应。因此,实现温度转换的具体步骤即为:初始化、发送跳过ROM命令、发送温度转换命令、再次初始化、再次发送跳过ROM命令、读取ScratchPad中头两个字节的数据。(此处可以跳过ROM是因为只有一个传感器,无需通过DS18B20本身的编码来确定是哪个传感器,如果有多个传感器连接在单片机上,则跳过命令会使传回的数据发生错误。)

通过以上步骤,即可实现对DS18B20的初始化以及开始温度转换,并最终返回存储在ScratchPad中的温度转换后的数据。而此数据在经过函数转化后,便会被存在数组中,之后在LCD上进行输出。

代码部分如下:
//MAKER: JK2001 ZHZ
#include <MSP430.h>
#include<LCD1602.h>
#define uchar unsigned char
#define uint unsigned int
uchar tem[16]={"The temp is"};
//此部分为时钟的初始化,DS18B20需要极为精确的微秒操作
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define DQ0 P2OUT &=~BIT6                //此处定义了DS18B20的端口
#define DQ1 P2OUT |= BIT6
unsigned int value;
uint Init_18B20(){  //18B20初始化P2DIR |= BIT6;uint i = 9;DQ1;             //先上拉电平打断初始化之前的操作DQ0;             //拉低电平等待响应delay_us(500);DQ1;P2DIR &= ~BIT6;delay_us(80);  if(P2IN & BIT6){i=1;P2DIR|=BIT6;} else{i=0;P2DIR|=BIT6;} //如果是低电平,则初始化成功delay_us(300);return i;}
void send_byte(uchar cmd){  //发送一个字节的命令uint num=0;for(num=0;num<8;num++){  //进行循环以发送每一位的数据P2DIR |= BIT6;DQ0;delay_us(8);if(cmd & 0x01){DQ1;}delay_us(60);DQ1;cmd >>= 1;}
}
uchar read_byte(void){   //读取一个字节uint i;uchar data=0;for(i=0;i<8;i++){data>>=1;         //右移,读取下一位DQ0;delay_us(5);DQ1;      delay_us(8);P2DIR &= ~BIT6;_NOP();if(P2IN & BIT6){data|=0x80;} delay_us(50);P2DIR |= BIT6;DQ1;delay_us(10);}return data;
}
uint read_temp(void){     //读取操作进行两次并将结果合并uint low=0;uint high=0;uint temp = 0;low = read_byte();high= read_byte();temp = (high*256) | low; return temp;
}
void skip(void){         //向18B20发送跳过ROM命令send_byte(0xcc);}
void zh(void){send_byte(0x44);      //温度转换命令}
void read_sp(void){      //读取ScratchPad命令send_byte(0xbe);}
uint do1zh(void){        //做一次转换uchar i=0; do{i = Init_18B20();}   //初始化while(i);skip();                 //跳过ROMzh();                   //转换delay_ms(800);          //转换时延时,12位精度最少需要750msdo{i = Init_18B20();}   //初始化while(i);skip();                 //跳过ROM命令read_sp();              //读取数据 return read_byte();     //返回数据
}
uchar dN[6]={"000000"};     //初始化dN数组
void Disp_Numb(uint temper){       //通过温度转换函数转换数据uchar i;    for(i = 0;i < 6;i++) dN[i] = 0; //初始化显示变量if(temper & BIT0) {dN[0] = 5;dN[1] = 2;dN[2] = 6;} //0.0625if(temper&BIT1)     {dN[1] += 5;dN[2] += 2;dN[3] += 1;} //0.125if(temper & BIT2)        //0.25
{
dN[2] += 5;dN[3] += 2;if(dN[2] >= 10){dN[2] -= 10;dN[3] += 1;}}if(temper & BIT3)       //0.5{dN[3] += 5;}if(temper & BIT4){dN[4] += 1;}if(temper & BIT5)     {dN[4] += 2;}if(temper & BIT6){dN[4] += 4;}if(temper & BIT7)     {dN[4] += 8;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper& BIT8){dN[4] += 6;dN[5] += 1;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & ~BIT9){dN[4] += 2;dN[5] += 3;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}}if(temper & ~BITA){dN[4] += 4;dN[5] += 6;if(dN[4] >= 10){dN[4] -= 10;dN[5] += 1;}if(dN[5] >= 10){dN[5] -= 10;}
}
}
//此处的主函数实现的主要功能是将测试温度显示在LCD上
int main (void){ WDTCTL = WDTPW + WDTHOLD;P2DIR |= BIT6;P2OUT |= BIT6;Port_init();LCD_init();LCD_Desk();LCD_Write_str(0,0,tem);  //输出temp is,此处和下处调用了头文件while (1){  Disp_Numb(do1zh());   LCD_Write_char(0x09,1,dN[5]+0x30);   //0X30是ASCII码转换LCD_Write_char(0x0a,1,dN[4]+0x30);LCD_Write_char(0x0b,1,0x2e);       //0x2e是小数点的ASCII码值LCD_Write_char(0x0c,1,dN[3]+0x30);LCD_Write_char(0x0d,1,dN[2]+0x30);LCD_Write_char(0x0e,1,dN[1]+0x30);LCD_Write_char(0x0f,1,dN[0]+0x30);}}

以上代码除了DS18B20本身的代码外,其余部分使用了LCD1602的头文件,这个并不难,所以不再赘述,有必要说明的是,DS18B20的各种操作可以参照51单片机关于DS18B20的操作,这里给出的是我自己基于MSP430修改的版本。

此版本代码是确认无误的,如果有问题,那反正不是我的问题

温度传感器DS18B20的相关介绍以及基于MSP430的驱动程序(附代码)相关推荐

  1. Python实例介绍正则化贪心森林算法(附代码)

    作者:Ankit Chaoudhary 翻译:笪洁琼 校对:梁傅淇 本文共3515字,建议阅读7分钟. 通过本文与大家讨论一个被称为正则化的贪心森林算法. 引言 作为一名参与多个机器学习竞赛数据科学家 ...

  2. python正则化调优_Python实例介绍正则化贪心森林算法(附代码)

    作者:Ankit Chaoudhary 翻译:笪洁琼 校对:梁傅淇本文共3515字,建议阅读7分钟. 通过本文与大家讨论一个被称为正则化的贪心森林算法. 引言 作为一名参与多个机器学习竞赛数据科学家, ...

  3. 光流 | OpenCV中的Lucas-Kanade光流与稠密光流:基于Opencv+Python(附代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  4. 计算机视觉与深度学习 | ORB特征提取:基于OpenCV+Python(附代码)

    ===================================================== github:https://github.com/MichaelBeechan CSDN: ...

  5. 简单实用的基于python的OCR中文字符识别——基于windows平台(附代码)

    1. 基本环境 操作系统:win7 64位系统 python版本:3.6 2.安装配套环境 (1)首先安装OCR字符识别库Tesseract    下载网址:https://digi.bib.uni- ...

  6. python 蓝牙开发_基于python实现蓝牙通信代码实例

    这篇文章主要介绍了基于python实现蓝牙通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装和示例 linux下安装 sudo apt ...

  7. python写安卓app控制蓝牙_基于python实现蓝牙通信代码实例

    这篇文章主要介绍了基于python实现蓝牙通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装和示例 linux下安装 sudo apt ...

  8. 基于python3写的源码剖析_基于python3生成标签云代码解析

    这篇文章主要介绍了基于python3生成标签云代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 标签云是现在大数据里面最喜欢使用的一种展现方式 ...

  9. 基于AT89C51/52和DS18B20的温度传感器设计报告(后附代码)

    1 设计的目的 通过理论设计和实物制作解决相应的实际问题,巩固和运用在<微机原理及单片机技术>中所学的理论知识和实验技能,掌握常用模拟电路的一般设计方法,提高设计能力和实践动手能力,为以后 ...

  10. 基于FPGA的SRIO的相关介绍和实现

    SRIO的相关介绍和实现 1.SRIO简介 SRIO是面向嵌入式系统开发提出的高可靠.高性能.基于包交换的新一代高速互联技术,已于2004年被国际标准化组织(ISO)和国际电工协会(IEC)批准为IS ...

最新文章

  1. 武大+CMU最新开源!全面支持平面/鱼眼/球面相机的实时统一线段检测算法
  2. 麻省理工学院的牛人解说数学体系,你到哪个层次了?
  3. PPT 下载 | 神策数据朱静芸:电商行业精细化运营四大场景
  4. python raw_input为什么不能用_热门问题 | 为什么发票不能用订书器只能用胶水?...
  5. 如何使用markdown编辑器?官方文档在此
  6. java双层for循环
  7. (转)公钥,私钥和数字签名这样最好理解
  8. python编程、abc最大值_Python中abc
  9. 5分钟k线数据 存储_短线高效炒股——60分钟K线买卖法,抓住买卖时机,看完受益匪浅!...
  10. 速成pytorch学习——3天自动微分机制
  11. python人工智能算法代码_python人工智能,分类例解
  12. MySQL详细安装教程
  13. PHP 7 vs HHVM 比较—兄弟连IT教育
  14. 国内电影下载网站收集
  15. 计算机安装xp蓝屏怎么办,重装xp系统一直蓝屏重启循环怎么回事
  16. 2021年10年后端开发程序员最新《C/C++Linux 服务器开发》学习路线总结,建议收藏
  17. TableauとSFDCデータ整理
  18. 键盘按键名称及HID扫描码及VK虚拟键码对照表
  19. 创建阿里云服务器并实现疫情地图可视化
  20. 牛客bfs:工厂流水线

热门文章

  1. echart实现地球外环绕卫星效果
  2. Vulkan Pipeline
  3. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学系学位设置
  4. Linux驱动开发——正点原子IMX6ULL核心板ADS1256驱动开发
  5. 遮羞布被撕,业界反思5G的冒进,运营商重视挖掘现有5G网络的潜力
  6. 一款在线Markdown编辑器,Markdown小白神器
  7. 国税服务器反回文件错误,电子税务局常见问题解答电子税务局异常转办(一).pdf...
  8. Unity:简单的蓄力技能的逻辑实现
  9. 安装 OpenCC 简繁体中文转换
  10. Illegal mix of collations