水的浑浊度是指水中含有的泥沙,粘土,有机物,浮游生物和微生物等悬浮
物质,造成的浑浊程度。工业级的浊度传感器或浊度仪价格昂贵,在电子产品设
计中成本太高不适合选用;因此我们选取了一款在家用电器洗衣机、洗碗机上广
泛应用的浑浊度传感器,这款浊度传感器利用光学原理,通过溶液中的透光率和
散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量
的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光
接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过
的光少,电流小。
浊度传感器模块将传感器输出的电流信号转换为电压信号,通过单片机进行
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);
}
|