作者:手机用户2502892557 | 来源:互联网 | 2023-05-31 11:21
文章目录1简介2绪论2.1课题背景3系统设计3.1系统架构3.2硬件部分3.2.1DS18B20简介3.2.2LCD1602液晶屏简介3.3软件部分3.3.1整体软件流程3.3.2
文章目录
- 1 简介
- 2 绪论
- 3 系统设计
- 3.1 系统架构
- 3.2 硬件部分
- 3.2.1 DS18B20 简介
- 3.2.2 LCD1602 液晶屏简介
- 3.3 软件部分
- 3.3.1 整体软件流程
- 3.3.2 初始化
- 3.3.3 温度采集与显示
- 3.4 实现效果
- 3.5 部分相关代码
1 简介
🔥 Hi,大家好,这里是丹成学长的毕设系列文章!
🔥 对毕设有任何疑问都可以问学长哦!
这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是
🚩 基于stm32的智能温控风扇设计与实现
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:4分
- 工作量:4分
- 创新点:3分
🧿 选题指导, 项目分享:
https://blog.csdn.net/molodi/article/details/125933857
2 绪论
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
#include "bsp_ds18b20.h"
int main()
{ int PWM,low,zhouqi;
float wendu;int wendu1;zhouqi=500;low=zhouqi-PWM;SysTick_Init();init1602();
lcdpos(1,0);
writestring("TEM: 00.0");GPIO_SetBits(GPIOB,GPIO_Pin_0);
while( DS18B20_Init()) {
lcdpos(0,0);writestring(" no ds18b20 exit");
}lcdpos(0,0);writestring("ds18b20 exit");for(;;){
DS18B20_Get_Temp(wendu);if (wendu<0){ lcdpos(1,4);writestring("-");
}wendu1&#61;wendu*100;lcdpos(1,5);write_dat(wendu1/10000&#43;0x30);
lcdpos(1,6);write_dat(wendu1%10000/1000&#43;0x30);lcdpos(1,7);write_dat(wendu1%1000/100&#43;0x30);lcdpos(1,9);write_dat(wendu1%100/10&#43;0x30);lcdpos(1,10);
write_dat(wendu1%10&#43;0x30);Delay_ms(2000);if(wendu1>30){ low&#61;500;GPIO_SetBits(GPIOB,GPIO_Pin_0);
Delay_ms(PWM);
} if(wendu1<15){ low&#61;0;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);
}if(wendu1>&#61;15&wendu1<20){ low&#61;100;
GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(low);
} if(wendu1>&#61;20&wendu1<25){
low&#61;200;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(low);}if(wendu1>&#61;25&wendu1<30){ low&#61;300;
GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(low);
}}
}
2.DS18B20 子程序
#include "bsp_ds18b20.h"
static void DS18B20_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin &#61; DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode &#61; GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed &#61; GPIO_Speed_50MHz;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
}
static void DS18B20_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin &#61; DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode &#61; GPIO_Mode_IPU;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
static void DS18B20_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin &#61; DS18B20_PIN;
GPIO_InitStructure.GPIO_Mode &#61; GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed &#61; GPIO_Speed_50MHz;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
static void DS18B20_Rst(void)
{
DS18B20_Mode_Out_PP();
DS18B20_DATA_OUT(LOW);
Delay_us(750);
DS18B20_DATA_OUT(HIGH);
Delay_us(15);
}
static uint8_t DS18B20_Presence(void)
{
uint8_t pulse_time &#61; 0;
DS18B20_Mode_IPU();
while( DS18B20_DATA_IN() && pulse_time<100 )
{
pulse_time&#43;&#43;;
Delay_us(1);
}
/ * 经过 100us 后&#xff0c; 存在脉冲都还没有到来*/
if( pulse_time >&#61;100 )
return 1;
else
pulse_time &#61; 0;
while( !DS18B20_DATA_IN() && pulse_time<240 )
{
pulse_time&#43;&#43;;
Delay_us(1);
}
if( pulse_time >&#61;240 )
return 1;
else
return 0;
}
static uint8_t DS18B20_Read_Bit(void)
{
uint8_t dat;
DS18B20_Mode_Out_PP();
DS18B20_DATA_OUT(LOW);
Delay_us(10);
/ * 设置成输入&#xff0c; 释放总线&#xff0c; 由外部上拉电阻将总线拉高 */
DS18B20_Mode_IPU();
if( DS18B20_DATA_IN() &#61;&#61; SET )
dat &#61; 1;
else
dat &#61; 0;
Delay_us(45);
return dat;
}
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i, j, dat &#61; 0;
for(i&#61;0; i<8; i&#43;&#43;)
{
j &#61; DS18B20_Read_Bit();
dat &#61; (dat) | (j<<i);
}
return dat;
}
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i, testb;
DS18B20_Mode_Out_PP();
for( i&#61;0; i<8; i&#43;&#43; )
{
testb &#61; dat&0x01;
dat &#61; dat>>1;
if (testb)
{
DS18B20_DATA_OUT(LOW);
Delay_us(8);
DS18B20_DATA_OUT(HIGH);
Delay_us(58);
}
else
{
DS18B20_DATA_OUT(LOW);
&#x1f9ff; 选题指导, 项目分享&#xff1a;
https://blog.csdn.net/molodi/article/details/125933857