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

📄 18b20_1.c

📁 MSP430f2274单片机的ds08b20程序
💻 C
字号:
//========================================= 头文件 ==========================================
#include  <msp430x22x4.h>
//========================================== 宏定义 =========================================
//=== DS18B20 使用说明 ===
// P3.0 ------ DS18B20-DQ 数据输入输出端
#define DQ1 P3OUT|=BIT0     //DS18B20接口为P3.0口
#define DQ0 P3OUT&=~BIT0
#define Set_clk P4OUT|=BIT1
#define Clr_clk P4OUT&=~BIT1
//======================================== 函数声明 ====
//==== DS18B20 ====
void DelayNus(unsigned int n);
void Write_18B20(unsigned char n);
unsigned char Read_18B20(void);
void Init (void);
void Skip(void);
void Convert (void);
void ReadDo (void);
void ReadTemp (void);
void GetTemp(void);

float Temper=0.0;
int temperature=0;
unsigned char Error=0;
unsigned int temp[11]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};

//=======================================================================================
//============功能:us 级别延时   n=10,则延时10*5+6=56uS================================
//=============08========================================================================
void DelayNus(unsigned int n)
{
    while(n--){};
}
//=======================================================================================
//============功能:写18B20 =============================================================
//=======================================================================================
void Write_18B20(unsigned char n)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ0;
        DelayNus(1);                          //==延时5us===
        if((n&0X01)==0X01) 
        DQ1;
        else DQ0;
        n=n>>1;
        DelayNus(9);                             //==延时50us 以上===
        DQ1;
    }
}
//=======================================================================================
//============功能:读取18B20 ===========================================================
//=======================================================================================
unsigned char Read_18B20(void)
{
    unsigned char i;
    unsigned char temp_1;
    for(i=0;i<8;i++)
    {
        temp_1=temp_1>>1;
        DQ0;
        _NOP();                                  //==延时1us===
        DQ1;
        _NOP();_NOP();                           //==延时5us===
        _NOP();_NOP();_NOP();
        P3DIR&=~BIT0;
        if((P3IN&BIT0)==0)
        {
            temp_1=temp_1&0x7F;
        }else
        {
            temp_1=temp_1|0x80;
        }
        DelayNus(7);                             //==延时40us===
        P3DIR|=BIT0;
        DQ1;
    }
    return    temp_1;
}
//=======================================================================================
//============DS18B20的初始化  ==========================================================
//=======================================================================================
void Init (void)
{
    DQ0;
    DelayNus(50);                                //==延时500us=================
    DQ1;
    DelayNus(17);                                //==延时16~60us==============
    P3DIR&=~BIT0;
    if((P3IN&BIT0)==BIT0)                        //==0001 1111b=1f  ===========
    {
        Error =1;                                //==失败1=====================
        P3DIR|=BIT0;
    }else
    {
        Error = 0;                               //==初始化成功================
        P3DIR|=BIT0;
        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 (void)
{
    char temp_low,temp_high;                     //== 温度值 =====
    temp_low=Read_18B20();                       //== 读低位 =====
    temp_high=Read_18B20();                      //== 读高位 =====
    
    temperature=(temp_high&0x0f);                //=== 屏蔽高4位==
    temperature<<=8;                    //=== 将temp_high部分数据移到temperature高8位===
    temperature|=temp_low;              //=== 将高低两字节内部合并成一个16位数据===
    Temper=temperature*0.0625;          //=== 计算真实温度值===
}

void GetTemp(void)
{
        Init();
        Skip();
        Convert();
        DelayNus(60000);
        DelayNus(60000);
        DelayNus(60000);//延时1s以上
        Init();
        Skip();
        ReadDo();
        ReadTemp();
}


void Display(int value)
{ 
  int i,j,s[8],flag=0;
  int m;
  Set_clk;
  m=value;                         
  for(i=0;i<8;i++) s[i]=0;   
  for(i=0;i<8;i++)
  { s[i]=m%10;
    m/=10;
  } 
  for(i=7;i>=0;i--)
  {
    if(s[i]!=0) break;
    if(s[0]==0) flag=1;}
  if(flag==1)
    for(j=1;j<8;j++) s[j]=10;
  else for(j=7;j>i;j--) s[j]=10;
  Set_clk;
  for(i=7;i>=0;i--)
  {
    m=temp[s[i]];
    for(j=0;j<8;j++)
    {
     Clr_clk;
      DelayNus(1);
     if((m&0x01)==1) P4OUT|=BIT0;
     else  P4OUT&=~BIT0;
     m>>=1;
     Set_clk;
     DelayNus(1);
    }
    Clr_clk;
  }
}

//=======================================================================================
//============获取DS18B20的温度值========================================================
//=======================================================================================
//===  MCU对DS18B20进行温度转换时,其操作必须满足以下过程:
//===  1- 每一次读写之前都要对DS18B20进行复位.
//===  2- 完成复位后发送一条ROM命令到DS18B20.
//===  3- 最后发送一条RAM命令到DS18B20.
void main(void)
 {
   WDTCTL = WDTPW + WDTHOLD;
   P4DIR=0x03;
        DQ1;
        while(1)
        {
            GetTemp();
            Display(Temper);
          DelayNus(1000);
        }
 }

⌨️ 快捷键说明

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