• 【毕业设计】基于单片机的智能饮水机系统 - stm32 物联网 嵌入式



    1 简介

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

    基于单片机的智能饮水机系统设计与实现

    大家可用于 课程设计 或 毕业设计


    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052


    在这里插入图片描述

    2 绪论

    2.1 课题背景与目的

    这次设计的智能饮水机就是单片机结合传感器的一个应用。

    该系统设计综合单片机以及电子技术理论,从生活实际出发,完善了饮水机的功能。整个设计系统实现三个功能,即加热、对温度上下限的控制和定时加热。与传统的饮水机相比,由于采用了自动检测和控制的电子设计技术,可较好地实现对水温的测量和控制,具有较广泛的应用前景。

    系统包括温度传感器,键盘输入模块,输出控制模块,数据传输模块,温度显示模块和出水驱动电路等部分。



    3 系统设计


    3.1 智能饮水机功能设计


    智能饮水机具有过热保护防干烧、 加热至沸腾、 设置温度加热、 超温报警提示、 安全锁定、 电动机出水功能等。

    3.1.1 智能饮水机的按键功能:

    • ① 出水键: 控制饮水机出水和停止出水;
    • ② 加热键: 负责控制开始加热和停止加热;
    • ③ 锁定键: 按下锁定键, 其他按键无效;
    • ④ 切换健:按下后开始设定用户想要的温度;
    • ⑤ 温度设定键: 按一下温度增加 5℃,温度可在 0℃到 100℃之间循环。

    3.1.2 智能饮水机的显示功能:

    • ①电源灯(绿色) : 接通电源, 电源灯点亮;
    • ②加热指示灯(黄色) :按下加热键, 加热指示灯点亮, 表示烧水开始工作。 再次按下加热键,指示灯熄灭, 表示烧水停止;
    • ③锁定键指示灯(蓝色) : 锁定其他按键功能, 灯亮表示其他按键均不可用;
    • ④超温报警灯(红色) : 灯点亮表示水已经达到设定的加热温度或已沸腾并停止加热;
    • ⑤数码管: 显示当前水温或用户设定的温度。
    • ⑥蜂鸣器: 响起后说明水以沸腾并停止加热。

    3.2 系统架构

    整个硬件系统由主控制系统、输入输出模块、传感器、其他功能电路和电源部分组成。主控系统使用单片机控制,包括对键盘的信息的接收和控制,对其他功能电路的控制等,通过软件编程实现预定功能;传感器部分即检测子系统,主要是进行饮水机中水的温度检测和控制,采用智能温度传感器DS18B20;其他功能电路部分包括恒温,防干烧,出水等电路,达到功能多样化;电源部分为智能饮水机提供必要的电能,保证饮水机能够正常的工作。

    在这里插入图片描述

    3.3 软件部分

    3.3.1 主程序部分

    程序的初始化主要包括三个环节:

    • (1) 实现各种设置堆栈指针、 定时器/计数器 0 初始化、 以及开中断、定时器/计数器启动;
    • (2) 实现 LED 显示当前水温并能显示预设的水温;
    • (3) 不断的进行按键扫描, 判断是否有按键按下, 如没有按键按下,则返回显示; 如有按键按下, 则根据所按键实现相应的操作。

    人机对话功能键设置如下:

    • (1) “出水” 键: 控制其出水和停止出水;
    • (2) “加热” 键: 控制其加热和停止加热;
    • (3) “锁定” 键: 用于锁定其他所有按键;
    • (4) “切换” 键: 用于将显示器切换至温度设定界面并开始设定温度;
    • (5) “设置温度” 键: 以 5℃为间隔在 0℃至 100℃之间以递增方式设定水温。
    // 关键代码
    void main()
    {
    T=100;
    while(1)
    {
    Lock_key();
    if(Lock==0)
    keyscan();
    if(flag2==0)
    temp_display();
    if(flag2==1)
    SEG_display(T,0);
    if(temp>=T*10) {Temp_led=0;Hot=1;Hot_led=1;}
    if(temp< T*10) Temp_led=1;
    if(temp>=1000){Beep=0;Hot=1;Hot_led=1;}
    if(temp<1000) Beep=1;
    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    3.3.2 温度检测

    温度检测运用 DS18B20 芯片, 因为其功能全面且精度高, 完全可以满足设计要求, 它将检测到的水温送给单片机, 再由单片机输出给显示电路将实时水温显示出来。

    在这里插入图片描述

    // 关键代码
    void init_ds18b20()
    {
    uchar x=0;
    DQ = 1; //DQ 复位
    delay_us(10); //稍做延时
    DQ = 0; //单片机将 DQ 拉低
    delay_us(100); //精确延时 大于 480us
    DQ = 1; //拉高总线
    delay_us(10);
    x=DQ; //稍做延时后 如果 x=0则初始化成功 x=1 则初始化失败
    delay_us(20);
    }
    uchar ReadOneChar()
    {
    uchar i;
    uchar dat=0;
    for (i=8;i>0;i--)
    {
    DQ = 0;
    dat>>=1;
    DQ = 1; 
    if(DQ)
    dat|=0x80;
    delay_us(10);
    }
    return(dat);
    }
    void WriteOneChar(uchar dat)
    {
    uchar i;
    for (i=8; i>0; i--)
    {
    DQ = 0;
    DQ = dat&0x01;
    delay_us(10);
    DQ = 1;
    dat>>=1;
    }
    }
    int ReadTem()
    {
    int t;
    uchar a,b;
    init_ds18b20();
    WriteOneChar(0xcc); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    delay_us(200);
    init_ds18b20();
    WriteOneChar(0xcc); //跳过读序号列号的操作
    WriteOneChar(0xbe); //读取温度寄存器等
    a=ReadOneChar();
    b=ReadOneChar();
    t=b;
    t<<=8;
    t=t|a;
    return t;
    }
    void temp_display()
    {
    uint temp_point;
    temp=ReadTem()*0.625; //将温度的高位与低位合并
    temp_point=temp%10; //取出小数位
    SEG_display(temp/10,temp_point);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    3.3.3 显示程序设计

    显示程序是负责点亮 4 支数码管, 并根据单片机送出的数据及时更新显示的数据, 其程序流程图如下

    (大家可以换成oled屏显示)

    在这里插入图片描述

    // 关键代码
    void SEG_display(uchar dat1,uchar dat2)
    {
    P23=1;
    P0=table[dat1/100];
    P20=0;
    delay_us(80);
    P20=1;
    P0=table[dat1/10%10];
    P21=0;
    delay_us(80);
    P21=1;
    P0=table[dat1%10]|0x80;
    P22=0;
    delay_us(80);
    P22=1;
    P0=table[dat2];
    P23=0;
    delay_us(80);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    3.3.4 键盘扫描程序

    键盘扫描程序的任务是在程序运行过程中始终不停的检测是否有按键被按下, 如果检测到有按键被按下, 则进入与该按键对应的程序运行; 若该按键没有被按下, 则继续检测下一个按键, 如此循环, 从而完成每一个按键所对应的功能。

    在这里插入图片描述

    // 关键代码
    void keyscan()
    {
    if(key1==0)
    {
    delay_ms(2);
    if(key1==0)
    {
    flag=~flag;
    if(flag==1)
    Out=0;
    if(flag==0)
    Out=1;
    }
    while(!key1);
    }
    if(key2==0)
    {
    delay_ms(2);
    if(key2==0)
    {
    flag1=~flag1;
    if(flag1==1)
    {Hot=0;Hot_led=0;}
    if(flag1==0)
    {Hot=1;Hot_led=1;}
    }
    while(!key2);
    }
    if(key3==0)
    {
    delay_ms(2);
    if(key3==0)
    {
    if(flag2==1) T+=5;
    if(T>=101)T=0;
    }
    while(!key3);
    }
    if(key5==0)
    {
    delay_ms(2);
    if(key5==0)
    {
    flag2=~flag2;
    }
    while(!key5);
    }
    }
    void Lock_key() // 锁定键盘
    {
    if(key4==0)
    {
    delay_ms(2);
    if(key4==0)
    {
    Lock=~Lock;
    if(Lock==1)
    Lock_led=0;
    if(Lock==0)
    Lock_led=1;
    }
    while(!key4);
    }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    3.4 实现效果

    在这里插入图片描述

    在这里插入图片描述


    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052


    4 最后

  • 相关阅读:
    Linux:文件IO
    JAVA面试题100道(纯手敲整理。注:面试不一定要全部答出来,只需要答出关键字即可)
    Linux高性能服务器编程 学习笔记 第十三章 多进程编程
    Websocket、Session&Cookie、前端基础知识
    被开除的ChatGPT之父,又回来了?
    苏州金龙客车为新疆哪吒车队提供车辆交车
    Tesseract .Net SDK C# OCR 2022.1
    软件构造 | Equality in ADT and OOP
    python迭代器模块itertools常用方法
    JavaScript学习——什么是编程语言?计算机基础
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/125573418