代码编织梦想

【毕业设计】8-基于STM32的水质/浊度检测仪设计与实现(原理图+源码+实物照片+答辩论文)

资料下载链接

资料链接
包含此题目毕业设计全套资料:

原理图工程文件
PCB工程文件
源码工程文件
实物照片
答辩论文低重复率,23035字

任务书

主要内容:
1.以STM32单片机为核心,配合水质模块;
2.主要完成系统的 功能控制、状态显示、信息检测以及报警硬件组建所需要的单片机和传感器等元器件的选择;
3.完成系统控制的软件设计编程;
4.实现对水质检测、温度检查、预警的功能。
方法和要求:
系统的方案及总体设计:设计的主要内容是完成模块电路图和电路板的绘制,完成对应程序的编写,实现远程数据的传输,并完成控制软件设计和电路图纸的绘制与设计。包含:
1.总体方案的确定;2.硬件的选择;3.各个模块电路的设计;4.软件部分的设计;5.调试运行;

设计说明书

摘要

质检测技术与开发应用都涉及到传感器技术,电气控制技术以及智能化控制技术。智能化控制技术是一门综合性的技术性学科,在当代的研究控制领域中也变得越发广泛。在本次设计一款水质检测设备。本设计需要实现主要完成系统的能控制、状态显示、信息检测以及报警硬件组建所需要的单片机和传感器等元器件的选择;完成系统控制的软件设计编程;实现对水质检测、温度检测、预警的功能。需要对系统功能规划系统设计完成系统的硬件电路部分、软件编程部分、焊接组装部分、调试测试部分,最终完成本次论文的研究与设计。
本次系统主要有硬件和软件两个部分组成。硬件部分由STM32单片机最小系统单元,温度检测电路单元,水质检测单元报警单元,人机交互单元,电源单元,液晶显示器单元组成,在设计上硬件需要考虑到系统的稳定性以及可靠性。软件部分通过对系统软件总流程图绘制,并绘制各个子控制驱动再对驱动程序编写完成系统程序的设计。在硬件与软件的设计上选择按照功能性分区设计,使设计有条理运行可靠。系统设计制作实物调试完成。后完成了温度检测和水浊度检测,并可以调节阈值实现对系统的报警自定义设置防止误报。
系统在设计时充分考虑到了系统的整体性价比已经功能性,在完成了功能的条件下预留了功能接口可以对系统功能拓展。并且此设计紧跟社会发展趋势,与健康医疗行业关联 具有推广意义。

设计框架架构

在这里插入图片描述
前 言 1
第一章 绪论 2
第一节 研究背景 2
第二节 研究意义 3
第三节 国家水质标准 3
第四节 传感器发展介绍 4
第五节 本文的主要研究内容 7
第六节 本章小结 8
第二章 水质检测系统方案 9
第一节 系统实现功能分析 9
第二节 系统设计思路 9
第三节 主控制器选型 10
第四节 主要元器件介绍 10
一、水质检测模块 11
二、温度传感器 13
第五节 本章小结 15
第三章 水质检测硬件电路设计 16
第一节 STM32最小系统板介绍 16
第二节 电源电路设计 17
第三节 水质检测电路设计 18
第四节 温度传感器电路设计 19
第五节 OLED显示电路设计 20
第六节 系统总电路图 21
第七节 本章小结 22
第四章 水质检测软件设计 23
第一节 Keil MDK软件介绍 23
第二节 软件主程序设计 24
一、主程序设计流程 24
二、主程序源码 25
第三节 OLED显示程序设计 26
一、OLED显示程序流程 26
二、OLED显示程序源码 28
第四节 水质检测程序设计 29
一、水质检测程序程序流程 29
二、水质检测程序程序源码 31
第五节 温度检测程序设计 32
一、温度检测程序流程 32
二、温度检测程序源码 33
第六节 本章小结 34
第五章 水质检测系统实现 35
第一节 实物焊接与调试 35
第二节 系统功能测试 37
一、水质检测功能测试 37
二、温度检测测试 38
第三节 本章小结 40
总 结 41
致 谢 42
参考文献 43
附 录 45
一、英文原文 45
二、英文翻译 48
三、工程图纸 51
四、源代码 52

设计说明书及设计文件

在这里插入图片描述在这里插入图片描述
字数:23035字
在这里插入图片描述

在这里插入图片描述

源码展示

