62 基于单片机的智能饮水机
所有仿真详情导航:
目录
一、主要功能
基于51单片机,采用DS1302时钟模块读取时间,DS18B20温度传感器检测时间,超声波检测,如果靠近,则感应自动出水,LCD1602显示实时时间,水杯温度,水位高度,是否出水,如果水温和水位超过下限,则声光报警,此时继电器闭合,自动加热/加水,然后也可以手动加热,加水,清洗,然后采用串口模拟WIFI,与电脑端通信模拟手机APP,报警的时候会发出信息给电脑端。
具体动态效果看B站演示视频(高清需要跳转到B站看)
二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
三、主程序编程
//-----------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------
//#include <reg51.h>
#include "reg52.H"
#include <intrins.h>
#include <stdio.h>
//-----------------------------------------------------------------
// 数据类型宏定义
//-----------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------------------------
// 定义LCD使用的IO口
//-----------------------------------------------------------------
sbit rs=P2^2; //寄存器选择端口
sbit rw=P2^1; //读写选择端口
sbit ep=P2^0; //使能信号端口
//-----------------------------------------------------------------
// 定义ds1302使用的IO口
//-----------------------------------------------------------------
sbit DSIO=P2^7;
sbit RST=P2^5;
sbit SCLK=P2^6;
//-----------------------------------------------------------------
// 定义按键、蜂鸣器和继电器使用的IO口
//-----------------------------------------------------------------
sbit KEY1=P1^2; //手动加水按键设置
sbit KEY2=P1^3; //手动清洗按键设置
sbit KEY3=P1^4; //手动上传数据按键设置
sbit LED1=P1^0;//led报警设置
sbit LED2=P1^1; //led水位过低标志
sbit BUZZER=P2^3; //蜂鸣器设置
sbit HOT=P2^4; //加热设置
sbit ADD_Water=P1^7;//加水设置
sbit CLEAN=P3^2; //清洗设置
//-----------------------------------------------------------------
// 定义DS18B20数据口
//-----------------------------------------------------------------
sbit DQ = P3^3;
uchar FLAG=1; //正负温度标志
unsigned char TMPH,TMPL;
uint temp;
//-----------------------------------------------------------------
// 定义ADC0832数据口
//-----------------------------------------------------------------
sbit cs = P3^4;//片选使能,低电平有效
sbit clk = P3^5;//芯片时钟输入
sbit dio = P3^7;//数据输入DI与输出DO
//-----------------------------------------------------------------
// 定义超声波数据口
//-----------------------------------------------------------------
sbit Trig = P1^5;//触发信号控制端口
sbit Echo = P1^6;//回响信号接收端口
unsigned int S = 0;//距离缓存变量
unsigned long times = 0;//时间缓存变量
//sbit TXD = P3^1;
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//LCD要显示的时间所在的地址
uchar code DT_lcdplace[] = {0x06,0x03,0x00};
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[] = {0, 0, 0};
uchar data_h,data_l;
uchar add_flag,drop_flag;
char count=0;//计数,count=20表示1s
uchar Alarm_time[] = {12,30,00};//闹钟时间
uchar temp1,temp2;
static char Dat_rxd;
static int moshi=0;
//-----------------------------------------------------------------
// 延时程序
//-----------------------------------------------------------------
void delay(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0; i<250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay_temp(uchar N)
{
while(--N);
}
//延时2us
void Delay_2us(void)
{
_nop_();
_nop_();
}
/******************************************************
** 函数名:Com0
** 描述 :串口上传pc函数
** 输入 :要上传的数据
** 输出 :无
******************************************************/
void Com0_Init(void)
{
ES=1; //允许串口中断
TMOD=0x21; //定时器T1,在方式3中断产生波特率
SCON=0x50;
TH1=0xfd; //波特率设置为9600(晶振12M)
TL1=0xfd;
TR1=1; //开定时器T1运行控制位
TI=1;
}
void Com0(void) interrupt 4 using 1
{
if(RI)
{
Dat_rxd=SBUF; //串口接收
Dat_rxd=Dat_rxd-0x30;
RI=0;
}
}
/*******************************************************************************
* 函 数 名 : Ds1302Write
* 函数功能 : 向DS1302命令(地址+数据)
* 输 入 : addr,dat
* 输 出 : 无
*******************************************************************************/
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();
for (n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//传送数据结束
_nop_();
}
/*******************************************************************************
* 函 数 名 : Ds1302Read
* 函数功能 : 读取一个地址的数据
* 输 入 : addr
* 输 出 : dat
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_();//以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
四、资源下载
全部资料(源程序、仿真文件、安装包、原理图、演示视频):
链接: https://pan.baidu.com/s/1E1pIODjUJ1ykFsrM7jJFPQ?pwd=c8y4 提取码: c8y4
--来自百度网盘超级会员v4的分享
原文地址:https://blog.csdn.net/zs849644371/article/details/144306181
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!