基于单片机的大棚温度控制系统1.docx
《基于单片机的大棚温度控制系统1.docx》由会员分享,可在线阅读,更多相关《基于单片机的大棚温度控制系统1.docx(17页珍藏版)》请在冰豆网上搜索。
基于单片机的大棚温度控制系统1
基于单片机的大棚温度控制系统
第1节引言……………………………………………………………………………3
1.1温度控制系统概述……………………………………………………………3
1.2本设计任务和主要内容………………………………………………………4
第2节系统主要硬件电路设计………………………………………………………5
2.1系统硬件结构…………………………………………………………………5
2.2单片机主机系统………………………………………………………………5
2.3温度检测的设计………………………………………………………………6
2.4ISD1420语音芯片……………………………………………………………7
第3节系统的软件设计………………………………………………………………9
3.1系统控制流程图………………………………………………………………9
3.2温度控制系统程序……………………………………………………………9
3.3温度检测子程序设计…………………………………………………………12
3.4语音读写程序…………………………………………………………………13
基于单片机的大棚温度控制系统
第1节引言
大棚蔬菜满足了人民能一年四季吃到新鲜蔬菜的愿望,为提供更多量、更有营养价值的蔬菜,智能的大棚温度控制系统已成为农民的迫切需要。
以80C51单片机为主的温度控制系统可对大棚内部的温度和蔬菜所需的正常温度进行比较,以人性化的方式向大棚管理人员提供温度调节的信息,帮助农民提高农作物的产量,减少农民的工作量。
温度控制系统采用80C51单片机为核心。
大棚温度经AD590温度传感器采样后变换为模拟电压信号,经低通滤波滤掉干扰信号后送放大器,信号放大后送模/数转换器转换为数字信号送单片机,单片机根据输入的温度得出结果,通过ISD1420语音芯片提醒农民作出适当的温度调节。
该系统成本低,操作方便,设计人性化,具有良好的推广价值。
1.1温度控制系统概述
随着生活条件的不断改善,人们更关注自身的健康,绿色蔬菜尤其受到重视。
大棚种植充分满足了人们的需求,但对于和农作物生长密切相关的大棚温度的控制,对大部分没有专业知识的农民来说着实是一件头疼的事。
种植高产量、高质量的农作物并非是一件简单的事,它不仅涉及遗传学,还和各地的气候、土壤、水分、温度、CO2含量等有密切的关系。
对于大棚种植而言,良好的物种、本地适合种植的物种及土地酸碱度都是可以通过农民长期的种植经验获得的。
但是温度是农民不能轻易解决的问题,而且温度的变化幅度大,不易人工控制,对于农民来说时刻关注作物的生长温度是个庞大的工作量。
“白天太阳很好,阳光充足,外面的温度零下5度如果大棚的薄膜没有破,里面照样产生有25度以上的温度,从而地温也可以得到提升至15度左右。
漆黑大风的夜晚棚内的温度会大幅度降低,能降低到零下5度以下,停止刮风可以恢复到较地温少低点为止。
”这些专业知识对于常年种植的农民也未必了解。
产量提高不了,收入状况不佳会牵制农民的经济,减弱农民投身于农业的积极性,对地区乃至国家来说都是不容小觑的事实。
使用于大棚种植的温度控制系统解决了长期以来困扰农民的问题,它的制作成本低廉,使用广泛,对农民自身的素质要求不高,便于农民操作。
更重要的是,它不仅帮助农民节约了大量,还在无形之中提高了作物的产量,增加了农民的收入,满足了人们对大棚蔬菜的需求。
要使全民步入小康的行列,重要的是提高农民的经济水平,只有每户农民家庭的生活都有了保障,才能进行各方面上层建筑的建设。
基于单片机的大棚温度控制系统是个小型的软硬件结合的产品,它针对个体农民的需要设计,适于中小面积的大棚种植。
该温度控制系统所包含的提醒功能极具亲切性,它使用ISD1420语音芯片,这种芯片可重现优质原声,没有常见的背景噪音。
农民可以根据自己的喜好录入属于自己的提示音,也可经常更换提示音。
1.2本设计任务和主要内容
本论文旨在研究基于单片机的大棚温度控制系统,介绍温度传感器对大棚温度收集的具体设计,以及相关硬件的设计和软件编程。
主要内容有:
1温度控制系统的特点
2单片机温度控制系统的组成及工作原理
3温度检测的详细设计
4各部分的软件编程。
第2节系统主要硬件电路设计
2.1系统硬件结构
系统的硬件结构如下图2-1所示:
执行控制接口
ISD1420
图2-1系统结构图
2.2单片机主机系统
该系列单片机是采用高性能的静态80C51设计由先进CMOS工艺制造并带有非易失性Flash程序存储器全部支12时钟和6时钟操作P89C51X2和P89C52X2/54X2/58X2分别包含128字节和256字节RAM32条I/O口线3个16位定时/计数器6输入4优先级嵌套中断结构1个串行I/O口可用于多机通信I/O扩展或全双工UART以及片内振荡器和时钟电路。
此外,由于器件采用了静态设计,可提供很宽的操作频率范围,频率可降至0。
可实现两个由软件选择的节电模式,空闲模式和掉电模式,空闲模式冻结CPU但RAM定时器,串口和中断系统仍然工作掉电模式保存RAM的内容但是冻结振荡器导致所有其它的片内功能停止工作。
由于设计是静态的,时钟可停止而不会丢失用户数据,运行可从时钟停止处恢复。
图2-2单片机主机系统图
2.3温度检测的设计
系统测温采用AD590温度传感器,AD590是美国模拟器件公司生产的单片集成两端感温电流源。
它的主要特性如下:
1.流过器件的电流(mA)等于器件所处环境的热力学温度(开尔文)度数;即:
,(2-1)
式中:
I—流过器件(AD590)的电流,单位为mA;T—热力学温度,单位为K。
2.AD590的测温范围为-55℃~+150℃;
3.AD590的电源电压范围为4V~30V;
4.输出电阻为710MW;
5.精度高。
AD590温度传感器输出信号经放大电路放大10倍,再送入模/数转换器ADC0804,转换后送单片机。
根据AD590温度传感器特性以及放大10倍后的电压值和现场温度的比较发现,实际温度转换后送入单片机的值和按键输入数值之间有一定的差值,模/数转换器送入单片机的数值是按键输入值得2.5倍。
由于单片机不能进行小数乘法运算,所以先对按键输入进行乘5,然后根据运算结果及程序状态字的状态再进行循环右移一位,如果溢出标志位为低电平时直接对累加器进行一次带进位循环右移,如果溢出标志位为高电平时,先对进位标准位CY位置为高电平,然后再进行一次带进位循环右移,通过上述操作使按键输入的温度值和模/数转换器送入单片机的温度值相统一。
图2-3感温部分的核心电路
2.4ISD1420语音芯片
ISD1420为美国ISD公司出品的优质单片语音录放电路,由振荡器、语音存储单元、前置放大器、自动增益控制电路、抗干扰滤波器、输出放大器组成。
一个最小的录放系统仅由一个麦克风、一个喇叭、两个按钮、一个电源、少数电阻电容组成。
录音内容存入永久存储单元,提供零功率信息存储,这个独一无二的方法是借助于美国ISD公司的专利--直接模拟存储技术(DASTTM)实现的。
利用它,语音和音频信号被直接存储,以其原本的模拟形式进入EEPROM存储器。
直接模拟存储允许使用一种单片固体电路方法完成其原本语音的再现。
不仅语音质量优胜,而且断电语音保护。
一、特点:
1)用方便的单片录放系统,外部元件最少
2)现优质原声,没有常见的背景噪音
3)放音可由边沿或电平触发
4)无耗电信息存储,省掉备用电池
5)信息可保存100年,可反复录放10万次
6)无需专用编程或开发系统
7)较强的分段选址能力可处理多达160段信息
8)具有自动节电模式
9)录或放后立即进入维持状态,仅需0.5μA电流
10)单一5伏电源供电。
二、电特性:
1)工作电压:
5V;
2)静态电流:
典型值0.5μA,最大值2μA;
3)工作电流:
典型值15mA,最大值30mA(16欧姆)。
图2-4ISD1420引脚说明及外形图
第3节系统的软件设计
3.1系统控制流程图
系统总体设计思想是以80C51单片机为控制核心,整个系统硬件部分包括温度检测部分、控制执行部分及ISD1420语音芯片。
系统利用单片机获得温度传感器数据并和系统设计值进行比较,根据比较结果分别控制执行系统。
系统控制流程图如图3-1所示。
图3-1系统控制流程图
3.2温度控制系统程序
单片机温度控制系统由硬件和软件组成,上述硬件原理图搭建完成上电之后,我们还不能实现对温度的控制,需要给单片机编写程序,下面给出了温度控制系统的编程方法。
ORG00H
START:
ANLP1,#00H;显示00
JBP3.4,$;T0=0?
有键按下?
LCALLDELAY1;消除抖动
JNBP3.4,$;T0=1?
放下?
MOVR0,#00;计温指针初值
L1:
MOVA,R0;计温指针载入ACC
MOVP1,A;输出至P1显示
MOVR5,#10;延时1秒
A1:
MOVR6,#200
D1:
MOVR7,#248;0.5毫秒
JNBP3.4,L2;第2次按下T0?
DJNZR7,$
DJNZR6,D1
DJNZR5,A1
INCA
DAA
MOVR0,A
JMPL1
L2:
LCALLDELAY1;第2次按消除抖动
JBP3.4,L3;放开了没?
是则跳至L3停止
JMPL2
L3:
MOVA,R0
LCALLCHANGE
MOV31H,A;下限温度存入31H
JBP3.5,$;T1=0?
有键按下?
LCALLDELAY1;消除抖动
JNBP3.5,$;T1=1?
放开?
MOVR0,#00;计温指针初值
L4:
MOVA,RO;计温指针载入ACC
MOVP1,A;显示00
MOVR5,#10;延时1秒
A2:
MOVR6,#200
D2:
MOVR7,#248;0.5毫秒
JNBP3.5,L5;第二次按下T1
DJNZR7,$
DJNZR6,D2
DJNZR5,A2
ADDA,#01H
DAA
MOVR0,A
JMPL4
L5:
LCALLDELAY1;第2次按消除抖动
JBP3.5,L6;放开了?
是则跳至L6
JMPL5
L6:
MOVA,RO;
LCALLCHANGE
MOV30H,A;上限温度存入30H
DELAY1:
MOVR6,#60;30毫秒
D3:
MOVR7,#248
DJNZR7,$
DJNZR6,D3
RET
CHANGE:
MOVB,#5
MULAB
JNZD4
SETBC
D4:
RRCA
RET
MOV32H,#0FFH;32H旧温度寄存器初值
AAA:
MOVX@R0,A;使BUS为高阻抗并令ADC0804开始转换
WAIT:
JBP2.0,ADC;检测转换完成否
JMPWAIT
ADC:
MOVXA,@RO;将转换好的值送入累加器
MOV33H,A;将现在温度值存入33H
CLRC;C=0
SUBBA,32H
JCTDOWN;C=0取入值较大,表示温度上升,C=1表示下降
TUP:
MOVA,33H;将现在温度值存入A
CLRC
SUBBA,30H;和上限温度作比较
JCLOOP;C=1时表示比上限小须加热,C=0表示比上限大,停止
;加热
SETBP2.1
JMPLOOP
TDOWN:
MOVA,33H;将现在温度值存入A
CLRC
SUBBA,31H;和下限温度作比较
JNCLOOP;C=1时表示比下限小,须加热,C=0表示比下限大
CLRP2.1;令P2.1动作
LOOP:
MOV32H,33H
CLRA
MOVR4,#0FFH;延时
DJNZR4,$
JMPAAA
END
3.3温度检测子程序设计
温度传感器是温度控制系统的重要组成部分,缺少了它则功能不能实现。
温度检测子程序如下:
MOVDPTR,DS_TABLE;指向器件序号表入口
LOOP:
MOVR7,7;逐个读取温度
MOVA,#055H;ROM匹配
LCALLWRITE_SERIAL
LCALLDELAY
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLDELAY;延时750us(12位)
LCALLINIT_1820;准备读温度前先复位
LCALLDELAY
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_1820;保存读出的温度数据
DJNZR7,LOOP
CLRP1.4
RET
3.4语音读写程序
在参考了大量的书籍和网上资料后,有关ISD1420的读写程序以C语言为主,由于自身能力有限,所以在此也参考了别人的程序用C语言进行语音芯片的编程。
程序如下:
#include
#include"ISD1420.h"
//0x00~0x09对应数字0~~9
Voice_data[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d};
sbitCLK_595=P0^2;
sbitDAT=P0^0;
sbitST=P0^1;
voiddisplay(uchardat)//595发送一个字节
{
uchari;
for(i=0;i<8;i++)//移动八次即发送八位
{//把数据的最低位送到数据线
DAT=dat&0x01;
CLK_595=0;
CLK_595=1;//启动时钟线,发送一位的595
dat>>=1;
}//数据移一位
}
//短延时函数:
nNop()
/*voidnNop(uinti)
{
for(;i>0;i--);
}
*/
//长延时函数:
LongDelay()
voidLongDelay(uinti)
{
uintj;
for(;i>0;i--)
{for(j=1000;j>0;j--);}
}
//指定段播放函数:
Sound_Play()
voidSound_Play1(ucharAddr)
{
//PLAYL=1;
display((Addr<<2)&0x3c);
ST=0;
ST=1;
LongDelay(50);
PLAYL=0;
LongDelay(60);
PLAYL=1;
}
voidSound_Play2(ucharAddr)
{
//PLAYL=1;
display((Addr<<2)&0x3c);
ST=0;
ST=1;
LongDelay(50);
PLAYL=0;
LongDelay(260);
PLAYL=1;
}
voidInitIO(void)
{
PLAYL=0;
PLAYE=0;
P0=0x00;
}
voidDisable(void)
{
PLAYL=1;
PLAYE=1;
}