历史上的今天
返回首页

历史上的今天

今天是: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]); //百位


       

推荐阅读

史海拾趣

Amptek Inc公司的发展小趣事

Amptek Inc 是一家专注于放射性测量和分析仪器的公司,提供各种 X 射线和伽马射线探测器以及相关的测试设备和软件。以下是 Amptek 公司发展的五个相关故事:

  1. 公司成立与早期发展:Amptek 公司于1987年成立,总部位于美国马萨诸塞州贝弗利市。公司成立初期,主要从事于放射性测量仪器的研发和生产。创始人团队在核物理和仪器设计领域拥有丰富的经验,致力于提供高性能、高精度的测量和分析解决方案。

  2. 技术创新与产品升级:随着技术的不断进步,Amptek 公司持续进行技术创新和产品升级。公司引入先进的探测器技术和数据处理算法,不断提升产品的性能和精度。公司的 X 射线和伽马射线探测器在放射性测量和分析领域具有很高的声誉,被广泛应用于科学研究、医学诊断、工业检测等领域。

  3. 全球市场拓展:Amptek 公司在全球范围内建立了广泛的销售网络和服务体系。除了在美国设立销售和服务中心外,公司还在欧洲、亚洲等地设立了分支机构和代理商,为全球客户提供及时的技术支持和售后服务。公司的产品远销全球,赢得了国内外客户的信赖和好评。

  4. 科研合作与应用推广:Amptek 公司与世界各地的科研机构、大学和实验室保持着紧密的合作关系,共同开展科研项目和应用研究。公司的产品被广泛应用于粒子物理、天体物理、材料科学、核医学等领域的实验和研究中,为科学家和研究人员提供了强大的实验工具和数据支持。

  5. 持续发展与未来展望:Amptek 公司将继续致力于技术创新和产品研发,不断提升产品的性能和功能,满足客户不断增长的需求。公司将继续拓展国际市场,加强与客户的合作关系,进一步巩固在放射性测量和分析领域的领先地位。同时,公司还将关注新兴市场和新技术的发展趋势,积极布局未来的发展方向。

CANOPUS公司的发展小趣事

随着业务的不断拓展,CANOPUS开始专注于鼓的制造研究。在1984年,公司推出了其标志性产品——整木掏空榉木军鼓。这款鼓的独特之处在于其鼓腔是由整个树干挖空处理而成,导角也做了特有的设计。这一创新使得CANOPUS的鼓在音质和外观上都与众不同,迅速在市场上获得了认可。

CYMBET公司的发展小趣事

随着全球环境问题的日益严重,环保和可持续发展已经成为电子行业的重要议题。CYMBET公司积极响应这一趋势,致力于环保和可持续发展。公司的EnerChip电池芯片采用环保材料制造,具有生物相容性,不会对环境造成污染。此外,CYMBET还积极探索绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。这种对环保和可持续发展的重视不仅体现了CYMBET的社会责任感,也为公司的可持续发展奠定了坚实的基础。

AEL [AEL Crystals Ltd]公司的发展小趣事

随着业务的不断发展,AEL Crystals意识到全球化战略的重要性。公司开始在全球范围内寻找合适的生产基地,并在英国、日本、台湾、韩国等地区建立了生产基地网络。这一战略布局使得AEL Crystals能够更好地满足全球客户的需求,同时也降低了供应中断的风险。

Floeth Electronic Ltd公司的发展小趣事

AEL Crystals一直注重技术创新和产品升级。公司拥有一支专业的研发团队,致力于开发具有竞争力的新产品。通过不断引进新技术和新材料,AEL Crystals成功推出了一系列具有高性能和稳定性的频率控制产品。这些产品不仅满足了客户的多样化需求,也进一步巩固了公司在行业内的领先地位。

功得(CONQUER)公司的发展小趣事

功得公司最初成立时,只是一家专注于电子元器件代理的小公司。创始人李明看准了电子行业快速发展的趋势,决定投身于这一领域。他带领团队深入市场调研,发现了一种新型的集成电路芯片在市场上有着巨大的潜力。于是,功得公司投入大量资金研发这种芯片,并通过不断改进和优化,最终成功推出了具有竞争力的产品。凭借这一创新产品,功得公司在市场上获得了初步的成功,为后续发展奠定了基础。

问答坊 | AI 解惑

数字对讲机

小弟是通信方面的新手 最近要做一个数字对讲机方面的课题 设计一个短信收发的应用层软件   想请教各位高手 有没有做过或者了解这方面的 给我一点资料或者指导   不甚感激…

查看全部问答>

初学者提问 有关arm linux内核 驱动开发

请教各位,要学arm linux内核 驱动开发,要不要对芯片的结构很了解,如寄存器之类了东西。…

查看全部问答>

WINCE死机了

自从我加了.NET 2.0后在WINCE欢迎界面就死机了!去掉就OK了,请问这是怎么回事呀? …

查看全部问答>

分享流水灯程序

#include <REG51.H>#include <INTRINS.H> void delay(void)   //误差 -0.152253987588us{    unsigned char a,b;    for(b=238;b>0;b--)        for(a=250 ...…

查看全部问答>

关于HOHO申请开发板的的经历

HOHO 申请到了下面的开发板 有图和大家分享:(手机拍摄,可能不清楚)   申请表发送目标邮箱 market@prochip.com.cnHOHO就是发到这个邮箱申请的,希望大家也能成功   申请地址为:大家可以去它的官方网站看看去 如果 ...…

查看全部问答>

ST32的一点建议

现在已经有 STM32  USB 转串口建议STM32  USB 转CAN 口可否芯片改进一些, 把USB/CAN共用的RAM分开?…

查看全部问答>

多级放大电路的动态分析

1、多级放大器的级间关系:在多级放大器中,后级电路相当于前级的负载,前级负载是后级放大器的输入电阻;前级相当后级的信号源,后级信号源内阻为前级的输出电阻。2、n级放大器的动态指标a、总电压放大倍数 :可见, n级放大器的总电压放大倍数 ...…

查看全部问答>

竞赛,单片机(处理器)怎么选取??

本帖最后由 paulhyde 于 2014-9-15 04:14 编辑 竞赛,单片机(处理器)怎么选取?是带队老师建议?是芯片厂商推荐?还是自己一个个测试? 当然,2013年全国大学生电子设计竞赛竞赛题目及要求中有以下说明: 竞赛题目包括 ...…

查看全部问答>

建议论坛做个APP

可以谋障碍的看贴看新闻 网页版属实不太方便 吴哈哈哈…

查看全部问答>