51单片机ds18b20和lcd1602显示温度

发布时间:2018-06-29 20:43:39

/*本程序为基于51单片机的DS18b20lcd1602显示温度程序,1602数据线友P0口提供*/

程序已通过硬件测试 直接使用 作者:liuzqiang1016

#include

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P2^0;//ds18b20

sbit lcd_rw=P2^5;

sbit lcd_rs=P2^6;

sbit lcd_en=P2^7;

unsigned char code str1[]={"temperature: "};

unsigned char code str2[16]={" "};

uchar data disdata[5];

uint value;//温度值

uchar flag;//正负标志

/*************************lcd1602程序**************************/

void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<100;j++);

}

void write_com(unsigned char com)//写指令//

{ delay1ms(1);

lcd_rs=0;

lcd_rw=0;

lcd_en=0;

P0=com;

delay1ms(1);

lcd_en=1;

delay1ms(1);

lcd_en=0;

}

void write_dat(unsigned char dat)//写数据//

{ delay1ms(1);;

lcd_rs=1;

lcd_rw=0;

lcd_en=0;

P0=dat;

delay1ms(1);

lcd_en=1;

delay1ms(1);

lcd_en=0;

}

void lcd_init()//初始化设置//

{

write_com(0x38);delay1ms(5);

write_com(0x08);delay1ms(5);

write_com(0x01);delay1ms(5);

write_com(0x06);delay1ms(5);

write_com(0x0c);delay1ms(5);

}

void display(unsigned char *p)//显示//

{

while(*p!='\0')

{

write_dat(*p);

p++;

delay1ms(1);

}

}

init_play()//初始化显示

{ lcd_init();

write_com(0x80);

display(str1);

write_com(0xc0);

display(str2);

}

void delay_18B20(unsigned int i)//延时1微秒

{

while(i--);

}

void ds1820rst()/*ds1820复位*/

{

unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(4); //延时

DQ = 0; //DQ拉低

delay_18B20(100); //精确延时大于480us

DQ = 1; //拉高

delay_18B20(40);

}

uchar ds1820rd()/*读数据*/

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{ DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(uchar wdata)/*写数据*/

{unsigned char i=0;

for (i=8; i>0; i--)

{ DQ = 0;

DQ = wdata&0x01;

delay_18B20(10);

DQ = 1;

wdata>>=1;

}

}

read_temp()/*读取温度值并转换*/

{uchar a,b;

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

value=b;

value<<=8;

value=value|a;

if(value<0x0fff)

flag=0;

else

{value=~value+1;

flag=1;

}

value=value*(0.625);//温度值扩大10倍,精确到1位小数

return(value);

}

/*******************************************************************/

void ds1820disp()//温度值显示

{ uchar flagdat;

disdata[0]=value/1000+0x30;//百位数

disdata[1]=value%1000/100+0x30;//十位数

disdata[2]=value%100/10+0x30;//个位数

disdata[3]=value%10+0x30;//小数位

if(flag==0)

flagdat=0x20;//正温度不显示符号

else

flagdat=0x2d;//负温度显示负号:-

if(disdata[0]==0x30)

{disdata[0]=0x20;//如果百位为0,不显示

if(disdata[1]==0x30)

{disdata[1]=0x20;//如果百位为0,十位为0也不显示

}

}

write_com(0xc0);

write_dat(flagdat);//显示符号位

write_com(0xc1);

write_dat(disdata[0]);//显示百位

write_com(0xc2);

write_dat(disdata[1]);//显示十位

write_com(0xc3);

write_dat(disdata[2]);//显示个位

write_com(0xc4);

write_dat(0x2e);//显示小数点

write_com(0xc5);

write_dat(disdata[3]);//显示小数位

}

/********************主程序***********************************/

void main()

{ init_play();//初始化显示

while(1)

{read_temp();//读取温度

ds1820disp();//显示

}

}

51单片机ds18b20和lcd1602显示温度

相关推荐