LPC213x ARM板子的DS18B20温度传感器模块添加

发布者:名字太长了吗最新更新时间:2020-02-29 来源: eefocus关键字:LPC213x  ARM板子  DS18B20  温度传感器 手机看文章 扫描二维码
随时随地手机看文章

老大临时给了一个任务,给了我一块LPC213x的板子,叫我加上DS18B20温度传感器。本人之前是写上层应用程序的,


对ARM是一窍不通的。没办法啊,硬着头皮上。调了好几天,终于调完了,先上一个热腾腾的截图:

看到的“18 4B”的十六制数据就是从温度传感器的寄存器中读出来的数值。


有关DS18B20的一些中英资料,我会在文章的末尾贴出。好了,我们开始吧。


1、关于DS18B20的简单介绍


DS18B20 温度读取函数参考步骤:


(1)DS18B20 开始转换:


1.DS18B20 复位。


2.写入跳过ROM 的字节命令,0xCC。


3.写入开始转换的功能命令,0x44。


4.延迟大约750~900 毫秒


(2)DS18B20 读暂存数据:


1.DS18B20 复位。


2.写入跳过ROM 的字节命令,0xCC。


3.写入读暂存的功能命令,0xee。


4.读入第0 个字节LS Byte,转换结果的低八位。


5.读入第1 个字节MS Byte,转换结果的高八位。


6.DS18B20 复位,表示读取暂存结束。


(3)数据求出十六进制:


1.整合LS Byte 和MS Byte 的数据


2.判断符号,得到整数部分


3.得到小数部分


另外,还有最重要的时序,比如复位、读、写时序。我夹着代码尽量说清楚吧,一个一个来。


2、DS18B20复位


DS18B20 的复位时序如下:


1.单片机拉低总线480us~950us, 然后释放总线(拉高电平)。


2.这时DS18B20 会拉低信号,大约60~240us 表示应答。


3.DS18B20 拉低电平的60~240us 之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。


4.DS18B20 拉低电平60~240us 之后,会释放总线。

我的LPC213x的板子(这里我不得不多说几句,对于小白程序员像我一样,一定要注意不同板子,指令是不同,所以代码不能随意copy,这样是不行的)相应复位的代码如下:


//DS18B20复位函数

void  DS18B20_Reset()

{

//IO0CLR   // out 0

//IO0SET   // out 1

//IO0DIR //方向

//IO0PIN  //read IO status  0/1

IO0DIR|=DQ; //DQ 为输出状态

IO0CLR|=DQ; //输出低电平

Delay_1us(600); //延迟600 微秒

IO0SET|=DQ; //释放总线,拉高电平

Delay_1us(30); //延迟30 微秒

IO0DIR|=DQ; //DQ 位输出状态

Delay_1us(240); //延迟240 微秒

if((IO0PIN&DQ) != 0){ //等待从机DS18B20 应答(低电平有效)

IO0SET|=DQ;//释放总线

}

}

代码注释很详细了,我这里就不多说了。


3、写时序


DS18B20写逻辑 0 的步骤如下:


(1)单片机拉低电平大约10~15us


(2)单片机持续拉低电平大约20~45us的时间


(3)释放总线


DS18B20写逻辑 1 的步骤如下:


(1)单片机拉低电平大约10~15us


(2)单片机持续拉高电平大约20~45us的时间


(3)释放总线

相应的代码:


//DS18B20 写字节函数

void DS18B20_Write(unsigned char Data)

{

unsigned char i;

IO0DIR|=DQ; //DQ 为输出

for(i=0;i<8;i++)

{

IO0CLR|=DQ; //拉低总线

Delay_1us(10); //延迟10微秒(最大15 微秒)

if(Data&0x01)

IO0SET|=DQ;

else 

IO0CLR|=DQ;

Delay_1us(40); //延迟40 微秒

IO0SET|=DQ; //释放总线

Delay_1us(1); //稍微延迟

Data>>=1;

}

}


