自学内容网 自学内容网

stm32f103,结合DS18B20测温,设置阈值对外界温度变化做出不同反应

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h" 
#include "ds18b20.h" 
#include "stm32f10x.h"
 
#include "stdio.h"
#include "stdarg.h"

 int main(void)
 { 
//printf("hello\r\n");
 u8 t=0;
  //u8 Pv_temp = 30; 
short temperature;       
  float In_temp;
float De_temp; 
delay_init();     //延时函数初始化  
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为 115200
LED_Init();  //初始化与LED连接的硬件接口
LCD_Init();   //初始化LCD  
 POINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(30,30,200,16,16,"DS18B20 OK");
LCD_ShowString(30,50,200,16,16,"ELITE STM32");
LCD_ShowString(30,70,200,16,16,"DS18B20 TEST");
//LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
//LCD_ShowString(30,110,200,16,16,"2015/1/16");
POINT_COLOR=BLUE;//设置字体为蓝色 
LCD_ShowString(30,90,200,16,16,"Pv_temp = 30.C ");
  LCD_ShowString(30,110,200,16,16,"Sv_temp =  .. .C ");
 while(DS18B20_Init())//DS18B20初始化
{
LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
 delay_ms(200);
}   


// LCD_ShowString(30,150,200,16,16,"Temp:   . .C");//固定格式 
while(1)
{        
 if(t%10==0)//每100ms读取一次//delay函数
{  
temperature = DS18B20_Get_Temp();
//printf();  float浮点型
if(temperature<0)
{
LCD_ShowChar(30+40,150,'-',16,0);//显示负号
temperature=-temperature;//转为正数
}
else 
LCD_ShowChar(30+40,150,' ',16,0);//去掉负号
   
LCD_ShowNum(30+40+40,110,temperature/10,2,16);//显示正数部分.2为数字宽度,16为显示字号    
   LCD_ShowNum(30+40+60,110,temperature%10,1,16);//显示小数部分
    //printf("获取温度 = %f\n",temperature);
     
In_temp = temperature/10;
De_temp = temperature%10;
//printf();t_temp是否是保留一位小数的真实温度值(此时可以直接用整数部分判断)
//30.1--30.9,此时默认到了30的整数范围
//通过整数部分判断传感器采集温度的变化进行判断,同时要求Pv_temp(target)在外部可调
//温度变化的判断过程需要算法进行调整而不是仅仅外部采集的变化
if(In_temp < 30)
{
    
  GPIO_InitTypeDef  GPIO_InitStructure;
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOD, ENABLE);//使能PB端口时钟
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;    //PE.4 端口配置
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
          GPIO_Init(GPIOE, &GPIO_InitStructure);     //初始化GPIOE.4
          GPIO_SetBits(GPIOE,GPIO_Pin_4);//PE.4 输出高

  GPIO_ResetBits(GPIOD,GPIO_Pin_3);
}
else

{
    
  GPIO_InitTypeDef  GPIO_InitStructure;  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOD, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;    //PD.3 端口配置
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
          GPIO_Init(GPIOD, &GPIO_InitStructure);     //初始化GPIOD.3
  GPIO_ResetBits(GPIOE,GPIO_Pin_4);//PE.4 输出低
          
  GPIO_SetBits(GPIOD,GPIO_Pin_3);
}
}

 delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}


}

通过设置温度阈值,当传感器测量到外界温度变化时有两个不同的引脚产生高电平,接到两个不同的小灯,从而可以观察变化。          项目文件借鉴于正点原子资料源码。


原文地址:https://blog.csdn.net/m0_59708799/article/details/142467454

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!