基于stc15单片机 使用 lcd1602 esp8266 ds18b20 tsw30 实现水质浑浊度检测 并显示在lcd1602 并通过8266上传数据的程序

时间: 2023-07-29 07:11:17 浏览: 102
以下是基于 STC15 单片机,使用 LCD1602、ESP8266、DS18B20、TSW30 实现水质浑浊度检测并显示在 LCD1602,并通过 ESP8266 上传数据的程序。 首先,我们需要连接硬件,具体连接方式如下: - 将 LCD1602 的 VSS 引脚连接到 GND,VDD 引脚连接到 +5V,RS 引脚连接到 P1.0,RW 引脚连接到 GND,EN 引脚连接到 P1.1,D4-D7 引脚分别连接到 P2.4-P2.7。 - 将 ESP8266 的 VCC 引脚连接到 +3.3V,GND 引脚连接到 GND,TXD 引脚连接到 P3.1,RXD 引脚连接到 P3.0。 - 将 DS18B20 的 VCC 引脚连接到 +5V,GND 引脚连接到 GND,DQ 引脚连接到 P3.2。 - 将 TSW30 的 DO 引脚连接到 P3.3。 接下来,我们来看看程序实现: ```c #include <STC15F2K60S2.H> #include <intrins.h> sbit SCLK = P3^4; sbit SDIO = P3^5; sbit RS = P1^0; sbit EN = P1^1; unsigned char code dis_str[][8] = {"Temp: ", "Turb: ", "NTU"}; void delay_ms(unsigned int t) { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 1000; j++); } void lcd_write_data(unsigned char dat) { RS = 1; P2 = dat; EN = 1; _nop_(); _nop_(); EN = 0; } void lcd_write_cmd(unsigned char cmd) { RS = 0; P2 = cmd; EN = 1; _nop_(); _nop_(); EN = 0; } void lcd_init() { lcd_write_cmd(0x38); lcd_write_cmd(0x0c); lcd_write_cmd(0x06); lcd_write_cmd(0x01); } void lcd_show_string(unsigned char x, unsigned char y, unsigned char *str) { unsigned char i = 0; if (y == 0) lcd_write_cmd(0x80 + x); else lcd_write_cmd(0xc0 + x); while (str[i] != '\0') { lcd_write_data(str[i]); i++; } } void ds18b20_init() { SDIO = 1; SCLK = 1; delay_ms(5); SDIO = 0; delay_ms(500); SCLK = 0; delay_ms(70); SDIO = 1; delay_ms(5); SCLK = 1; delay_ms(5); SDIO = 1; delay_ms(5); } unsigned char ds18b20_read_byte() { unsigned char i, byte_data = 0; for (i = 0; i < 8; i++) { byte_data >>= 1; SDIO = 0; SCLK = 1; _nop_(); _nop_(); if (SDIO) byte_data |= 0x80; SCLK = 0; _nop_(); _nop_(); } return byte_data; } void ds18b20_write_byte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { SDIO = dat & 0x01; dat >>= 1; SCLK = 1; _nop_(); _nop_(); SCLK = 0; _nop_(); _nop_(); } } int ds18b20_read_temp() { unsigned char i; int temp = 0; ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0x44); delay_ms(100); ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0xbe); for (i = 0; i < 2; i++) temp |= ds18b20_read_byte() << (i * 8); return temp; } unsigned int tsw30_read_ntu() { unsigned int ntu; TSW30 = 1; delay_ms(10); ntu = (unsigned int)TSW30; TSW30 = 0; return ntu; } void esp8266_send_cmd(char *cmd) { while (*cmd != '\0') { SBUF = *cmd; while (!TI); TI = 0; cmd++; } } void esp8266_send_data(char *data) { esp8266_send_cmd("AT+CIPSEND="); esp8266_send_cmd(itoa(strlen(data))); esp8266_send_cmd("\r\n"); delay_ms(1000); while (*data != '\0') { SBUF = *data; while (!TI); TI = 0; data++; } delay_ms(1000); } void main() { unsigned int temp; unsigned int ntu; char temp_str[10]; char ntu_str[10]; char send_buf[50]; TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; PCON &= 0x7f; SCON = 0x50; TR1 = 1; lcd_init(); while (1) { temp = ds18b20_read_temp(); ntu = tsw30_read_ntu(); sprintf(temp_str, "%d", temp / 16); sprintf(ntu_str, "%d", ntu); lcd_show_string(0, 0, dis_str[0]); lcd_show_string(6, 0, temp_str); lcd_show_string(11, 0, "C"); lcd_show_string(0, 1, dis_str[1]); lcd_show_string(6, 1, ntu_str); lcd_show_string(11, 1, dis_str[2]); sprintf(send_buf, "Temperature: %dC, Turbidity: %dNTU", temp / 16, ntu); esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.1.100\",8000\r\n"); delay_ms(1000); esp8266_send_data(send_buf); delay_ms(1000); } } ``` 程序中,我们先定义了一些变量和常量,其中 dis_str 数组存储了 LCD1602 中需要显示的字符串,delay_ms 函数用来进行延时,lcd_write_data 和 lcd_write_cmd 函数用来向 LCD1602 中写入数据和命令,lcd_init 函数用来初始化 LCD1602,lcd_show_string 函数用来在 LCD1602 上显示字符串,ds18b20_init 函数用来初始化 DS18B20 温度传感器,ds18b20_read_byte 函数用来从 DS18B20 中读取一个字节的数据,ds18b20_write_byte 函数用来向 DS18B20 中写入一个字节的数据,ds18b20_read_temp 函数用来读取 DS18B20 中的温度值,tsw30_read_ntu 函数用来读取 TSW30 中的浑浊度值,esp8266_send_cmd 函数用来向 ESP8266 发送 AT 命令,esp8266_send_data 函数用来向 ESP8266 发送数据。 在主函数中,我们先初始化串口,初始化 LCD1602 和 DS18B20,然后进入一个无限循环中,不断读取温度和浑浊度值并在 LCD1602 上显示,然后将数据通过 ESP8266 发送到服务器上。 需要注意的是,在使用 ESP8266 发送数据之前,我们需要先将 ESP8266 连接到 Wi-Fi 网络中,并将其 IP 地址和端口号设置为服务器的 IP 地址和端口号。具体的连接方式和设置方法可以参考 ESP8266 的相关文档。

