19,502
社区成员
发帖
与我相关
我的任务
分享
#include "2410addr.h"
#define U32 unsigned int
unsigned int x;
unsigned int flag;
/*******************延时函数1us***********************/
void delay1us(U32 time) //精确延时时间1us
{
U32 i;
for(;time>0;time--)
for(i=0;i<39;i++);
}
/*******************初始化DS18B20**********************/
void Init_DS18B20(void)
{
x=0;
rGPBCON=0x155559; //GPBCON配置成允许GPB2输出
rGPBDAT=rGPBDAT|0x004; //拉高GPB2
delay1us(10);
rGPBDAT=rGPBDAT&0x7fb; //DQ=0,总线主机发送一复位脉冲(>480us低电平)
delay1us(700); //延时大于480us
rGPBDAT=rGPBDAT|0x004; //拉高GPB2
delay1us(55); //DS18B20等待15~60us并发送(60~240us的低电平信号)
rGPBCON=0x155549; //允许GPB2输入
x=rGPBDAT&0x001; //判断是否有低电平信号输入
if(x==1)
uart_printf("DS18B20初始化失败!\n");
delay1us(300);
//rGPBCON=0x155559;//GPDCON配置成允许GPB2输出
//rGPBDAT=rGPBDAT|0x0004; //拉高GPB2
//delay1us(300);
}
/*****************读16位温度数字量其中的8位********************/
unsigned char ReadOneChar(void)
{
unsigned char dat=0;
unsigned int i;
rGPBCON=0x155559; //GPBCON配置成允许GPB2输出
for(i=8;i>0;i--)
{ dat>>=1;
// rGPBDAT=rGPBDAT|0x004;//DQ=1
// delay1us(2);
rGPBDAT=rGPBDAT&0x7fb; //DQ=0置低电平
delay1us(1); //数据线要保持1us以上的低电平
rGPBDAT=rGPBDAT|0x004;//DQ=1 读时间片结束给脉冲信号
delay1us(5);
rGPBCON=0x155549; //允许GPD2输入
if((rGPBDAT&&0x001)==1) //用于检测所读的字节中哪些位为1.
dat=dat|0x80; //从字节的低位读起
else
dat=dat&0x7f;
delay1us(60);
}
return (dat);
}
/************************************向DS18B20发送指令**************************/
void WriteOneChar(unsigned char dat)
{
unsigned char rDC;
unsigned int i;
rGPBCON=0x155559; //允许GPB2输出
for (i=8;i>0;i--)
{
rGPBDAT=rGPBDAT&0x7fb;//DQ=0置低电平,I/O线由高电平变低电平在15us~60us对I/O进行采集,高电平写1,低电平写0
delay1us(12);
rDC=dat&0x01;
dat=dat>>1;
if(rDC==1)
rGPBDAT=rGPBDAT|0x004; //DQ=1给脉冲信号
else
rGPBDAT=rGPBDAT&0x7fb;
delay1us(60);
rGPBDAT=rGPBDAT|0x004; //DQ=1 给脉冲信号
}
}
/*********************读取温度*********************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
unsigned int s1=0;
unsigned int s2=0;
Init_DS18B20();
if(x==0)
{
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay1us(7500000); //750ms延时等待温度转换
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0x5f); //温度设定11位
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0xbe); //读取温度寄存器
a=ReadOneChar(); //读寄存器低八位
b=ReadOneChar(); //读寄存器高八位
t=b;
t=t<<8;
t=t|a;
if(t>0x3ff) //最高有效位为符号位,实际数据位为10位
{
t=~t+1;
flag=1;
}
t=t*0.125; //温度整数部分;
s1=(a&0x07)*10/8; //小数第一位;
s2=(a&0x07)*100/8%10;//小数第二位;
}
return t ;
}