DS18B20 Experiment of digital temperature sensor
STM32 Although there is a temperature sensor inside , But because of the chip temperature rise and other problems , It is quite different from the actual temperature , therefore , In this chapter, we will show you how to pass the STM32
To read the temperature of the external digital temperature sensor , To get a more accurate ambient temperature . In this chapter , We will learn to use single bus technology , Through it STM32 And external temperature sensor (
DS18B20) Communication of , The temperature obtained from the temperature sensor is displayed in the TFTLCD On the module .
1 DS18B20 brief introduction
DS18B20 By DALLAS
A new product launched by semiconductor company “ One wire bus ” Temperature sensor of interface . Compared with the traditional thermistor and other temperature measuring elements , It is a new type of small size , Wide voltage range , Digital temperature sensor with simple interface with microprocessor . One wire bus structure is simple and economical , It makes it easy for users to set up sensor networks , So as to introduce a new concept for the construction of measurement system , The measuring temperature range is -55~+125℃
, The accuracy is ±0.5℃. The field temperature is directly controlled by “ One wire bus ” Digital mode of transmission , The anti-interference performance of the system is greatly improved . It can read the temperature directly , And it can be realized by simple programming according to the actual requirements 9~l2
Digital value reading mode of bit . It works in 3~5.5V Voltage range , Various packaging forms are adopted , So the system design is flexible , convenient , The set resolution and the alarm temperature set by the user are stored in the EEPROM
in , Keep it after power down .
ROM In 64 Bit serial number is recorded by light before leaving factory , It can be seen as the DS18B20 Address sequence code of , each DS18B20 Of 64 The bit serial numbers are not the same . 64 position
ROM What's the arrangement : front 8 Bit is the product family code , next 48 The position is DS18B20 Serial number of , last 8 One is in the front 56
Bit cyclic redundancy check code (CRC=X8+X5+X4+1). ROM The role is to make every DS18B20 It's all different , In this way, it is possible to connect multiple nodes on one bus DS18B20.
All single bus devices require strict signal timing , To ensure the integrity of the data . DS18B20 share 6 Two signal types : Reset pulse , Reply pulse , write 0, write 1, read 0 And read
1. All these signals , Except for the reply pulse , The synchronous signal is sent by the host . And send all the commands and data are the first byte . Here we briefly introduce the timing of these signals :
①, Unique single bus interface mode ,DS18B20 Only one port line is needed to connect with microprocessor Modern microprocessors and DS18B20 Two way communication based on Internet . The anti-interference performance of the system is greatly improved .
② , Measuring range -55℃~+125℃, The accuracy is ±0.5℃.
③, Support multipoint networking , Multiple DS18B20 It can be connected in parallel on the only three wires , Parallel connection at most 8 individual , Multi point temperature measurement , If the quantity is too much , The power supply voltage will be too low , So the signal transmission is unstable .
④, Working power supply : 3.0~5.5V/DC ( Data line parasitic power supply can be used ).
⑤ , No peripheral components are needed in use .
⑥, The measurement results are as follows 9~12 Serial transmission in bit word mode .
1) Reset pulse and reply pulse
All communication on a single bus starts with an initialization sequence . Host output low level , Keep low for at least 480us,, To generate a reset pulse . Then the host releases the bus , 4.7K
The pull-up resistance will pull the single bus high , delayed 15~60 us, And enter the receiving mode (Rx). next DS18B20 Pull down the bus 60~240
us, To generate a low level reply pulse , In case of low level , Further delay 480 us.
2) Write timing
Write timing includes write timing 0 Timing and writing 1 sequential . All write timing requires at least 60us, And in 2 At least two independent write sequences are required 1us
Recovery time for , Both write sequences start when the host pulls down the bus . write 1 sequential : Host output low level , delayed 2us, Then release the bus , delayed 60us. write 0 sequential : Host output low level , delayed
60us, Then release the bus , delayed 2us.
3) Reading sequence
The single bus device is only used when the host sends the read sequence , To transmit data to the host , therefore , After the host sends the read data command , Read sequence must be generated immediately , So that the slave can transfer data . All read sequences require at least
60us, And in 2 At least two independent read sequences are required 1us Recovery time for . Each read sequence is initiated by the host , At least pull down the bus
1us. The host must release the bus during read timing , And at the beginning of the sequence 15us Internal sampling bus status . The typical reading sequence process is :
Host output low level delay 2us, Then the host goes into input mode 12us, Then read the current level of the single bus , Then delay 50us.
After understanding the single bus timing , Let's see DS18B20 Typical temperature reading process , DS18B20 The typical temperature reading process is : reset hair SKIP ROM command (
0XCC) Send the start conversion command ( 0X44) delayed reset send out SKIP ROM command ( 0XCC) Send read memory command ( 0XBE)
Read two bytes of data continuously ( That is temperature ) end .
DS18B20 encapsulation
2. Connection mode
Connect to STM32 upper Pin interface of ( Other options are available ) The connected pins are used for later programming
Single bus is a half duplex communication mode
DS18B20 share 6 Two signal types : Reset pulse , Reply pulse , write 0, write 1, read 0 And read 1. All these signals , Except for the reply pulse , The synchronous signal is sent by the host . And send all the commands and data are the first byte .
Talking about signal types , Talking about the way of code configuration , Let us know STM32 drive 18B20 process .
The signal line :PG9
//IO Direction setting
#define DS18B20_IO_IN() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;}
//PG9 Input module
#define DS18B20_IO_OUT() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;}
//PG9 Output mode
IO operation
#define DS18B20_DQ_OUT PGout(9) // Data port PG9
#define DS18B20_DQ_IN PGin(9) // Data port PG9
( 1). Reset pulse
All communication on a single bus starts with an initialization sequence . Host output low level , Keep low for at least 480
us,, To generate a reset pulse . Then the host releases the bus ,4.7K The pull-up resistance will pull the single bus high , delayed 15~60 us, And enter the receiving mode (Rx). next DS18B20 Pull down the bus 60~240
us, To generate a low level reply pulse .
// reset DS18B20 void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); // Set to output mode
DS18B20_DQ_OUT=0; // Pull down DQ
delay_us(750); // Pull down 750us( at least 480us)
DS18B20_DQ_OUT=1; //DQ=1 Pull up release bus
delay_us(15); //15US
// Enter acceptance mode , Waiting for response signal .
}
② Response signal
// wait for DS18B20 My response
// return 1: Not detected DS18B20 The existence of return 0: existence
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PA0 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;
}
③ Write timing
Write timing includes write timing 0 Timing and writing 1 sequential . All write timing requires at least 60us, And in 2 At least two independent write sequences are required 1us Recovery time for , Both write sequences start when the host pulls down the bus .
write 1 sequential : Host output low level , delayed 2us, Then release the bus , delayed 60us. write 0 sequential : Host output low level , delayed 60us, Then release the bus , delayed 2us.
/ Write a byte to DS18B20 //dat: Bytes to write
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT();// set up PA0 For output
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb) // High output
{
DS18B20_DQ_OUT=0;// Host output low level
delay_us(2); // delayed 2us
DS18B20_DQ_OUT=1;// Release the bus
delay_us(60); // delayed 60us
}
else // Low output
{
DS18B20_DQ_OUT=0;// Host output low level
delay_us(60); // delayed 60us
DS18B20_DQ_OUT=1;// Release the bus
delay_us(2); // delayed 2us
}
}
}
④ Reading sequence
The single bus device is only used when the host sends the read sequence , To transmit data to the host , therefore , After the host sends the read data command , Read sequence must be generated immediately , So that the slave can transfer data .
All read sequences require at least 60us, And in 2 At least two independent read sequences are required 1us Recovery time for . Each read sequence is initiated by the host , At least pull down the bus 1us. The host must release the bus during read timing , And at the beginning of the sequence 15us Internal sampling bus status .
The typical reading sequence process is : Host output low level delay 2us, Then the host goes into input mode 12us, Then read the current level of the single bus , Then delay 50us.
The typical reading sequence process is : Host output low level delay 2us, Then the host goes into input mode 12us, Then read the current level of the single bus , Then delay 50us.
// from DS18B20 Read a bit // Return value :1/0
u8 DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();// Set to output
DS18B20_DQ_OUT=0; // Output low level 2us
delay_us(2);
DS18B20_DQ_OUT=1; // Pull up release bus
DS18B20_IO_IN();// Set to input
delay_us(12);// delayed 12us
if(DS18B20_DQ_IN)data=1;// Read bus data
else data=0;
delay_us(50); // delayed 50us
return data;
}
Read a byte of data
// from DS18B20 Read a byte // Return value : Data read
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;
}
Let's see DS18B20 Typical temperature reading process ,DS18B20 The typical temperature reading process is : reset hair SKIP
ROM command (0XCC) Send the start conversion command (0X44) delayed reset send out SKIP
ROM command (0XCC) Send read memory command (0XBE) Read two bytes of data continuously ( That is temperature ) end .
3 Finally, the final source program ( You need to put the program in the STM32F4 Library function programming )
Open our DS18B20 Digital temperature sensor experiment project can see that we added ds18b20.c Documents and their
Header file ds18b20.h file , All ds18b20 Driver code and related definitions are distributed in these two files .
//ds18b20.c code
// reset DS18B20
#include "DS18B20"
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_DQ_OUT=0; // Pull down DQ
delay_us(750); // Pull down 750us
DS18B20_DQ_OUT=1; //DQ=1
delay_us(15); //15US
}
// wait for DS18B20 My response
// return 1: Not detected DS18B20 The existence of
// return 0: existence
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;
}
// from DS18B20 Read a bit
// Return value : 1/0
u8 DS18B20_Read_Bit(void)
{
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;
}
// from DS18B20 Read a byte
// Return value : Data read
u8 DS18B20_Read_Byte(void)
{
u8 i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
// Write a byte to DS18B20
//dat: Bytes to write
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);
}
}
}
// Start temperature conversion
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0x44);// convert
}
// initialization DS18B20 Of IO mouth DQ Simultaneous detection DS The existence of
// return 1: non-existent
// return 0: existence
u8 DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);// Enable GPIOG Clock
//GPIOG9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;// Normal output mode
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// Push pull output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;// Pull up
GPIO_Init(GPIOG, &GPIO_InitStructure);// initialization
DS18B20_Rst();
return DS18B20_Check();
}
// from ds18b20 Get the temperature value
// accuracy : 0.1C
// Return value : Temperature value ( -550~1250)
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; // The temperature is negative
}else temp=1; // The temperature is positive
tem=TH; // Get the top eight
tem<<=8;
tem+=TL; // Get the bottom eight
tem=(double)tem*0.625;// transformation
if(temp)return tem; // Return temperature value
else return -tem;
}
This part of the code is read according to the single bus operation sequence we introduced earlier DS18B20 The temperature value of ,DS18B20
The temperature of DS18B20_Get_Temp Function read , The return value of this function is signed short integer data , Of the return value
The scope is -550~1250, In fact, the temperature value has expanded 10 times .
Principal function ds18b20.h
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "ds18b20.h"
int main(void)
{
u8 t=0;
short temperature;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// Setting system interrupt priority group 2
delay_init(168); // Initialize delay function
uart_init(115200); // Initialize serial port baud rate to 115200
LED_Init(); // initialization LED
LCD_Init();
POINT_COLOR=RED;// Set the font to red
LCD_ShowString(30,50,200,16,16,"ALIX");
LCD_ShowString(30,70,200,16,16,"DS18B20 TEST");
LCD_ShowString(30,90,200,16,16,"ALIX");
LCD_ShowString(30,110,200,16,16,"2018/7/22");
while(DS18B20_Init()) //DS18B20 initialization
{
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;// Set the font to blue
LCD_ShowString(30,150,200,16,16,"Temp: . C");
while(1)
{
if(t%10==0)// each 100ms Read once
{
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
LCD_ShowChar(30+40,150,'-',16,0); // Show minus sign
temperature=-temperature; // Turn to positive
}else LCD_ShowChar(30+40,150,' ',16,0); // Remove the minus sign
LCD_ShowNum(30+40+8,150,temperature/10,2,16); // Show positive part
LCD_ShowNum(30+40+32,150,temperature%10,1,16); // Show decimal part
}
delay_ms(10); t++;
if(t==20)
{
t=0; LED0=!LED0;
}
}
Technology