DS18B20温度传感器程序设计

Wenda ·
更新时间:2024-09-20
· 534 次阅读

本程序对应的开发板为蓝桥杯嵌入式开发板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); }
作者:初入江湖的郭大侠



ds18b20 程序设计 程序 传感器

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章