📄 msp4301820.c.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 + -