文章目录
-
- DS18B20
-
- 技术性能特征
- DS18B20封装
- 连接方式
- 信号类型
-
- 复位脉冲
- 应答信号
- 写时序
- 温度读取过程
- 实验代码
DS18B20
技术性能特征
独特的单总线接口方式 连接到微处理器只需要一条口线 实现双向通信 提高系统的抗干扰性 2.测温范围-555℃~ 125℃ 精度±0.5℃ 支持多点组网 并联8实现多点测温 工作电源 3.0~5.5V DC 不需要任何外围电路 测量结果为9~12位数字串行传输
DS18B20封装
连接方式
信号类型
复位脉冲 应答脉冲 写0 写1 读0 读1 除响应脉冲外,主机还发出同步信号 信号线:PG9(探索者)
复位脉冲
单总线上的所有通信都是从初始序列开始的 主机输出低电平 至少保持低电时间480us 产生复位脉冲 后主机释放总线 上拉电阻拉高单总线 延时15~60us 进入接收 而后DS18B20拉低总线60~240us 产生低电平响应
//复位DS18B20 void DS18B20_Rst(void) {
DS18B20_IO_OUT(); //SET PG11 OUTPUT DS18B20_DQ_OUT=0; //拉低DQ delay_us(750); //拉低750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US }
应答信号
u8 DS18B20_Check(void) {
u8 retry=0; DS18B20_IO_IN();//SET PG11 INPUT while (DS18B20_DQ_IN&&retry<200) {
retry ; delay_us(1); }; if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)return 1;
return 0;
}
写时序
包括写0 写1 主机拉低总线时 写 写1:主机输出低电平 延时2us 然后释放总线 延时60us
写0: 主机输出低电平 延时60us 释放总线 延时2us
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT();//SET PG11 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
{
DS18B20_DQ_OUT=0;// Write 1 主机输出低电平
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;// Write 0 主机输出低电平
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
u8 DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();//SET PG11 OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();//SET PG11 INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
u8 DS18B20_Read_Byte(void) // read one byte
{
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
温度读取过程
复位->发SKIP ROM命令 ->发开始转换命令 -> 延时 ->复位 ->发送SKIPROM命令 ->发读存储器命令 ->连续读出两个字节数据 ->结束
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得低八位
tem=(double)tem*0.625;//转换
if(temp)return tem; //返回温度值
else return -tem;
}
实验代码
int main(void)
{
u8 t=0;
short temperature;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
LED_Init();
LCD_Init();
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"DS18B20 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2021/10/10");
while(DS18B20_Init())
{
LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
POINT_COLOR=BLUE;
LCD_ShowString(30,150,200,16,16,"Temp: . C");
while(1)
{
if(t%10==0)//每100s读一次
{
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
LCD_ShowChar(30+40,150,'-',16,0);//负号
temperature=-temperature; //转正
}else LCD_ShowChar(30+40,150,' ',16,0); //去掉负号
LCD_ShowNum(30+40+8,150,temperature/10,2,16); //显示正数
LCD_ShowNum(30+40+32,150,temperature%10,1,16); //显示小数部分
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
}