[求助帖]用ds18b20和12864显示即时温度,结果温度没变化

2019-07-16 00:22发布

程序如下:
#include<reg51.h>
#define uchar unsigned char
#define LCD_data P0             //数据口
sbit RS  =  P2^0;            //寄存器选择输入
sbit RW  =  P2^1;            //液晶读/写控制
sbit E   =  P1^6;            //液晶使能控制
sbit PSB =  P2^2;
sbit DQ=P3^2;
uchar a,b,t;                 
uchar tempbuf[3];
void delay(uchar z)
  {
     while(z--);
  }

void init_ds18b20()
  {
   uchar x=0;
   DQ=1;
   delay(10);
   DQ=0;
   delay(80);
   DQ=1;
   delay(14);
   x=DQ;
   delay(20);
  }

void write_onechar(uchar dat)
{
   uchar i=0;
    for(i=0;i<8;i++)
     {
       DQ=0;
       DQ=dat&0x01;
       delay(5);
       DQ=1;
       dat=dat>>=1;
     }
     delay(4)
}

uchar read_onechar()
{
    uchar i=0;uchar dat=0;
      for(i=0;i<8;i++)
        {
         DQ=0;
         dat>>=1;
         DQ=1;
         if(DQ) dat|=0x80;
         delay(4);
       }
             return(dat);
}
uchar read_temperature()
  {
   init_ds18b20();
   write_onechar(0xcc);
   write_onechar(0x44);
   delay(100);
   init_ds18b20();
   write_onechar(0xcc);
   write_onechar(0xbe);
   delay(100);
   a=read_onechar();
   b=read_onechar();
   a=(a&0xf0)>>4;      
   b=b<<4;
   t=b|a;
   return(t);
  }
  void temperature(void)
  {
    tempbuf[0]=t/10+0x30;
    tempbuf[1]=t%10+0x30;             
}
void chk_busy()
{  RS=0;
   RW=1;
   E=1;
   LCD_data=0xff;
   while((LCD_data&0x80)==0x80);
   E=0;
}
  void write_com(uchar cmdcode)
{
        chk_busy();
        RS=0;
        RW=0;
        E=1;
        LCD_data=cmdcode;
         E=0;
}  
void write_data(uchar Dispdata)
{
        chk_busy();
        RS=1;
        RW=0;
        E=1;
        LCD_data=Dispdata;
        E=0;  
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
        PSB = 1;  
        write_com(0x30);       //选择基本指令集
        write_com(0x0c);       //开显示(无游标、不反白)
        write_com(0x01);       //清除显示,并且设定地址指针为00H
        write_com(0x06);      // 游标右移
}
void hzkdis(uchar *s)
{
    while(*s>0)                
    {
        write_data(*s);
        s++;
        delay(50);
    }
}

void main()
{          uchar i=0;
        lcdreset();
        while(1)
        {   
                read_temperature();
                temperature();
                write_com(0x80);
                hzkdis("温度为:    ");
                write_com(0x84);
                write_data(tempbuf[0]);
                write_com(0x85);
                write_data(tempbuf[1]);
                delay(10);
        }
}希望大神能就我写的程序进行修改不要另外写一个,谢谢。。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。