当前位置: 首页 > news >正文

stm32f103zet6 ds18b20

main.c

// main.c
#include "sys.h"
#include "ds18b20.h"int main(void){	uart_init(9600);delay_init();while(DS18B20_Init())	//DS18B20初始化	{printf("error");delay_ms(200);}while(1){printf("%4.2f\r\n",Get_Temp());}}

ds18b20.h

// ds18b20.h
#ifndef __DS18B20_H
#define __DS18B20_H 
#include "sys.h"   
//DS18B20引脚宏定义						
#define DS18B20_GPIO_PORT		GPIOB
#define DS18B20_GPIO_PIN		GPIO_Pin_12
#define DS18B20_GPIO_CLK   	RCC_APB2Periph_GPIOB
//输出状态定义
#define OUT 1
#define IN  0
//控制DS18B20引脚输出高低电平
#define DS18B20_Low  GPIO_ResetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)
#define DS18B20_High GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)		
u8 DS18B20_Init(void);//初始化DS18B20
short DS18B20_Get_Temp(void);//获取温度
void DS18B20_Start(void);//开始温度转换
void DS18B20_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_Read_Byte(void);//读出一个字节
u8 DS18B20_Read_Bit(void);//读出一个位
void DS18B20_Mode(u8 mode);//DS18B20引脚输出模式控制
u8 DS18B20_Check(void);//检测是否存在DS18B20
void DS18B20_Rst(void);//复位DS18B20   
float Get_Temp(void);
#endif

ds18b20.c

// ds18b20.c
#include "ds18b20.h"
#include "delay.h"			
void DS18B20_Rst(void)	   
{                 DS18B20_Mode(OUT); 	//SET OUTPUTDS18B20_Low; 				//拉低DQdelay_us(750);    	//拉低750usDS18B20_High; 			//DQ=1 delay_us(15);     	//15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
/*
复位脉冲执行完之后,总线已经被拉高了;
此时,从机需要给总线拉高;
因此,逻辑是:主机切换为输入模式判断总线是否仍为高点平,如果超过200us,表示从机没反应,初始化失败;如果200us内,总线被从机拉低了,则开始计时拉低的时间,<240us初始化成功,超时则失败
*/
u8 DS18B20_Check(void) 	   
{   u8 retry=0;DS18B20_Mode(IN);	//SET  INPUT	 while (GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)&&retry<200){retry++;delay_us(1);};	 if(retry>=200)return 1;else retry=0;while (!GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;	    return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 	 
{u8 data;DS18B20_Mode(OUT);	//SET OUTPUTDS18B20_Low; delay_us(2);DS18B20_High; DS18B20_Mode(IN);	//SET INPUTdelay_us(12);if(GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN))data=1;else data=0;	 delay_us(50);           return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
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;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 ByteData)     {             u8 j;u8 LastBit;DS18B20_Mode(OUT);	//SET OUTPUT;for (j = 1;j <= 8;j++){//取最后一位 LastBit = ByteData&0x01;ByteData = ByteData >> 1;if (LastBit) {DS18B20_Low;	// Write 1delay_us(2);                            DS18B20_High;delay_us(60);             }else{DS18B20_Low;	// Write 0delay_us(60);             DS18B20_High;delay_us(2);                          }}
}
//开始温度转换
void DS18B20_Start(void) {   						               DS18B20_Rst();	   DS18B20_Check();	 DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0x44);	// convert
} //初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在    	 
u8 DS18B20_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE);	 //使能PORTA口时钟 GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;				//PORTA.6 推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);    //输出DS18B20_Rst();return DS18B20_Check();
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{u8 temp;u8 TL,TH;short tem;DS18B20_Start ();  			// ds1820 start convertDS18B20_Rst();DS18B20_Check();	 DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0xbe);	// convert	    TL=DS18B20_Read_Byte(); 	// LSB   TH=DS18B20_Read_Byte(); 	// MSB  if(TH>7){TH=~TH;TL=~TL; temp=0;					//温度为负  }else temp=1;				//温度为正	  	  tem=TH; 					//获得高八位tem<<=8;    tem+=TL;					//获得底八位tem=(float)tem*0.625;		//转换     if(temp)return tem; 		//返回温度值else return -tem;    
}void DS18B20_Mode(u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE);	 //使能PORTA口时钟if(mode){GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;}else{GPIO_InitStructure.GPIO_Pin =  DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;}GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);
}
float Get_Temp(void){short temperature = 0;temperature = DS18B20_Get_Temp();	//读取温度float temp = (float)temperature/10;return  temp;
}
http://www.lryc.cn/news/512769.html

相关文章:

  • 【前端,TypeScript】TypeScript速成(六):函数
  • React引入Echart水球图
  • 谷歌浏览器的智能推荐功能使用指南
  • GitHub 上排名前 11 的开源管理后台(Admin Dashboard)项目
  • 【运维】部署MKDocs
  • C# 读取多种CAN报文文件转换成统一格式数据,工具类:CanMsgRead
  • 计算机网络 (8)物理层的传输方式
  • 【C#】WPF设置Separator为垂直方向
  • 太速科技-519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡
  • 安卓入门二 Kotlin基础
  • C++ ——— 单/多参数构造函数的隐式类型转换和 explicit 关键字
  • Java编程规约:集合处理
  • IOS safari 播放 mp4 遇到的坎儿
  • plsql :用户system通过sysdba连接数据库--报错ora-01031
  • LabVIEW条件配置对话框
  • PyAudio库基本知识详解——为自制PCM音频播放器做准备
  • Git如何添加子仓库
  • 001__VMware软件和ubuntu系统安装(镜像)
  • 在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档
  • STM32完全学习——FATFS0.15移植SD卡
  • Linux -- 生产消费模型之环形队列、信号量
  • Ashy的考研游记
  • MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据
  • vue3学习笔记(11)-组件通信
  • 【PDF物流单据提取明细】批量PDF提取多个区域内容导出表格或用区域内容对文件改名,批量提取PDF物流单据单号及明细导出表格并改名的技术难点及小节
  • 张量与数据类型
  • torchvision.utils.make_grid 解释下
  • Android原生Widget使用步骤
  • 实验八 指针2
  • 1 数据库(下):多表设计 、多表查询 + SQL中的with查询语法(MySQL8.0以后版本才支持这种新语法)+ 数据库优化(索引优化)