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

📄 main.c

📁 DS18B20 basic msp430F1232
💻 C
字号:
/**********************************************************/
//MSP430高级实验开发组件 - DS18B20单线温度传感器示例程序
//硬件连接:
//     MSP430 Broad     
 //               DS18B20
//   ------------------         ------------------
//   |      P2.2       | ------> |       DQ       |
//   ------------------         ------------------
//当前演示程序功能描述:
//循环进行温度检测,将结果分别保存在
// ResultSignal   温度符号(0x01为负)
// ResultTemperatureH 温度整数
// ResultTemperatureLH 温度小数(高两位)
// ResultTemperatureLL 温度小数(低两位)
//如果系统存在ZLG7289键盘显示模块,则可以显示温度
//**更多资料参考DS18B20数据手册以及ZLG7289_430.C
/*********************************************************/

#include<msp430x12x.h>

#define DS18B20_DIR   P2DIR
#define DS18B20_IN   P2IN
#define DS18B20_OUT   P2OUT

#define DS18B20_DQ   BIT2   //定义DS18B20的接口

// DS18B20 ROM命令宏定义
#define ReadRom    0x33
#define MatchRom   0x55
#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

#define SMCLK    4000   //(KHz)用于

// 温度的十进制编码(查表用)
unsigned char decimalH[16]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
unsigned char decimalL[16]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};

// 变量定义
unsigned char GetScratchpad[9];
unsigned char ResultTemperatureH;   //温度的整数部分
unsigned char ResultTemperatureLH;   //温度的小数部分(高位)
unsigned char ResultTemperatureLL;   //温度的小数部分(低位)

void DS18B20_WriteBit(unsigned char oww_dat);
void DS18B20_WriteByte(unsigned char oww_dat);
void DS18B20_ReadTemp(void);
unsigned char DS18B20_Init(void);
unsigned char DS18B20_ReadBit(void);
unsigned char DS18B20_ReadByte(void);
void Delay10us(void);
void DelayX10us(unsigned char x10us);



// 功能函数定义

unsigned char DS18B20_Init(void)
{
  unsigned char result;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DS18B20_OUT &= ~DS18B20_DQ;// DS18B20_DQ=0;
  DelayX10us(48);       // Bus master pulling low 480us minimum;
  DS18B20_OUT |= DS18B20_DQ;       // DS18B20_DQ=1;
  DelayX10us(6);        // Resister pull up 15-60us;
  DS18B20_DIR &= ~DS18B20_DQ;      // ow input
  result = DS18B20_IN & DS18B20_DQ;
  DS18B20_DIR |= DS18B20_DQ;        
  // ow output
  DelayX10us(48);       // End of timeslot total 480us;
  return(result);       // any 1 wire device ?result:=1 no devide; ?result:=0 have device;
  }//Intialization the 1-wire devices;
  
  unsigned char DS18B20_ReadBit(void){
  unsigned char result;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DS18B20_OUT &= ~DS18B20_DQ;      // DS18B20_DQ=0;
  _NOP();               // Start of timeslot;
  DS18B20_OUT |= DS18B20_DQ;       // DS18B20_DQ=1;
  _NOP();_NOP();_NOP();_NOP();
            // Wait from the start;
  DS18B20_DIR &= ~DS18B20_DQ;      // ow input
  result = DS18B20_IN & DS18B20_DQ;
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  return(result);       // return the result of the 1-wire devide;
}//Read a bit on the 1-wire bus;

void DS18B20_WriteBit(unsigned char oww_dat)
{
  DS18B20_DIR |= DS18B20_DQ;       // ow output
  DS18B20_OUT &= ~DS18B20_DQ;      // DS18B20_DQ=0;
  if (1 == oww_dat) 
      DS18B20_OUT |= DS18B20_DQ;     // DS18B20_DQ=1;
  DelayX10us(10);
  
  // Remain the state for 100us;
  DS18B20_OUT |= DS18B20_DQ;       // DS18B20_DQ=1;
}//Write a bit to the 1-wire bus;


unsigned char DS18B20_ReadByte(void)
{
  unsigned char i;
  unsigned char result='0';
  for(i = 0; i < 8; i++){
      if(DS18B20_ReadBit())
        result |= 0x01 << i;
      DelayX10us(12);     // ??
  }
  return(result);       // return the result of the 1-wire device;
}//Read a byte from the 1-wire bus;

