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

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

文章目录

  • 【毕业设计】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;    
    } 
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 【毕业设计】8-基于STM32的水质_浊度检测仪设计与实现(原理图+源码+实物照片+答辩论文)

    发表评论