基于STM32与DS18B20的温度采集

#include "Headfile.h"


void Beep_Init()//蜂鸣器初始化
{
 GPIO_InitTypeDef GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_13;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP ;
 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;


 GPIO_Init(GPIOC,&GPIO_InitStructure);


}


void Key_Init()//按键初始化
{
 GPIO_InitTypeDef GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ;
 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;


 GPIO_Init(GPIOA,&GPIO_InitStructure);
}


#define  MODE       GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)//模式切换按键
#define  CANCEL     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)//处理警报按键
#define  ADD      GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)	//加按键
#define  SUB      GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)	 //减按键


int Temperature_High=100,Temperature_Low=0;
uint8_t flag=0;
uint8_t High_Set=1,Cancel=0;
void KeyScan()
{
   
if(MODE==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5-20ms
     if(MODE==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(MODE==0);//如果确认按下按键等待按键释放,没有释放则一直等待
     	 if(High_Set==1)  High_Set=0;
		 else High_Set=1;
		 LCD_clear();
	   }
	  }


if(CANCEL==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5-20ms
     if(CANCEL==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(CANCEL==0);//如果确认按下按键等待按键释放,没有释放则一直等待
		if(flag==1)  flag=0;
		else flag=1;
		LCD_clear();
	   }
	  }


if(ADD==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5-20ms
     if(ADD==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(ADD==0);//如果确认按下按键等待按键释放,没有释放则一直等待
        if(High_Set==1) Temperature_High+=1;
		else Temperature_Low+=1;
		LCD_clear();
	   }
	  }


if(SUB==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5·20ms
     if(SUB==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(SUB==0);//如果确认按下按键等待按键释放,没有释放则一直等待
       	if(High_Set==1) Temperature_High-=1;
		else Temperature_Low-=1;
		LCD_clear();
	   }
	  }


}


 int temper=0;
uint8_t Danger_Flag=0;
void State_Check()
{
if((temper>Temperature_High)||(temper<Temperature_Low))  Danger_Flag=1;
else Danger_Flag=0;
}








uint16_t Cnt=0;
int main()
{
SystemInit();//系统时钟配置
delay_init(72);//系统延时函数初始化
Usart_Init(115200);//串口初始化
Beep_Init();//蜂鸣器初始化
LCD_Init();//显示屏初始化
Key_Init();//按键初始化
ds18b20_start();//温度传感器初始化
delay_ms(200);
while(1)
 {
  temper=ds18b20_read(); //温度采集
  KeyScan();//按键扫描
  State_Check();//报警检测
 LCD_write_english_string(0,0,"NowTemp:");   write_number(50,0,temper);LCD_write_english_string(70,0,"%C");//当前温度
 


  if(High_Set==1)    LCD_write_english_string(20,1,"Set_High");//模式显示
  else              LCD_write_english_string(20,1,"Set_Low");


   
  LCD_write_english_string(0,2,"High");  LCD_write_english_string(40,2,"Low"); //温度上、下限 
 
  write_number(0,3,Temperature_High);             write_number(50,3,Temperature_Low);
 
  if(flag==1)   LCD_write_english_string(25,4,"Sorting"); //状态显示
  else 
  {
   if(Danger_Flag==1)   LCD_write_english_string(25,4,"Danger~~~~");
   else  LCD_write_english_string(25,4,"OKay!!!");
  
  }
 Cnt++;
 if(Cnt>=100)
 {
  Cnt=0;
 }
 if(Cnt>=50)
   {
 if(Danger_Flag==1&&flag==0) 	 PCout(13)=1;//产生警报
   }
 else 
   {
   	PCout(13)=0;


   }
   
 }
}


#include "Headfile.h"
#include "DS18B20.h"


 


#define EnableINT()  
#define DisableINT() 


#define DS_PORT   GPIOA
#define DS_DQIO   GPIO_Pin_1
#define DS_RCC_PORT  RCC_APB2Periph_GPIOA
#define DS_PRECISION 0x7f   //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位;
#define DS_AlarmTH  0x64
#define DS_AlarmTL  0x8a
#define DS_CONVERT_TICK 1000


#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)
#define SetDQ()  GPIO_SetBits(DS_PORT,DS_DQIO)
#define GetDQ()  GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)
 
 
//static unsigned char TempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};




void Delay_us(u32 Nus) 
{  
 SysTick->LOAD=Nus*9;          //时间加载       
 SysTick->CTRL|=0x01;             //开始倒数     
 while(!(SysTick->CTRL&(1<<16))); //等待时间到达  
 SysTick->CTRL=0X00000000;        //关闭计数器 
 SysTick->VAL=0X00000000;         //清空计数器      
}  


 


unsigned char ResetDS18B20(void)
{
 unsigned char resport=0;
 SetDQ();
 Delay_us(50);
 
 ResetDQ();
 Delay_us(500);  //500us (该时间的时间范围可以从480到960微秒)
 SetDQ();
 Delay_us(40);  //40us
 //resport = GetDQ();
 while(GetDQ());
 Delay_us(500);  //500us
 SetDQ();
 return resport;
}


void DS18B20WriteByte(unsigned char Dat)
{
 unsigned char i;
 for(i=8;i>0;i--)
 {
   ResetDQ();     //在15u内送数到数据线上,DS18B20在15-60u读数
  Delay_us(5);    //5us
  if(Dat & 0x01)
   SetDQ();
  else
   ResetDQ();
  Delay_us(65);    //65us
  SetDQ();
  Delay_us(2);    //连续两位间应大于1us
  Dat >>= 1; 
 } 
}




