⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 多点烟雾,温度探测报警程序 基于MSP430F247,485总线.
💻 C
字号:
//主题:DS18B20程序
//******************************************************************************
#include <msp430x24x.h>

//定义一个位设置,这样可以简化程序编写
#define DQ1 P5OUT|=BIT7		//DQ=1
#define DQ0 P5OUT&=~BIT7	//DQ=0
#define DQIO_OUT P5DIR|=BIT7    //设为输出
#define DQIO_IN  P5DIR &= ~BIT7 //设为输入

#define positive 0x0f           //正温系数

//定义
unsigned char Error = 0;
float   Temper=0.0;		//真正有效温度值
int     temperature=0;		//读取两字节温度数据
unsigned char symbol = 1 ;      //温度正负符号


//******************************************************************************
//功能:us 级别延时
// n=10,则延时10*5+6=56uS
//******************************************************************************
void DelayNus(unsigned int n)
 {
    while(n--){};
 }
//******************************************************************************


//功能:写18B20
//******************************************************************************
void Write_18B20(unsigned char n)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ0;
        _NOP();_NOP();		//延时5us
        _NOP();_NOP();_NOP();
        if((n&0X01)==0X01)      //DQ=1
          DQ1;
        else 
         DQ0;                   //DQ=0     
        n=n>>1;			//下一位
        DelayNus(6);		//延时50us 以上
        DQ1;
    }
}
//******************************************************************************


//功能:读取18B20
//******************************************************************************
unsigned char Read_18B20(void)
{
    unsigned char i;
    unsigned char temp;
    for(i=0;i<8;i++)
    {
        temp=temp>>1;		//移向下一位
        DQ0;			
        _NOP();			//延时1us
        DQ1;
        _NOP();_NOP();		//延时5us
        _NOP();     
        
        DQIO_IN;		//DQ口设为输入
      if((P5IN&BIT7)==0)	//DQ是否等于0
          {
            temp=temp&0x7F;	//读入DQ为0
          }
      else
        {
         temp=temp|0x80;	//读入DQ为1
        }

      DelayNus(5);		//延时40us
      DQIO_OUT;		        //DQ口设为输出
      DQ1;			//DQ输出1
    }
    return    temp;		//返回一个数据
}
//******************************************************************************
//复位说明:复位要求主CPU将数据线下拉500us,然后释放,
//当DS18B20收到信号后等待16~60us左右,后发出60~240微秒的存在低脉冲,
//主CPU收到此信号表示复位成功。 
//初始化DS18B20
void Init (void)
{
    DQ0;			
    DelayNus(50);		//延时500us
    DQ1;
    DelayNus(10);		//延时16~60us

    DQIO_IN;		        //设DQ为输入
    if((P5IN&BIT7)==BIT7)        //1000 0000b=1f,DQ是否为1
     {
      Error =1;    		//失败1
      DQIO_OUT;		        //设DQ为输输出
     }
    else
     {
      Error = 0;		//初始化成功
      DQIO_OUT;		        //设DQ为输输出
      DQ1;
     }
}
//******************************************************************************
//指令描述:跳过ROM命令,指定代码为CCH,忽略64位ROM地址,直接向DS1820发温度变换
//命令,适用于单片机工作.
void Skip(void)
{
    Write_18B20(0xcc);
}
//******************************************************************************
//指令描述:温度转换命令,指定代码为44H.启动DS1820进行温度转换,12位转换时最长
//为750ms(9位为93.75ms).结果存入内部9字节RAM中.
 void Convert (void)
 {
    Write_18B20(0x44);
  }
//******************************************************************************

//指令描述:读暂存器,指定代码为BEH.读内部RAM中9字节的内容.
  void ReadDo (void)
  {
    Write_18B20(0xbe);
  }
//******************************************************************************
//读取温度值
void ReadTemp (char temp_low,char temp_high)
 {
    temp_low = Read_18B20(); 	//读低位
    temp_high = Read_18B20(); 	//读高位
 }
//******************************************************************************
//MCU对DS18B20进行温度转换时,其操作必须满足以下过程:
// 1- 每一次读写之前都要对DS18B20进行复位.
// 2- 完成复位后发送一条ROM命令到DS18B20.
// 3- 最后发送一条RAM命令到DS18B20.
// 以上系列动作是根据DS18B20的通讯协议所得.
//读取温度
void GetTemp(char temp_low,char temp_high)
 {
        Init();			//DS1820初始化
        Skip();			//跳过64位ROM(ROM命令)
        Convert();		//转换(RAM命令)
        DelayNus(60000);        //60000x5us=0.3s
        DelayNus(60000);        //0.3s
        DelayNus(60000);	//0.3s
        Init();			//DS1820初始化
        Skip();			//跳过64位ROM
        ReadDo();		//读暂存器
        ReadTemp( temp_low,temp_high);		//读取温度值
 }
//******************************************************************************

//MSP430F14初始化
void Temp_mcuinit(void)
 {
   P5DIR |=BIT7;                             //设DQ电时为1
   DQ1;
    
 }

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


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -