第二篇文章主要介绍的是温度传感器DS18B20温度传感器
在上一篇文章中没有写出来,在设计LCD1602显示模式的时候出现了一个难题,就是分屏显示数据的问题,因为要显示的东西比较多但是显示屏只支持16*2的显示,所以要设置多个界面显示。在这我设置了几个按键作为触发的条件,进行界面的切换。
void anjiank1()
{
if(k1==0)
{
delay1ms(10);
if(k1==0)
{
lcd_init();
write_com(0x80);
display(table1);
write_com(0x80+0x40);
display(table2);
write_com(0x80+0x0A);
display(table3);
write_com(0x80+0x4A);
display(table4);
while(3)
{
xianshi1();
jinchu();
if(k2==0||k3==0)
{
break;
}
}
}
}
}
void anjiank3()
{
if(k3==0)
{
delay1ms(10);
if(k3==0)
{
lcd_init();
while(2)
{
xianshi3();
if(k1==0||k2==0)
{
break;
}
}
}
}
}
void anjiank2()
{
if(k2==0)
{
delay1ms(10);
if(k2==0)
{
lcd_init();
init_play();
while(4)
{
xianshi2();
ledss();
temp();
smoke();
if(k1==0||k3==0)
{
break;
}
}
}
}
}
再设计的过程中我只考虑了温度的检测,没有进行湿度的检测,所以在检测的过程中使用DS18B20温度传感器就可以,这个温度传感器不需要数模转换器就可以进行显示,现实的结果要在LCD1602上显示出来,所以需要设置一下LCD的另一个显示界面。
DS18B20温度传感器的两个模式就是读和写模式,具体的时序图可以查询其他的CSDN的大神!!
接下来的是DS18B20温度传感器的代码
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();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}