代码如下,经调试运行稳定(显示稳定和空调的显示稳定一致 ),特别提醒必须加上拉电阻,我就是在这个问题上耽搁了2个小时:
#include "inc/hw_types.h"
#include "18b20.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "inc/hw_memmap.h"
//#define LCD_CTL_PERIPH SYSCTL_PERIPH_GPIOB //定义控制管脚
#define LCD_CTL_PORT GPIO_PORTB_BASE
#define DQ_PIN GPIO_PIN_3 //
#define DQ_0 GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0x00)
#define DQ_1 GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0XFF)
#define DQ_OUT GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_3);
#define DQ_IN GPIOPinTypeGPIOInput(GPIO_PORTB_BASE,GPIO_PIN_3);
char presence,flag;
//延时函数
void us_delay(unsigned int num)
{
while( --num );
}
////初始化ds1820
char Init_DS18B20(void)
{
tBoolean dat; //定义位变量
DQ_OUT; //重设为输出
DQ_1;
us_delay(50);
DQ_0;
us_delay(2000);
DQ_1;
us_delay(50);
DQ_IN; //设置DQ为输入状态
dat=GPIOPinRead(LCD_CTL_PORT,DQ_PIN); //读取DQ口状态值
if(dat)
presence = 1; //如果=0则初始化成功 =1则初始化失败
else
presence = 0; //如果=0则初始化成功 =1则初始化失败
us_delay(1000);
DQ_OUT; //重设为输出
DQ_1; //写1
return(presence); //返回信号,0=presence,1= no presence
}
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i = 0;
unsigned char dat = 0,ss;
for (i = 8; i > 0; i--)
{
DQ_0;//DQ写0
dat >>= 1;//右移一位数
DQ_1;
DQ_IN; //设置为输入//DQ设置为输入
ss=GPIOPinRead(LCD_CTL_PORT,DQ_PIN);//读取DQ值
if(ss) //假如读取值为高,这dat些1
dat |= 0x80;
us_delay(100);
DQ_OUT;//重设为输出
DQ_1; //写1
}
return (dat);//返回dat
}
//写一个字节
WriteOneChar(char dat)//写一个字节
{
unsigned char i = 0,tem;
for (i = 8; i > 0; i--)
{
DQ_0;
tem= dat&0x01;//取最低位
if(tem)//如果为1,这写DQ为1,否则为0
DQ_1;
else
DQ_0;
us_delay(100);
DQ_1;
dat>>=1;
}
}
float Read_Temperature(void)
{
unsigned char temp_data[2];
unsigned short temp;
Init_DS18B20();
if(1==presence)
{
flag=0x01;
}
else
{
flag=0x00;
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
us_delay(600);
Init_DS18B20(); //再次初始化18b20
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
temp_data[0]=ReadOneChar(); //温度低8位
temp_data[1]=ReadOneChar(); //温度高8位
temp=temp_data[1];
temp<<=8;
temp+=temp_data[0];
if(temp_data[1]&0xf8)
{
temp=~temp_data[1]+1;
temp=-(temp*256+temp_data[0])*0.0625;
}
else
temp=(temp_data[1]*256+temp_data[0])*0.0625;
}
return(temp);
}