自学内容网 自学内容网

62 基于单片机的智能饮水机

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、主程序编程

四、资源下载


一、主要功能

        基于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)!