总结:如何驱动DS18B20温度传感器
2016-04-04 18:32
531 查看
DS18B20时序分析:
以下是STM32的驱动代码:
#include "bsp_ds18b20.h" static void DS18B20_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); } static void DS18B20_Mode_IPU(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); } static void DS18B20_Mode_Out_PP(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DS18B20_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(DS18B20_PORT, &GPIO_InitStructure); } static void DS18B20_Rst(void) { DS18B20_Mode_Out_PP(); DS18B20_DATA_OUT(LOW); Delay_us(750); DS18B20_DATA_OUT(HIGH); Delay_us(15); } static uint8_t DS18B20_Presence(void) { uint8_t pulse_time = 0; DS18B20_Mode_IPU(); while( DS18B20_DATA_IN() && pulse_time<100 ) { pulse_time++; Delay_us(1); } if( pulse_time >=100 ) return 1; else pulse_time = 0; while( !DS18B20_DATA_IN() && pulse_time<240 ) { pulse_time++; Delay_us(1); } if( pulse_time >=240 ) return 1; else return 0; } static uint8_t DS18B20_Read_Bit(void) { uint8_t dat; DS18B20_Mode_Out_PP(); DS18B20_DATA_OUT(LOW); Delay_us(10); DS18B20_Mode_IPU(); //Delay_us(2); if( DS18B20_DATA_IN() == SET ) dat = 1; else dat = 0; Delay_us(45); return dat; } uint8_t DS18B20_Read_Byte(void) { uint8_t i, j, dat = 0; for(i=0; i<8; i++) { j = DS18B20_Read_Bit(); dat = (dat) | (j<<i); } return dat; } void DS18B20_Write_Byte(uint8_t dat) { uint8_t i, testb; DS18B20_Mode_Out_PP(); for( i=0; i<8; i++ ) { testb = dat&0x01; dat = dat>>1; if (testb) { DS18B20_DATA_OUT(LOW); Delay_us(8); DS18B20_DATA_OUT(HIGH); Delay_us(58); } else { DS18B20_DATA_OUT(LOW); /* 60us < Tx 0 < 120us */ Delay_us(70); DS18B20_DATA_OUT(HIGH); Delay_us(2); } } } void DS18B20_Start(void) { DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0X44); } uint8_t DS18B20_Init(void) { DS18B20_GPIO_Config(); DS18B20_Rst(); return DS18B20_Presence(); } float DS18B20_Get_Temp(void) { uint8_t tpmsb, tplsb; short s_tem; float f_tem; DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0X44); DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); DS18B20_Write_Byte(0XBE); tplsb = DS18B20_Read_Byte(); tpmsb = DS18B20_Read_Byte(); s_tem = tpmsb<<8; s_tem = s_tem | tplsb; if( s_tem < 0 ) f_tem = (~s_tem+1) * 0.0625; else f_tem = s_tem * 0.0625; return f_tem; } /*************************************END OF FILE******************************/
相关文章推荐
- 类中似有属性的访问方式
- 类中没有构造方法的三种情况
- 玩玩nmap
- 一站式学习Wireshark(七):Statistics统计工具功能详解与应用
- Uvalive6885(最短路)
- putchar()
- return用法
- LA 3266&HDU 1052 Tian Ji -- The Horse Racing(田忌赛马,贪心)
- linux 用户及组的管理
- OpenGL之坐标转换(好文-清晰版)
- 初识asynctask和handler
- 抽象类与接口之间的关系
- sizeof用法汇总
- LeetCode之5_Longest Palindromic Substring
- 九九乘法表
- 接口与抽象类典型应用例子
- string用法
- 如何使用s:iterator循环每4条数据换一次行的代码
- 4.2日学习记录
- 【Android开发经验】使用Ant批量打包Android应用全然指南