4、读时序


DS18B20 读逻辑0 的步骤如下:

1.在读取的时候单片机拉低电平大约1us

2.单片机释放总线,然后读取总线电平。

3.这时候DS18B20 会拉低电平。

4.读取电平过后,延迟大约40~45 微秒


DS18B20 读逻辑1 的步骤如下:

1.在读取的时候单片机拉低电平大约1us

2.单片机释放总线,然后读取总线电平。

3.这时候DS18B20 会拉高电平。

4.读取电平过后,延迟大约40~45 微秒

相应的代码如下:


//DS18B20 读字节函数

unsigned char DS18B20_Read()

{

unsigned char i,Data;

for(i=0;i<8;i++)

{

Data>>=1; //数据右移

IO0DIR|=DQ; //DQ 为输出状态

IO0CLR|=DQ; //拉低总线,启动输入

Delay_1us(1);

IO0SET|=DQ; //释放总线

IO0DIR&=(~DQ); //DQ 为输入状态

if(IO0PIN&DQ) 

Data|=0x80;

Delay_1us(45); //延迟45 微秒

}

return Data;

}



5、真正的读取温度的总函数


/***************  读温度函数*******************

数据例子:

Tem[0]=0x1a,Tem[1]=0x32,则为正26.50摄氏度

Tem[0]=0xb7,Tem[1]=0x4b,则为负55.75摄氏度

*****************************************************/

void  Read_Temperature(unsigned char *Tem)

{

unsigned int Temp1,Temp2;

DS18B20_Reset(); //DS18B20 复位

DS18B20_Write(0xCC); //跳过ROM

DS18B20_Write(0x44); //温度转换

DS18B20_Reset(); //DS18B20 复位

DS18B20_Write(0xCC); //跳过ROM

DS18B20_Write(0xBE); //读取RAM

Temp1=DS18B20_Read(); //读低八位,LS Byte, RAM0

Temp2=DS18B20_Read(); //读高八位,MS Byte, RAM1

DS18B20_Reset(); //DS18B20 复位,表示读取结束

 

Convert_Data(Tem,Temp1,Temp2);//例如:Tem[0]=0x19,Tem[1]=0x00, 温度值为25.00度

}


到这差不多就做完了,Temp1和Temp2就是读出寄存器中的数值。可能你也注意了Convert_Data函数,这个跟我们项目没有多大关系,主要功能就是把读到的两个字节转化成我们可读的十六进制,原因你看了资料手册就很清楚这个的重要性了。直接上代码吧,这里仅仅做为一个转换的参考。

/******************************************************************************

 把从温度传感器寄存器中16bit的数据转化为char[]保存;

  temp_str 为保存目的数组, temp1为低位寄存器数据,temp2为高位数据;

  

  将读到的整数部分(包括符号位,最高位为1是负,为0是正)  存于temp_str[0] 中;

  将读到的(2 位)小数部分(不包括小数点)存于temp_str[1] 中;

  

  转换误差0.25 摄氏度左右;

*******************************************************************************/

void Convert_Data(unsigned char *temp_str,unsigned int temp1,unsigned int temp2)

