51单片机ds18b20和lcd1602显示温度

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dsl820wr (Oxcc) ;//*跳过读序列号*/ dsl820wr(0xbe) ;//*读取温度*/a=dsl820rd();
b=dsl820rd();
value二b;
value«=8;
value=value a;
if(value<OxOfff)
flag=O;
else
{value=\ralue+l;
f 1 agda t二0x20; //正温度不显示符号else
flagdat=0x2d; //负温度显示负号:-
if(disdata[0]==ຫໍສະໝຸດ Baidux30)
{disdata[0] =0x20;//如果百位为0,不显示if(disdata[l]=0x30)
{disdata[l]=0x20;//如果百位为0,十位为0也不显示
sbit lcd_rw=P2*5;
I
sbit lcd_rs二P2 6;
sbit lcd_en二P2"7;
unsigned char code strl [] = {z/temperature:"};
unsigned char code str2[16] = {" "};
uchar data disdata[5J;
lcd_en=0;
void write_dat (unsigned char dat)//写数据// { delaylms(l);;
lcd_rs=l;
lcd_rw=0;
lcd_en=0;
P0=dat;
delaylms(1);
lcd_en=l;
delaylms(1);
lcd_en=0;
}
void lcd_init ()//初始化设胃7/
void display (unsigned char *p)//显示〃{
while(*p!=,\0f)
{
write_dat(*p);
p++;
delaylms (1);
}
s
}
init_play() //初始化显示
{ lcd_init0;
write_com(0x80);
display(strl);
write_com(OxcO);
/*本程序为基于51单片机的DS18B20与lcdl602显示温度程序,1602数据线友P0口提供
*/
程序已通过硬件测试直接使用作者:liuzqiangl016
#include<>
^define uchar unsigned char
^define uint unsigned int
sbit DQ二P2"0;//dsl8b20
DQ二1; //给脉冲信号if(DQ)
dat =0x80; delay_18B20(10);
}
return(dat);
}
void ds 1820wr (uchar wdata)/*写数据*/{unsigned char i=0;
for (i=8; i>0; i—)
{ DQ = 0;
DQ = wdata&OxOl;
for(i=0;i<ms;i++)
for(j=0;j<100;j卄);
}
void write_com(unsigned char com)//写扌旨令//
{ delaylms(1);
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delaylms(1);
lcd_en二1;
delaylms(1);
delay_18B20(10);
DQ = 1;
wdata>>=l;
read.temp () /*读取温度值并转换*/
{uchar a, b;
dsl820rst 0 ;
dsl820wr(0xcc) ;//*跳过读序列号*/
dsl820wr(0x44) ;//*启动温度转换*/ dsl820rst 0;
disdata _0] =value/1000+0x30; //百位数disdatall] =value%1000/100+0x30; //十位数disdata L2]=value%100/10+0x30;//个位数disdata [3] =value%10+0x30; //小数位
if(flag==O)
uint value;//温度值
uchar flag;//正负标志

/***************経********lcdl602程序**************************/
void delay 1ms(unsigned int ms)//延时1亳秒(不够精确的)
{
unsigned int i, j;
display(str2);
}
void delay_18B20(unsigned int i)//延时1微秒{
while(i--);
}
void dsl820rst()/*dsl820复位*/
{
unsigned char x=0;
DQ = 1;//DQ复位
delay_18B20(4) ;//延时
DQ = 0;//DQ拉低
{
write_com(0x38);delaylms(5);
write_com(0x08);delaylms(5);
write_com(0x01);delaylms(5);
\vrite_com(0x06) ; delaylms (5);
\vrite_com(0x0c) ; delaylms (5);
}
write_com(OxcO);
uTite_dat (flagdat) ;//显示符号位write_com(Oxcl);
write_dat(disdata[01) ;//显示百位write_com(0xc2);
write_dat(disdata[ll) ;//显示十位write_com(0xc3);
flag=l;
}
value二value*;//温度值扩大10倍,精确到1位小数return(value);
/*******************************************************************/
void dsl820disp() //温度值显示{ uchar flagdat;
delay_18B20(100) ; //精确延时大于480us
DQ = 1;//拉髙
delay_18B20(40);
uchar dsl820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i二8;i>0;i—)
{ DQ二0;〃给脉冲信号dat»=l;
相关文档
最新文档