室温为20几度可是显示的是-30几度
/*************************************
ds18b20测温
晶振 ;11.0592M
**************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
READTEMPERATURE(void);
sbit DQ=P2^2;
sbit du=P2^6;
sbit we=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms()
{
int x,y;
for(x=1;x>0;x--)
for(y=20;y>0;y--);
}
/****************************
精确延时函数
****************************/
void delay (uint i)
{
while(i--);
}
/****************************
初始化18B20函数
*****************************/
void init_DS18B20(void)
{
uchar x=0;
DQ=1;
delay(2); //稍作延时
DQ=0;
delay(80);//做测试出来的函数 需要测试
DQ=1;
delay(14);// 复位脉冲和存在脉冲之间的间隔+存在脉冲出现的时间
x=DQ; //为0时复位成功。
delay(20);// 随便延时下,为下一步做准备
}
/***************************************
读一个字节DS18b20
*****************************************/
READONECHAR(void)
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0;
//不用延时了 12兆的晶振处理一次查不多要1us
dat=dat>>1;
DQ=1;
if(DQ==1) //假如是0 就直接右移
{
dat=dat|0x80; //如果是1 就在DAT的最高位 或 一个1
} //循环8次
delay(2);
}
return (dat);
}
/***************************************
写一个字节DS18b20
*****************************************/
void WRITEONECHAR(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0; //控制器拉低
DQ=dat&0x01;// 取最低位 从最低位写起
delay(5);//测试过了,要保持多余60us 66us
DQ=1;
dat=dat>>1; //右移一位
}
delay(4);// 每个命令有个间隔
}
/***************************************
读取温度值函数DS18b20
*****************************************/
READTEMPERATURE(void)
{
uchar a=0; // a b 和成一个温度
uchar b=0; //
uchar t=0;
init_DS18B20();
WRITEONECHAR(0xCC);//跳过命令 因为只有一个18B20
WRITEONECHAR(0x44); //开始温度转化
delay(20);
//可以不加延时 因为初始化里面有延时了
//完成第一步
init_DS18B20();
WRITEONECHAR(0xCC);
WRITEONECHAR(0xBE); //读取暂存器数据
a=READONECHAR();// 温度地位 lsb
b=READONECHAR();// 温度高位 msb
//舍弃小数点后的数字
//h还可以继续读 READONECHAR() 下面的温度上下限
t=(b<<4)|(a>>4);//b去高四位 a去低四位 这样 或 上就是一个温度
if(t>128)
{
t=-t+1;
}
delay(14);
return(t); //把t返回出去
}
/**********************************
数码管函数
************************************/
void display(uchar shi,uchar ge)
{
we=1;
P0=0xfe;
we=0;
P0=0xff;
du=1;
P0=shi;
du=0;
delayms();
we=1;
P0=0xfd;
we=0;
P0=0xff;
du=1;
P0=ge;
du=0;
delayms();
}
/***************************
主函数部分
***************************/
void main ()
{
uchar t0,t1 ,t,T_GE,T_SHIWEI;
init_DS18B20();
delay(20);
while(1)
{
t=READTEMPERATURE();
T_GE=t%10; // 去高四位
T_SHIWEI=t/10;//去低四位
t0=T_SHIWEI;
t1=T_GE;
display(table[t0],table[t1]);
}
}
你好好研究研究18B20读出数据的转换方法。还有重要的一点就是18B20的读写时序时间要求挺严格的。最好用示波器捕获一下时序时间是不是合适。
帮忙看下这个程序有问题吗