【毕业设计】31-基于单片机的农业蔬菜大棚温度自动控制系统设计(原理图+源码+仿真工程+论文(低重复率))
任务书要求
基于单片机作为控制器,利用温度传感器等采集大棚温度,并结合其它元器件,设计一个农业大棚温度自动控制系统,实现对棚内温度的设定、采集、检测、控制、报警、调节等功能。
1、提出农业大棚温度自动控制系统的总体设计方案;
2、对系统的进行硬件、软件设计;
3、应用Proteus软件对系统进行仿真验证。
需要完成的事项
原理图工程文件
源码工程文件
仿真工程文件
论文(低重复率)
需要资料请私信
设计说明书
摘要
当前农业大棚是一种高效的农业种植方式与传统的农业生产相比有较多的优势,可以带来高品质的蔬菜大棚,并且可以节约资源保证农业发展。传统的方式并不能有效的解决室内大棚的温度自动控制,会影响蔬菜瓜果的生长环境不能最好的达到生长状态。影响农业蔬菜的品质。根据这个现象设计出一款农业大棚温度自动控制系统,将农业大棚内部的各个温度采集,实现对温度大棚的检测实现系统的自动控制,达到自动调节的目的。实现温度的控制保证农作物有一个适应的生长环境。
系统设计上,首先对系统分析确定系统需要实现的功能,确定系统框架选择适合本次系统的元器件。根据各方面的分析和对比,本设计选择STC89C51单片机作为控制器,温度传感器为DS18B20,当温度超出设置上下限阀值,则系统报警并启动继电器进行温度控制。系统的人机交互使用独立按键实现对温度的调节,使用LCD1602液晶显示器显示系统的各项信息。软件设计采用Keil平台,C语言进行编程,最后使用Proteus软件对系统模拟仿真。仿真结果表明,本次系统能够实现对温度的检测,并且可以通过按键来调节温度阀值,保证当温度超过设定范围后报警,并开启继电器控制升降温设备,满足设计需求。
该系统除了完成设计功能外,还保证了系统的性价比、稳定性、耐久性以及系统的抗干扰能力,完成了农业大棚温度自动控制系统的设计。
1.原理图工程文件及截图
2.仿真工程文件及截图
源代码工程
3.论文(低重复率)24276字
4.相关英文文献
设计框架架构
设计说明书及设计文件
论文(低重复率)24276字
源码展示
//程序头函数
#include <reg52.h>
//显示函数
#include <display.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
//管脚声明
sbit jdq= P2^4; //继电器
sbit Feng = P1^1; //蜂鸣器
//按键
sbit Key1=P1^3; //设置
sbit Key2=P1^4; //加
sbit Key3=P1^5; //减
sbit Key4=P1^6; //确定
sbit pwm = P1^2;
uchar f_pwm_l ;
sbit DQ=P1^0; //定义DS18B20总线I/O
signed char w,bj,bjx,bjd; //温度值全局变量
uint c; //温度值全局变量
bit bdata flag=0,flag_BJ,flag_off=1;
//时间计算
#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000
//解码变量
unsigned char Im[4]={0x00,0x00,0x00,0x00};
//全局变量
uchar f;
unsigned long m,Tc;
unsigned char IrOK;
//设置变量
uchar xx=20;
//下限
uchar sx=30;
//上限
int ds=0;
uchar Mode=0;
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<121;j++);
}
/*****延时子程序*****/
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay_DS18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_DS18B20(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay_DS18B20(14);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
}
}
/*****读取温度*****/
unsigned int Read Temperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
Write One Char(0xCC); //跳过读序号列号的操作
Write One Char(0x44); //启动温度转换
Init_DS18B20();
Write One Char(0xCC); //跳过读序号列号的操作
Write One Char(0xBE); //读取温度寄存器
a=Read One Char(); //读低8位
b=Read One Char(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*****读取温度*****/
void check_wendu(void)
{
c=Read Temperature()-5; //获取温度值并减去DS18B20的温漂误差
w=c/10; //计算得到整数位
if(w<0){w=0;} //设置温度显示上限
if(w>99){w=99;} //设置温度显示上限
}