基于51单片机太阳能热水器控制系统-proteus仿真-程序

news2024/10/6 8:34:28

、系统方案
系统设计将软件设计内容分为了六大模块,分别是蜂鸣器报警、水位检测、DS18B20模块、液晶显示、加热模块、按键模块,系统将其进行分别设计,接通电源之后,单片机分别向LCD1602液晶显示器、DS18B20模块、和按键发出初始化指令,初始化结束后,进行按键扫描,若检测到按键信号,处理按键对应操作,无论是否有按键信号,都会继续进行下一步,读取DS18B20转换值,在LCD1602液晶显示器上,根据水位大小,启动加水或停止加水,根据温度大小决定是加热还是停止加热,之后返回到LCD1602液晶显示器、DS18B20模块、和按键初始化,继续这个流程,直到断开电源结束。
在这里插入图片描述

二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
/lcd1602初始化设置*/
void init_1602()
{
write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口 不检测忙信号
write_com(0x0c); //开显示 不显示光标
write_com(0x06); //当写一个字符是,地址指针加 1
write_string(1,0,“0 T: . 00:00 0”); //初始化1602显示
write_string(2,0,"H: . L: . "); //初始化1602显示
write_lcd3_18B20(2,2,t_high); //显示上限报警值
write_lcd3_18B20(2,10,t_low); //显示温度下限报警值
write_zifu(1,8,0xdf); //显示度
write_zifu(2,6, 0xdf); //显示度
write_zifu(2,14,0xdf); //显示度

}
2、液晶显示程序
void delay_uint(uint q)
{
while(q–);
}

/********************************************************************

  • 名称 : write_com(uchar com)
  • 功能 : 1602指令函数
  • 输入 : 输入的指令值
  • 输出 : 无
    ***********************************************************************/
    void write_com(uchar com)
    {
    rs=0; //写指令
    rw=0; //对1602写操作
    P0=com; //P0口对1602写指令数据
    delay_uint(25);
    e=1; //e=1使能信号
    delay_uint(100); //延时一下等1602完成操作
    e=0;
    }