unsigned char DS18B20ReadByte(void)
{
 unsigned char i=0,Dat=0;
 SetDQ();
 Delay_us(5);
 for(i=8;i>0;i--)
 {
   Dat >>= 1;
    ResetDQ();     //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后
  Delay_us(5);   //5us
  SetDQ();
  Delay_us(5);   //5us
  if(GetDQ())
    Dat|=0x80;
  else
   Dat&=0x7f;  
  Delay_us(65);   //65us
  SetDQ();
 }
 return Dat;
}




void ReadRom(unsigned char *Read_Addr)
{
 unsigned char i;


 DS18B20WriteByte(ReadROM);
  
 for(i=8;i>0;i--)
 {
  *Read_Addr=DS18B20ReadByte();
  Read_Addr++;
 }
}




void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL)
{
 DisableINT();
 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(WriteScratchpad);
 DS18B20WriteByte(AlarmTL);
 DS18B20WriteByte(AlarmTH);
 DS18B20WriteByte(Precision);


 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(CopyScratchpad);
 EnableINT();


 while(!GetDQ());  //等待复制完成 ///
}




void DS18B20StartConvert(void)
{
 DisableINT();
 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(StartConvert); 
 EnableINT();
}


void DS18B20_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);


 GPIO_InitStructure.GPIO_Pin = DS_DQIO;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度
 GPIO_Init(DS_PORT, &GPIO_InitStructure);
}




void ds18b20_start(void)
{
 DS18B20_Configuration();
 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);
 DS18B20StartConvert();
}




float ds18b20_read(void)
{
 unsigned char TemperatureL,TemperatureH;
float Temperature;
uint8_t fg=1;


 DisableINT();
 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(ReadScratchpad);
 TemperatureL=DS18B20ReadByte();
 TemperatureH=DS18B20ReadByte(); 
 ResetDS18B20();
 EnableINT();


	{
		TemperatureL=~TemperatureL;					//补码转换,取反加一
		TemperatureH=~TemperatureH+1;       
		fg=0;      						//读取温度为负时fg=0
	}
	Temperature = TemperatureL/16+TemperatureH*16;      	//整数部分	
	DS18B20StartConvert();
	if(fg==0) Temperature*=-1; 
	return  Temperature;


}


 


 



  • 16
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于STM32DS18B20温度传感器是目前应用较广的一种温度测量方案。DS18B20传感器采用数字式温度传感器,可以精确地测量环境的温度,并将温度的数字信号传输至STM32微控制器。 在使用DS18B20传感器时,需要通过1-Wire总线连接至STM32微控制器。该总线可以同时连接多个DS18B20传感器,以实现多点温度测量。在使用过程中,STM32通过对1-Wire总线输出不同的电平来控制DS18B20传感器执行不同的指令。在执行读取温度指令时,DS18B20传感器会将温度值转换为数字信号并返回至STM32进行数据处理。 为了保证温度传感器的准确性,需要进行校准。校准过程中,需要在已知温度的环境中,将DS18B20传感器进行校准并进行数据修正。通过精确的校准,可以提高温度测量的精度和准确度。 基于STM32DS18B20温度传感器广泛应用于温度监测领域,例如环境温度测量、生产过程温度控制等。同时,该传感器具有体积小、功耗低、精度高、成本低等优点,是一种经济、实用的温度测量方案。 ### 回答2: 基于STM32DS18B20温度传感器可以实现精准的温度测量和数据采集,并且具有数据传输速度快、功耗低、体积小等优点。该传感器采用单总线协议,通过1-Wire接口与STM32控制器通信,实现温度数据的采集与传输。在使用过程中,需要对DS18B20进行初始化设置、发送温度转换命令、读取温度值等步骤,才能实现温度数据的获取。同时,为了保证测量精度和稳定性,需要根据实际应用场景进行合理的电路设计和选用高质量的传感器件。 另外,在使用过程中还需要注意一些问题,如传感器与控制器连接时需要遵循正确的接线方法;使用时需要防止瞬时过压、电源涟漪等因素对传感器产生干扰;在进行温度转换时,需要根据实际需求选择不同的分辨率;对于不同的应用场景,还需要考虑传感器的安装方式、温度范围、测量精度等因素。 总之,基于STM32DS18B20温度传感器具有测量精度高、数据传输速度快等优点,对于温度测量和数据采集应用具有较高的实用价值。 ### 回答3: STM32是一种基于ARM Cortex-M处理器的微控制器。DS18B20是一种数字温度传感器,采用封装为TO-92S的封装形式,使用一个数据引脚进行通信。基于STM32DS18B20温度传感器是一种常见的温度测量方案,在许多应用中被广泛应用。 使用STM32控制DS18B20传感器,需要先配置引脚,在程序中设置引脚的输入或输出功能。当STM32需要读取DS18B20传感器的温度数据时,需要向传感器发出启动信号,并接收传感器发出的应答信号。然后,STM32需要发送温度数据的读取命令,并等待传感器发出温度数据的应答信号。最后,STM32接收传感器发送的温度数据,并进行处理,得到实际的温度值。 为了稳定地读取温度传感器的数据,STM32还需要对传感器进行初始化,并进行CRC校验以确保数据的准确性。此外,在程序设计中需要考虑到传感器的工作环境,比如温度变化的范围、采样频率、数据存储方式等等。 综上所述,基于STM32DS18B20温度传感器是一种常见的温度测量方案,在工业控制、自动化、环境监测等应用中具有广泛的应用前景。通过合理的程序设计及适当的硬件配置,可以实现有效、可靠、高精度的温度测量功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值