基于51单片机智能鱼缸控制系统

一、系统方案
1、本设计采用51单片机作为主控器。
2、液晶1602显示。
3、采集温度值,水质大小、水位值、DS1302显示年月日时分秒。
4、自动加热、定时喂食,自动换水、水泵加热。
5、按键设置。
在这里插入图片描述

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

三、单片机软件设计
1、首先是系统初始化
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff; //单片机IO口初始化为1
// init_time0(); //初始化定时器
//init_ds1302(); //ds1302初始化
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化显示
//init_eeprom(); //开始初始化保存的数据
temperature = read_temp(); //先读出温度的值
delay_1ms(650);
2、液晶显示程序
/lcd1602写命令函数*/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}

/lcd1602写数据函数*/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}

/lcd1602初始化设置*/
void init_1602() //lcd1602初始化设置
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
}

/lcd1602上显示两位十进制数*/
void write_sfm1(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(table_num[date % 10]);
}

/lcd1602上显示温度*/
void write_sfm3_18B20(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(‘.’);
write_data(0x30+date%10);
}

//
// 液晶光标定位函数
/
/
void LcdGotoXY(uchar line,uchar column)
{
// 第一行
if(line1)
write_com(0x80+column);
// 第二行
if(line
2)
write_com(0x80+0x40+column);
}
//
// 液晶输出多位数字
/
/
void LCD_Write_Char(uchar x,uchar y,uint s,uchar l)
{
LcdGotoXY(x,y) ;

if(l>=5)write_data(0x30+s/10000%10);	//万位
if(l>=4)write_data(0x30+s/1000%10);		//千位
if(l>=3)write_data(0x30+s/100%10);		//百位
if(l>=2)write_data(0x30+s/10%10);			//十位
if(l>=1)write_data(0x30+s%10);		//个位

}
/lcd1602上显示两位十进制数*/
void write_sfm2_ds1302(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(table_num[date/16]);
write_data(table_num[date%16]);
}

/lcd1602上显示这字符函数*/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == ‘\0’) break;
write_data(*p);
p++;
}
}

/控制光标函数***/
void write_guanbiao(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
write_com(0x0f); //显示光标并且闪烁
else
write_com(0x0c); //关闭光标
}

/lcd1602上显示特定的字符*/
void write_zifu(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(date);
}

/开机液晶显示函数 初始化液晶的内容****************/
void init_1602_dis_csf() //初始化液晶
{

write_string(1,0,"   -     :  :   ");	
write_string(2,0,"00.0 C        % ");	
write_zifu(2,4,0xdf);  //显示度	

}
3、核心算法
/主函数***/
void main()
{

delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff;		//单片机IO口初始化为1

// init_time0(); //初始化定时器
//init_ds1302(); //ds1302初始化
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化显示
//init_eeprom(); //开始初始化保存的数据
temperature = read_temp(); //先读出温度的值
delay_1ms(650);
while(1)
{
//P2=0X00;
key(); //按键程序
if(key_can < 10)
{
key_with();
}

     if(menu_1==0){read_time();		  //读时间temperature = read_temp();	//先读出温度的值hunzhuozhi=Adc0832(0);				//读取AD值hunzhuozhi=hunzhuozhi/2.5;if(hunzhuozhi>=100)hunzhuozhi=99;hunzhuozhi=100-hunzhuozhi;write_sfm3_18B20(2,0,temperature);	   //显示温度LCD_Write_Char(2,12,hunzhuozhi,2) ;  ///显示浑浊度值init_1602_ds1302();   //显示时钟 }wendujiarekongzhi();温度加热控制函数ziwaixianedinshikongzhi();///喂食定时自动函数zengyangdinshikongzhi();   灯光继电器控制函数wenduzhilengkongzhi();注水泵继电器控制函数hunzhuodukongzhi();过滤泵继电器控制函数if(shuiwei_L!=0&&shuiwei_H!=0)/两个水位传感器都没监测到水 低水位 启动水泵{Key5_shuibeng =0;启动水泵}if(shuiwei_L!=1&&shuiwei_H!=1)/两个水位传感器都监测到水 高水位 停止水泵{Key5_shuibeng =1;停止水泵}delay_1ms(100);
}

}

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

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

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

相关文章

【教学类-44-08】20240319 “(幼儿用)数字练习簿1.0”(A4版)

背景需求&#xff1a; 我一直想把 “&#xff08;幼儿用&#xff09;数字练习簿”的内容复刻出来——这里面的字体始终找不到&#xff0c;是一种已经做成图片的手写数字字体 素材准备&#xff1a; 1、买了一本&#xff08;幼儿用&#xff09;数字练习簿&#xff0c;把每一页扫…

java 通过 microsoft graph 调用outlook(二)

这次提供一些基础调用方式API 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>32.1.3-jre</version></dependency><dependency>&…

网络编程:多点通信+域套接字

一、多点通信 1.网络属性 getsockopt和setsockopt int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); 功能&#xff1a;获取或设置套接字…

微信小程序登录后根据code获取APP_ID和APP_SECRET与火狐信息

话不多说&#xff0c;直接上代码。 session_key是与用户微信客户端之间通信的密钥&#xff0c;获取用户信息时会用到。 调用&#xff1a;getSessionKeyAndOpenId方法传入code值&#xff0c;返回openid与session_key&#xff0c; 这里的&#xff1a; appid: 应用唯一标识&am…

SSH服务

