/******************************************************************************
*模块名:DS1820驱动(430)
*创建人:Iceflame
*日期:2008-5-1 6:17
*功能:数据读取控制
*版本:1.0
*修改日期:
********************************************************************************/
#include "msp430x24x.h"
#include "DS18B20.h"
#define DQDIRIN P1DIR &= 0xFE
#define DQDIROUT P1DIR |= 0x01
#define DQIN (P1IN & 0x01)
#define DQOUT_L P1OUT &= 0xFE
#define DQOUT_H P1OUT |= 0x01
void DS18B20_delay_us(unsigned int n);
unsigned char Bus_1820_reset(void);
unsigned char Read_1820_word(void);
void Write_1820_word(unsigned char m);
/*******************************************************************************
*函数名:延时函数
*功能:延时
*输入:无
*输出:无
*调用函数:无
*版本:1.0
*******************************************************************************/
void DS18B20_delay_us(unsigned int n)//16MHz
{
unsigned int k;
k = n;
while ( k != 0 )
{
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
_NOP();
k--;
}
}
/*******************************************************************************
*函数名:总线复位函数
*功能:使总线上所有器件复位
*输入:
*输出:uchar 当总线上有器件时返回0,否者是1
*调用函数:延时函数DS18B20_delay_us()
*版本:1.0
*
*******************************************************************************/
unsigned char Bus_1820_reset(void)
{
unsigned char temp = 1;
DQOUT_L;
//延时600us
DS18B20_delay_us(600);
DQDIRIN;
//延时120us
DS18B20_delay_us(120);
/*
if ( DQIN == 0x01 ) //0001 1111b=1f
{
temp = 1;
}
else
{
temp = 0;
}
*/
DQDIROUT;
DQOUT_H;
return temp;
}
/*******************************************************************************
*函数名:读字节指令函数
*功能:写一个字节
*输入:
*输出:uchar 一个字节的内容
*调用函数:延时函数DS18B20_delay_us() 读位函数 Read_1820_bit()
*版本:1.0
*
*******************************************************************************/
unsigned char Read_1820_word(void)
{
unsigned char i;
unsigned char temp;
for ( i=0; i<8; i++)
{
temp=temp>>1;
DQOUT_L;
DQOUT_H;
DQDIRIN;
if ( DQIN == 0x00 )
{
temp = temp&0x7F;
}
else
{
temp = temp|0x80;
}
//延时40us
DS18B20_delay_us(40);
DQDIROUT;
DQOUT_H;
}
return temp;
}
/*******************************************************************************
*函数名:写字节指令函数
*功能:写一个字节到总线
*输入:uchar m(数据)
*输出:无
*调用函数:延时函数DS18B20_delay_us() 写位函数 Write_1820_bit()
*版本:1.0
*
*******************************************************************************/
void Write_1820_word(unsigned char m)
{
unsigned char i;
for ( i=0; i<8; i++ )
{
DQOUT_L;
//延时13us 左右
DS18B20_delay_us(10);
if ( (m&0X01) == 0X01 )
DQOUT_H;
else
DQOUT_L;
m=m>>1;
//延时50us 以上
DS18B20_delay_us(50);
DQOUT_H;
}
}
/*******************************************************************************
*函数名:读取温度函数
*功能:读取温度数据并处理
*输入:无
*输出:无
*调用函数:复位函数 Bus_1820_reset() 写字节函数 Write_1820_word()
读字节函数 Read_1820_word() 读位函数 Read_1820_bit()
*版本:1.0
*说明: str[0] --------- 正负符号位
* str[1] --------- 温度值百位
* str[2] --------- 温度值十位
* str[3] --------- 温度值个位
* str[4] --------- 温度值小数点
* str[5] --------- 温度值十分位
* str[6] --------- 温度值百分位
*
*******************************************************************************/
unsigned char Temp_get( unsigned char *str )
{
unsigned char tmpl=0;
unsigned char tmph=0;
//unsigned char m;
unsigned int tm=0;
//m = Bus_1820_reset();
//if ( m == 1 )
//{
Bus_1820_reset();
Write_1820_word(0xCC); //直接访问
Write_1820_word(0x44); //开始转化指令
//while ( Read_1820_bit() == 0 ); //等待温度转化完毕
//DS18B20_delay_us(8000);
Bus_1820_reset();
Write_1820_word(0xCC); //直接访问
Write_1820_word(0xBE); //读取便签存储器
tmpl = Read_1820_word(); //读取温度数据低字节
tmph = Read_1820_word(); //读取温度数据高字节
if ( tmph&0xf0 ) //判断正负
str[0] = '-';
else
str[0] = '+';
tm = (unsigned int)(((float)(tmph&0x07)*16.0+(float)tmpl*0.0625)*100.0);//转化
str[1] = tm/10000 + 0x30;
str[2] = tm%10000/1000 + 0x30;
str[3] = tm%1000/100 + 0x30;
str[4] = '.';
str[5] = tm%100/10 + 0x30;
str[6] = tm%10 + 0x30;
str[7] = '\0';
return 1;
//}
// return 0;
}
这是我用的 可以用 你参考参考
hregbfdkvh