#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "led.h"
#include "usart.h"
#include "adc.h"
#include "ds18b20.h"
#include "temp.h" 
#include "timer.h"
#define ARRY_LENGTH 10
#define median_filtering_length 3
float num[2];16 median_filtering(void);
 int main(void)
  {	
		float temperature;      //温度值								  
		float hui;         //H2采集的数字量
		
		delay_init();	    	 //延时函数初始化	 
		NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级		    
		Adc_Init();	         //AD初始化   
		uart_init(9600);	   //串口初始化
    Timer4_Init(4999,7199);		
		OLED_Init();			   //初始化OLED  
		OLED_Clear(); 	     //Clear screen
		LED_Init();
 	while(DS18B20_Init())	//DS18B20初始化	
	{
		OLED_ShowString(0,0,"DS18B20 Error",16);	//初始化失败,检查连线
		delay_ms(200);														//延时等待数据稳定
	}	
		OLED_Clear(); 	     											//清屏
	
	while(1)
	{	
		OLED_ShowString(0,0,"temperature:",16);
		temperature=DS18B20_Get_Temp();						//采集温度	
		temperature=temperature/10;
		OLED_ShowNum(0,2,temperature,4,16);  			//显示温度
	  printf("温度:%d  \r\n",(int)temperature);
		if(temperature>25){LED2=0;}
		else LED2=1;		 
		hui=median_filtering();
	 	hui=hui*(3.3/4096);
		hui = hui*100/3.3;
		if(hui > 100) hui = 100;
		hui=100-hui;
		OLED_ShowString(0,4,"median:",16);
	 OLED_ShowNum(0,6,hui,4,16);  			//显示浑浊度
	 printf("浑浊度:%d  \r\n",(int)hui);
	 if(hui>41)LED3=0;
	 else LED3=1;	
	}	  
}
u16 median_filtering(){
  int senseV[median_filtering_length];
  int i,k;	
  for(i = 0; i < median_filtering_length; i++){
    senseV[i] = Get_Adc_Average(6,5);
		delay_ms(3);
  }
  for(i = 0; i < median_filtering_length; i++ ){
    for(k = i; k <median_filtering_length; k++ ){
      if(senseV[i] > senseV[k]){
          int tmp = senseV[i];
          senseV[i] = senseV[k];
          senseV[k] = tmp;
      }
    }  
  }
  return senseV[median_filtering_length/2];
}
#include "ds18b20.h"
#include "delay.h"	
//复位DS18B20
void DS18B20_Rst(void)	   
{                 
	DS18B20_IO_OUT(); //SET PA0 OUTPUT
    DS18B20_DQ_OUT=0; //拉低DQ
    delay_us(750);    //拉低750us
    DS18B20_DQ_OUT=1; //DQ=1 
	delay_us(15);     //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_IO_IN();//SET PA0 INPUT	 
    while (DS18B20_DQ_IN&&retry<200)
	{
		retry++;
		delay_us(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 			 // read one bit
{
    u8 data;
	DS18B20_IO_OUT();//SET PA0 OUTPUT
    DS18B20_DQ_OUT=0; 
	delay_us(2);
    DS18B20_DQ_OUT=1; 
	DS18B20_IO_IN();//SET PA0 INPUT
	delay_us(12);
	if(DS18B20_DQ_IN)data=1;
    else data=0;	 
    delay_us(50);           
    return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)    // read one byte
{        
    u8 i,j,dat;
    dat=0;
	for (i=1;i<=8;i++) 
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }						    
    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
	DS18B20_IO_OUT();//SET PA0 OUTPUT;
    for (j=1;j<=8;j++) 
	{
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        {
            DS18B20_DQ_OUT=0;// Write 1
            delay_us(2);                            
            DS18B20_DQ_OUT=1;
            delay_us(60);             
        }
        else 
        {
            DS18B20_DQ_OUT=0;// Write 0
            delay_us(60);             
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{   						               
    DS18B20_Rst();	   
	DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
} 
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在    	 
u8 DS18B20_Init(void)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PORTG口时钟 
	
 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//PORTG.11 推挽输出
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
 	GPIO_SetBits(GPIOA,GPIO_Pin_0);    //输出1
	DS18B20_Rst();
	return DS18B20_Check();
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
	short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();	 
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert	    
    TL=DS18B20_Read_Byte(); // LSB   
    TH=DS18B20_Read_Byte(); // MSB  	    	  
    if(TH>7)
    {
        TH=~TH;
        TL=~TL; 
        temp=0;//温度为负  
    }else temp=1;//温度为正	  	  
    tem=TH; //获得高八位
    tem<<=8;    
    tem+=TL;//获得底八位
    tem=(float)tem*0.625;//转换     
	if(temp)return tem; //返回温度值
	else return -tem;    
} 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/transducer_1/article/details/128011278

基于stm32f429+ltdc的原理图设计及pcb设计-爱代码爱编程

基于STM32F429+LTDC的设计 之前使用的一直都是一些外置驱动的显示屏,近期闲来无事,接触了STM32F429之后,便想尝试着做一个RGB888接口的屏幕 板载资源如下: USB转TTL, 采用的是FTDI的芯

作品分享:基于STM32的温度报警器含源码、原理图、PCB文件、作品报告-爱代码爱编程

文章目录 一.前言二.材料准备三.硬件部分四.软件部分1. 底层封装库2.中间层3.应用层五.外壳设计六.资料链接 一.前言 该作品是我在华工电工开放实习的作品,本作品由七部分组成。中央为Stm32F405RG芯片,使用两节18650电池供电,在外围加入大量外设。 DBS18B20温度传感器用于外界温度的测量;舵机、蜂鸣器用于检测响应;增加

基于stm32单片机外文文献_基于STM32的智能家居系统设计毕业论文+任务书+开题报告+文献综述+外文翻译及原文+程序+原理图+参考资料+答辩PPT+仿真设计...-爱代码爱编程

基于STM32的智能家居系统设计 摘要 本文设计介绍一种以stm32 单片机为核心,设计了一套基于GPRS无线网络的智能家居控制系统。该系统以GPRS通信为基础、能通过无线通信技术实时监控家居的温湿度状态,并能自由控制家居的电器的开关操作。同时集成光强采集电路,能自动开关窗帘的功能。 本设计硬件电路结构简单,分为控制器模块,GPRS模块,继电器控

基于STM32的双向DC-DC变换器(论文+原理图+PCB+源码)-爱代码爱编程

内容介绍 发布内容为本科毕业设计。根据15年电赛题设计的双向DC-DC变换器,装置采用PID控制,主要功能是恒流充充电和恒压输出。充电模式下,直流电源对电池组恒流充电,1A~2A步进可调,步进值0.1A,控制精度小于1%,充电效率大于90%;放电模式下,电池组恒压输出30V驱动负载,放电效率大于95%,控制误差小于0.1V;自动模式下,恒压输出30V,控

基于 STM32 的水质监测(需求与实现分析)-爱代码爱编程

文章目录 写在前面需求分析硬件使用实现简单分析  最后代码已上传!!!!   代码文章链接    github 代码链接在该文章最后   ​ 写在前面   ​  本人编程小白一枚,第一次接触 STM32 所编写的项目。后续会逐步分块更新,并会在最后一篇文章上传源代码。 ​ ​  若有 刚学 STM32 ,懂得 串口通信,可以学一下本项目,增强

基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)-爱代码爱编程

书接上文:https://blog.csdn.net/m0_59113542/article/details/123592010?spm=1001.2014.3001.5502 本篇文章主要介绍如何对采集到的图像处理,进行车牌号的识别。 本车牌识别系统包括以下:图像采集→二值化灰度处理→识别车牌区域→字符分割→字符识别。 一、效果展示: 有图有真相

基于STM32G031的失真度测试仪(CubeMX+ADC+DMA+OLED+EC11)-爱代码爱编程

目录 项目介绍硬件介绍设计思路各功能代码及说明SPWM波生成ADC采样FFT获取按键动作OLED显示系统顶层功能展示OLED显示采样波形OLED显示频谱/失真度曲线项目总结 项目介绍 本项目基于电子森林的STM32G031口袋仪器训练平台,基于CubeMX与Keil,实现了: 通过芯片的PWM+板上LPF电路生成频率在DC~20KHz,频率

【毕业设计】基于 stm32 的自动泊车系统 -智能小车 - 物联网单片机_mdc_stdio的博客-爱代码爱编程

文章目录 1 简介1 背景2 设计概要3 硬件选型3.1 主控 - STM323.2 电机驱动3.3 红外遥控设计3.4 传感器部分3.4.1 循迹模块3.4.2 红外避障模块3.4.3 超声波模块3.4.4 WIFI 视频模块4 小车成品展示5 泊车算法设计5.1 侧方位泊车5.2 倒车入库6 测试效果7 最后 1 简介 Hi,大家好,这里

【毕业设计】基于单片机红外热成像仪 - stm32 物联网 嵌入式_mdc_stdio的博客-爱代码爱编程

文章目录 1 简介2 项目简介3 主要器件3.1 MLX90640红外摄像头模块3.1.1 模块特性3.1.2相关参数3.1.2 应用场景3.1.3 接口说明(以接入 MCU 为例):4 实现效果4.1 STM32+LCD 图像显示4.2 Arduino+ESP32+LCD 图像显示4.3 树莓派 HDMI 显示屏显示5 部分相关驱动代码6 最后

【毕设选题】基于stm32的毕业设计题目项目汇总 - 350例_mdc_stdio的博客-爱代码爱编程

文章目录 1前言2 STM32 毕设课题3 如何选题3.1 不要给自己挖坑3.2 难度把控3.3 如何命名题目4 最后 1前言 🥇 更新单片机嵌入式选题后,不少学弟学妹催学长更新STM32和C51选题系列,感谢大家的认可,来啦! 以下是学长亲手整理的STM32相关的毕业设计选题,都是经过学长精心审核的题目,适合作为毕设,难度不高,工作量达标

【毕业设计】基于stm32的便携体测仪(心率 体温) - 单片机 嵌入式 物联网_mdc_stdio的博客-爱代码爱编程

文章目录 0 前言1 简介2 主要器件3 实现效果4 设计原理4.2 **硬件部分**4.3 软件部分 5 部分代码6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设

【毕业设计】基于stm32的便携式u盘设计与实现 -爱代码爱编程

文章目录 0 前言1 简介2 主要器件3 实现过程4 部分核心代码5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求

毕业设计 基于单片机的智能音响设计与实现 -爱代码爱编程

文章目录 0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 PAJ7620U2模块4.2 HC-05蓝牙模块4.3 JQ8900语音模块 5 部分核心代码6 最后 0 前言 🔥