热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

泳池水质监控PH温度浑浊度测量_基于STC89C51单片机

前述:QQ:3177227373VX:F9986858主要内容研究泳池水质监控系统的整体结构设计,包括总体方案设计、软硬

前述:
QQ:3177227373
V X:F9986858


主要内容

研究泳池水质监控系统的整体结构设计,包括总体方案设计、软硬件总体设计等,要求监控泳池水温度、PH值、浑浊度等。
以单片机为主要控制器件,主要包括硬件电路的设计和系统程序的设计。硬件电路主要包括传感器的选取,单片机的选取与应用,A/D转换的选用,电源设计,显示部分设计等;软件设计主要包括主程序设计和子程序设计,监测结果通过显示模块显示。


系统硬件结构设计


单片机的选择

泳池监控系统的核心是微处理器,对处理器的选型将直接决定系统的性能及总体开发方式。选型的主要标准有:
1、具有较高的计算能力;
2、具备与其他设备的通信接口;
3、整体功耗较低等。
根据获取和软件开发的难易程度,经过初步的筛选,基本在MSP430单片机,51单片机和其他PIC中进行选择。根据前文对低功耗要求,首先要选择的是具备低功耗模式且运算速度较快的芯片。
从供电电压上来看,MSP430的最低工作电压为3.3V,51单片机及其他PIC为5V,在工作电压的需求方面,与其他单片机相比,MSP430对电压的要求较低,可以更好的降低功率。另外,MSP430自身带有5种低功耗模式,可以根据不同的实际情况选择对应的低功耗模式,在程序设计上可以根据实际需要关闭闲置的模块,来达到低功耗的目的。在本次筛选对比MSP430系列的单片机低功耗以及运算能力方面有着相当的优势。
根据对比筛选得出,本设计选择MSP430芯片作为主控芯片。根据前人的设计证明,以及MSP430价格上的优势加上片内资源丰富,MSP 430能够很好的完成智能监控的主控功能。整个数据采集处理流程为,传感器模块将采集到的模拟信号经过A/D模块转化为数字信号传至MSP430芯片中,MSP430芯片对传来的信号进行分析和处理,实现对采集信息的显示以及对控制端的控制。
本设计主控芯片采用的是MSP430系列单片机中的f149型号。该单片机在程序设计、开发调试及实际应用上都具有明显的优点。具有方便、便宜、实用等优点,给用户提供了一个理想的样机开发方式。MSP430主控芯片特点:1、处理能力强;2、运算速度快;3、超低功耗;4、折叠片内资源丰富;5、开发环境简单。


传感器选择


温度传感器:

经常用到的温度传感器类型有、半导体、热电偶、热敏电阻等,其中半导体测温元件又分为电压型、电流型和数值型。DS18B20传感器为数值型温度传感器、其具备了导线少、体积小以及使用方便等特点。虽然它有0.5℃的固有测温误差为,但是考虑到作为泳池水质的温度采集,0.5℃的误差是可以接受的,其优点远大于缺点。因此本设计采用DS18B20数字温度传感器。
DS18B20温度传感器输出数字信号,通过程序编辑设置可选择数字值的位数(9-12位),本设计基于泳池水环境的实际使用情况,选择DS18B20的防水封装,该封装类型可以直接将传感器安装与水中,且体积小安装方便。


PH值传感器:

PH值的测量,主要由指示电极和参考电极构成。目前主要的指示电极有两大类,分别为金属电极和玻璃电极。在实际应用中由于各种原因,金属电极仅仅在工业测量中使用。而玻璃电极在实验测量和工业测量中都有比较广泛的应用。
在PH值测量中玻璃电极和金属电极都具有比较良好的复现性,都存在可以接受的测量误差,都能够较为准确的测量出被测溶液的PH值。经过各两类电极的比较,本设计采用玻璃电极传感器采集泳池水中的PH值。


水浊度传感器:

游泳池水质在正常营业过程中随着游泳人员越来越多加上所处的自然环境,水中出现越来越多的悬浮颗粒,从而导致水质被污染。对水浊度进行检测主要是检测水中悬浮颗粒的含量。
本设计选用的浊度传感器为红外传感器,内部有封装的红外对管。对管平行放置于泳池的水环境中,通过红外对管发射端发出光线,红外对管接收端把透过的光强度转化为电流。水中悬浮颗粒会挡住红外传感器发出的一部分光线,使光线的强度发生改变。水中的悬浮颗粒越多则水浊度越高,透过光线的强度则越弱,接收端转化出来的电流也越小。相反,水浊度越高,透光性越强则电流越大。所以可以通过对浊度传感器电流的检测,完成对泳池水浊度的监测。
在这里插入图片描述


系统软件结构设计

主程序是程序设计的主干,在主程序的调控下完成整体的工作。本设计实际流程为:打开开关,单片机通电,首先进行系统初始化,LCD显示屏进入欢迎界面,2秒钟后进入系统测量程序,屏幕实时显示测量的值,整个系统开始正常工作。主程序流程如图所示。
在这里插入图片描述


实物照片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


仿真

