一.项目和创意方向介绍
本项目旨在设计并实现一个基于STC89C52单片机的智能洗碗机控制系统。智能洗碗机利用微控制器技术和多种传感器模块,以实现自动化、智能化的洗碗过程。系统可进行温度检测、水位控制、加热、排水、冲洗以及报警等多种功能,并且能够通过蓝牙模块与手机端通信,实时监控和设置参数。
创意方向:
通过现代化的单片机控制技术,使传统洗碗机具备智能化和自动化功能,大幅提升用户体验和设备效率,适应现代家居的智能化需求。
二.项目设计思路及实现方法
1.设计思路
- 系统模块划分:将整个系统分为输入、处理和输出三个部分。
- 中央控制:使用STC89C52单片机作为核心控制器。
- 数据采集:通过DS18B20温度传感器和水位检测模块获取关键数据。
- 手动控制:通过独立按键实现手动界面切换和参数设置。
- 状态显示和告警:利用LCD1602显示屏、LED和蜂鸣器提供实时信息和警报。
- 蓝牙通信:通过蓝牙模块实现与移动设备的通信。
2.实现方法
- 硬件设计:搭建包括单片机、传感器、显示屏、继电器和蓝牙模块在内的硬件电路。
- 软件编程:编写单片机程序,包括传感器数据处理、继电器控制逻辑、显示更新、按键处理和蓝牙通信。
三.项目方案框图和原理图介绍
这是本次项目的一个系统框图。
这是由KiCad所绘制的智能洗碗机的原理图
方案框图说明:
- 中控部分: STC89C52单片机,负责主要的控制和处理任务。
- 输入部分:
- DS18B20温度采集模块: 用于实时检测洗碗机内部温度。
- 水位检测模块: 监测洗碗机内部水位状态。
- 独立按键: 用于用户交互,包括界面切换、参数调整和操作控制。
- 输出部分:
- LCD1602显示模块: 提供洗碗机运行状态和参数显示。
- 进水继电器、加热继电器、排水继电器、冲洗继电器: 控制洗碗机的进水、加热、排水和冲洗功能。
- LED和蜂鸣器: 用于状态指示和报警功能。
- 蓝牙模块: 实现与手机端的数据交互和远程控制功能。
四.设计中用到的指定厂商元器件及介绍
- 继电器:TE Connectivity 提供广泛的连接解决方案,包括我所需要的DC5V继电器来控制水泵。
- 蜂鸣器:Microchip 提供广泛的电子解决方案,包括各种传感器和驱动器件,这是我选择的原因。
- 电阻:可以选择的方案有许多,本次我选择的是TE Connectivity 公司的优质电阻。
- LCD1602显示屏:ROHM 作为电子元器件制造商,它是我的优先选择。
五.PCB设计介绍及遇到的问题和解决方法
关于PCB部分,可以看到我是将他们按照一定的顺序进行排布的,确保PCB的一个美观度,我所遇到的一个问题主要还是电流走线问题以及如何正确驱动继电器正常工作,再者就是蓝牙模块的几条线没有正确的分在单片机对应功能的位置上导致上电就烧,很烦。解决方法就是我将PCB的走线都明显加粗处理,查看单片机引脚分布找到RX与TX与蓝牙模块交错相连就没问题了。
六.关键代码及说明
#include "uart.h"
uchar uart_num;
void Uart_Init(void)
{
SCON=0x50;
RCLK = 1;
TCLK = 1;
TH2 = RCAP2H = (65536 - 11059200/32/115200)/256;
TL2 = RCAP2L = (65536 - 11059200/32/115200)%256;
TR2 = 1;
ES=1;
EA=1;
void Uart_Sent_Char(uchar date)
{
SBUF=date;
while(!TI);
TI=0;
}
void Uart_Sent_Str(uchar *date)
{
while(*date != '\0')
{
Uart_Sent_Char(*date);
date++;
}
}
void ser() interrupt 4
{
static uchar string[1];
if(RI)
{
RI=0;
string[0]=SBUF;
switch(string[0])
{
case('1'): uart_num = 1 ;break;
case('2'): uart_num = 2 ;break;
case('3'): uart_num = 3 ;break;
default: break;
}
}
}
}
此代码实现了一个简单的串口通信功能,包括初始化、数据发送和接收处理。串口初始化配置了参数,使用定时器2提供波特率,通过中断服务程序来接收数据,并根据接收的数据更新全局变量 uart_num
的值。
#include "ds18b20.h"
void ds18b20_delay_uint(uint z)
{
while(z--);
}
void Ds18b20_Init(void)
{
bit q;
DS18B20_DQ=1; //把总线拿高
ds18b20_delay_uint(1); //15us
DS18B20_DQ=0; //给复位脉冲
ds18b20_delay_uint(80); //750us
DS18B20_DQ=1; //把总线拿高 等待
ds18b20_delay_uint(10); //110us
q=DS18B20_DQ; //读取18b20初始化信号
ds18b20_delay_uint(20); //200us
DS18B20_DQ=1; //把总线拿高 释放总线
}
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //写数据是低位开始
DS18B20_DQ=0; //把总线拉低
DS18B20_DQ=dat&0x01; //向18b20总线写数据
ds18b20_delay_uint(5); // 60us
DS18B20_DQ=1; //释放总线
dat>>=1;
}
}
uchar read_18b20(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
DS18B20_DQ=0; //把总线拿低读时间隙开始
value>>= 1; //读数据是低位开始
DS18B20_DQ=1; //释放总线
if(DS18B20_DQ==1) //开始读写数据
value|=0x80;
ds18b20_delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
}
return value;
}
int Ds18b20_Read_Temp(void)
{
int temp = 0;
uchar tmh, tml;
Ds18b20_Init(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0x44); //启动一次温度转换命令
ds18b20_delay_uint(50); //500us
Ds18b20_Init(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0xbe); //发出读取暂存器命令
EA=0; //关闭中断,防止数据读取异常
tml=read_18b20(); //读温度低字节
tmh=read_18b20(); //读温度高字节
EA=1; //打开中断
temp = tmh; //整合数值
temp <<= 8;
temp |= tml;
temp=temp*0.0625*10; //换算成温度,并扩大10倍,个位为小数位
return temp;
}
这一串代码就是一个实现了对DS18B20温度传感器的初始化、数据写入、数据读取以及温度值获取的功能。
#include "lcd1602.h"
void lcd1602_check_busy()
{
P0=0xff;
do
{
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=0;
LCD1602_E=1;
} while(LCD1602_BUSY==1);
LCD1602_E=0;
}
void lcd1602_write_date(uchar date)
{
lcd1602_check_busy();
LCD1602_E=0;
LCD1602_PORT=date;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=1;
LCD1602_E=0;
}
void lcd1602_write_com(uchar com)
{
lcd1602_check_busy();
LCD1602_E=0;
LCD1602_PORT=com;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=1;
LCD1602_E=0;
}
void lcd1602_display_str(uchar hang, uchar add, uchar *dat)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行
while(*dat != '\0')
{
lcd1602_write_date(*dat++);
}
}
void lcd1602_display_temp(uchar hang, uchar add,uchar *temp_buf)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行
lcd1602_display_str(1,2,temp_buf);
lcd1602_write_date(0xdf);
lcd1602_write_date(0x43);
lcd1602_write_date(' ');
lcd1602_write_date(' ');
}
void lcd1602_clean()
{
lcd1602_display_str(1,0," ");
lcd1602_display_str(2,0," ");
}
void Lcd1602_Init()
{
lcd1602_write_com(0x38);
lcd1602_write_com(0x0c);
lcd1602_write_com(0x06);
lcd1602_write_com(0x01);
}
这串代码包含了多个操作向LCD1602液晶显示模块的函数,包括发送命令(lcd1602_write_com
)、显示字符串(lcd1602_display_str
)、显示温度(lcd1602_display_temp
)、清屏(lcd1602_clean
)、以及初始化LCD1602显示模块(Lcd1602_Init
),通过这些函数的调用,可以在LCD1602上实现各种信息的显示。
七.功能展示图及说明
我们可以通过DS18B20可以实时观测温度的变化,通过按钮切换自己想要的数据进行实时控制我们的洗碗机的控制。
八.心得体会
通过本项目的设计与实现,我深刻理解了嵌入式系统的开发流程和各种传感器、执行模块的应用特点。在项目中,我学会了如何利用单片机进行数据处理与控制,如何通过传感器实时监测环境参数,以及如何设计用户友好的界面与功能。这不仅增强了我的硬件设计能力,还提升了解决问题和团队合作的能力。未来,我将继续深入学习和探索,致力于开发更多创新的嵌入式系统解决方案。