|
#include "msp430x12x2.h"
typedef unsigned char uchar;
typedef unsigned int uint;
uchar TMPL,TMPH;
uint jk=0;
/**************函数的声明*************************/
void delay_us(); //延时1.25
uchar rest_ds18b20(void); //复位函数
uchar read_bit(); //读一位
void write_bit(char bitval) ; //写一位
uchar read_byte(); //读一个字节
void write_byte(uchar val); //写一个字节
uint get_temp(); //获得温度
/************DS18B20控制引脚定义****************/
#define DQ_OUT P3DIR|=BIT5
#define DQ_IN P3DIR&=~BIT5
#define DQ_H P3OUT|=BIT5
#define DQ_L P3OUT&=~BIT5
#define DQ_DATE (P3IN&BIT5) //读出P2.7口数据 1 OR 0
//延时函数
void delay_us(unsigned long time)
{
//while(time--);
_NOP();//一个周期
}
//ds18b20复位子程序
uchar rest_ds18b20(void)
{
uchar ds18b20_rest_flag;
// delay_us(5);//稍做延时
DQ_OUT;//输出
DQ_L; //输出0
delay_us(480); //480uS
DQ_H; //输出1
delay_us(48);
DQ_IN; //输入
ds18b20_rest_flag=DQ_DATE;
delay_us(400); //400uS
return ds18b20_rest_flag; //如果stDQ=0则初始化成功 stDQ=1则初始化失败
}
//读一个位
uchar read_bit()
{
DQ_OUT;//输出
DQ_L;//输出0
DQ_H;//输出1
delay_us(15);//15uS
return DQ_DATE; //读出的一个位值返回
}
//写一个位
void write_bit(char bitval)
{
DQ_OUT;//输出
DQ_L; //输出0
delay_us(16);//16us
if(bitval==1)
DQ_H;
delay_us(80); //在其余的时间隙保持值。
DQ_H;
}
//读一个字节
uchar read_byte()
{
uchar i;
uchar value=0;
for(i=0;i<8;i++)
{
if(read_bit()) //当read_bit()=0时,value=0。
{ //当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
value|=0x01<<i; //按位或|。 有一个为1则为1
}
delay_us(36) ; //等待剩下时间隙。
}
return value;
}
//写一个字节
void write_byte(uchar val)
{
uchar i,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
}
delay_us(80);//80uS
}
//获得温度的值
uint get_temp()
{
float f_temp;
uint temp;
rest_ds18b20(); //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
write_byte(0xCC); // 写跳过读ROM指令。因为只对一个DB18B20操作。
write_byte(0xBE); //read_EEROM =0xBE ,读暂存器,读内部RAM中9字节的温度
TMPL = read_byte(); //读取低字节的8位数据
TMPH = read_byte(); //读取低字节的8位数据
temp = TMPH; //把高位的8字节数据 付给temp。
temp <<= 8; //两个字节为一个字
temp = temp | TMPL;
f_temp=temp*0.0625; //温度在寄存器里面是12位,分辨率为:0.0625。
temp=f_temp*10+0.5; //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
f_temp=f_temp+0.05;
return temp;
}
uchar flag;
//*****************温度转换函数****************************
void tempchange()
{
flag=rest_ds18b20();
//delay_us(20);
write_byte(0xCC); // 写跳过读ROM指令。因为只对一个DB18B20操作。
write_byte(0x44 ); // 写温度转换指令。
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
//DCOCTL=DCO0+DCO1+DCO2;
//BCSCTL1=RSEL2;
//BCSCTL2 = DIVS_0 + DIVM_0; //MCLK SMCLK不分频
DCOCTL=DCO0+DCO1+DCO2;
BCSCTL1=RSEL0+RSEL1+RSEL2;
//BCSCTL2 = DIVM_1 + DIVM_0;
while(1)
{
tempchange(); //温度转换函数。
jk=get_temp();
}
}
为什么得不到温度呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|