首先,如果你要使用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 <intrins.h>,这是定义下面调用的_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<=8;j++) {testb=dat&0x01; dat=dat>>1; if(testb)// xie 1 {ds=0; _nop_(); ds=1; delay1(7); } else { ds=0; delay1(7); ds=1; _nop_(); } } } 上面这三个函数算是基础,一定要保证时序的准确性,先给你检查了这三个,你自己看看其他的地方还有没有需要是要改的。ds18b20就这样,你只要保证了时序,一般按照数据手册来写就差不多了。网上有很多现成的资料,在不理解的话你自己下下来看看。ds18b20的源程序网上一般很好找的。一定自己多看看数据手册,把一些最基本的搞清楚。最近事比较多,就不能给你细看了,就到这,祝你成功!