本程序对应的开发板为蓝桥杯嵌入式开发板stm32f103rbt6,为中型mcu。DS18B20是单线接口数字温度传感器,具体特征如下图。
DS18B20包括寄生电源电路、64位ROM和单线接口电路、暂存器、EEPROM、8位CRC生成器和温度传感器等。寄生电源电路可以实现外部电源供电和单线寄生供电,64位ROM中存放的48位序列号用于是吧同一单线 上连接的多个DS18b20,以实现多点测温。
64位ROM代码的格式为:
8位CRC校验码+48位序列号+8位系列码(0x28)
其中8位CRC校验码是48位序列号和8位系列码的CRC校验码。
连接:
P4.6(PA6)-P3.6(TDQ)
程序:
ds18b20.c
#include "stm32f10x.h"
#include "ds18b20.h"
#define delay_us(X) delay((X)*72/5)
void delay(unsigned int n)
{
while(n--);
}
void ds18b20_init_x(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
/* Configure Ports */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//
void mode_input1(void )
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void mode_output1(void )
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//
uint8_t ow_reset(void)
{
uint8_t err;
OW_DIR_OUT(); // pull OW-Pin low for 480us
OW_OUT_LOW(); // disable internal pull-up (maybe on from parasite)
delay_us(400); //about 480us
// set Pin as input - wait for clients to pull low
OW_DIR_IN(); // input
delay_us(66);
err = OW_GET_IN(); // no presence detect
// nobody pulled to low, still high
// after a delay the clients should release the line
// and input-pin gets back to high due to pull-up-resistor
delay_us(480-66);
if( OW_GET_IN() == 0 ) // short circuit
err = 1;
return err;
}
uint8_t ow_bit_io( uint8_t b )
{
OW_DIR_OUT(); // drive bus low
OW_OUT_LOW();
delay_us(1); // Recovery-Time wuffwuff was 1
if ( b ) OW_DIR_IN(); // if bit is 1 set bus high (by ext. pull-up)
#define OW_CONF_DELAYOFFSET 5
delay_us(15-1-OW_CONF_DELAYOFFSET);
if( OW_GET_IN() == 0 ) b = 0; // sample at end of read-timeslot
delay_us(60-15);
OW_DIR_IN();
return b;
}
uint8_t ow_byte_wr( uint8_t b )
{
uint8_t i = 8, j;
do
{
j = ow_bit_io( b & 1 );
b >>= 1;
if( j ) b |= 0x80;
}
while( --i );
return b;
}
//
uint8_t ow_byte_rd( void )
{
return ow_byte_wr( 0xFF );
}
unsigned char dsb_read(void)
{
unsigned char th,t1;
ow_reset();
ow_byte_wr(0xcc);
ow_byte_wr(0x44);
ow_reset();
ow_byte_wr( 0xcc );
ow_byte_wr ( 0xbe );
t1=ow_byte_wr(0xff);
th=ow_byte_wr(0xff);
return (th<<8)+t1;
}
主程序
#include "stm32f10x.h"
#include "lcd.h"
#include "ds18b20.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
unsigned long Tick_Ms;
unsigned char string[20];
unsigned char Sec,Sec1;
unsigned char DSB_Val;
void DSB_Proc(void);
int main(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
ds18b20_init_x();
LCD_DisplayStringLine(Line0," ");
LCD_DisplayStringLine(Line1," ");
LCD_DisplayStringLine(Line2," ");
LCD_DisplayStringLine(Line3," ");
LCD_DisplayStringLine(Line4," ");
LCD_DisplayStringLine(Line5," ");
LCD_DisplayStringLine(Line6," ");
LCD_DisplayStringLine(Line7," ");
LCD_DisplayStringLine(Line8," ");
LCD_DisplayStringLine(Line9," ");
while (1)
{
DSB_Proc();
}
}
void DSB_Proc(void)
{
if(Sec!=Sec1)
{
Sec1=Sec;
DSB_Val=dsb_read();
sprintf((char*)string,"Temp :%5.2fC",DSB_Val/16.0);
LCD_DisplayStringLine(Line6,string);
}
}
void SysTick_Handler(void)
{
TimingDelay--;
Tick_Ms++;
if(Tick_Ms%1000==0)Sec++;
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}