历史上的今天
今天是:2024年12月21日(星期六)
2020年12月21日 | 单片机TDS水质检测源程序
2020-12-21 来源:51hei
1.系统是基于低功耗的AT89S51单片机,通过LCD555定时器构成的多谐振荡器产生一定频率的波,再通过单片机的I/O接口对捕获高低电平的读出频率,然后通过程序算法处理抽换算成电阻的值,使用DS18B20作为温度采集模块,经过主机的数据转换和处理,将温度值通过字符液晶1602显示器显示。本设计结构简单,使用灵活,具有很大的使用和研究价值。
2.使用说明:烧录程序到单片机,此时要把蓝牙串口先断开,下载程序完成后,连接蓝牙模块,将探针放入水中,打开手机蓝牙串口助手,搜素配对蓝牙,按下按键即可发送数据,手机端会接收到相应的测量数据。
3.结果:测量得到水质的TDS值,并通过蓝牙传输可在手机上得到相关的测量值
单片机源程序如下:
/*******************************************************************************
--------------------------------------------------------------------------------
* 实 验 名 : TDS显示试验
* 实验说明 : LCD1602显TDS。
* 连接方式 : 见连接图
* 注 意 :
*******************************************************************************/
#include #include"lcd.h" #include"temp.h" unsigned char code buf3[]={"evaluation:Suggested filteringnn"}; unsigned char code buf2[]={"evaluation:Slight solute in waternn"}; unsigned char code buf1[]={"evaluation: less solute in waternn"}; unsigned char code buf4[]={"Warningnn"}; long caculate_TDS(int temp); void LcdDisplay(int temp); void TDSDisplay(int temp); void send(); void PutString(unsigned char *TXStr); unsigned int count; sbit key=P1^4; sbit key1=P1^3; unsigned int FreResultFlag; unsigned int FreNum; /******************************************************************************* * 函 数 名 : Timer0 * 描 述 : 中断程序,定时时间到后重新赋值开始定时,同时将LED的状态取反. ********************************************************************************/ void time0(void) interrupt 1 { unsigned char i; TH0=(65536-46083)/ 256; TL0=(65536-46083)% 256; i++; if(i==20) { i=0; count=TH1*256+TL1; TH1=0x00; TL1=0x00; } } /******************************************************************************* * 函数名 : main * 函数功能 : 主函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void main() { unsigned char flag=1; TMOD=0x51; TH0=(65536-46083)/ 256; TL0=(65536-46083)% 256; TH1 = TL1 = 0; EA=1; ET0=1; TR0 = 1; TR1 = 1; LcdInit(); //初始化LCD1602 LcdWriteCom(0x88); //写地址 80表示初始地址 LcdWriteData('C'); while(1) { //LcdDisplay(); // Delay1ms(1000);//1s钟刷一次 if( FreResultFlag ) { FreNum = ( TH1 * 256 + TL1); TH1 = 0; TL1 = 0; FreResultFlag = 0; TR1 = 1; TR0 = 1; LcdDisplay(Ds18b20ReadTemp()); TDSDisplay(caculate_TDS(Ds18b20ReadTemp())); send(); UsartConfiguration(); } } } /******************************************************************************* * 函数名 : LcdDisplay() * 函数功能 : LCD显示读取到的温度 * 输入 : v * 输出 : 无 *******************************************************************************/ void LcdDisplay(int temp) //lcd显示 { unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组 float tp; if(temp< 0) //当温度值为负数 { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { LcdWriteCom(0x80); //写地址 80表示初始地址 LcdWriteData('+'); //显示正 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; LcdWriteCom(0x82); //写地址 80表示初始地址 LcdWriteData('0'+datas[0]); //百位
上一篇:51单片机基础计算器
史海拾趣
|
HOHO 申请到了下面的开发板 有图和大家分享:(手机拍摄,可能不清楚) 申请表发送目标邮箱 market@prochip.com.cnHOHO就是发到这个邮箱申请的,希望大家也能成功 申请地址为:大家可以去它的官方网站看看去 如果 ...… 查看全部问答> |
|
1、多级放大器的级间关系:在多级放大器中,后级电路相当于前级的负载,前级负载是后级放大器的输入电阻;前级相当后级的信号源,后级信号源内阻为前级的输出电阻。2、n级放大器的动态指标a、总电压放大倍数 :可见, n级放大器的总电压放大倍数 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 竞赛,单片机(处理器)怎么选取?是带队老师建议?是芯片厂商推荐?还是自己一个个测试? 当然,2013年全国大学生电子设计竞赛竞赛题目及要求中有以下说明: 竞赛题目包括 ...… 查看全部问答> |




