【卒業プロジェクト】8-STM32に基づく水質_濁度検出器の設計と実装 (回路図+ソースコード+実物写真+解答エッセイ)

【卒業プロジェクト】8-STM32に基づく水質・濁度検出器の設計と実装(回路図+ソースコード+実物写真+解答エッセイ)

ミッションステートメント

主な内容:
1. STM32 マイクロコントローラをコアとして、水質モジュールと連携します;
2. 主に、システムの機能制御、ステータス表示、情報検出、およびアラーム ハードウェアの構築に必要なシングル チップ マイクロコンピュータやセンサーなどのコンポーネントの選択を完了します; 3
. システム制御のソフトウェア設計とプログラミングを完了する;
4. 水質検知、温度検査、早期警報の機能を実現。
方法と要件:
システムスキームと全体設計:設計の主な内容は、モジュール回路図と回路基板の図面を完成させ、対応するプログラムの作成を完成させ、リモートデータの伝送を実現し、制御ソフトウェアを完成させることです。回路図の設計と図面と設計。内容:
1. 全体計画の決定; 2. 3. ハードウェアの選択。各モジュール回路の設計 4.ソフトウェア部分の設計 5.デバッグと実行、
データ リンク

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

設計書

まとめ

品質試験技術と開発および応用には、すべてセンサー技術、電気制御技術、およびインテリジェント制御技術が含まれます。インテリジェント制御技術は包括的な技術課題であり、現代の研究制御の分野でますます広範になっています。この設計では、水質検査装置です。この設計では、システムのエネルギー制御、ステータス表示、情報検出、アラーム ハードウェアの主な完成に必要なシングル チップ マイクロコンピュータやセンサーなどのコンポーネントの選択を実現し、システム制御のソフトウェア設計とプログラミングを完了し、実現する必要があります。水質検知、温度検知、早期警報機能。システム機能計画システムを設計して、ハードウェア回路部分、ソフトウェアプログラミング部分、溶接アセンブリ部分、システムのデバッグおよびテスト部分を完成させ、最終的にこの論文の研究と設計を完成させる必要があります。
このシステムは、主にハードウェアとソフトウェアで構成されています。ハードウェア部分はSTM32シングルチップマイコンの最小システムユニット、温度検知回路ユニット、水質検知ユニットと警報ユニット、ヒューマンコンピュータインタラクションユニット、電源ユニット、液晶表示ユニットで構成されており、安定性と信頼性に優れています。ハードウェアの設計では、システムを考慮する必要があります。ソフトウェア部分は、システムソフトウェアの全体的なフローチャートを描画し、各サブコントロールドライバーを描画し、ドライバープログラムを記述してシステムプログラムの設計を完了します。ハードウェアとソフトウェアの設計では、設計を整理して確実に実行できるように、機能分割に従って設計することを選択します。システムの設計と物理オブジェクトの製作が完了しました。最後に、温度検出と水の濁度検出が完了し、しきい値を調整してシステムのカスタマイズされたアラーム設定を実現し、誤報を防ぐことができます。
システムを設計するときは、システム全体のコスト パフォーマンスと機能性を十分に考慮し、機能が完成した後、システムの機能を拡張するために機能インターフェイスを確保します。そして、このデザインは社会発展の傾向に密接に従っており、ヘルスケア産業に関連するプロモーションの意味があります.

フレームワーク アーキテクチャの設計

ここに画像の説明を挿入
はじめに 1
章 1 はじめに 2
節 1 研究の背景 2 節 2
研究の意義3
節 3 国家水質基準 3 節
4 センサー開発の紹介 4 節 5
本論文の主な研究内容 7
節 6 本章のまとめ 8
第二章 水質検出システムのスキーム 9
セクション 1 システム実現機能の分析 9
セクション 2 システム設計のアイデア 9
セクション 3 メインコントローラーの選択 10
セクション 4 主要コンポーネントの紹介 10
1. 水質検出モジュール 11
2. 温度センサー
13 第 5 章 この章のまとめ 15
第 3 章水質検出ハードウェア回路設計 16
セクション 1 STM32 最小システム ボードの紹介 16
セクション 2 電源回路設計 17
セクション 3 水質検出回路設計 18
セクション 4 温度センサー回路設計 19
セクション 5 OLED ディスプレイ回路設計 20
セクション 6 システム一般回路図 21
セクション 7 この章のまとめ 22
第 4 章 水質検出ソフトウェアの設計 23
セクション 1 Keil MDK ソフトウェアの紹介 23 セクション
2 ソフトウェアのメイン プログラムの設計 24
1. メイン プログラムの設計プロセス 24
2. メイン プログラムのソース コード 25
セクション 3 OLED ディスプレイ プログラムの設計 26
1. OLED 表示プログラムの流れ 26
2. OLED 表示プログラムのソースコード 28
セクション 4 水質検査プログラムの設計 29
1. 水質検査プログラムの流れ 29
2. 水質検査プログラムのソースコード 31
セクション 5 温度検査プログラムの設計 32
1. 温度検査プログラムの流れ 32
2. 温度テスト プログラムソースコード 33
セクション 6 本章のまとめ 34
第 5 章 水質検知システムの実装 35
セクション 1 物理的溶接とデバッグ 35
セクション 2 システム機能テスト 37
1. 水質検知機能テスト 37
2. 温度検出テスト 38
セクション 3この章のまとめ 40
まとめ 41
謝辞 42
参考文献 43 付録
45
1. 原文英文 45
2. 英訳 48
3. 設計図 51
4. ソースコード 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;    
} 

おすすめ

転載: blog.csdn.net/qq_22592979/article/details/128125794