当前位置: 首页 > news >正文

蓝桥杯真题——模拟灌溉系统

                                 尽量每天都自己写一遍模板,记住模板就好写了 

                                                   以下内容直接在模板内进行


基本任务:
要求“模拟智能灌溉系统”能够实现土壤湿度测量、土壤湿度和时间显示、湿度阈值设
定及存储等基本功能。通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号,再通过
AD 采集完成湿度测量功能;通过 DS1302 芯片提供时间信息;通过按键完成灌溉系统控制
和湿度阈值调整功能,通过 LED 完成系统工作状态指示功能。系统硬件电路主要由单片机
控制电路、显示单元、ADC 采集单元、RTC 单元、EEPROM 存储单元、继电器控制电路及
报警输出电路组成.

系统功能:

1.1 自动工作状态,根据湿度数据自动控制打开或关闭灌溉设备( 初始状态),以 L1 点亮指示
1.2 手动工作状态,通过按键控制打开或关闭灌溉设备,以 L2 点亮指示
1.3 系统上电后处于自动工作状态,系统初始湿度阈值为 50%,此时若湿度低于
50%灌溉设备自动打开,达到 50%后,灌溉设备自动关闭
1.4 灌溉设备打开或关闭通过继电器工作状态模拟  

我们现在就要一步步进行下去:

1.我们先来实现DS1302 

“模拟智能灌溉系统”通过读取 DS1302 时钟芯片相关寄存器获得时间,DS1302
芯片时、分、秒寄存器在程序中设定为系统进行初始化设定,时间为 08 30
开始为     ucRtc(0x80,0x30,0x00)

我们通过读取函数来读取这个时间值 Read_Rtc[ucRtc];然后在主函数设置Set_Rtc(ucRtc);

2. 湿度显示:

以电位Rb2 输出电压信号模拟湿度传感器输出信号,且假定电压信号与湿度成正
比例关系 H 湿度 = KVRb2K 为常数),Rb2 电压输出为 5V 时对应湿度为 99%

湿度我们是能够控制的,他就包括了阈值 控制值,以及一个显示值。

Humidity = Ad_Read(0x03) / 2.56;我们让AD读取R3的值给到湿度,之后也可以调试

3.按键功能:

S7为模式切换功能,初始为自动模式,按下后为手动。

自动工作状态下按键 S6S5S4 功能设定如下:
S6 功能设定为湿度阈值调整按键,按下 S6 后,进入湿度阈值调整界面(如图 3
所示),此时按下 S5 为湿度阈值加 1,按下 S4 湿度阈值减 1,再次按下 S6 后,系
统将新的湿度阈值保存到 EEPROM 中,并退出湿度阈值设定界面。

这也就是我们再 Mode 0 状态下,通过按键完成的功能加上条件就可以。

4.Led显示模式:

这个比较简单后续再继续补充纤细内容

