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

📄 temp.c

📁 ds1820在msp430实测
💻 C
字号:
#include <msp430x22x4.h>
#include "lcdforadc.h"

#define DQ1 P4OUT|=BIT4
#define DQ0 P4OUT&=~BIT4

float   Temper=0.0;
int     temperature=0;
unsigned char Error = 0;
unsigned char rom_seq[8];
unsigned char tab[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

void GetTemp();
//----------------------------------
//功能: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;
    DelayNus(1);//延时13us 左右
    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;
  for(i=0;i<8;i++)
  {
    temp=temp>>1;
    DQ0;
    _NOP();//延时1us
    DQ1;
    _NOP();_NOP();//延时5us
    _NOP();_NOP();_NOP();
    P4DIR&=~BIT4;
    if((P4IN&BIT4)==0)
      temp=temp&0x7F;
    else
      temp=temp|0x80;
    DelayNus(7);//延时40us
    P4DIR|=BIT4;
    DQ1;
  }
  return temp;
}
//-----------------------------------
void Init (void)
{
  DQ0;
  DelayNus(50);//延时500us
  DQ1;
  DelayNus(17);//延时90us
  P4DIR&=~BIT4;
  if((P4IN&BIT4)==BIT4)        //0001 1111b=1f
  {
    Error =1;    //失败1
    P4DIR|=BIT4;
  }
  else
  {
    Error = 0;//初始化成功
    P4DIR|=BIT4;
    DQ1;
  }
}
//----------------------------------
void Skip(void)
{
  Write_18B20(0xcc);
}
//----------------------------------
void Convert (void)
{
  Write_18B20(0x44);
}

//----------------------------------
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);
  temperature<<=8;
  temperature|=temp_low;
  Temper=temperature*0.0625;
}

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

void GetRom()
{
  unsigned char i;
  Init();
  Write_18B20(0x33);
  for(i=0;i<8;i++)
  {
    rom_seq[i]=Read_18B20();
  }
}
void InitTA(void)//TA实现定时,每一秒采样一次
{
  TACTL=TASSEL0+TACLR;//定时器A时钟源为LFXT1,并清TAR
  TACCTL0|=CCIE;//CCR0中断使能
  TACCR0=32768;//定时时间为1s
  TACTL|=MC0;
}
#pragma vector=TIMERA0_VECTOR//定时器中断
__interrupt void TA0()
{
  GetTemp();
  LPM0_EXIT;
}
void showtemp(unsigned char x,unsigned char y)
{
  DisplayOneChar(x,y,number[(int)Temper/10]);
  DisplayOneChar(x+1,y,number[(int)Temper%10]);
  DisplayOneChar(x+2,y,'.');
  DisplayOneChar(x+3,y,number[(int)(Temper*10)%10]);
  DisplayOneChar(x+4,y,number[(int)(Temper*100)%100%10]);
  DisplayOneChar(x+5,y,number[(int)(Temper*1000)%1000%100%10]);
}
void main(void)
{
  unsigned char n;
  WDTCTL=WDTPW+WDTHOLD; //停狗
  P4DIR|=BIT4;
  DQ1;
  GetRom();
  InitTA();
  InitLcd();
  for(n=0;n<8;n++)
  {
    DisplayOneChar(n*2,0,tab[rom_seq[n]/16]);
    DisplayOneChar(n*2+1,0,tab[rom_seq[n]%16]);
  }
  DisplayListChar(0,1,"Temper:");
  _EINT();
  while(1)
  {
    LPM0;
    showtemp(8,1);
  }
}

⌨️ 快捷键说明

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