多功能智能温控器设计论文(基于stm32的智能温控风扇设计与实现)

2023-10-14 08:26:00 来源 : haohaofanwen.com 投稿人 : admin

下面是好好范文网小编收集整理的多功能智能温控器设计论文(基于stm32的智能温控风扇设计与实现),仅供参考,欢迎大家阅读!

多功能智能温控器设计论文

文章目录

1 简介

Hi,大家好,今天向大家介绍一个 单片机项目

基于stm32的智能温控风扇设计与实现

大家可用于 课程设计 或 毕业设计

2.1 课题背景

随着科技的日新月异,智能家居逐渐走入普通家庭,风扇作为基本的家用电器也将成为智能家居的一部分。这里介绍的是以STM32单片机为控制单元并结合嵌入式技术设计的一款具有温控调速、液晶显示温度等信息的智能电风扇。经过前期设计、制作和最终的测试得出,该风扇电源稳定性好,操作方便,运行可靠,功能强大,价格低廉,节约能耗,能够满足用户多元化的需求。该风扇具有的人性化设计和低廉的价格很适合普通用户家庭使用。

3 系统设计

3.1 系统架构

设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在LCD1602上。根据温度的不同,利用STM32对风扇进行调速,总体硬件设计如下图所示

3.2 硬件部分

3.2.1 DS18B20 简介

DS18B20 是美国 DALLAS 半导体公司继 DS1820 之后最新推出的一种改进型智能温度传感器。 与传统的热敏电阻相比, 它能够直接读出被测温度并且可根据实际要求通过简单的编程实现 9~12 位的数字值读数方式。

3.2.2 LCD1602 液晶屏简介

1602 液晶也叫 1602 字符型液晶, 它是一种专门用来显示字母、 数字、 符号等的点阵型液晶模块。 它由若干个 5X7 或者 5X11 等点阵字符位组成, 每个点阵字符位都可以显示一个字符, 每位之间有一个点距的间隔, 每行之间也有间隔, 起到了字符间距和行间距的作用, 正因为如此所以它不能很好地显示图形

3.3 软件部分

3.3.1 整体软件流程

控制系统软件使用 C 语言编程。

使用模块化设计, 除主程序外, 还有各功能子程序, 分别执行直流电机驱动调速及温度采集、 显示等功能, 编辑环境采用集成开发环环境 Keil。

程序总体运行流程图如下:

3.3.2 初始化

系统初始化包括 STM32 系统定时器初始化, GPIO 口初始化以及 LCD1602 初始化等。

3.3.3 温度采集与显示

DS18B20 温度传感器进行温度采集时, 要依次进行初始化, ROM 操作指令, 存储器操作指令, 数据传输等操作

3.4 实现效果

3.5 部分相关代码

