ds18b20测温#include#include#define uchar unsigned char#define uint unsigned int sbit ds=P1^1;sbit lcden=P2^1;sbit lcdrs=P2^0;uint temp;float f_temp;void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset(void) //
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/15 03:52:55
ds18b20测温#include#include#define uchar unsigned char#define uint unsigned int sbit ds=P1^1;sbit lcden=P2^1;sbit lcdrs=P2^0;uint temp;float f_temp;void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset(void) //
ds18b20测温
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^1;
sbit lcden=P2^1;
sbit lcdrs=P2^0;
uint temp;
float f_temp;
void delay(uint z)//延时函数
{uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //初始化函数
{uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读一位函数
{uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void)//读一个字节函数
{uchar i,j,dat;
dat=0;
for(i=1;i1;
if(testb)// xie 1
{ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{ ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //ds18b20 开始转换
{dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp()// 读取寄存器温度
{uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp0;i--)
{write_com(0x80);
write_data(f_temp+0x30);
delay(5);}
comm(buff);
for(i=4;i>0;i--)
{write_com(0x80);
write_data(f_temp+0x30);
delay(5);
}
}
}
液晶不能正常显示温度,只会一直是0.帮我看下这个程序问题.
ds18b20测温#include#include#define uchar unsigned char#define uint unsigned int sbit ds=P1^1;sbit lcden=P2^1;sbit lcdrs=P2^0;uint temp;float f_temp;void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void dsreset(void) //
首先,如果你要使用12864液晶显示温度的话,请保证你本身的液晶显示程序没有问题,这个可以通过让他随便显示一个数据或字符得到验证.假设本省液晶显示程序没有问题,那十有八九的问题就出在ds18B20温度传感器的程序上,应该是你的ds18b20温度传感器本身就没有工作,也就是说你的f_temp一直就是默认的值0,因为温度传感器没有正常工作吗,所以程序中也就无法给f_temp重新赋值,在保证液晶程序正确的情况下,你可以这样,给你要显示的变量,比如这里的这个f_temp赋上一个值,看他还显0吗,显然,如果现在显示的是你赋给他的这个值,那问题就出在我说的这个地方,温度传感器没有工作.我估计十有八九是这样的原因.对于温度传感器,你首先要明白,对于这类单总线的器件,由于其本省外部结构简单,所以他是需要较为复杂的软件程序来进行弥补的.本身它对时序的要求比较严格,所以延时一定要尽量精确,请在这一方面进行详细的检查.对于每一次的ds18B20操作,基本都是一个复位、一个ROM指令、一个ram指令这样的顺序.ds18B20前段时间我用过,不过现在算起也有一些时间了,有些东西也在忘,所以暂时对你的程序我也不能帮你进行详细的检查了.你自己试试看吧.有时间的话我就在帮你瞅瞅.
刚才简单看了一下,你ds18B20程序肯定是有问题.首先就是你复位函数里最后少一个延时,这个延时是要有的,不然ds18b20是不能正常工作的.
简单说明如下,先多定义一个延时函数,以后用着方便.
void delay1(uchar count)
{
while(count>0) count--;
}
void dsreset(void) //初始化函数
{
DS=0;
delay1(103); //延时804.473,符合480-960us之间
DS=1;
delay1(4); //延时36.449us,符合15-60us之间
delay1(20); //延时164.494us,符合60-240us之间(这个你少了!)
}
下面是读一位的函数,感觉也是延时有点问题,修改如下:(头文件多包涵一个#include ,这是定义下面调用的_nop_()函数用的头文件,该函数对于51系列12时钟单片机执行一次的时间为1us)
bit tempreadbit(void) //读一位函数
{uint i;
bit dat;
ds=0;
_nop_();
ds=1;
_nop_();
dat=ds;
delay1(7);
return(dat);
}
下面是写一个字节的函数(我只是改成了我用的延时函数,如果你的延时效果和我定义是一样的,其实也没有必要改,但是一定保证延时的时间,即时序!两个i++执行下来是1us吗,我没试,一般延时一毫秒我都是习惯用_nop_()函数,是的话你不该也成)
void tempwritebyte(uchar dat)
{uint i;
uchar j;
bit testb;
for(j=1;j>1;
if(testb)// xie 1
{ds=0;
_nop_();
ds=1;
delay1(7);
}
else
{ ds=0;
delay1(7);
ds=1;
_nop_();
}
}
}
上面这三个函数算是基础,一定要保证时序的准确性,先给你检查了这三个,你自己看看其他的地方还有没有需要是要改的.ds18B20就这样,你只要保证了时序,一般按照数据手册来写就差不多了.网上有很多现成的资料,在不理解的话你自己下下来看看.ds18b20的源程序网上一般很好找的.一定自己多看看数据手册,把一些最基本的搞清楚.最近事比较多,就不能给你细看了,就到这,