温度测量DSB1820 lcd1602液晶显示
2015-02-09 来源:51hei
程序中要用到LCD1602display.h头文件 可以在我的另一篇文章中取得: http://www.51hei.com/mcu/3292.html 为同一个文件
#include
#include
#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();
}
}
}
进入单片机查看更多内容>>
#include
#include
#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();
}
}
}
上一篇:C51单片机串口通信
下一篇:数码语音温度计设计方案
相关文章