程序中要用到LCD1602display.h頭文件 可以在我的另一篇文章中取得: http://www.zg4o1577.cn/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();
}
}
}