相关推荐

最新推荐

recommend-type

基于stc51单片机的LCD1602显示时间_的电子万年历(显示当前温度)

"基于 STC51 单片机的 LCD1602 显示时间的电子万年历(显示当前温度)" 本资源是基于 STC51 单片机的电子万年历项目,旨在设计一个可以显示当前时间、温度和日期的电子万年历。该项目使用 STC51 单片机作为控制器,...
recommend-type

基于STC15W204S单片机模拟单总线EEPROM芯片DS2431

基于STC15W204S单片机研究模拟了单总线EEPROM芯片DS2431。SOP8封装的STC15W204S单片机具有引脚少、价格便宜、不需要外部晶振、内部时钟从5 MHz~35 MHz可设置的优点。DS2431是一款具有1 024 bit的1 Wire EEPROM芯片...
recommend-type

DS18B20 温度传感器自动火灾报警论文

综上所述,这篇论文详细阐述了如何使用51单片机、DS18B20温度传感器、DS1302时钟芯片和1602 LCD显示屏设计一个自动火灾报警器。通过集成这些组件,系统能够实时监测温度,当温度超出安全范围时,触发报警机制,为...
recommend-type

ESP8266(AP模式)控制51单片机亮灯.docx

有关ESP8266型号的WiFi模块的,简单有关51的用法,希望可以帮到你
recommend-type

基于嵌入式ARMLinux的播放器的设计与实现 word格式.doc

