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

📄 ds18b20.c

📁 MSP430单片机的DS18B20程序,自动识别ID号,可同时管理5个DS18B20,非常好用
💻 C
📖 第 1 页 / 共 2 页
字号:
#include          "msp430x14x.h"            // Standard Equations
#include          "DS18B20.h"

//----------------------------------------------------------------------
 void Delay(unsigned int x);        //延时程序
 void Temp(void);
//-----------------------全局变量定义------------------------------

unsigned char ID[5][8];                     //ID[5][8]为检索到的地址
unsigned char TEMP_NUMBER;                  //温度传感器数量
unsigned int  TEMP[5];                      //温度值
float    fT[5];

//-----------------------软件标志定义------------------------------
unsigned int FLAG;    //软件标志
//FLAG.0--DS18B20复位OK  FLAG.1--温度传感器OK  FLAG.2--搜索温度结束

//****************************************************************************
//模块名:Init_DS18B20
//编写者:liukang
//描述:  初试化DS18B20子程序。
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Init_DS18B20(void)
  {
    DS_DIR = DS18B20;
    DS_OUT = 0;
  }
 
void main(void)
  {
    unsigned int iq0;
    WDTCTL = WDTPW +WDTHOLD;     //停看门狗
 //---------------------------系统时钟定义---------------------
    BCSCTL1&=~XT2OFF;                       //打开XT2振荡器
    do
      {
        IFG1 &= ~OFIFG;                     // 清除振荡器失效标志
        for (iq0 = 0xFF; iq0 > 0; iq0--);   // 延时,等待XT2起振
      }
    while ((IFG1 & OFIFG) != 0);            // 判断XT2是否起振

    BCSCTL2 =SELM_2+DIVS_0+SELS;            //选择MCLK、SMCLK为XT2
    Init_DS18B20();                         
    _EINT();
    while (1)
      {
        Temp();
        for (iq0 = 5; iq0 != 0; iq0--)
          {
            fT[iq0-1] = 0.0625 * TEMP[iq0-1];
          }
        _NOP();
      } 
  }

//****************************************************************************
//模块名:Rst_DS18B20
//编写者:liukang
//描述:  复位温度传感器DS18B20子程序。
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Rst_DS18B20(void)
  {
    unsigned int I;
    FLAG |= FLAG_TEMP_RET;      //预设ds18b20复位OK 
    W18BUS_0;                   //拉低总线
    Delay(960);                  //延时480uS
    SF18BUS;                    //释放总线
    Delay(50);                  //延时15-60uS
    I = 890;
    while (/*(R18BUS) && */(I != 0)) I--;     //循环条件:ds18b20总线不为“0”
                                       //并且延时总时间不够4mS
    if (I != 0)
      {
        _NOP();
        while(!(R18BUS));
      }
    else
      {
        FLAG &= ~FLAG_TEMP_RET;
      }
  }
//****************************************************************************
//模块名:Read_BUS_bit
//编写者:liukang
//描述:  从单总线读一位数据子程序。
//功能:  DATA右移一位,从单总线读一位数据到DATA的最高位,
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
unsigned char Read_BUS_bit (unsigned char DATA)
  {
    unsigned char I;
    DATA >>= 1;
    SF18BUS;                       //释放总线
    I = 30;
    while (I != 0) I--;
    _DINT();
    W18BUS_0;                      //拉低总线2uS
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    W18BUS_1;                      //拉高总线
    I = 20;
    while (I != 0) I--;
    if (R18BUS != 0)
      DATA |= 0X80;
    _NOP();
    _EINT();
    I = 25;                         //延时45uS
    while (I != 0) I--;
    return (DATA);
  }
//****************************************************************************
//模块名:Write_BUS_bit
//编写者:liukang
//描述:  向单总线写一位数据子程序。
//功能:  把DATA的最低一位数据写到单总线上,DATA右移一位
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
unsigned char Write_BUS_bit (unsigned char DATA)
  {
    unsigned char I;
    _DINT();
    W18BUS_1;
    if (DATA&0X01)
      {
        DS_DIR |=  DS18B20;
        DS_OUT &= ~DS18B20;
        _NOP();
        _NOP();
        DS_OUT |=  DS18B20;
      }
    else
      {
        W18BUS_0;
      }
    _EINT();
        I = 16;                         //延时15uS
        while (I != 0) I--;
    DATA >>= 1;
    I = 80;
    while (I != 0) I--;
    W18BUS_1;
    _NOP();
    _NOP();
    return (DATA);
  }
//****************************************************************************
//模块名:Read_BUS_Byte
//编写者:liukang
//描述:  从单总线读一个字节数据子程序。
//功能:  返回从单总线读出的一个字节数据,调用了Read_BUS_bit
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
unsigned char Read_BUS_Byte (void)
  {
    unsigned char I;
    unsigned char DATA;
    for (I = 8;I != 0;I--)
      {
        DATA = Read_BUS_bit(DATA);
      }
    return (DATA);
  }
//****************************************************************************
//模块名:Write_BUS_Byte
//编写者:liukang
//描述:  向单总线写一个字节数据子程序。
//功能:  调用Write_BUS_bit,把DATA数据写到单总线上
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Write_BUS_Byte (unsigned char DATA)
  {
    unsigned char I;
    for (I = 8;I != 0;I--)
      {
        DATA = Write_BUS_bit(DATA);
      }
  }
  
//****************************************************************************
//模块名:Read_BUS_2bit
//编写者:liukang
//描述:  从单总线读2位数据子程序。
//功能:  调用Read_BUS_bit,从单总线读2位数据到DATA高位,并返回DATA
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
unsigned char Read_BUS_2bit (void)
  {
    unsigned char DATA;
    DATA = 0;
    DATA = Read_BUS_bit(DATA);
    DATA = Read_BUS_bit(DATA);
    return(DATA);
  }
  
//****************************************************************************
//模块名:Right_Move_Temp
//编写者:liukang
//描述:  循环右移子程序。
//功能:  
//版本:  1.0
//修改:  2006年05月12日
//****************************************************************************
void Right_Move_Temp(unsigned char *PA,unsigned char *PB)
  {
    unsigned char DATA,I;
    DATA = 0;
    if (*PA & 0X01) DATA = 0X80;
    PB = PB+7;
    if (*PB & 0X01) DATA |= 0X01;
    for (I=0; I<7; I++)
      {
        *PA >>= 1;
        *PB >>= 1;
        if (*(PA+1) & 0X01) *PA |= 0X80;
        else *PA &= 0X7F;
        if (*(PB-1) & 0X01) *PB |= 0X80;
        else *PB &= 0X7F;
        PA++;
        PB--;
      }
    *PA >>= 1;

⌨️ 快捷键说明

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