{

 

unsigned int   Temp;

unsigned int Integer_tem;//保存整数部分

unsigned int Decimal_tem;//保存小数部分

/*判断符号位*/

if(temp2 & 0xF8){ //为负数

Temp = ((temp2<<8)|temp1); //高8位和低8位合并

Temp = ((~Temp)+1);//取反加1

Temp = (Temp & 0x0000ffff);//将32位的前16位复原

 

/* 得到整数部分*/

Integer_tem = Temp;

Integer_tem = (Integer_tem & 0x000007F0);//得到7位整数

Integer_tem = (Integer_tem | 0x00000800);//将最高位置1(为负)

Integer_tem = (Integer_tem>>4);              //得到8位数

 

/* 得到小数部分*/

Decimal_tem = Temp;

Decimal_tem = (Decimal_tem & 0x0000000c);// 得到两位小数

if(Decimal_tem == 0x00000000){//小数为 0.00

Decimal_tem = 0x00;

}else if (Decimal_tem == 0x00000004 ){//小数为 0.25

Decimal_tem = 0x19;

}else if (Decimal_tem == 0x00000008 ){//小数为0 .50

Decimal_tem = 0x32;

}if (Decimal_tem == 0x0000000c ){//小数0 .75

Decimal_tem = 0x4B;

}

}else{              //为正数

Temp = ((temp2<<8)|temp1); //高8位和低8位合并

/* 得到整数部分*/

Integer_tem = Temp;

Integer_tem = (Integer_tem & 0x000007F0);//得到7位整数

Integer_tem = (Integer_tem & 0xFFFFF7FF);//将最高位置0(为正)

Integer_tem = (Integer_tem>>4);              //得到8位数

 

/* 得到小数部分*/

Decimal_tem = Temp;

Decimal_tem = (Decimal_tem & 0x0000000c);// 得到两位小数

if(Decimal_tem == 0x00000000){//小数为 0.00

Decimal_tem = 0x00;

}else if (Decimal_tem == 0x00000004 ){//小数为 0.25

Decimal_tem = 0x19;

}else if (Decimal_tem == 0x00000008 ){//小数为0 .50

Decimal_tem = 0x32;

}if (Decimal_tem == 0x0000000c ){//小数0 .75

Decimal_tem = 0x4B;

}

}

 

temp_str[0] = Integer_tem;//将整数部分存于第1个元素中

temp_str[1] = Decimal_tem;//将小数部分存于第2个元素中

}


另外再加上一些头文件,这是自己定义的,对你们一点作用都没有。要把引脚宏定义好,因为你只能联接DS18B20的引脚操作。

//DS18B20 DQ 引脚对应的链接,为P0.23

#define   DQ    ANT4_LED    //(1<<23)

/*延迟1微秒时间函数*/

void Delay_1us(unsigned int  iTime)

