找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 855|回复: 3
打印 上一主题 下一主题
收起左侧

求分享基于单片机的浊度检测设计资料

[复制链接]
跳转到指定楼层
楼主
ID:1080331 发表于 2024-1-20 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2024-1-20 14:47 | 只看该作者
你先把传感器特性搞清楚,不然没人能做。
回复

使用道具 举报

板凳
ID:420836 发表于 2024-1-21 08:54 | 只看该作者
请给出您对系统的设计要求、规格以及您已经掌握的一些信息,以便其他人更好地帮助您。
回复

使用道具 举报

地板
ID:155507 发表于 2024-1-21 18:09 | 只看该作者
水的浑浊度是指水中含有的泥沙,粘土,有机物,浮游生物和微生物等悬浮
物质,造成的浑浊程度。工业级的浊度传感器或浊度仪价格昂贵,在电子产品设
计中成本太高不适合选用;因此我们选取了一款在家用电器洗衣机、洗碗机上广
泛应用的浑浊度传感器,这款浊度传感器利用光学原理,通过溶液中的透光率和
散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量
的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光
接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过
的光少,电流小。


浊度传感器模块将传感器输出的电流信号转换为电压信号,通过单片机进行
AD 转换数据处理。改款模块具有模拟量和数字量输出接口。模拟量可通过单片
机 A/D 转换器进行采样处理,以获知当前水的污浊度。数字量可通过模块上的
电位器调节触发阈值,当浊度达到设置好的阈值后,D1 指示灯会被点亮,传感
器模块输出由高电平变成低电平,单片机通过监测电平的变化,判断水的浊度是
否超标,从而预警或者联动其他设备。该模块价格低廉、使用方便、测量精度高
可以用于洗衣机、洗碗机等产品的水污浊程度的测量;也可以用于工业现场控制,
环境污水采集等需要浊度检测控制的场合。


* 硬件连接:
* ADC0809:OE -> P1.0; EOC -> P1.1; ST -> P1.2;CLK -> P1.3; A -> P1.4; B -> P1.5; C->P1.6;
*         OUT1~OUT8 -> P3口
* LCD1602:RS -> P0.0; RW -> P0.1; E -> P0.2;
*         D0~D7 -> P2口

* PH模块: VCC -> 5V; GND -> GND; PO -> IN3;


/************************************************************************************
* 文件名  :main.c
* 描述    :        
* 硬件连接:
* ADC0809:OE -> P1.0; EOC -> P1.1; ST -> P1.2;CLK -> P1.3; A -> P1.4; B -> P1.5; C->P1.6;
*         OUT1~OUT8 -> P3口
* LCD1602:RS -> P0.0; RW -> P0.1; E -> P0.2;
*         D0~D7 -> P2口
* 浊度传感器模块: VCC -> 5V; GND -> GND; PO -> IN3;
*
* 实验平台:
*
**********************************************************************************/
#include <reg52.h>
#include <adc0809.h>
#include <1602.h>
#include <intrins.h>
#include <math.h>
float TU=0.0;
float TU_value=0.0;
float TU_calibration=0.0;
unsigned char disbuff[13]={0};
float temp_data=25.0;
float K_Value=3047.19;


uint num;
/**************延时1s函数***************/
void Delay_1s()
{
     unsigned char a,b,c;
    for(c=167;c>0;c--)
        for(b=171;b>0;b--)
            for(a=16;a>0;a--);
}


/**************PH值采集函数***************/
void TU_Collection()
{
        Red_0809 () ;
        TU =num * 5.0 / 256;
        TU_calibration=-0.0192*(temp_data/10-25)+TU;  
        TU_value=-865.68*TU_calibration + K_Value;
       
  if(TU_value<=0){TU_value=0;}
        if(TU_value>=3000){TU_value=3000;}
}
/**************PH值显示函数***************/
void TU_Display()
{
   
        disbuff[0]=(int)(TU_value)/1000+'0';
        disbuff[1]=(int)(TU_value)%1000/100+'0';       
        disbuff[2]=(int)(TU_value)%100/10+'0';
        disbuff[3]=(int)(TU_value)%10+'0';


        DisplaySingleChar(0x3,1,disbuff[0]);
        DisplaySingleChar(0x4,1,disbuff[1]);
        DisplaySingleChar(0x5,1,disbuff[2]);
        DisplaySingleChar(0x6,1,disbuff[3]);
        DisplaySingleChar(0x7,1,disbuff[4]);
}


/**************主函数***************/
void main()
{        
        TMOD = 0x02; //中断初始化,adc0809产生时钟信号
        TH0  = 0x14;
        TL0  = 0x00;
        IE   = 0x82;
        TR0  = 1;
        P1   = 0x3f;
        LCDInit();         //LCD初始化
  DisplayString(0x0,0,"  Welcome  TU   ");
        DisplayString(0x0,1,"Detection system");
        Delay_1s();
        WriteCmd(LCD_CLS);                 //清屏
       
        DisplaySingleChar(0x0,1,'T');
        DisplaySingleChar(0x1,1,'U');
        DisplaySingleChar(0x2,1,'=');
        DisplaySingleChar(0x8,1,'p');
        DisplaySingleChar(0x9,1,'p');
        DisplaySingleChar(0x0A,1,'m');
       
        while(1)
        {
      TU_Collection();
                  TU_Display();
  }
}


void Timer0_INT() interrupt 1
{
        CLK = !CLK;

}


#ifndef ADC0809_H
#define ADC0809_H
#include <reg52.h>

#define uint unsigned int
#define uchar unsigned char
       
extern uint num;

sbit OE  = P1^0;
sbit EOC = P1^1;
sbit ST  = P1^2;
sbit CLK = P1^3;