本文主要探讨了基于嵌入式ARM-Linux的播放器的设计与实现。在当前PC时代,随着嵌入式技术的快速发展,对高效、便携的多媒体设备的需求日益增长。作者首先深入剖析了ARM体系结构,特别是针对ARM9微处理器的特性,探讨了如何构建适用于嵌入式系统的嵌入式Linux操作系统。这个过程包括设置交叉编译环境,优化引导装载程序,成功移植了嵌入式Linux内核,并创建了适合S3C2410开发板的根文件系统。 在考虑到嵌入式系统硬件资源有限的特点,通常的PC机图形用户界面(GUI)无法直接应用。因此,作者选择了轻量级的Minigui作为研究对象,对其实体架构进行了研究,并将其移植到S3C2410开发板上,实现了嵌入式图形用户界面,使得系统具有简洁而易用的操作界面,提升了用户体验。 文章的核心部分是将通用媒体播放器Mplayer移植到S3C2410开发板上。针对嵌入式环境中的音频输出问题,作者针对性地解决了Mplayer播放音频时可能出现的不稳定性,实现了音乐和视频的无缝播放,打造了一个完整的嵌入式多媒体播放解决方案。 论文最后部分对整个项目进行了总结,强调了在嵌入式ARM-Linux平台上设计播放器所取得的成果,同时也指出了一些待改进和完善的方面,如系统性能优化、兼容性提升以及可能的扩展功能等。关键词包括嵌入式ARM-Linux、S3C2410芯片、Mplayer多媒体播放器、图形用户界面(GUI)以及Minigui等,这些都反映出本文研究的重点和领域。 通过这篇论文,读者不仅能了解到嵌入式系统与Linux平台结合的具体实践,还能学到如何在资源受限的环境中设计和优化多媒体播放器,为嵌入式技术在多媒体应用领域的进一步发展提供了有价值的经验和参考。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Python字符串为空判断的动手实践:通过示例掌握技巧

![Python字符串为空判断的动手实践:通过示例掌握技巧](https://img-blog.csdnimg.cn/72f88d4fc1164d6c8b9c29d8ab5ed75c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGFyYm9yIExhdQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. Python字符串为空判断的基础理论 字符串为空判断是Python编程中一项基本且重要的任务。它涉及检查字符串是否为空(不包含任何字符),这在
recommend-type

box-sizing: border-box;作用是?

`box-sizing: border-box;` 是 CSS 中的一个样式属性,它改变了元素的盒模型行为。默认情况下,浏览器会计算元素内容区域(content)、内边距(padding)和边框(border)的总尺寸,也就是所谓的"标准盒模型"。而当设置为 `box-sizing: border-box;` 后,元素的总宽度和高度会包括内容、内边距和边框的总空间,这样就使得开发者更容易控制元素的实际布局大小。 具体来说,这意味着: 1. 内容区域的宽度和高度不会因为添加内边距或边框而自动扩展。 2. 边框和内边距会从元素的总尺寸中减去,而不是从内容区域开始计算。
recommend-type

经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf

本文主要探讨的是"经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf",该研究专注于嵌入式指纹识别技术在实际应用中的设计和实现。嵌入式指纹识别系统因其独特的优势——无需外部设备支持,便能独立完成指纹识别任务,正逐渐成为现代安全领域的重要组成部分。 在技术背景部分,文章指出指纹的独特性(图案、断点和交叉点的独一无二性)使其在生物特征认证中具有很高的可靠性。指纹识别技术发展迅速,不仅应用于小型设备如手机或门禁系统,也扩展到大型数据库系统,如连接个人电脑的桌面应用。然而,桌面应用受限于必须连接到计算机的条件,嵌入式系统的出现则提供了更为灵活和便捷的解决方案。 为了实现嵌入式指纹识别,研究者首先构建了一个专门的开发平台。硬件方面,详细讨论了电源电路、复位电路以及JTAG调试接口电路的设计和实现,这些都是确保系统稳定运行的基础。在软件层面,重点研究了如何在ARM芯片上移植嵌入式操作系统uC/OS-II,这是一种实时操作系统,能够有效地处理指纹识别系统的实时任务。此外,还涉及到了嵌入式TCP/IP协议栈的开发,这是实现系统间通信的关键,使得系统能够将采集的指纹数据传输到远程服务器进行比对。 关键词包括:指纹识别、嵌入式系统、实时操作系统uC/OS-II、TCP/IP协议栈。这些关键词表明了论文的核心内容和研究焦点,即围绕着如何在嵌入式环境中高效、准确地实现指纹识别功能,以及与外部网络的无缝连接。 这篇论文不仅深入解析了嵌入式指纹识别系统的硬件架构和软件策略,而且还展示了如何通过结合嵌入式技术和先进操作系统来提升系统的性能和安全性,为未来嵌入式指纹识别技术的实际应用提供了有价值的研究成果。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依