专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

温度测量DSB1820 lcd1602液晶显示

作者:佚名   来源:本站原创   点击数:  更新时间:2014年04月10日   【字体:

程序中要用到LCD1602display.h头文件 可以在我的另一篇文章中取得: http://www.51hei.com/mcu/3292.html  为同一个文件
#include <reg52.h>
#include <intrins.h>
#include "LCD1602display.h"
sbit DQ=P2^0;    //ds18b20
uint wendu=0;
uchar num,num1;
uint temperature=0;
uchar code range[]="===TEMPERTURE===";
uchar code ASCII[]="0123456789.";
uchar code table0[]="ROME TEMP:00.0C ";
uchar code table1[]="    ERRO !!!    ";
uchar temp[3]={0,0,0};
//********************延时
void delay1ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=114;y>0;y--);
}
//*************************初始化
bit init_DS18B20()
{
 bit flag;     //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
 DQ=1;
 _nop_();       //先拉高
 DQ=0;
 for(num=0;num<200;num++); //要求保持480~960us
 DQ=1;      //释放数据线
 for(num=0;num<10;num++); //等待DS18B20响应
 flag=DQ;     // 响应
 for(num=0;num<200;num++); //延时足够长时间(此延时函数为了防止收不到信号而进入死胡同)
 DQ=1;      //释放数据线
 return (flag);    //返回检测成功标志
}
//*******************************写温度数据
void DS18B20_WR_CHAR(uchar byte) // 先写低位
{
 for(num1=0;num1<8;num1++)
 {  
  DQ=1;
  _nop_();
  DQ=0;  //将数据线从高拉低时即启动写时序
  for(num=0;num<5;num++);//等待15us
  DQ=byte&0x01;
  for(num=0;num<15;num++); //延时约45us,DS18B20在约15~45us期间从数据线上采样
  byte>>=1;
  for(num=0;num<1;num++);//延时3us,两个写时序间至少需要1us的恢复期 
 }
 DQ=1;//释放数据线 
}
//**********************************读出温度数据
uchar DS18B20_RD_CHAR() //先读低位
{
 uchar byte=0;
 for(num1=0;num1<8;num1++)
 {
  DQ=1;  
  _nop_();
  DQ=0;  //给个低脉冲 
  _nop_();
  DQ=1;
  for(num=0;num<5;num++);  //延时约15us,使主机在15us内采样 
  byte>>=1;
  if(DQ==1)
   byte|=0x80;
  else
   byte|=0x00;
  for(num=0;num<1;num++);//延时3us,两个读时序之间必须有大于1us的恢复期
 }
 return (byte);
}
//*********************************温度计算
void DS18B20_WENDU()
{
 uchar temperaturel=0,temperatureh=0;
 if(init_DS18B20()==0)
 {
  DS18B20_WR_CHAR(0xcc);
  DS18B20_WR_CHAR(0x44);
  delay1ms(1000);
  if(init_DS18B20()==0)
  {
   DS18B20_WR_CHAR(0xcc);
   DS18B20_WR_CHAR(0xBE);
   _nop_();
   temperaturel=DS18B20_RD_CHAR();
   temperatureh=DS18B20_RD_CHAR();
   temperature=(temperatureh*256+temperaturel)*0.625;
   init_DS18B20();
  }
  //return (temperature);   
 }
}
//******************************温度显示
void display_DS18B20()  
{
 temp[2]=temperature/100%10;
 temp[1]=temperature%100/10;
 temp[0]=temperature%10;
 
 DisplayListChar(0, 1, table0);
 DisplayOneChar(10, 1, ASCII[ temp[2] ] );
 DisplayOneChar(11, 1, ASCII[ temp[1] ]  );
 DisplayOneChar(12, 1, ASCII[10] );
 DisplayOneChar(13, 1, ASCII[ temp[0] ] );
}
//*******************************主函数
main()
{
 InitLCM();
 DisplayListChar(0,0,range);
 DisplayListChar(0,1,table0);
 while(1)
 {
  if( init_DS18B20()==0)  
      { 
    DS18B20_WENDU();
    display_DS18B20();    
  }
 }
}
 

关闭窗口