文章目录[隐藏]
1. 实验目的
(1) 掌握使用 KEIL MDK5 进行软件开发的具体流程;
(2) 掌握硬件电路的设计方法;
(3) 掌握 STM32 微控制器的程序设计及代码编写方法。
2. 任务和要求
(1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集;
(2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超过范围实现声光报警,声音报警为启动无源蜂鸣器播放音乐,光源报警采用 LED灯闪烁的方式(每个同学采用不同的声光报警方式。例如:播放不同的音乐,LED灯闪烁的次数不一样等);
(3)手动设置报警温度和湿度上下限。
(4)加分项:自行增加其他功能。
3. proteus仿真图
4. 实验代码
#include "stm32f4xx.h"
#include <stdio.h>
#include "systick.h"
#include "led.h"
#include "lcd.h"
#include "dht11.h"
#include "usart.h"
#include "sr04.h"
#include "key.h"
int main()
{
u16 i,key;//定义距离和按键值的变量
u16 t1=25;//温度下限初始化
u16 t2=35;//温度上限初始化
u16 h1=65;//湿度下限初始化
u16 h2=75;//湿度下限初始化
u8 data_buf[5] = {0};//为了存储温湿度数据
Led_Init();//led初始化
systick_init();//系统时钟的初始化函数
sr04_init();//sr04初始化
dht_init();//Dht初始化
lcd_init();//LCD初始化
key_init();//key初始化
while(1)
{
i=get_distance();//得到的距离给i
key=KEY_Scan(1); //得到的键值给key
dht_read_data(data_buf); //得到的温湿度数据给data_buf
//如果距离大于5,并且小于等于10cm 灯0,1,2,3亮
if (i>5 && i<=10)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 );//点亮4盏灯
}
//如果距离大于10,并且小于等于15cm 灯0,1,2亮
if(i>10 && i<=15)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);//点亮3盏灯
GPIO_SetBits(GPIOA,GPIO_Pin_3);
}
//如果距离大于15,并且小于等于20cm 灯0,1亮
if(i>15 && i<=20)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1);//点亮2盏灯
GPIO_SetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_3 );
}
//如果距离小于等于5,或者大于20cm 灯全灭
if(i>20 || i<=5)
{
GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//全灭
}
//设置上下限
if(key)
{
switch(key)
{
case KEY0_PRES:
t1--;//如果KEY0按下 温度下限减1
break;
case KEY1_PRES:
t2--;//如果KEY1按下 温度上限减1
break;
case KEY2_PRES:
h1--;//如果KEY2按下 湿度下限减1
break;
case KEY3_PRES:
h2--;//如果KEY3按下 湿度上限减1
break;
case KEY4_PRES:
t1++;//如果KEY4按下 温度下限加1
break;
case KEY5_PRES:
t2++;//如果KEY5按下 温度上限加1
break;
case KEY6_PRES:
h1++;//如果KEY6按下 湿度下限加1
break;
case KEY7_PRES:
h2++;//如果KEY7按下 湿度上限加1
break;
}
}
if(data_buf[2]>t1 && data_buf[2]<t2)
GPIO_SetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5);//温度是否在范围内,是的话灯不亮
else if (data_buf[2]<t1) GPIO_ResetBits(GPIOA,GPIO_Pin_4);//小于下限,灯4亮
else if (data_buf[2]>t2) GPIO_ResetBits(GPIOA,GPIO_Pin_5);//大于于下限,灯5亮
if(data_buf[0]>h1 && data_buf[0]<h2) GPIO_SetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);//湿度是否在范围内,是的话灯不亮
else if (data_buf[0]<h1)GPIO_ResetBits(GPIOA,GPIO_Pin_6);//小于下限,灯6亮
else if (data_buf[0]>h2)GPIO_ResetBits(GPIOA,GPIO_Pin_7);//大于于下限,灯7亮
lcd_show_string(0,1,"distance= cm");//显示字符串
lcd_num(9,1,i);//显示超声波测得距离
lcd_show_string(0,2,"Temp: C");
lcd_num(5,2,data_buf[2]);//显示温度数值
lcd_show_string(0,3,"Hum: %");
lcd_num(4,3,data_buf[0]);//显示湿度数值
lcd_num(9,2,t1);//显示温度下限数值
lcd_show_string(11,2,"-");
lcd_num(12,2,t2);//显示温度上限数值
lcd_num(9,3,h1);//显示湿度下限数值
lcd_show_string(11,3,"-");
lcd_num(12,3,h2);//显示湿度上限数值
}
}
下载地址:成品下载
版权声明:本文为CSDN博主「十言1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45771313/article/details/120889675
暂无评论