DS18B20+LCD1602数字温度传感器
uchar ReadOneByte()
{
uchar j,dat;
for(j=0;j<8;j++)
{
dq=1;
_nop_(); //至少1uS的恢复期
dq=0;
_nop_();
dq=1;
for(i=0;i<3;i++);//主机在15uS内读取DQ
dat>>=1;
if(dq==1)
dat|=0x80;
else
dat|=0x00;
for(i=0;i<15;i++);//一个读周期至少要60us
}
return(dat);
}
void temp_ds18b20()
{
uchar th,tl;
uint x;
float p;
init_ds18b20();
WriteOneByte(0xcc);
WriteOneByte(0x44);
delay(255);//等待转换最大为750ms,典型值为200mS
init_ds18b20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
tl=ReadOneByte();
th=ReadOneByte();
x=th;
x<=8;
x|=tl;//合并高低位
p=x*0.0625;//实际转换温度值为p
temp=p*100+0.5;//将小数转换为整数并保留两位小数,第三位小数四舍五入
}
/******************************************************/
/***********************数据转换***********************/
void datchx()
{
uchar d,t;
float g;
g=temp/100.00;
d=g;
t=(g-d)*100;//整数与小数部分分离,t为小数,d为整数;
bai=d/100;
shi=(d%100)/10;
ge=d%10;//整数分离
xi1=t/10;
xi2=t%10;
}
/****************************************************/
/******************LCD1602操作***********************/
void write_com(uchar dat)
{
rs=0;
rw=0;
P0=dat;
delay(3);
e=0;
e=1;
e=0;
}
void write_dat(uchar dat)
{
rs=1;
rw=0;
P0=dat;
delay(3);
e=0;
e=1;
e=0;
}
void init_lcd()
{
write_com(0x38);
write_com(0x0D);
write_com(0x06);
write_com(0x01);
}
void disp_lcd()
{
write_com(0x80);
for(i=0;i<16;i++)
{
write_dat(table2[i]);
delay(5);
}
write_com(0xc0);
for(i=0;i<5;i++)
{
write_dat(table3[i]);
delay(5);
}
write_dat(table1[bai]);
write_dat(table1[shi]);
write_dat(table1[ge]);
write_dat(table1[10]);
write_dat(table1[xi1]);
write_dat(table1[xi2]);
write_dat(table1[11]);
}
/****************************************************/
void main()
{
SP=0x30;
init_lcd();
while(1)
{
temp_ds18b20();
datchx();
disp_lcd();
}
}
DS18B20LCD1602数字温度传感 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)