/* 和参考的区别最大的在于内容写入的内容不同 *//* Í·ÎļþÉùÃ÷Çø */
#include <STC15F2K60S2.H>
#include "LED.h"
#include "key.h"
#include "Seg.h"
#include "HC573.h"
#include "init.h"
#include "ds1302.h"
#include "iic.h"
#include "onewire.h"/* ±äÁ¿ÉùÃ÷Çø */
unsigned char Key_Down,Key_Val,Key_Old,Key_Up;
unsigned char Key_Slow_Down;unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};
unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0};
unsigned char Seg_Pos;
unsigned int Seg_Slow_Down;unsigned char ucRtc[3]={0x08,0x30,0x00};
unsigned char ucLed[8]={0,0,0,0,0,0,0,0};unsigned char Seg_Mode = 0;
unsigned char Seg_Mode_set = 0;bit Work_Mode = 0;
bit Beep_Flag = 0;unsigned char Humidity;
unsigned char Hum_Disp = 50;
unsigned char Hum_Ctrol = 50;/* °´¼ü´¦ÀíÇø */
void Key_Proc()
{if(Key_Slow_Down) return;Key_Slow_Down =1;Key_Val = Key_Read();Key_Down = Key_Val & (Key_Old ^ Key_Val);Key_Up = ~Key_Val & (Key_Old ^ Key_Val);Key_Old = Key_Val;switch(Key_Down){case 7:Work_Mode ^= 1; //	Çл»Ä£Ê½break;case 6:if(Work_Mode == 0 && Seg_Mode ==0) //×Ô¶¯Ä£Ê½£¬½øÈëãÐֵ״̬{Seg_Mode = 2;}if(Work_Mode == 0 && Seg_Mode ==2 && Seg_Mode_set==1) //Ìø³öÅжÏÌõ¼þ£¬Ð´Èë¿ØÖÆ²ÎÊý{Hum_Ctrol = Hum_Disp;EEPROM_Write(&Hum_Disp,0,1); //±£´æãÐÖµ²ÎÊýSeg_Mode_set=0;Seg_Mode = 0;}break;if(Work_Mode == 1) //ÊÖ¶¯Ä£Ê½{Beep_Flag ^= 1;}break;case 5:if(Seg_Mode == 2 && Work_Mode ==0){Seg_Mode_set = 1;if(++Hum_Disp == 100){EEPROM_Write(&Hum_Disp,0,1);	Hum_Ctrol = Hum_Disp;	Hum_Disp = 99;}}if(Work_Mode == 1){Relay(1);}break;case 4:if(Seg_Mode == 2 && Work_Mode ==0){Seg_Mode_set = 1;if(--Hum_Disp == 255){EEPROM_Write(&Hum_Disp,0,1);Hum_Ctrol = Hum_Disp;	Hum_Disp = 0;}}if(Work_Mode == 1){Relay(0);}break;}}/* Êý¾Ý´¦ÀíÇø */
void Seg_Proc()
{if(Seg_Slow_Down) return;Seg_Slow_Down =1;/* Êý¾Ý¶ÁÈ¡ÇøÓò */Read_Rtc(ucRtc);Humidity = Ad_Read(0x03) / 2.56;/* Êý¾ÝÏÔÊ¾ÇøÓò */switch(Seg_Mode){case 0: //ÉϵçÏÔʾʵʱ״̬/* ×Ô¶¯Ä£Ê½ */Seg_Buf[0] = ucRtc[0] / 16;Seg_Buf[1] = ucRtc[0] % 16;Seg_Buf[3] = ucRtc[1] / 16;Seg_Buf[4] = ucRtc[1] % 16;Seg_Buf[2] = 11;// ζÈÏÔʾSeg_Buf[6] = Humidity / 10;Seg_Buf[7] = Humidity % 10;break;case 1:Seg_Buf[0] = ucRtc[0] / 16;Seg_Buf[1] = ucRtc[0] % 16;Seg_Buf[3] = ucRtc[1] / 16;Seg_Buf[4] = ucRtc[1] % 16;Seg_Buf[2] = 11;// ζÈÏÔʾSeg_Buf[6] = Humidity / 10;Seg_Buf[7] = Humidity % 10;break;case 2: //ÏÔʾãÐÖµSeg_Mode_set=1;Seg_Buf[0] = Seg_Buf[1] = 11;Seg_Buf[2] = Seg_Buf[3] = Seg_Buf[4] = 10;Seg_Buf[6] = Hum_Disp / 10;Seg_Buf[7] = Hum_Disp % 10;break;}
}void Led_Proc()
{if(Work_Mode ==0){ucLed[0] = 1;ucLed[1]=0;if(Humidity >=50)Relay(0);elseRelay(1);}if(Work_Mode ==1){ucLed[0] = 0;ucLed[1]=1;Beep(Beep_Flag);}}void Timer0Init(void)		//@12.000MHz
{AUXR &= 0x7F;		TMOD &= 0xF0;		TL0 = 0x18;		TH0 = 0xFC;		TF0 = 0;	TR0 = 1;		ET0 = 1;    EA = 1;     
}void Timer0Server() interrupt 1
{  if(++Key_Slow_Down == 10) Key_Slow_Down = 0;if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;if(++Seg_Pos == 8) Seg_Pos = 0;Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}void main()
{Humidity = Ad_Read(0x03) / 2.56; //Ö÷º¯ÊýÔÙ¶ÁÒ»´ÎHum_Disp = Hum_Ctrol; //±ãÓÚ¸ÄÕýEEPROM_Read(&Hum_Disp,0,1);//¶ÁÈ¡ãÐÖµ²ÎÊýSystem_init();Timer0Init();Set_Rtc(ucRtc);while(1){Key_Proc();Led_Proc();Seg_Proc();}
}

http://www.lryc.cn/news/43136.html

相关文章:

  • 【数据结构】双向链表实现
  • 无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】
  • CentOS 7+Docker搭建rabbitMQ无法访问15672端口
  • 面试官:如何保证接口幂等性?一口气说了9种方法!
  • 蓝桥杯刷题冲刺 | 倒计时14天
  • 【数据结构】树的概念
  • Qt Glog toStdWString转char* 中文乱码
  • 基于线性Kalman观测器(LKF)的2、4、7自由度悬架主动控制合集
  • 第二章 作业(6789B)【编译原理】
  • 【java】连续最大和、统计回文
  • AI真的快让我们失业了,从ChatGPT到Midjourney
  • JVM学习 GC垃圾回收机制 (堆内存结构、GC分类、四大垃圾回收算法)
  • ChatGPT 有哪些神奇的使用方式?
  • 【JavaEE】Java设计模式-单例模式(饿汉式与懒汉式)
  • (算法基础)朴素版Prim算法
  • 第十四届蓝桥杯三月真题刷题训练——第 23 天
  • 基于springboot实现医院信息管理系统【源码+论文】
  • CODESYS增量式PID功能块(ST完整源代码)
  • 代码质量提升,代码扫描 review 之 Codacy 工具使用
  • Centos Linux 正确安装 Redis 的方式
  • C++Primer第五版【阅读笔记】
  • ERD Online 4.0.11 在线数据库建模、元数据协作平台(免费、私有部署)
  • 3.数组算法、动态规划
  • 项目管理工具哪个好?最新排名
  • 650. 只有两个键的键盘——【Leetcode每日一题】
  • 【平常心无焦虑探讨】未来谁将被淘汰—在日常网络安全工作中使用GPT的感受
  • 【C语言】深度理解指针(下)
  • 【树与二叉树】树与二叉树的概念及结构--详解介绍
  • Spring Boot集成RocketMQ实现普通、延时、事务消息发送接收、PULL消费模式及开启ACL | Spring Cloud 30
  • 人人都能看懂的Spring源码解析,Spring如何解决循环依赖