1.主函数#include"stm32f10x.h"#include"bsp_SysTick.h"#include<LCD1602.h>#include"bsp_ds18b20.h" PWM,low,zhouqi;float wendu;int wendu1; zhouqi low=zhouqi-PWM;SysTick_Initinit1602lcdposwritestring("TEM: 00.0");GPIO_SetBits(GPIOB,GPIO_Pin_0DS18B20_Initlcdposwritestring(" no ds18b20 exit"lcdposwritestring("ds18b20 exit"DS18B20_Get_Temp(wenduwendulcdposwritestring  wendu1=wendulcdposwrite_dat(wendu1lcdposwrite_dat(wendu1lcdposwrite_dat(wendu1lcdposwrite_dat(wendu1lcdposwrite_dat(wendu1Delay_mswendu1 lowGPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWMwendu1 lowGPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWMwendu1wendu1 lowGPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(lowwendu1wendu1lowGPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(lowwendu1wendu1 lowGPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(lowDS18B20 子程序#include"bsp_ds18b20.h"/** 函数名: DS18B20_GPIO_Config* 描述 : 配置 DS18B20 用到的 I/O 口* 输入 : 无* 输出 : 无*/staticvoidDS18B20_GPIO_Config/*定义一个 GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启 DS18B20_PORT 的外设时钟*/RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);/*选择要控制的 DS18B20_PORT 引脚*/GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*设置引脚速率为 50MHz */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数, 初始化 DS18B20_PORT*/GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);GPIO_SetBits(DS18B20_PORT, DS18B20_PIN/** 函数名: DS18B20_Mode_IPU* 描述 : 使 DS18B20-DATA 引脚变为输入模式* 输入 : 无* 输出 : 无*/staticvoidDS18B20_Mode_IPUGPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的 DS18B20_PORT 引脚*/GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;/*设置引脚模式为浮空输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;/*调用库函数, 初始化 DS18B20_PORT*/GPIO_Init(DS18B20_PORT,&GPIO_InitStructure/** 函数名: DS18B20_Mode_Out_PP* 描述 : 使 DS18B20-DATA 引脚变为输出模式* 输入 : 无* 输出 : 无*/staticvoidDS18B20_Mode_Out_PPGPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的 DS18B20_PORT 引脚*/GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*设置引脚速率为 50MHz */GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数, 初始化 DS18B20_PORT*/GPIO_Init(DS18B20_PORT,&GPIO_InitStructure/**主机给从机发送复位脉冲*/staticvoidDS18B20_Rst/* 主机设置为推挽输出 */DS18B20_Mode_Out_PPDS18B20_DATA_OUT(LOW);/* 主机至少产生 480us 的低电平复位信号 */Delay_us/* 主机在产生复位信号后, 需将总线拉高 */DS18B20_DATA_OUT(HIGH);Delay_us/** 检测从机给主机返回的存在脉冲* 0: 成功* 1: 失败*/staticuint8_tDS18B20_Presenceuint8_t pulse_time /* 主机设置为上拉输入 */DS18B20_Mode_IPUDS18B20_DATA_IN()&& pulse_timepulse_time++;Delay_us 经过 100us 后, 存在脉冲都还没有到来 pulse_time returnpulse_time /* 存在脉冲到来, 且存在的时间不能超过 240us */DS18B20_DATA_IN()&& pulse_timepulse_time++;Delay_us pulse_time returnreturn/** 从 DS18B20 读取一个 bit*/staticuint8_tDS18B20_Read_Bituint8_t dat;/* 读 0 和读 1 的时间至少要大于 60us */DS18B20_Mode_Out_PP/* 读时间的起始: 必须由主机产生 >1us <15us 的低电平信号 */DS18B20_DATA_OUT(LOW);Delay_us 设置成输入, 释放总线, 由外部上拉电阻将总线拉高 */DS18B20_Mode_IPU//Delay_us(2);if(DS18B20_DATA_IN SET )dat dat /* 这个延时参数请参考时序图 */Delay_usreturn dat;}/** 从 DS18B20 读一个字节, 低位先行*/uint8_tDS18B20_Read_Byteuint8_t i, j, dat i i ij =DS18B20_Read_Bitdat =(datj<<ireturn dat;}/** 写一个字节到 DS18B20, 低位先行*/voidDS18B20_Write_Byte(uint8_t dat){uint8_t i, testb;DS18B20_Mode_Out_PP i i itestb = datdat = dat>>1;/* 写 0 和写 1 的时间至少要大于 60us */if(testb){DS18B20_DATA_OUT(LOW);/* 1us < 这个延时 < 15us */Delay_usDS18B20_DATA_OUT(HIGH);Delay_usDS18B20_DATA_OUT(LOW);/* 60us < Tx 0 < 120us */Delay_usDS18B20_DATA_OUT(HIGH);/* 1us < Trec(恢复时间) < 无穷大*/Delay_usDS18B20_StartDS18B20_RstDS18B20_PresenceDS18B20_Write_Byte/* 跳过 ROM */DS18B20_Write_Byte/* 开始转换 */}uint8_tDS18B20_InitDS18B20_GPIO_ConfigDS18B20_RstreturnDS18B20_PresenceDS18B20_Get_Temp(float f_tem){uint8_t tpmsb, tplsb;short s_tem;DS18B20_RstDS18B20_PresenceDS18B20_Write_Byte/* 跳过 ROM */DS18B20_Write_Byte/* 开始转换 */DS18B20_RstDS18B20_PresenceDS18B20_Write_Byte/* 跳过 ROM */DS18B20_Write_Byte/* 读温度值 */tplsb =DS18B20_Read_Byte tpmsb =DS18B20_Read_Bytes_tem = tpmsb<<8;s_tem = s_tem | tplsb;I f( s_tem /* 负温度 */f_tem s_tem0.0625;elsef_tem = s_tem *0.0625;return f_tem;}

4 最后


相关文章

专题分类