基于单片机冬暖式温室大棚环境监测系统设计毕业设计.docx
《基于单片机冬暖式温室大棚环境监测系统设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于单片机冬暖式温室大棚环境监测系统设计毕业设计.docx(35页珍藏版)》请在冰豆网上搜索。
基于单片机冬暖式温室大棚环境监测系统设计毕业设计
基于单片机冬暖式温室大棚环境监测系统设计
摘要
本系统以STC89C52单片机为核心部件,外加温度采集电路、光强采集电路、及显示电路。
温度部分采用单总线型数字式的温度传感器DS18B20,使系统具有测温误差小、分辨率高、抗干扰能力强,动态显示的方式等特点。
光强部分采用A/D转换器ADC0809。
本设计既可以对当前温度和光强进行检测又可以其进行数码显示。
关键词:
仿真温度检测报警DS18B20ADC0809光强检测
第1章题目要求与分析
1.1课程设计的意义
本次课程设计是我们在学习计算机控制技术的一次实习。
可增强我们的动手能力,特别对单片机的系统设计有很大的帮助。
1.2题目要求
1.利用单片机检测和控制温度以及光强并应用于普通温暖式大棚的温度控制和光控制。
2.设定定时功能,可以定时只允许在设定的时间范围内触发单片机工作控制温度或光强。
1.3题目分析
本设计可分为温度检测与控制部分和光强检测部分。
温度检测部分,可以利用单总线型数字式的温度传感器DS18B20,使系统具有测温误差小、分辨率高、抗干扰能力强,动态显示的方式等特点。
光强检测电路,可以使用光敏电阻之类的器件利用其感光效应,在将随被测光亮变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测光强显示出来。
第2章系统总体方案及硬件设计
2.1温度检测与控制部分
2.1.1温度检测与控制系统设计
本系统设计了一个由数字化测温元件构成的温度检测控制系统,本系统包括了温度检测、温度显示、温度设置等部分。
本系统主要运用了单片机STC89C52,高性能CMOS8位单片机,片内含8Kbytes的可反复擦写的;兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元等强大功能;也采用了新型传感器DS18B20,利用它的体积小,高精度、强大的读写功能等特点进行温度的采集;用PNP型三极管做驱动,采用4位共阳LED动态显示方式。
主要采用了自动复位操作。
2.1.2硬件设计与分析
2.1.2.1主控制器采用STC89C52单片机
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
STC89C52是由深圳宏晶科技公司生产的与工业标准MCS-51指令集和输出管脚相兼容的单片机。
STC89C52主要功能如表2.1所示,其PDIP封装如图1
主要功能特性
兼容MCS51指令系统
8K可反复擦写FlashROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
表1STC89C52主要功能
STC89C52引脚介绍
①主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
②外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口(Pin39~Pin32):
8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):
8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):
8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):
8位准双向I/O口线,名称为P3.0~P3.7
图1STC89C52PDIP封装图
STC89C52最小系统
最小系统是指能进行正常工作的最简单电路。
STC89C52最小应用系统电路如图2所示。
它包含五个电路部分:
电源电路、时钟电路、复位电路、片内外程序存储器选择电路、输入/输出接口电路。
其中电源电路、时钟电路、复位电路是保证单片机系统能够正常工作的最基本的三部分电路,缺一不可。
①电源电路芯片引脚VCC一般接上直流稳压电源+5V,引脚GND接电源+5V的负极,电源电压范围在4~5.5之间,可保证单片机系统能正常工作。
为提高电路的抗干扰性能,通常在引角Vcc与GND之间接上一个10uF的电解电容和一个0.1uF陶片电容,这样可抑制杂波串扰,从而有效确保电路稳定性。
②时钟电路单片机引脚18和引脚19外接晶振及电容,STC89C52芯片的工作频率可在2~33MHz范围之间选,单片机工作频率取决于晶振XT的频率,通常选用11.0592MHz晶振。
两个小电容通常取值3pF,以保证振荡器电路的稳定性及快速性。
③复位电路一般若在引脚RST上保持24个工作主频周期的高电平,单片机就可以完成复位,但为了保证系统可靠地复位,复位电路应使引脚RST保持10ms以上的高电平。
如图复位电路带有上电自动复位功能,当电路上电时,由于C1电容两端电压值不能突变,电源+5V会通过电容向RST提供充电电流,因此在RST引脚上产生一高电平,使单片机进入复位状态。
随着电容C1充电,它两端电压上升使得RST电位下降,最终使单片机退出复位状态。
正常运行时,可按复位按钮对单片机复位
图2STC89C52最小系统
主要功能特性:
兼容MCS-51指令系统
8k可反复擦写(>1000次)FlashROM
32个双向I/O口
4.5-5.5V工作电压
时钟频率0-33MHz
◆全双工UART串行中断口线
◆256x8bit内部RAM
◆2个外部中断源
◆低功耗空闲和省电模式
◆中断唤醒省电模式
◆3级加密位
◆看门狗(WDT)电路
◆软件设置空闲和省电功能
◆灵活的ISP字节和分页编程
◆双数据寄存器指针
◆2个16位可编程定时/计数器
STC89C42共有4个(P0、P1、P2、P3口)8位并行I/O端口,共32个引脚。
P0口双向I/O口,用于分时传送低8位地址和8位数据信号;P1、P2、P3口均为准双向I/O口;其中P2口还用于传送高8位地址信号;P3口每一引脚还具有特殊功能,用于特殊信号的输入输出和控制信号。
STC89C52内部有一个可编程的、全双工的串行接口。
它串行收发存储在特殊功能寄存器SFR的串行数据缓冲器SBUF中的数据。
2.1.2.2温度传感器
温度传感器选用DS18B20。
适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下由数据线供电。
独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。
DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
温范围-55℃~+125℃,在-10~+85℃时精度为0.5℃。
可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在你750ms内把温度值转换为数字,速度更快。
测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
DS18B20的外形和内部结构
DS18B20的外形结构及引脚排列
图3DS18B20外形结构图
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
2.1.2系统方案设计
2.1.2.1主控电路设计
主控电路采用STC89C52单片机电路如下:
图4STC89C52单片机电路
2.1.2.2复位电路
当单片机AT89S52的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
根据应用的要求,复位操作通常有两种基本形式:
上电复位和上电或开关复位。
上电复位要求接通电源后,自动实现复位操作。
常用的上电复位图如7中A图所示。
图中电容C1和R1对电源+5V来说构成微分电路。
上电后使RST持续一段时间的高电平。
由于单片机内的等效电阻作用,不用图中电阻R1,也能达到上电复位的功能。
图5
上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。
常用的上电或开关复位电路如上图(B)所示。
上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。
当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。
2.2光强检测与控制部分
2.2.1光强检测与控制系统设计
本设计使用光敏电阻5228搭建光电转换电路,经过AD转换将光电模拟信号数字化,在通过单片机进行数据处理,最终在4位LED上显示光强。
同时设计了报警系统,当光强达到一定上限值时,启动报警模式。
单片机的RESET口上提供了供电自启动,在X1,X2口上提供了12MHZ晶振,以支持单片机的运行与启动。
系统由4个模块组成,分别为光电转换模块、AD转换模块、测量数据显示模块、报警模块。
系统框图如图8:
图6系统框图
2.2.2光强检测与控制系统硬件设计与分析
本系统主要由光电转换电路,AD转换器,单片机,存储器,LED显示,蜂鸣器组成。
2.2.2.1光电转换模块
光电转换模块采用5228光敏电阻进行光电转换,当有光照射到光敏电阻上时,光敏电阻的阻值发生变化,从而产生电信号。
在经过放大器将电信号放大,转换电路如图9所示。
为减小输出信号的噪声,输出端可接1个0.1μF的电容C4去除高频信号。
为防止产生自激振荡在输入与输出之间接1个0.1μF的补偿电容C1,对于增益电阻可采用高精度的可调电阻,输出信号幅度与R1成正比。
R1取值大一些可以增加信噪比,但R1取值要受输出电压幅度的限制。
图7光电转换电路
2.2.2.2A/D转换
A/D转换采样比较熟悉的ADC0809芯片。
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
本次设计中AD转换系统与AT89S51单片机的外部总线接口P0连接,接收采集到的光强电压。
如图3所示。
第三章系统软件分析
3.1温度检测与控制部分
程序流程:
图8主流程图
3.2光强检测与控制部分
程序流程:
图9主流程图
第五章总结与体会
这次设计与制作,温度部分主要是依靠新型DS18B20温度传感器对温度的采集以及STC89C51单片机、LED数码管,发光二极管完成了一个简单的温度控制自动报警系统。
本设计充分采用了DS18B20的高精度、体积小、一线总线等特点和STC89C51单片机的强大功能,既节约了时间、经济成本,也减小了设计电路的复杂性。
但本设计也有许多不足的地方。
光部分主要是对光强这个陌生名词的理解和完成设计的硬件电路的设计。
首先,我们了解光强的基本概念,了解光强在生活中的应用。
因为我们没用光电传感器,所以我们需用光敏电阻或光敏二极管做成一个光电转换电路用来采集光强。
在设计电路上,我们需了解各个器件的引脚分布,防止接错。
焊接过程中,我们由于没有掌握器件的引脚,而导致电路不能正常工作。
在程序方面,相对比较简单,都是平时做过的一些实验。
参考文献
[1]乐建波《温度控制系统》北京化学工业出版社。
[2]张毅刚《新编MCS-51单片机应用设计》哈尔滨工业大学出版社2003版
[3]李东升等《Protel99SE电路设计技术入门与应用》电子工业出版社
[4]龚永彬采用单片机设计温湿度控制仪,2002
[5]KeilSoftwareCompany.Cx51CompilerUser’sGuide.2001
[6]王为青、邱文勋.51单片机应用开发案例精选.人民邮电出版社,2007
[7]李朝青.单片机原理与接口技术.北京航空航天大学出版社,200
[8]邹逢兴.微型计算机原理与接口技术[M].长沙:
国防科技大学出版社,
[9]穆兰.单片微型计算机原理及接口技术[M].北京:
机械工业出版社,
[10]沈德金,陈粤初.接口电路与应用程序例[M].机械工业出版社,2003
[11]刘祖润,胡俊达.[M].北京:
航天航空大学出版社,1995
[12]宋明刚.智能PID方法在高精度控温中的应用研究[J].水利电力机械,2001
[13]罗鑫.微机在电阻炉自动控温中的应用[J].威谱机械,1994
[14]沈协和.用单片微机构成的温控制器[J].仪表仪器,1998
[15]吴期,俞亚珍.微机自动程序温度控制系统[J].水利电力机械,2003
[16]陈磊.单片机控制数字光强检测计的设计[J].大学物理实验.2009.4.
[17]马忠梅,张凯.单片机的C语言应用程序设计(第四版)[M].北京航天大学出版社.
附录
程序
温度部分主程序:
voidmain(void)
{
unsignedchara;
unsignedintt,cntUp,cntDown,cntDisp;
unsignedcharmode=0,temMin=25,temMax=27;
while
(1)
{
t=ReadTemperature();
if(temMax!
=temMin)//高低温值相同则不报警
{
if((t>temMax*10)||(t{
BZ=0;
}else{
BZ=1;
}
}else{
BZ=1;
}
switch(mode){
case0:
//显示温度
SEG[0]=(t/1000)?
TABLE[t/1000]:
0xFF;//如果为0则不显示
SEG[1]=(t%1000/100)?
TABLE[t%1000/100]:
((SEG[0]==0xFF)?
0xFF:
TABLE[0]);//如果为0需要看SEG[0],SEG[0]不显示,则本位也不显示
SEG[2]=TABLE[t%100/10]&0x7F;
SEG[3]=TABLE[t%10];
break;
case1:
//低温限值修改
SEG[0]=TABLE[11];
SEG[1]=0xFF;
SEG[2]=TABLE[temMin/10];
SEG[3]=TABLE[temMin%10];
break;
case2:
//高温限值修改
SEG[0]=TABLE[10];
SEG[1]=0xFF;
SEG[2]=TABLE[temMax/10];
SEG[3]=TABLE[temMax%10];
break;
default:
break;
}
for(a=0;a<4;a++)
{
PORT_CODE=SEG[a];
PORT_BIT=SCAN_CODE[a];
Delayms
(1);
PORT_BIT=0xFF;
}
KEY_MASK;
KeyRead();
if(KeyShort&KEY_MENU)//菜单
{
mode++;
if(mode>2)
{
mode=0;
}
}
if(KeyShort&KEY_UP)//+
{
switch(mode)
{
case0:
//正常状态
break;
case1:
//低温限值修改
if(temMin!
=temMax){//低温不能超过高温限值
temMin++;
}
break;
case2:
//高温限值修改
if(temMax!
=99)//高温限值不能超过99;
{
temMax++;
}
break;
}
}
if(KeyShort&KEY_DOWN)//-
{
switch(mode)
{
case0:
//正常状态
break;
case1:
//低温限值修改
if(temMin!
=0){//低温不能小于0
temMin--;
}
break;
case2:
//高温限值修改
if(temMax!
=temMin)//高温限值低于低温限值;
{
temMax--;
}
break;
}
}
}
}
/*******微秒延时*********/
voidDelayus(unsignedintdUT)
{
while(dUT--);
}
/*******毫秒延时*********/
voidDelayms(unsignedintdT)
{
unsignedintdA,dB;
for(dA=0;dA
for(dB=0;dB<113;dB++)
;
}
/**************************************************************/
unsignedcharInit_DS18B20(void)//初始化ds1820温度传感器
{
unsignedcharx=0;
DQ=1;//DQ复位
Delayus(16);//稍做延时
DQ=0;//单片机将DQ拉低
Delayus(100);//精确延时大于480us
DQ=1;//拉高总线
Delayus(4);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
Delayus(60);
returnx;
}
/****************************************************************/
unsignedcharReadOneChar(void)//读一个字节(DS18B20驱动)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delayus(4);
}
return(dat);
}
/****************************************************************/
voidWriteOneChar(unsignedchardat)//写一个字节(DS18B20驱动)
{
unsignedchari=0;
DQ=0;
Delayus(5);
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delayus(4);
DQ=1;
dat>>=1;
}
}
/***************************************************************/
unsignedintReadTemperature(void)//读取温度(DS18B20驱动)
{
unsignedcharTL,TH;
unsignedintt=0;
floattt=0;
bitflag=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
TL=ReadOneChar();//读低8位
TH=ReadOneChar();//读高8位
t=TH;
t<<=8;
t=t|TL;
tt=t*0.0625;
t=tt*10+0.5;//放大10倍输出并四舍五入
return(t);
}
//读按键值
voidKeyRead(void)
{
unsignedcharReadData=PORT_KEY^0xFF;//读端口值,并取反
ReadData&=(KEY_MENU|KEY_UP|KEY_DOWN);//只取有效按键值
KeyShort=ReadData&(ReadData^KeyLong);//只在第一次按下时为按键值,以后为0
KeyLong=ReadData;//长按、短按都为按键值
}
光强部分源程序:
#include
//***