/********************************************************************

  • 名称 : write_data(uchar dat)
  • 功能 : 1602写数据函数
  • 输入 : 需要写入1602的数据
  • 输出 : 无
    ***********************************************************************/
    void write_data(uchar dat)
    {
    rs=1; //写数据
    rw=0; //对1602写操作
    P0=dat; //P0口对1602写数据
    delay_uint(25);
    e=1; //e=1使能信号
    delay_uint(100); //延时一下等1602完成操作
    e=0;
    }
    3、按键程序
    /*按键显示函数/
    void key_with()
    {
    if(menu_1 == 0)
    {
    if(key_can == 2) //手动打开断电器
    relay1 = ~relay1; //打开关闭加热继电器
    if(key_can == 3)
    relay2 = ~relay2; //打开关闭抽水继电器
    }
    if(key_can == 1) //设置键
    {
    menu_1 ++;
    if(menu_1 > 4)
    {
    menu_1 = 0; //menu_1 = 0 退出设置了,在正常显示界面下
    init_1602(); //1602初始化
    }
    }
    if(menu_1 == 1) //设置温度上限报警值
    {
    if(key_can == 2) //加键
    {
    if(flag_lj_en <= 3)
    t_high ++ ; //按键按下未松开加1 加三次
    else
    t_high += 10; //按键按下未松开加三次后加10
    if(t_high > 999)
    t_high = 999;
    }
    if(key_can == 3) //减键
    {
    if(flag_lj_en <= 3)
    t_high – ; //按键按下未松开减1 减三次
    else
    t_high -= 10; //按键按下未松开减三次后减10
    if(t_high <= t_low)
    t_high = t_low + 1; //限制温度上限不能低于温度下限
    }
    write_lcd3_18B20(2,2,t_high); //显示上限报警值
    write_com(0x80+0x40+2); //将光标移动到第2行第2位
    write_com(0x0f); //显示光标并且闪烁
    }
    if(menu_1 == 2) //设置温度下限报警值
    {
    if(key_can == 2) //加键
    {
    if(flag_lj_en <= 3)
    t_low ++ ; //按键按下未松开加1 加三次
    else
    t_low += 10; //按键按下未松开加三次后加10
    if(t_low >= t_high)
    t_low = t_high - 1; //限制温度下限不能高于温度上限
    }
    if(key_can == 3) //减键
    {
    if(flag_lj_en <= 3)
    t_low – ; //按键按下未松开减1 减三次
    else
    t_low -= 10; //按键按下未松开减三次后减10
    if(t_low <= 10)
    t_low = 10;
    }
    write_lcd3_18B20(2,10,t_low); //显示温度下限报警值
    write_com(0x80+0x40+10); //将光标移动到第2行第10位
    write_com(0x0f); //显示光标并且闪烁
    }
    if(menu_1 == 3) //设置时钟
    {
    if(key_can == 2) //加键
    {
    if(flag_lj_en <= 3)
    shi ++ ; //按键按下未松开加1 加三次
    else
    shi += 5; //按键按下未松开加三次后加5
    if(shi > 23)
    shi = 0;
    }
    if(key_can == 3) //减键
    {
    if(flag_lj_en <= 3)
    {
    if(shi == 0)
    shi = 24;
    shi – ; //按键按下未松开减1 减三次
    }
    else
    {
    if(shi < 5)
    shi = 28;
    shi -= 5; //按键按下未松开减三次后减5
    }
    }
    write_lcd2(1,10,shi); //显示时
    write_com(0x80+10); //将光标移动到第1行第10位
    write_com(0x0f); //显示光标并且闪烁
    }
    if(menu_1 == 4) //设置分钟
    {
    if(key_can == 2) //加键
    {
    if(flag_lj_en <= 3)
    fen ++ ; //按键按下未松开加1 加三次
    else
    fen += 5; //按键按下未松开加三次后加5
    if(fen > 60)
    fen = 0;
    }
    if(key_can == 3) //减键
    {
    if(flag_lj_en <= 3)
    {
    if(fen == 0)
    fen = 60;
    fen – ; //按键按下未松开减1 减三次
    }
    else
    {
    if(fen < 5)
    fen = 65;
    fen -= 5; //按键按下未松开减三次后减5
    }
    }
    write_lcd2(1,13,fen); //显示分钟
    write_com(0x80+13); //将光标移动到第1行第13位
    write_com(0x0f); //显示光标并且闪烁
    }
    delay_1ms(400);
    }

4、核心算法程序
/*主函数/
void main()
{
beep = 0; //蜂鸣器响一声
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff; //所有单片机IO口输出高电平
init_1602(); //1602初始化
time_init(); //初始化定时器
temperature = read_temp(); //先读出温度的值
delay_1ms(750);
while(1)
{
if(flag_250ms == 1) //250ms 处理一次温度程序
{
flag_250ms = 0;
temperature = read_temp(); //先读出温度的值
shuiwei_dis() ; //水位显示
clock_h_l(); //报警函数
if(menu_1 == 0)
{
write_lcd3_18B20(1,4,temperature); //显示温度
dingshi_dis(); //定时控制
write_lcd1(1,0,dengji); //显示水位
}
}
key(); //按键程序
if(key_can > 0)
{
key_with(); //设置温度
}
}
}

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C【整数正序分解】

// 整数正序分解 #include <stdio.h> #include <stdlib.h>int main() {int x;scanf("%d", &x);// 13425/10000->1(int一个d)// 13425%10000->3425(这是x)// 10000/10-.1000(这是mask)int mask 1;int t x;while (t > 9){t / 10;mask * 10;…

安装dubbo-admin报错node版本和test错误

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;dubbo-admin安装 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0…

JAVA安全之Log4j-Jndi注入原理以及利用方式

什么是JNDI&#xff1f; JDNI&#xff08;Java Naming and Directory Interface&#xff09;是Java命名和目录接口&#xff0c;它提供了统一的访问命名和目录服务的API。 JDNI主要通过JNDI SPI&#xff08;Service Provider Interface&#xff09;规范来实现&#xff0c;该规…

matlab中实现画函数图像添加坐标轴

大家好&#xff0c;我是带我去滑雪&#xff01; 主函数matlab代码&#xff1a; function PlotAxisAtOrigin(x,y); if nargin 2 plot(x,y);hold on; elsedisplay( Not 2D Data set !) end; Xget(gca,Xtick); Yget(gca,Ytick); XLget(gca,XtickLabel); YLget(gca,YtickLabel)…

csdn初始模板【自用】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

C++ Qt 学习(五):Qt Web 编程

1. Chrome 技术介绍 大多数 web 技术都是基于 chrome&#xff0c;例如 CEF、QCefView 以及 QWebEngineView&#xff0c;这些都是在 native 界面里用来显示 html 网页&#xff0c;并且可以与 web 交互 例如常见的登录窗口、优酷的视频区域、WPS 的稻壳商城等&#xff0c;这些都…

npm 下载包失败解决方案

1.【问题描述】使用 npm 下载vue项目依赖包时失败&#xff0c;版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令&#xff0c;用于在 Node.js 环境中使用 npm&#xff08;Node Package Manager&#xff09;安装包或模块。–force 参数表…

Apipost-Helper:IDEA中的类postman工具

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

AirTag追踪汽车

美国华盛顿特区&#xff0c;11月4日&#xff0c;在一项全新的抗击车辆盗窃的措施中&#xff0c;市长穆里尔•鲍泽签署了一项新计划&#xff0c;将向该市车辆盗窃频率较高的社区居民免费提供苹果AirTag追踪器。 AirTag是苹果公司推出的一款蓝牙跟踪设备&#xff0c;它依靠Findm…

JAVA将List转成Tree树形结构数据和深度优先遍历

引言&#xff1a; 在日常开发中&#xff0c;我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回&#xff0c;或者需要对转为树结构后的数据绑定层级关系再返回&#xff0c;比如需要统计当前节点下有多少个节点等&#xff0c;因此我们需要封装一个ListToTree的工具类…

Redis 键值类型及其存储结构

Redis 键值类型及其存储结构 键值类型 键的数据类型是字符串&#xff0c;值的类型有&#xff1a;字符串、列表、Hash、集合、有序集合。 键的存储和查找 Redis底层键的存储类似于Java中其他Hash存储结构&#xff1a;数组链表的组合。数组中存储的是Key Hash函数对数组长度取模…

《深入理解计算机系统》书籍学习笔记 - 第二课 - 位,字节和整型

Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型 文章目录 Lecture 02 Bits,Bytes, and Integer 位&#xff0c;字节和整型Byte 字节位操作布尔代数集合的表现形式和操作C语言的逻辑操作 位移操作整型数值范围无符号与有符号数值无符号与有符号在C中 拓展和截断拓…

个人网厅——提取

目录 需求文档 公积金提取类 controller层 service层 service层实现类 1.验证&#xff08;个人账户&#xff09; 2.提交&#xff08;添加&#xff09; controller层 service层 service层实现类 3.分页查询 controller层 service层 service层实现类 4.详情查询 co…

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打&#xff0c;yyds&#xff01; 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 经常看视频&#xff0c;看到别人在键盘上一通干净利索的操作&#xff0c;就打出想要的文字。心里突然来一句&#xff1a;卧槽&#xff0c;打字贼快啊&#xff01;思索下…

【Java笔试强训】Day9(CM72 另类加法、HJ91 走方格的方案数)

CM72 另类加法 链接&#xff1a;另类加法 题目&#xff1a; 给定两个int A和B。编写一个函数返回AB的值&#xff0c;但不得使用或其他算数运算符。 题目分析&#xff1a; 代码实现&#xff1a; package Day9;public class Day9_1 {public int addAB(int A, int B) {// wr…

解析找不到msvcr100.dll文件的解决方法,4个方法修复msvcr100.dll

msvcr100.dll是Microsoft Visual C 2010运行库的组成部分&#xff0c;一些基于Visual C开发的软件运行时会依赖这个dll文件。出现“找不到msvcr100.dll”的错误提示&#xff0c;往往意味着这个文件在你的计算机系统中丢失或损坏&#xff0c;导致相关程序无法正常运行。以下是找…

【Android】画面卡顿优化列表流畅度一

卡顿渲染耗时如图&#xff1a; 卡顿表现有如下几个方面&#xff1a; 网络图片渲染耗时大上下滑动反应慢&#xff0c;甚至画面不动新增一页数据加载渲染时耗时比较大&#xff0c;上下滑动几乎没有反应&#xff0c;画面停止没有交互响应 背景 实际上这套数据加载逻辑已经运行…

数字化广告运营,小迈科技的关键一步

数据驱动广告运营是小迈科技提升整体经营效率、构建竞争优势的重要选择。 截止目前&#xff0c;小迈科技已经完成了数据驱动的广告运营体系的搭建&#xff0c;并通过与神策数据的深入合作&#xff0c;借力神策客户旅程分析平台&#xff0c;在广告投放、运营活动等各个环节实现了…

Samtec连接器技术前沿 | 全新对准功能确保测试和测量应用中的精确对准

【摘要/前言】 Samtec开发了一种创新的易于使用的对准技术&#xff0c;以确保测试和测量应用中的精密、高频压缩安装连接器的峰值性能。下面解释了我们所看到的趋势&#xff0c;并概述了我们针对出现的常见对准挑战所开发的解决方案。 【问题所在】 随着数据传输率的不断提高…

C++的Odyssey之旅——STL

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a;我们已经将基本语法了解的差不多了&#xff0c;现在我们就该进入C中最重要也是最富有特点的一部分——STL。在学习C语言中我们想要使用顺序表、链表等一些数据结构进行做题时都需要进行这…