void DS18B20_WriteByte(unsigned char oww_dat)
{
  unsigned char i,temp;
  for(i = 0; i < 8; i++){
      temp = oww_dat >> i;
      temp &= 0x01;
      DS18B20_WriteBit(temp);
  }
  DelayX10us(7);        // ??
}//Write a byte to the 1-wire bus;


void DS18B20_ReadTemp(void)
{ 
  unsigned char tempH,tempL;
  DS18B20_Init();
  DS18B20_WriteByte(SkipRom);
  _NOP();
     //There is just one DS1820 on the bus;
  DS18B20_WriteByte(ConvertTemperature);
  DelayX10us(10);
     //Start to convert temperature;
  DS18B20_Init();
  DS18B20_WriteByte(SkipRom);
  _NOP();
  DS18B20_WriteByte(ReadScratchpad);
  GetScratchpad[0]=DS18B20_ReadByte();
     //Master samples the LSB temperature from the scratchpad;
  GetScratchpad[1]=DS18B20_ReadByte();
     //Master samples the MSB temperature from the scratchpad;
  GetScratchpad[2]=DS18B20_ReadByte();
     //Master samples the Th register or userbyte1 from the scratchpad;
  GetScratchpad[3]=DS18B20_ReadByte();
     //Master samples the Tl register or userbyte0 from the scratchpad;
  GetScratchpad[4]=DS18B20_ReadByte();
     //Master samples the configuration register from the scratchpad;
  GetScratchpad[5]=DS18B20_ReadByte();
     //Master samples the reservedbyte from the scratchpad;
  GetScratchpad[6]=DS18B20_ReadByte();
     //Master samples the reservedbyte from the scratchpad;
  GetScratchpad[7]=DS18B20_ReadByte();
     //Master samples the reservedbyte from the scratchpad;
  GetScratchpad[8]=DS18B20_ReadByte();
     //Master samples the CRC from the scratchpad;
  tempH=(GetScratchpad[1] << 4) | (GetScratchpad[0] >> 4);
  tempL=(GetScratchpad[0] & 0x0f);
  DS18B20_Init(); //Issue a reset to terminate left parts;
  //if(tempH & 0x80)
  //{ tempH=~tempH;
  // tempL=~tempL+1;
  // ResultSignal=1;
  // //Negative temperature;
  //}
  ResultTemperatureH=tempH;
  ResultTemperatureLL=decimalL[tempL];
  ResultTemperatureLH=decimalH[tempL];
     //Result of temperature; 
}//Read the byte0 and byte1 from scratchpad;



void Delay10us(void)
{
  unsigned char i;
  for (i=0; i<(SMCLK/500-3); i++);
}

// Time is accurately !!
void InitSystemClock(void)  // 初始化系统时钟
{
  unsigned char i;
  BCSCTL1|=XTS;//Set 430 clk 
  do
  {
    IFG1&=~OFIFG;
    for(i=0xff;i>0;i--);
  }
  while ((IFG1&OFIFG)!=0);
  BCSCTL2 |= (SELM1 + SELS);  //MCLK = SMCLK = XT1
  return;
}
void DelayX10us(unsigned char x10us)
{
  unsigned int i;
  for (i=0; i<x10us; i++) Delay10us();
}
 
void main(void) {
  volatile unsigned int i=0,j=0;
  WDTCTL = WDTPW + WDTHOLD;   //停止看门狗
  InitSystemClock();  // 初始化系统时钟
  DS18B20_Init();     //初始化DS18B20
  P3DIR=0XFF;
  while(1) 
  {
     DS18B20_ReadTemp();
     i=ResultTemperatureH/10;
     j=ResultTemperatureH-(i*10);
     P3OUT=i;
     DelayX10us(200);
     DelayX10us(200);
     DelayX10us(200);
     DelayX10us(200);
     DelayX10us(200);
    /* i=ResultTemperatureLH/10;
     j=ResultTemperatureLH-(i*10);
     i=ResultTemperatureLL/10;
     j=ResultTemperatureLL-(i*10);
  */
  }
}

⌨️ 快捷键说明

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