專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

溫度測(cè)量DSB1820 lcd1602液晶顯示

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月10日   【字體:

程序中要用到LCD1602display.h頭文件 可以在我的另一篇文章中取得: http://www.torrancerestoration.com/mcu/3292.html  為同一個(gè)文件
#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};
//********************延時(shí)
void delay1ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=114;y>0;y--);
}
//*************************初始化
bit init_DS18B20()
{
 bit flag;     //儲(chǔ)存DS18B20是否存在的標(biāo)志,flag=0,表示存在;flag=1,表示不存在
 DQ=1;
 _nop_();       //先拉高
 DQ=0;
 for(num=0;num<200;num++); //要求保持480~960us
 DQ=1;      //釋放數(shù)據(jù)線
 for(num=0;num<10;num++); //等待DS18B20響應(yīng)
 flag=DQ;     // 響應(yīng)
 for(num=0;num<200;num++); //延時(shí)足夠長(zhǎng)時(shí)間(此延時(shí)函數(shù)為了防止收不到信號(hào)而進(jìn)入死胡同)
 DQ=1;      //釋放數(shù)據(jù)線
 return (flag);    //返回檢測(cè)成功標(biāo)志
}
//*******************************寫溫度數(shù)據(jù)
void DS18B20_WR_CHAR(uchar byte) // 先寫低位
{
 for(num1=0;num1<8;num1++)
 {  
  DQ=1;
  _nop_();
  DQ=0;  //將數(shù)據(jù)線從高拉低時(shí)即啟動(dòng)寫時(shí)序
  for(num=0;num<5;num++);//等待15us
  DQ=byte&0x01;
  for(num=0;num<15;num++); //延時(shí)約45us,DS18B20在約15~45us期間從數(shù)據(jù)線上采樣
  byte>>=1;
  for(num=0;num<1;num++);//延時(shí)3us,兩個(gè)寫時(shí)序間至少需要1us的恢復(fù)期 
 }
 DQ=1;//釋放數(shù)據(jù)線 
}
//**********************************讀出溫度數(shù)據(jù)
uchar DS18B20_RD_CHAR() //先讀低位
{
 uchar byte=0;
 for(num1=0;num1<8;num1++)
 {
  DQ=1;  
  _nop_();
  DQ=0;  //給個(gè)低脈沖 
  _nop_();
  DQ=1;
  for(num=0;num<5;num++);  //延時(shí)約15us,使主機(jī)在15us內(nèi)采樣 
  byte>>=1;
  if(DQ==1)
   byte|=0x80;
  else
   byte|=0x00;
  for(num=0;num<1;num++);//延時(shí)3us,兩個(gè)讀時(shí)序之間必須有大于1us的恢復(fù)期
 }
 return (byte);
}
//*********************************溫度計(jì)算
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] ] );
}
//*******************************主函數(shù)
main()
{
 InitLCM();
 DisplayListChar(0,0,range);
 DisplayListChar(0,1,table0);
 while(1)
 {
  if( init_DS18B20()==0)  
      { 
    DS18B20_WENDU();
    display_DS18B20();    
  }
 }
}
 

關(guān)閉窗口