|
#include "msp430x14x.h"
//DS18B2O控制引脚定义
#define DQ_OUT P2DIR|=BIT6
#define DQ_IN P2DIR&=~BIT6
#define DQ_H P2OUT|=BIT6
#define DQ_L P2OUT&=~BIT6
#define DQ_DATE (P2IN & BIT6)
void delay_us(unsigned int i);//delay 2.5us at 8M
unsigned char rest_ds18b20(void);//DS18B20复位程序
void ReadTemp1820(void);//读取温度
void WriteOneChar(unsigned char value);//写一个字节
unsigned char ReadOneChar(void);
//****************************************************
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char value = 0;
for (i=0;i<8;i++)
{
value>>=1;
DQ_OUT;
DQ_L;
delay_us(1);
DQ_H; //DQ = 1
DQ_IN;
if(DQ_DATE) value|=0x80;
delay_us(16); //延时40us
DQ_OUT;
DQ_H; //DQ = 1
delay_us(1);
}
return value;
}
//写一个字节
void WriteOneChar(unsigned char value)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DQ_OUT;
DQ_L;
if (value&0x01) DQ_H; //DQ = 1
delay_us(30); //延时50us 以上
DQ_H; //DQ = 1
value>>=1;
}
}
//;**************************************************
//ds18b20复位子程序
unsigned char rest_ds18b20(void)
{
unsigned char ds18b20_rest_flag;
delay_us(4); //稍做延时
DQ_OUT;
DQ_L;
delay_us(200); //480us<T<960us
DQ_IN; //拉高总线
delay_us(36); //延时90us
ds18b20_rest_flag=DQ_DATE;
delay_us(40); //延时100us
return ds18b20_rest_flag; //如果stDQ=0则初始化成功 stDQ=1则初始化失败
}
//***************************************************
//2.5us延时程序
void delay_us(unsigned int i)//delay 2.5us at 8M
{
unsigned int ii;
for(ii =i;ii > 0;ii--)
{
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();
}
}
//******************************************************
//352微秒延时程序
void delay_352us(unsigned int i)//352us延时程序,延时时间的计算在前面已经讲过
{
unsigned char j;
while(i--)
{
for(j=0;j<255;j++)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
}
//读取温度
unsigned long temp32;
void ReadTemp18B20(void)
{
unsigned char templ,temph;
while(rest_ds18b20());
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay_us(10);
while(rest_ds18b20());
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
templ=ReadOneChar();
temph=ReadOneChar();
temp32=temph*256+templ;//执行这句程序后,temp32/16就是温度
// return temp32;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|