文章目录
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 STM32的智能饮水机控制系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
🧿 项目分享:
https://gitee.com/sinonfin/sharing

主要功能: 使用STM32为主控制器,LCD1602显示当前信息:水温、模式、设置水温。DS18b20检测当前饮水机水温,水位传感器检测是否有水,无水情况下蜂鸣器发出声光报警,且所有功能停止(防干烧)并显示:Water!(提醒加水)。
1.使用STM32F103C8T6单片机做主控制器。
2.使用LCD1602显示采集到的水温、模式、设置水温值。
3.使用DS18b20检测当前饮水机水温值。
4.使用水位传感器检测是否有水。
5.使用继电器控制加热片加热和水泵出水。
6.当无水的情况下,蜂鸣器进行声光报警提醒,并且停止所有的功能,直到检测到有水。
7.四个按键分别对应:加热、出水,温度加、温度减的功能。
Normal:常温模式
Water:缺水警告
Hot:加热模式
open:水泵出水

(1)整体方案的设计
方案所选择的芯片,在便于操作的基础上,要能够实现控制设计任务的基本要求。本文设计的智能饮水机是采用STM32F103C8T6单片机作为主控芯片,通过、DS18B20温度传感器、Water Sensor水位传感器、继电器控制、LCD1602显示、蜂鸣器报警以等功能。
(2)设计方案原理
本设计的软件设计主要包括系统主程序以及液位采集子程序、温度设定子程序等设计。整个系统程序采用模块化结构设计,程序相对比较优化易修改,调试系统软件的开发是用C语言编程实现的。
通过软件编程使单片机通过控制不同的工作模块来控制饮用水的水温,利用LM3939传感器完成将水位数据传输入单片机,通过DS18B20温度传感器将水温信息输入单片机,输入的信息经过单片机的处理经LCD1602显示器直观的显示出来。工作的模式通过按键来控制,将按键产生的高低电平的变化输入单片机,发出相应的程序,进入相应的工作模式。通过Keil C编程将各模块衔接成整体并实现各模块之间的逻辑控制。
根据系统要求及上面几个硬件设计原则,确定系统硬件原理图。系统以单片机STM32F103C8T6为中央处理单元、蜂鸣器报警、LCD液晶显示、按键设置,LM393比较器判断、DS18B20温度采集、水位传感器、继电器控制原理图如3-1所示:下面对主要的电路设计做详细介绍。系统以单片微型计算机为核心外加多种接口电路组成如图所示

软件部分的主要任务是完成对整个设计的流程进行处理。首先STM32单片机进行引脚的配置,配置各个模块使用的引脚后来进行初始化,首先 DS18B20温度传感器获取当前温度,液晶初始化完成后显示当前的信息和参数,最后程序开始判断,如果饮水机内无水蜂鸣器就会进行报警提醒,防干烧。有水的情况下进行判断是常温模式还是加热模式,如果是常温就直接控制继电器进行出水,如果是加热模式判断温度是否低于下限如果低于下限先加热在控制继电器进行出水基于上述分析,系统软件设计流程如图4-2所示。各功能的控制。系统主流图如图所示。

#include "sys.h"
#include "delay.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "gpio.h"
u8 mode=0;//ģʽ������0�dz���ģʽ��1�Ǽ���ģʽ
u8 setTemp=40;//���õ��¶�ֵ
u8 openFlag=0;//��ˮ��־
void keyscan(void)
{
if(KEY1 == 0)//ģʽ�л�����
{
delay_ms(10);//����
if(KEY1 == 0)
{
while(KEY1 == 0);//�ȴ������ɿ�
mode=!mode;
if(mode==0)LCD_Write_String(10,0,"Normal");
else LCD_Write_String(10,0," Hot ");
}
}
if(KEY2 == 0 && WATER_LEVEL)//��ˮ����
{
delay_ms(1);
if(KEY2 == 0)
{
RELAY2 = 1;
if(openFlag==0)
{
openFlag=1;
LCD_Write_String(10,1," open ");//��ʾopen
}
}
}
else
{
if(openFlag==1)
{
openFlag=0;
LCD_Write_String(10,1," ");
}
RELAY2 = 0;
}
if(KEY3 == 0)//�Ӽ�
{
delay_ms(10);
if(KEY3 == 0 )
{
while(KEY3 == 0);
if(setTemp<99)setTemp++;
LCD_Write_Char(4,1,setTemp/10+0x30);//��ʾ���õ��¶�
LCD_Write_Char(5,1,setTemp%10+0x30);
}
}
if(KEY4 == 0)//����
{
delay_ms(10);
if(KEY4 == 0 )
{
while(KEY4 == 0);
if(setTemp>0)setTemp--;
LCD_Write_Char(4,1,setTemp/10+0x30);//��ʾ���õ��¶�
LCD_Write_Char(5,1,setTemp%10+0x30);
}
}
}
int main(void)
{
u16 timeCount=200;
u16 temperature=0;
u8 shanshuo=0;
delay_init(); //��ʱ������ʼ��
delay_ms(500); //�ϵ�˲�����һ����ʱ�ڳ�ʼ��
DS18B20_GPIO_Init(); //ds18b20���ų�ʼ��
DS18B20_Init(); //��ʼ��DS18B20
KEY_AND_RELAY_GPIO_Init();
LCD_Init(); //��Ļ��ʼ��
LCD_Write_String(0,0,"TEM:00 C Normal");//��ʾ�ַ���
LCD_Write_String(0,1,"SET:00 C ");
LCD_Write_Char(6,0,0xDF);
LCD_Write_Char(6,1,0xDF);
LCD_Write_Char(4,1,setTemp/10+0x30);//��ʾ���õ��¶�
LCD_Write_Char(5,1,setTemp%10+0x30);
while(1)
{
keyscan();//����ɨ��
if(timeCount++>=300)//��ʱһ��ʱ�䣬��ʱ���300ms
{
timeCount=0;
shanshuo = !shanshuo;
temperature=ReadTemperature();//��ȡ�¶�
LCD_Write_Char(4,0,temperature/10+0x30);//��ʾ�¶�
LCD_Write_Char(5,0,temperature%10+0x30);
if(!WATER_LEVEL && shanshuo)//ȱˮʱ���������εεε��죬Һ����˸��ʾ
{
LCD_Write_String(10,1,"Water!");
BEEP = 1;
}
else
{
if(openFlag==0)LCD_Write_String(10,1," ");
BEEP = 0;
}
if(WATER_LEVEL && mode==1 && temperature<setTemp)//����ˮ��״̬�²����Ǽ���ģʽ�¶ȵ�������ֵ������ִ�м���
{
RELAY1 = 1;
}
else
{
RELAY1 = 0; //����ر�
}
}
delay_ms(1);
}
}

🧿 项目分享:
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id