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)!