在这里插入图片描述


PCB

在这里插入图片描述


部分代码


浑浊度计算

//浑浊度计算
void TURB_Date()
{//浑浊度获取并计算Dat1&#61;ReadADC(1);TU&#61; 不展示核心代码;//计算电压temp_data&#61;shi*10&#43;ge;//计算温度TU_calibration&#61;不展示核心代码;//温度补偿TU_value&#61;不展示核心代码;//转换公式if(TU_value<&#61;0){TU_value&#61;0;}if(TU_value>&#61;3000){TU_value&#61;3000;}TU_Val&#61;(int)TU_value/30;//计算为百分比
}

PH值计算

//PH值计算
void PH_Date()
{//PH值获取并计算Dat2&#61;ReadADC(0);ADC_Voltage_1&#61;不展示核心代码;//转换为电压值PH_Value&#61;不展示核心代码;//转换公式if(PH_Value<&#61;0){PH_Value&#61;0;}if(PH_Value>&#61;14){PH_Value&#61;14;}Disbuff_PH[0]&#61;(int)(PH_Value*100)/1000;Disbuff_PH[1]&#61;(int)(PH_Value*100)%1000/100;Disbuff_PH[2]&#61;(int)(PH_Value*100)%100/10;Disbuff_PH[3]&#61;(int)(PH_Value*100)%10;PH_DAT&#61;Disbuff_PH[0]*1000&#43;Disbuff_PH[1]*100&#43;Disbuff_PH[2]*10&#43;Disbuff_PH[3];
}

LCD1602显示

void LCD_Init()//液晶初始化
{u8 i;LCD_WR&#61;0;LCD_Write_Cmd(0x38);//设置16*2显示,5*7点阵&#xff0c;8位数据接口LCD_Write_Cmd(0x0c);//设置开显示&#xff0c;0x0e显示光标 0x0c不显示光标LCD_Write_Cmd(0x06);//写一个字符后地址指针自动加&#xff11;&#xff0c;光标自动右移LCD_Write_Cmd(0x01);//清屏LCD_Write_Cmd(0x80);//数据指针定位到第一行第一个字处for(i&#61;0;i<16;i&#43;&#43;)LCD_Write_Data(str1[i]);//液晶显示第一行写数据LCD_Write_Cmd(0xc0);//数据指针定位到第二行第一个字处for(i&#61;0;i<16;i&#43;&#43;)LCD_Write_Data(str2[i]);//液晶显示第二行写数据
}//LCD1602显示函数
void LCD_Manifest(u8 row,u8 add,u8 date)
{if(row&#61;&#61;1) LCD_Write_Cmd(0x80&#43;add);if(row&#61;&#61;2) LCD_Write_Cmd(0xc0&#43;add);LCD_Write_Data(0x30&#43;date);
}void LCD_Write_Cmd(u8 com)//液晶写命令
{LCD_RS&#61;0;//选择写命令模式Date&#61;com;//将要写的命令字送到数据总线上delay_ms(1);LCD_E&#61;1;//使能端给一高脉冲&#xff0c;高脉冲有效delay_ms(1);LCD_E&#61;0;
}
void LCD_Write_Data(u8 date)//数据写命令
{LCD_RS&#61;1;//选择写数据模式Date&#61;date;delay_ms(1);LCD_E&#61;1;//使能端给一高脉冲&#xff0c;高脉冲有效delay_ms(1);LCD_E&#61;0;
}

ADC采集

//读取AD模数转换的值&#xff0c;有返回值
unsigned char ReadADC(unsigned char Chl)
{unsigned char Data;Start(); //写入芯片地址Send(0x90);Ack();Send(0x40|Chl);//写入选择的通道&#xff0c;Chl的值分别为0、1、2、3&#xff0c;分别代表1-4通道Ack();Start();Send(0x91); //读入地址Ack();Data&#61;Read(); //读数据Scl&#61;0;NoAck();Stop();return Data; //返回值
}

DS18B20温度采集

void Tem_display(u16 temp)
{float tp;tp&#61;temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么&#xff0c;那么正数的原码就是补码它本身temp&#61;不展示核心代码; //留一个小数点就*10&#xff0c;&#43;0.5是四舍五入&#xff0c;因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉&#xff0c;不管是否大于0.5&#xff0c;而&#43;0.5之后大于0.5的就是进1了&#xff0c;小于0.5的就//算加上0.5&#xff0c;还是在小数点后面。shi &#61; temp % 1000 / 100; //显示温度十位数ge &#61; temp % 100 / 10; //显示温度个位数xs &#61; temp % 10; //显示小数一位Temp_Now&#61;(u16)temp%1000;
}//读取温度
int Ds18b20ReadTemp()
{int temp&#61;0;u8 tmh,tml;Ds18b20ChangTemp(); //先写入转换命令Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令tml&#61;Ds18b20ReadByte(); //读取温度值共16位&#xff0c;先读低字节tmh&#61;Ds18b20ReadByte(); //再读高字节不展示核心代码return temp;
}

推荐阅读
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
author-avatar
国王的驴耳朵要吐槽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有