打印

请指点程序有时显示不是实际温度值哪里错了并详解此程序

[复制链接]
1636|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
haojianfu12345|  楼主 | 2011-3-20 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,tmph,tmpl;
sbit ds18b20=P2^2;
sbit duan=P2^6;
sbit wei=P2^7;
sbit lcde=P3^4;
sbit rs=P3^5;
              //下面是1602的驱动程序
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
void write_com(uchar com,bit i) //是命令写0 数据写1
{
  rs=i;
  P0=com;
  delay(5);
  lcde=1;
  delay(5);
  lcde=0;
}
void lcd1602init(void)
{
  
  duan=0;
  wei=0;
  write_com(0x01,0);
  write_com(0x02,0);
  write_com(0x06,0);
  write_com(0x0c,0);
  write_com(0x38,0);

}
void display(uchar x,uchar y,uchar date)   // 显示函数
{
x&=0x01;
y&=0x0f;
if(x)
  {
   y+=0x40;
  }
  y+=0x80;
  write_com(y,0);
  write_com(date,1);
}
     
void delayms(uint xms)
{
uint i,j;
   for(i=xms;i>0;i--)
     for(j=110;j>0;j--);
}
/////////////////////////////////////////////////////////
/////DS18B20部分////////////
///////////////////////////

  //延时部分
void delay_600us()
{
  uchar i;
  for(i=0;i<180;i++);
}//延时600us

void delay_400us()
{
uchar i;
  for(i=0;i<120;i++);
}
void delay_60us()
{
  uchar i;
  for(i=0;i<18;i++);
}//延时60us
void delay_15us()
{
  uchar i;
   for(i=0;i<3;i++);
}//延时15us
//复位脉冲
bit resetpulse(void)
{
    ds18b20=0;
    delay_600us();
    ds18b20=1;
    delay_60us();
    return ds18b20;
}
//ds18b20初始化
void ds18b20_init(void)
{
   while(1)
   {
    if(!resetpulse()) //收到ds18b20的低电平信号
     {
        ds18b20=1;
        delay_400us();
        break;
     }
     else
       resetpulse();  //继续发送复位信号
   }
}
void ds18b20_write_byte(uchar date) //写一个字节
{
  uchar i;
    for(i=0;i<8;i++)    //一个字节八位
      {
      
         if((date&0x01)==0x01)
        {
         ds18b20=0;
         _nop_();    ///////////////////////请解释一下这块是什么意思
         ds18b20=1;
         delay_60us();
        }  //end if
        else           //写入0
        {
        ds18b20=0;  
       delay_60us();
       ds18b20=1;
        } //end else
       delay_15us();
       date>>=1;  //右移一位
     }
}
uchar ds18b20_read_byte(void)  //读一个字节
{
   uchar i,u;
     for(i=0;i<8;i++)  
     {
       u>>=1;
      ds18b20=0;
      _nop_();
              //释放总线
      ds18b20=1;
   _nop_();
   _nop_();                    ////////////////////////////这块什么意思
       if(ds18b20==1)     //读1
        {
  u|=0x80;
           
        }
       else
        { u=u&0x7f;       //读0
        
        }
       delay_60us();
     
     }
  return u;
  }
  
uchar read_temperaturn()
{
   ds18b20_init();            //初始化;
   ds18b20_write_byte(0xcc); //跳过ram;
   ds18b20_write_byte(0x44); //启动温度测量  当为高电平时转换完成
   delayms(750);             //转换时间要求
   
   ds18b20_init();            //初始化;
   ds18b20_write_byte(0xcc); //跳过ram;
   ds18b20_write_byte(0xbe); //采集温度
  delayms(750);
   tmpl=ds18b20_read_byte();    //低位温度数据
   tmph=ds18b20_read_byte();    //高位温度数据
  tmph<<=4;           //左移4位
  tmph+=(tmpl&0xf0)>>4;
  return(tmph);
  }

void main()
{  

   uchar temph=0;
   uchar templ=0;
   lcd1602init();
   while(1)
    { temp=read_temperaturn();
      
   temph=temp/10+'0';    ////////////////请解释一下+‘0’是什么意思
   templ=temp%10+'0';
      delayms(20);
   display(0,0,temph);
   display(0,1,templ);
  
    }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

1

粉丝