综合实训:海洋环境监测节点
课程定位:C51 单片机课程综合实训周项目(融合海洋特色) 学习目标:综合运用全部 C51 + Proteus + LCEDA 知识,完成一个"海洋环境监测节点"的设计、仿真与实物制作,体验完整的硬件开发流程。
项目背景
湛江地处南海之滨,海洋牧场、水产养殖、近岸水质监测是本地特色产业。本实训以海洋环境监测为应用场景,设计一个可部署在海洋牧场/养殖区的环境监测节点,实时采集并显示水温、光照等关键参数。
🐟 海洋特色融入:本项目将通用传感器教学与海洋应用场景结合,学生可扩展为溶解氧、盐度、水位、浊度等海洋专属参数监测。
一、项目需求
功能要求
| 功能 | 说明 |
|---|---|
| 水温采集 | 用 DS18B20 数字温度传感器采集水温(0~50℃) |
| 光照检测 | 用光敏电阻 + ADC 检测环境光照强度 |
| 实时显示 | LCD1602 液晶屏显示温度、光照、状态 |
| 超限报警 | 水温超过设定阈值,蜂鸣器报警 + LED 指示 |
| 阈值设置 | 按键调整报警阈值(上调/下调/确认) |
| 串口上报 | 通过串口将采集数据上传上位机(模拟数据上报) |
系统框图
mermaid
flowchart LR
A[DS18B20 水温传感器] --> D[STC89C52 主控]
B[光敏电阻+ADC] --> D
C[按键×3 阈值设置] --> D
D --> E[LCD1602 显示]
D --> F[蜂鸣器+LED 报警]
D --> G[串口上报]二、硬件设计
元件清单
| 元件 | 型号/参数 | 数量 | 用途 |
|---|---|---|---|
| 单片机 | STC89C52RC | 1 | 主控 |
| 温度传感器 | DS18B20 | 1 | 水温采集 |
| 液晶屏 | LCD1602 | 1 | 数据显示 |
| 光敏电阻 | GL5528 | 1 | 光照检测 |
| 电位器 | 10K | 1 | ADC 分压 |
| 蜂鸣器 | 有源 5V | 1 | 报警 |
| LED | 红/绿 | 各1 | 状态指示 |
| 按键 | 轻触 | 3 | 阈值设置 |
| 电阻 | 4.7K/10K/330Ω | 若干 | 上拉/限流 |
关键电路
DS18B20 接线(单总线):
STC89C52 DS18B20
┌──────┐ ┌──[4.7K上拉]──VCC
│ P3.7 ├───┤ │
│ │ │ ┌───────────┘
│ │ ├──┤ DQ
│ │ ├──┤ VCC ── 5V
│ │ └──┤ GND ── GND
└──────┘光敏电阻 + ADC(用单片机的比较器/PWM 或外接 ADC0809):
VCC ──[光敏电阻 GL5528]──┬──[电位器 10K]──GND
│
P1.0 (ADC输入)三、程序设计
模块划分
main.c 主程序:系统初始化、主循环
ds18b20.c 温度传感器驱动(单总线时序)
lcd1602.c LCD 显示驱动
adc.c ADC 采样(光照)
key.c 按键扫描与阈值设置
alarm.c 超限判断与报警
uart.c 串口上报主程序框架
c
/****************************************************
* 海洋环境监测节点 - 主程序
****************************************************/
#include <reg51.h>
#include "ds18b20.h"
#include "lcd1602.h"
#include "adc.h"
#include "key.h"
// 全局参数
unsigned int temperature; // 水温(℃×10)
unsigned char light; // 光照等级
unsigned int alarm_temp = 300; // 报警阈值(30.0℃)
void main(void)
{
lcd_init(); // LCD 初始化
uart_init(); // 串口初始化
lcd_show(0, 0, "Ocean Monitor");
lcd_show(0, 1, "Temp: --.- C");
while (1)
{
// 1. 采集数据
temperature = read_ds18b20(); // 读温度
light = read_light(); // 读光照
// 2. 更新显示
lcd_show_temp(temperature);
lcd_show_light(light);
// 3. 超限判断
if (temperature > alarm_temp)
alarm_on(); // 蜂鸣+LED
else
alarm_off();
// 4. 阈值设置(按键)
key_handle(&alarm_temp);
// 5. 串口上报
uart_send_data(temperature, light, alarm_temp);
delay_ms(500); // 采样周期
}
}DS18B20 温度读取(单总线核心时序)
c
// 复位脉冲
bit ds18b20_reset(void)
{
bit presence;
DQ = 0; delay_us(480); // 拉低 480us
DQ = 1; delay_us(60); // 释放
presence = DQ; // 读存在脉冲
delay_us(420);
return presence; // 0=存在
}
// 读温度
unsigned int read_ds18b20(void)
{
unsigned char low, high;
ds18b20_reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0x44); // 启动转换
delay_ms(750); // 等待转换
ds18b20_reset();
write_byte(0xCC); // 跳过 ROM
write_byte(0xBE); // 读暂存器
low = read_byte(); // 低字节
high = read_byte(); // 高字节
return (high << 8) | low; // 原始 16 位数据
}四、仿真验证(Proteus)
- 在 Proteus 中绘制完整电路(单片机 + DS18B20 + LCD1602 + 光敏电阻 + 蜂鸣器 + 按键)
- Keil 编写完整程序,编译生成 HEX
- 加载 HEX 运行仿真
- 用 Proteus 虚拟仪器验证:
- 虚拟终端查看串口上报数据
- 调节 DS18B20 温度值(双击元件改温度),观察 LCD 与报警联动
- 调节光照(电位器),观察光照显示变化
仿真验收要点:
□ LCD 正确显示温度/光照
□ 温度超过阈值时蜂鸣器响 + LED 亮
□ 按键能调整阈值
□ 串口能上报数据帧五、PCB 设计与制作(LCEDA)
- 在 LCEDA 中绘制原理图(STC89C52 最小系统 + 各外设)
- 布局布线:主控居中,DS18B20/蜂鸣器等传感器接口放板边
- DRC 检查 0 错误
- 导出 Gerber,嘉立创打样
- 焊接调试
板级设计建议
| 设计点 | 建议 |
|---|---|
| 传感器接口 | 用排针/端子引出,便于外接探头 |
| 防水考虑 | 预留硅胶密封槽位(海洋场景防护) |
| 供电 | USB 供电 + 稳压,预留电池接口(户外部署) |
| 天线预留 | 扩展串口/WiFi 模块接口(后续联网) |
六、项目验收
功能验收
| 验收项 | 标准 |
|---|---|
| 温度采集 | 显示与实际温度误差 ±1℃ |
| 光照检测 | 光照变化能反映到显示 |
| 超限报警 | 阈值触发蜂鸣器+LED 正常 |
| 阈值设置 | 按键可调整并保存 |
| 串口上报 | 数据帧格式正确 |
文档验收
- 提交实验报告(见下一节模板)
- 提交 Proteus 仿真文件 + Keil 源码
- 提交 LCEDA 原理图 + PCB 文件
- 提交实物照片 + 演示视频(可选)
七、评分标准
| 项目 | 分值 |
|---|---|
| 方案设计与答辩 | 20 |
| 仿真功能完整 | 25 |
| PCB 设计质量 | 20 |
| 实物功能演示 | 25 |
| 报告规范 | 10 |
拓展方向
- 海洋专属参数:扩展 DS18B20 之外的溶解氧传感器、盐度传感器(电导率法)
- 无线组网:接入 ZigBee/WiFi 模块,实现多节点海洋监测组网
- 低功耗设计:间歇采集、休眠唤醒,延长节点续航
- 太阳能供电:设计太阳能充电电路,适配野外/海上部署