标题:
LCD1602显示DS18B20温度(两位小数)
[打印本页]
作者:
echoma
时间:
2018-9-9 22:09
标题:
LCD1602显示DS18B20温度(两位小数)
没有报警和其他功能,因为是测人体表面温度,就没有考虑复数。
优点是程序简明清晰,可以作为基础参考
采用的是HC6800-ES V2.0开发板,所以接口需要自己根据实际情况改变
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar num;
float f_temp;
sbit DQ=P3^7;
sbit lcdrs=P2^6;
sbit RW=P2^5;
sbit lcden=P2^7;
uchar table0[6]={'0'};
void delay_us(uint i)
{
while(i--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcden=0;
lcdrs=0;
RW=0;
P0=com;
delay(1);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcden=0;
lcdrs=1;
RW=0;
P0=date;
delay(1);
lcden=1;
delay(5);
lcden=0;
}
void init()
{ RW=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void Init_DS18B20(void)
{
uchar x=0;
DQ = 0;
x=103;
while(x>0)x--;
DQ=1;
x=4;
while(x>0)x--;
}
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay_us(40);
}
return(dat);
}
void WriteOneChar(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else
{
DQ=0;
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
uint ReadTemp(void)
{
uchar a=0,b=0;
uint temp=0;
Init_DS18B20();
delay(1);
WriteOneChar(0xCC);
WriteOneChar(0x44);
Init_DS18B20();
delay(1);
WriteOneChar(0xCC);
WriteOneChar(0xBE);
a=ReadOneChar();
b=ReadOneChar();
temp = b<<8;
temp |= a;
f_temp=temp*0.0625;
temp=f_temp*100+0.5;
return temp;
}
void show_WD(uint t)
{
table0[0]='+';
table0[1]=(t/1000)+'0';
table0[2]=(t/100%10)+'0';
table0[3]='.';
table0[4]=(t/10%10)+'0';
table0[5]=(t%10)+'0';
write_com(0x80);
for(num=0;num<6;num++)
write_data(table0[num]);
}
void main()
{
RW=0;
init();
while(1)
{
show_WD(ReadTemp());
delay(1);
}
}
复制代码
作者:
文凤轩
时间:
2018-9-10 07:23
谢谢分享
作者:
392768922
时间:
2018-12-4 19:31
谢谢分享!!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1