[资料分享] LPC1114采集温度传感器DS18B20程序

灞波儿奔   2019-3-9 20:55 楼主
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=tempH;
                Temperature<<=8;
                Temperature+=tempL;
           if(wenduqk) Temperature= Temperature; //返回温度值
           else  Temperature= -Temperature;
         }
                 //冒泡法排序
    for (i=0; i<9;i++)
        {
                for(j=i+1;j<=9;j++)
                {               
                        if(Temperature>Temperature[j])
                        {
                                T1=Temperature;
                                Temperature=Temperature[j];
                                Temperature=T1;               
                        }
                }               
        }
        
        T=0;
        for(i=0;i<6;i++)
        {
                T=T+Temperature[2+i];
        }         
        T=T*(0.625)/6;                              


}


回复评论 (2)

谢谢分享!可以做一些小东西出来
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
点赞  2019-3-9 21:13

挺不错,支持。也可以选用DS18B20成品检测模块LCT2662M或者仪表LCT2201C

 

 

北京长信物联科技有限公司 专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。 www.lct2000.cn QQ:1930227091
点赞  2019-7-10 11:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复