{

    unsigned int i,j ;

    for(i=0;i     {

        for(j=0;j<10;j++);

    }

}


再多说很重要的两句,这个Delay_1us函数得自己用示波器把这个时间调在误差范围之内,因为ARM 嵌入式机器对时序要求很高。

关键字:LPC213x  ARM板子  DS18B20  温度传感器 引用地址:LPC213x ARM板子的DS18B20温度传感器模块添加

上一篇:s3c2440之IIS(2)I2S音频总线学习-数字音频技术
下一篇:s3c2440之IIS(3)I2S总线协议

推荐阅读最新更新时间:2024-11-18 16:53

DS18B20与数码管程序
#include reg51.h #define uint unsigned int #define uchar unsigned char sbit DQ=P2^0;//P2^0 uchar code tab ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//不带小数点 uchar code tab1 ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点 sbit wei0=P0^0;//P3^2 sbit wei1=P0^1;//P3^3 //sbit wei2=P1^2; //sbit wei3=P1
[单片机]
基于ds18b20温度传感器的51单片C语言程序
基于ds18b20温度传感器的51单片C语言程序 #include REG51.H #define uchar unsigned char #define uint unsigned int sbit DQ=P1^1; uchar code SEG7 ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar tplsb,tpmsb; /*延时tms*/ void delay(uint t) { uint i; while(t--) { for (i=0;i 125;i++) {;} } } /* 产生复位脉冲初始化DS18B20
[单片机]
欧姆龙高精度16x16单元型非接触式温度传感器
近期,根据欧姆龙株式会社宣布,欧姆龙已完成世界首次应用晶圆级真空封装技术的红外线传感器的研发,成功开发了具有90度广视野范围并可实现高精度区域温度检测的16x16单元型非接触式温度传感器,并拟于2013年10月开始出售样品。         由于普遍用于人感传感器的热电传感器无法检测静止不动的人物,所以难以检测人数及人物所处位置。鉴于这种情况,欧姆龙开发了能够检测静止人物,具有90度广视野范围并可实现高精度区域温度检测,用于人感传感器的16×16单元型MEMS非接触式温度传感器。   MEMS非接触式温度传感器通过应用MEMS技术的热电堆将对象物体发出的红外线能源变为热能,并通过两种金属接点之间温差所形成的热电动势测量温度
[模拟电子]
欧姆龙高精度16x16单元型非接触式<font color='red'>温度</font><font color='red'>传感器</font>
DS18B20数字温度计设计与分析
1.DS18B20基本知识   DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点   (1)、只要求一个端口即可实现通信。   (2)、在DS18B20中的每个器件上都有独一无二的序列号。   (3)、实际应用中不需要外部任何元器件即可实现测温。   (4)、测量温度范围在-55。C到+125。C之间。   (5)、数字温度计的分辨率用户可以从9位到12位选择。   (6)、内部有温度上、下限告警设置。 2、DS18B20的引脚介绍   TO-9
[单片机]
<font color='red'>DS18B20</font>数字<font color='red'>温度</font>计设计与分析
基于单片机和CDMA的车载温控系统
  该系统利用GSM远程通信系统控制车内空调等器械运作。用户通过短信形式达到人机互动,克服红外线、无线等远程控制距离短的问题,还可以实现实时监控汽车的状态,为车主提供便利。   1 系统原理与结构   1.1 系统功能介绍   本系统能以10次/s的速度自动采集现场的环境温度和光照强度、采集空调和窗帘的开闭状态,并通过LCD液晶屏实时地显示出来。温度的感应范围-55~+125℃,精度为±0.5℃。光强的强度范围分为强、较强、中、较弱、弱5档。空调和窗帘的状态为开或者关。   用户可以通过手机或者小灵通等终端与GSM模块连接的系统之间进行无线通信,通信范围为移动网络覆盖的所有范围,做到了真正的通信范围无穷大。具体的通信为:
[单片机]
基于单片机和CDMA的车载温控系统
国家半导体开发出微细化、高精度的温度传感器
荷兰代尔夫特理工大学(TU Delft)教授Kofi Makinwa等的研究小组在2010年2月8日起举办的半导体国际会议“ISSCC”上宣布,开发出了不用修正即可实现±0.2℃精度的温度传感器(演讲序号:17.4,温度范围为-55℃~125℃)。温度传感器由该大学与大型半导体温度传感器厂商美国国家半导体(National Semiconductor)共同开发而成,采用0.18μm的CMOS技术制造。   TU Delft主要从事温度传感器的研究工作,此前主要研发普通的带隙型温度传感器,此次的产品为利用硅底板热扩散系数(thermal-diffusivity)的温度传感器。TU Delft在08年的ISSCC上发表过相同原
[传感器]
单片机DS18B20温度检测LCD1602显示程序+电路PCB设计
制作出来的实物图如下: Altium Designer画的原理图和PCB图如下: 单片机源程序如下: /*********************************************** 该程序为温度测量 用到DS18B20、LCD1602 备注:程序的许多地方也是理解了他人的程序才写出来的如果有理解错误、书写错误的地方望大家留言指导 ********************************
[单片机]
单片机<font color='red'>DS18B20</font><font color='red'>温度</font>检测LCD1602显示程序+电路PCB设计
STC15F2K60S2读取DS18B20温度串口显示
//************************** //程序说明:stc15f2k60s2采集ds18b20温度数据,并从串口输出 //为方便大家调试,特附该程序的项目下载地址: //采用的是22.1184M晶振 //************************** #include stc15fxxxx.h //调用stc15f系列头文件,下载地址: http://pan.baidu.com/s/1eRUbjLS //IO口声明 #define ds18b20_io P20 //P2.0口作为数据读取接口 //常量声明 #define MAIN_Fosc 22118400L //主时钟
[单片机]
STC15F2K60S2读取<font color='red'>DS18B20</font><font color='red'>温度</font>串口显示
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved