×
单片机 > 单片机程序设计 > 详情

LPC1114采集温度传感器DS18B20程序

发布时间:2020-06-04 发布时间:
|

Temperature.h文件

#ifndef _TEMPERATURE_H_

#define _TEMPERATURE_H_

#include "lpc11xx.h"


#define DQ_H    (LPC_GPIO0->DATA |= (1<<2))

#define DQ_L    (LPC_GPIO0->DATA &=~(1<<2))

#define DQ_IN   (LPC_GPIO0->DIR&=~(1<<2))

#define DQ_OUT  (LPC_GPIO0->DIR|=(1<<2))

#define DQ_DATE ((LPC_GPIO0->DATA&0x4)>>2^1)




//DS18B20 ROM 命令宏定义

#define ReadRom 0x33

#define MatchRom 0x55

#define Skip_ROM 0xcc  //跳过ROM

#define SearchRom 0xf0

#define AlertSearch 0xec

#define CopyScratchpad 0x48

#define SkipRom 0xcc

#define ReadPower 0xb4

//DS18B20 功能命令宏定义

#define ConvertTemperature 0x44

#define ReadScratchpad 0xbe

#define WriteScratchpad 0x4e

#define RecallE 0xb8

extern unsigned char DS18B20_Init(void);

#endif


Temperature.c文件#include "temperature.h"#include "lpc11xx.h"

#include "timer.h"

extern uint16_t T;

extern unsigned char tempH,tempL,wenduqk;


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

* 名称: unsigned char DS18B20_Init(void)

* 功能:对DS18B20 进行初始化

* 入口参数:

* 出口参数:

* 说明:

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

unsigned char DS18B20_Init(void)

{

        unsigned char result;

        DQ_OUT;

        DQ_L;

        Delay_Us(600); // 总线拉低480us~960us ,即主机发送复位脉冲

        DQ_H;

        DQ_IN; // 总线设为输入状态,等待18b20 应答

        Delay_Us(60);

        result=DQ_DATE; // 读取18b20 应答信号

//        Send_TO_DWIN(0x00,result,2);

        Delay_Us(500); // 等待480us 以上,保证总线释放

        return(result); // 返回0 则初始化成功

}



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

* 名称: unsigned char DS18B20_ReadBit(void)

* 功能:从DS18B20 单总线上读1Bit 数

* 入口参数:

* 出口参数:

* 说明:

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

unsigned char DS18B20_ReadBit(void)

{

        unsigned char result;

        DQ_OUT; // 设置总线为输出状态

        DQ_L; // 总线拉低,产生读起始信号

        Delay_Us(2); // 保证低电平在1us 以上

        //要在15us 内读取总线上数据

        DQ_IN;

        Delay_Us(3);  // 这个延时很重要,没有这个延时,读不出18B20的数据

        result=DQ_DATE; // 接收数据

        Delay_Us(60); // 延时60us,保证总线释放

        return(result); // 返回数据

}



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

* 名称: void DS18B20_WriteBit(unsigned char Data)

* 功能:给DS18B20 单总线上写1Bit 数

* 入口参数:

* 出口参数:

* 说明:

****************************************************************************/void

DS18B20_WriteBit(unsigned char Data)

{

        DQ_OUT; // 设置总线为输出

        DQ_L; // 产生写起始信号

        Delay_Us(10); //15us 后写入数据

        if(Data) DQ_H;

        else DQ_L;

        Delay_Us(80); // 延时60us~120us ,保证总线释放

        DQ_IN; // 空闲状态总线保持输入状态

}


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

* 名称: unsigned char DS18B20_ReadByte(void)

* 功能:从DS18B20 单总线上读1Byte 数

* 入口参数:

* 出口参数:

* 说明:

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

unsigned char DS18B20_ReadByte(void)

{

        unsigned char i,result=0;

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

        {

        result>>=1;

//        if(DS18B20_ReadBit()) result|=0x80;          // 设为上拉电阻,当读取值为0时,实际上总线为高电平,所以要反过来

//        else result&=0x7f;

        if(DS18B20_ReadBit()) result&=0x7f;

        else result|=0x80;

        }

        return(result);

}



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

* 名称: void DS18B20_WriteByte(unsigned char Data)

* 功能:给DS18B20 单总线上写1Byte 数

* 入口参数:

* 出口参数:

* 说明:

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

void DS18B20_WriteByte(unsigned char Data)

{

        unsigned char i;

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

        {

                DS18B20_WriteBit(Data&0x01);

                Data>>=1;

    }

}



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

* 名称: void DS18B20_ReadTemp(void)

* 功能:从DS18B20 上读取温度值

* 入口参数:

* 出口参数:

* 说明:

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

void DS18B20_ReadTemp(void)

{

        unsigned char i,j;

        uint16_t Temperature[10],T1;

    DS18B20_Init();

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

        {        

                DS18B20_WriteByte(SkipRom);

                DS18B20_WriteByte(ConvertTemperature);

        //        Delay_Ms(600); // 按照要求延时1s 左右,但是不延时也可以,还未找到原因

                DS18B20_Init();

                DS18B20_WriteByte(SkipRom);

                DS18B20_WriteByte(ReadScratchpad);

                tempL=DS18B20_ReadByte(); // 读温度低字节

                tempH=DS18B20_ReadByte(); // 读温度高字节

        

                // 未考虑温度为负情况

        //        Temperature=tempH;

        //        Temperature<<=8;

        //        Temperature+=tempL;

        //        Temperature=0.625*Temperature;

                // 考虑温度为负情况

        

                if(tempH>7)//(TH>xxxxx111)温度为负

           {

               tempH=~tempH;tempL=~tempL;

               wenduqk=0; 

           }

           else  wenduqk=1;//温度为正

            Temperature[i]=tempH;

                Temperature[i]<<=8;

                Temperature[i]+=tempL;

           if(wenduqk) Temperature[i]= Temperature[i]; //返回温度值

           else  Temperature[i]= -Temperature[i];

         }

                 //冒泡法排序

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

        {

                for(j=i+1;j<=9;j++)

                {                

                        if(Temperature[i]>Temperature[j])

                        {

                                T1=Temperature[i];

                                Temperature[i]=Temperature[j];

                                Temperature[i]=T1;                

                        }

                }                

        }

        

        T=0;

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

        {

                T=T+Temperature[2+i];

        }         

        T=T*(0.625)/6;                               


}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计