目录 一. 熟悉SSH服务 1.1 何为SSH协议 1.2 SSH服务优点 1.3 常见的SSH协议 1.4 SSH服务的功能 1.5 为何使用SSH服务 1.6 SSH服务的工作原理 1.6.1 公钥传输原理 1.6.2 ssh加密通讯原理 1.7 SSH服务的最佳应用场景 1.8 SSH服务远程登录的方式 1.8.1 方法一&#…

自动驾驶决策 - 规划 - 控制 (持续更新!!!)

总目录 Frenet与Cartesian坐标系 Apollo基础 - Frenet坐标系 车辆模型 车辆运动学和动力学模型 控制算法 PID控制器轨迹跟随实现 Pure Pursuit控制器路径跟随 路径跟踪算法Stanley 实现 c 无人驾驶LQR控制算法 c 实现 MPC自动驾驶横向控制算法实现 c 双环PID控制详细讲解 …

【DL经典回顾】激活函数大汇总(二十六)(Identity附代码和详细公式)

激活函数大汇总&#xff08;二十六&#xff09;&#xff08;Identity附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或缺的…

大模型面试题最全总结,没有一道是送分题。。。

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂同学、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天分享…

3月19日做题

[NPUCTF2020]验证&#x1f40e; if (first && second && first.length second.length && first!second && md5(firstkeys[0]) md5(secondkeys[0]))用数组绕过first1&second[1] 这里正则规律过滤位(Math.) (?:Math(?:\.\w)?) : 匹配 …

串口123

1.开启时钟 把需要使用的USART和GPIO的时钟打开 2.GPIO初始化 把TX配置成复用输出&#xff0c;RX配置成输入 3.配置USART 直接使用一个结构体即可将所有参数配置完成 4.开关控制 如果需要仅发送的功能&#xff0c;就直接开启USART&#xff0c;初始化到此结束 如果还需要接收…

优化器算法SGD、Adam、AdamW等

文章目录 SGDSGD with momentumSGD with Nesterov AccelerationAdaGradRMSpropAdaDeltaAdamAdamW参考资料 假设有&#xff1a; 待优化的目标函数为 f ( w ) f(w) f(w)&#xff0c;使用优化算法来最小化目标函数 f ( w ) : a r g m i n w f ( w ) f(w):argmin_wf(w) f(w):argmin…

获取指定路径下,所有指定后缀文件列表

要获取指定路径下所有指定后缀的文件列表&#xff0c;你可以使用Python的os和glob模块。下面是一个简单的示例&#xff0c;展示了如何获取指定路径下所有.txt后缀的文件列表&#xff1a; import os import globdef get_files_with_extension(directory, extension):"&quo…

vivado 布线、路线_设计

路由 Vivado路由器对放置的设计执行路由&#xff0c;并对路由设计&#xff0c;以解决保留时间冲突。Vivado路由器从放置的设计开始&#xff0c;并尝试路由所有网络。它可以从已放置的未布线、部分布线或完全布线的设计。对于部分路由的设计&#xff0c;Vivado路由器使用现有的…

Unittest框架及自动化测试实现流程

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Unittest框架介绍 Unittest框架是Python中一个标准的库中的一个模块&#xff0c;该模块包括许多…

红与黑(c++题解)

题目描述 有一间长方形的房子&#xff0c;地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上&#xff0c;只能向相邻的黑色瓷砖移动。请写一个程序&#xff0c;计算你总共能够到达多少块黑色的瓷砖。 输入格式 包括多个数据集合。每个数据集合的第一行是…

【Mysql】面试题汇总

1. 存储引擎 1-1. MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f; 答&#xff1a; MySQL 支持的存储引擎包括 InnoDB、MyISAM、Memory 等。 Mysql 5.5 之前默认的是MyISAM&#xff0c;Mysql 5.5 之后默认的是InnoDB。 可以通过 show engines 查看 Mysql 支持…

外包2月,技术退步惊现!大专生逆袭大厂,全靠这份神秘资料!

大家好&#xff0c;我是一名大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;从事功能测试工作已近4年。今年8月&#xff0c;我意识到长期舒适的环境让我变得不思进取&#xff0c;技术停滞不前&#xff0c;甚至因此失去了谈了2年的女朋友。我下定决心&#xff0c…

金蝶云星空——插件dll重新发布报错:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�

项目场景&#xff1a; 金蝶插件开发 问题描述 今天更新了插件dll然后重启IIS金蝶就报如下错误&#xff1a; 解决方案&#xff1a; 折腾了一天结果发现是给自己挖坑了&#xff0c;这次更新我担心插件代码有问题就把原dll重命名了然后把最新dll更新到金蝶bin文件中&#xff0c…

vue实现双向绑定原理深度解析

1. vue双向绑定应用场景 Vue的双向绑定机制主要体现在以下几个方面: 表单输入:在表单输入中,Vue的双向绑定机制非常有用。通过v-model指令,可以将表单元素的值与Vue实例中的数据进行双向绑定,当用户在表单输入框中输入内容时,数据会自动更新,反之,当数据发生变化时,输…

【DBC专题】-11-使用Cantools将CAN/CANFD DBC自动生成C语言代码

目录 1 安装Python和Cantools 1.1 查看Python已安装的Package包 1.2 在Python中安装Cantools插件包 1.3 获取更多Cantools工具的更新动态 2 经典CAN/CANFD DBC自动生成C语言代码 2.1 批处理文件CAN_DBC_To_C.bat内容说明 2.2 经典CAN/CANFD DBC文件要求 2.3 如何使用生…