void Red_0809 ();

#endif


#include "adc0809.h"

void Red_0809 ()
{

        ST = 0;
        ST = 1;
        ST = 0;
        while(EOC == 0);
        OE = 1;
        num = P3;
        OE = 0;
       
}




#ifndef _1602_H
#define _1602_H
#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
#define Busy                        0x80                                        //忙信号
#define  LCD_Data             P2       
#define Write                                0x00                                        //低电平写入
#define Read                                0x01                                        //高电平读出
#define Data                                0x01                                        //高电平选择数据
#define Cmd                                    0x00                                        //低电平选择命令

#define Enable                            0x00                                        //跃变到低电平时执行命令
#define Disable                            0x01   
#define True                                0x01
#define False                                0x00
#define LCD_Init                        0x38                                        //初始化模式                                                       
#define LCD_DispCtr                    0x0C                                        //开显示及光标设置
#define LCD_CloseCtr                0x08                                        //关显示
#define LCD_CLS                        0x01                                        //清屏幕
#define LCD_EnterSet                   0x06                                        //显示光标

sbit LCD_RS                          =P0^0;                                        //数据命令选择端
sbit LCD_RW                          =P0^1;                                   //读写控制端
sbit LCD_E                           =P0^2;                                        //执行使能端


/*-------------------------------  LCD模块 -------------------------------------*/
void LCDInit(void);                                                                //LCD初始化
void SetWriteCmd(void);                                                                //设置写命令模式
void SetReadCmd(void);                                                                //设置读命令模式
void SetWriteData(void);                                                        //设置写数据模式
void WriteCmd(char cmd);                                                        //写命令
void WriteData(char ddata);                                                        //写数据
void ExecuteCmd(void);                                                                //执行命令
void SetXY(char x,char y);                                                        //定位显示地址
void DisplaySingleChar(char x,char y,char cchar);                //显示单个字符
void DisplayString(char x,char y,char *str);                         //显示一段字符串
void Delay(unsigned int time);                                                //延时主程序
void DelayUs(unsigned int time);                                                //延时子程序
//void delay500ms(void) ;
bit  IsBusy(void);                                                                        //判断忙标志函数
void DisplayTime(void);                                                                //显示时间
void DisplayAVGSpeed(void);                                                        //显示平均速度
void DisplayDistance(void);                                                        //显示路程
void DelayUs(unsigned int time);        //延时函数



#endif


#include "1602.h"

void Delay(unsigned int time)
{
    unsigned int timeCounter = 0;
        for (timeCounter = time;timeCounter > 0 ;timeCounter --)
                DelayUs(255);
}

void DelayUs(unsigned int time)
{
        unsigned int timeCounter = 0;
        for (timeCounter = 0;timeCounter < time;timeCounter ++)
                _nop_();
}

/*---------------------------------  LCD初始化函数--------------------------------------*/

void LCDInit(void)
{
    //三次显示模式设置
        LCD_Data=0;
        LCD_E=Disable;
        Delay(5);
        WriteCmd(LCD_Init);
        Delay(5);
        WriteCmd(LCD_Init);
        Delay(5);
        WriteCmd(LCD_Init);

        WriteCmd(LCD_Init);                                                           //初始化
        WriteCmd(LCD_CloseCtr);                                                        //关显示
        WriteCmd(LCD_CLS);                                                                //清屏幕
        WriteCmd(LCD_EnterSet);                                                        //光标移动设置
        WriteCmd(LCD_DispCtr);                                                        //显示开以及光标设置
       
}

/*---------------------------------  LCD模式设置函数--------------------------------------*\
       
        SetWriteCmd()                                  设置LCD为写命令模式
        SetReadCmd()                                       设置LCD为读命令模式
        SetWriteData()                                设置LCD为写数据模式
       
\*----------------------------------------------------------------------------------------*/
void SetWriteCmd(void)
{
        LCD_RW=Write;
        LCD_RS=Cmd;
}

void SetReadCmd(void)
{
        LCD_RW=Read;
        LCD_RS=Cmd;
}

void SetWriteData(void)
{
        LCD_RW=Write;
        LCD_RS=Data;
}

/*---------------------------------  LCD功能执行函数--------------------------------------*\
       
        WriteCmd()                                        写命令
        WriteData()                                        写数据
        ExecuteCmd()                                        执行命令
        SetXY()                                                显示定位
        DisplaySingleChar()                        显示单个字符
        DisplayString()                                显示一串字符
        IsBusy()                                                忙标志检测
\*----------------------------------------------------------------------------------------*/
void WriteCmd(char cmd)
{
        while(IsBusy());
        LCD_Data=cmd;       
        SetWriteCmd();
        ExecuteCmd();
}

void WriteData(char ddata)
{
        while(IsBusy());
        LCD_Data=ddata;
        SetWriteData();       
        ExecuteCmd();
}

void ExecuteCmd(void)
{
        LCD_E=Enable;
        LCD_E=Disable;
}

void SetXY(char x,char y)
{
        if (y)
                x|=0x40;
        x|=0x80;
        Delay(5);
        WriteCmd(x);

}

void DisplaySingleChar(char x,char y,char cchar)
{
        Delay(5);
        SetXY(x,y);
        WriteData(cchar);       
}

void DisplayString(char x,char y,char *str)
{
        while(*str)
        {
                Delay(5);
                DisplaySingleChar(x++,y,*str);
                str++;
        }
}

bit IsBusy(void)
{
        LCD_Data=0xFF;
        SetReadCmd();
        ExecuteCmd();
        return (bit)(LCD_Data & 0x80);       
}




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表