DS18B20温度传感器程序设计

本程序对应的开发板为蓝桥杯嵌入式开发板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校验码。

扫描二维码关注公众号,回复: 10496753 查看本文章

连接:

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);	
}
																										  
发布了61 篇原创文章 · 获赞 145 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qqGHJ/article/details/105304878