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

📄 msp4301820.c.bak

📁 基于MSP430单片机的测温系统及无线通信程序。
💻 BAK
字号:
/******************************************************
2008-7-19读单个1820的温度
temp1 temp2只能设成局部变量,设成全局变量会出错
只做收到整数的温度值
*******************************************************/
#include "msp430x20x2.h"
#include "include.h"

#define positive 0x08           //正温系数

unsigned char error18b20 = 0;

unsigned char symbol18b20 = 1 ;      //温度正负符




/************************************************
函 数 名: delay(unsigned int)
功 能:延时
说 明:
调 用:
全局变量:
入口参数:unsigned int
出口参数:无
返 回 值:无
************************************************/
//延时
void delay(unsigned int useconds)
{
  while(useconds--){_NOP();_NOP();_NOP();
    _NOP();
    _NOP();};///n=10,则延时10*5+6=56uS
 }
/************************************************
函 数 名: Ds18b20_present()
功 能: ds18b20复位和存在脉冲
说 明:
调 用:
全局变量:
入口参数: 无
出口参数:无
返 回 值: unsigned char(0: presence, 1: no part)
************************************************/
//ds18b20复位
//unsigned char Ds18b20_present(void)
void Ds18b20_present(void)
{
  DS18B20_OUT &= ~DS18B20; //pull DQ line low
  delay(100); 	//延时500us
  DS18B20_OUT |= DS18B20; //allow line to return high
  delay(11); //延时16~60us leave it low for 600us
  DS18B20_DIR &= ~DS18B20; //SET TO INPUT???
  if((DS18B20_IN & DS18B20)==DS18B20)//get presence signal  I am not this??		///???
  {
  	error18b20 = 1;
  	DS18B20_DIR |= DS18B20; //SET TO OUTPUT
  }
  else						///???
  {
  	error18b20 = 0;
  	DS18B20_DIR |= DS18B20; //SET TO OUTPUT	
  	DS18B20_OUT |= DS18B20;//after 60us--240us
  }
} //1 //= presence, 0 = no part

/************************************************
函 数 名: Ds18b20_read_byte()
功 能:从 1-wire 总线上读取一个字节
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:unsigned char
************************************************/
//从 1-wire 总线上读取一个字节
unsigned char Ds18b20_read_byte(void)
{
  unsigned char i;
  unsigned char value = 0;
  for(i = 8; i > 0; i--)
  {
  	value >>= 1;	///移向下一位
	DS18B20_OUT &= ~DS18B20; //pull DQ low to start timeslot
  	_NOP();			//延时1us
  	DS18B20_DIR |= DS18B20; //SET TO OUTPUT
  	_NOP();_NOP();_NOP();	//延时5us
  	_NOP();_NOP();
  	///DS18B20_OUT |= DS18B20; //this me
  	DS18B20_DIR &= ~DS18B20; //SET TO INPUT
  	if((DS18B20_IN & DS18B20)==0)
  	{
  		value &= 0x7F;	//读入DS18B20_IN为0	
  	}
  	else
  	{
  		value |= 0x80;	//读入DS18B20_IN为1 	
  	}
  	delay(7);	//延时40us
  	DS18B20_DIR |= DS18B20;//DS18B20_OUT口设为输出
  	DS18B20_OUT |= DS18B20;//DS18B20_OUT输出1
  	/*if(DS18B20_IN & DS18B20)
  	  value |= 0x80;
 	 else
  	  value &= ~0x80;
  	delay(8); //wait for rest of timeslot*/
  	
  }
  return(value);
}

/************************************************
函 数 名: Ds18b20_write_byte(unsigned char)
功 能:向 1-WIRE 总线上写一个字节
说 明:
调 用:
全局变量:
入口参数:unsigned char
出口参数:无
返 回 值:无
************************************************/
//向 1-WIRE 总线上写一个字节
void Ds18b20_write_byte(unsigned char val)
{
  unsigned char i;
  for(i = 8; i > 0; i--) //writes byte, one bit at a time
  {
    DS18B20_OUT &= ~DS18B20; //pull DQ low to start time slot
    _NOP();_NOP();_NOP();_NOP();//this me
    _NOP();//_NOP();_NOP();_NOP();延时5us
    if((val & 0x01)==0x01)
       	DS18B20_OUT |= DS18B20;
    else
        DS18B20_OUT &= ~DS18B20;
    val >>= 1;
    delay(9); //hold value for remainder of time slot 60us 50us以上
    DS18B20_OUT |= DS18B20;
    }
} 


//----------------------------------

//MCU对DS18B20进行温度转换时,其操作必须满足以下过程:
// 1- 每一次读写之前都要对DS18B20进行复位.
// 2- 完成复位后发送一条ROM命令到DS18B20.
// 3- 最后发送一条RAM命令到DS18B20.
// 以上系列动作是根据DS18B20的通讯协议所得.
//读取温度

void Ds18b20_Convert_commond(void)
{
  //unsigned int tmp;
  char temp1,temp2;     //温度值的整数部分、小数部分
 // DS18B20_R = DS18B20;        //使用上拉电阻
  
  DS18B20_SEL &= ~DS18B20;    //设为I/O,默认为1
  
  Ds18b20_present();        //复位
 // delay(200);               //1ms
  Ds18b20_write_byte(0xCC); //Skip ROM忽略ROM匹配操作
  Ds18b20_write_byte(0x44); // Start Conversion温度转换命令
  delay(60000);             //60000x5us=0.3s
  delay(60000); 
  delay(60000); 	////延时1s以上
  
  Ds18b20_present();			//复位
  //delay(200);    //1ms
  Ds18b20_write_byte(0xCC);	//忽略ROM匹配操作
  Ds18b20_write_byte(0xBE);	//读寄存器
 
  temp2 = Ds18b20_read_byte();	//读取第1字节  LSB
  temp1 = Ds18b20_read_byte();	//读取第2字节  MSB
  delay(10);
 //_NOP();
  
  temperature = (temp1<<4)|(temp2>>4);
}

void main18b20(void)
{
  WDTCTL = WDTPW + WDTHOLD;                       // 停止WDT

 
 

  while(1)
  {
    DS18B20_OUT |= DS18B20;
    delay(60000) ;
    Ds18b20_Convert_commond();       //读取温度
    
    if(symbol18b20==1)
 //     LED_OUT  |= LED1;                      //处理正负符合+
 //   else
 //     LED_OUT  |= LED2; 		//-
      
    delay(60000) ;
    delay(60000) ;
   
    if(error18b20==1)                                   
   { 
 //  	LED_OUT &= 0;  //失败
   }
 //  else
   { 
 //  	LED_OUT  |= LED1 + LED2;//正确
   }
   
   delay(60000) ;
   delay(60000) ;
   delay(60000) ;
  //LPM4;
  }
  
  
}

⌨️ 快捷键说明

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