温度光强采集报警系统.docx
《温度光强采集报警系统.docx》由会员分享,可在线阅读,更多相关《温度光强采集报警系统.docx(21页珍藏版)》请在冰豆网上搜索。
温度光强采集报警系统
实验总成绩:
——————————————————————————装订线—————————————————————————————————
报告份数:
温度光强采集报警系统
通信与信息工程学院
专业课程设计报告
专业班级:
学生姓名:
学号(班内序号):
年月日
一、设计内容
1.题目:
温度光强采集报警系统
基本部分要求:
(1)采用单片机温度的采集。
(2)通过者液晶显示采集到的数字。
(3)当温度超过设定的值进行声光报警,用发光二极管闪烁报警。
发挥部分要求:
(1)将采集到的数据通过串口传给PC,PC端进行显示。
(2)通过按键可以切换华氏温度和摄氏温度显示。
2.设计思路
本次课程设计主要是51单片机温度的采集,采集到的数字显示在液晶屏上。
通过键盘控制温度的上限,当温度超过上限时,采用二极管闪烁和蜂鸣器鸣响进行声光报警。
4*4矩阵键盘控制温度上限以及切换华氏温度和摄氏温度显示。
主要涉及了温度的测量、显示以及实现简单控制。
硬件方面有五个模块,即AT89S52单片机主控模块、DHT11传感器模块、LCD1602液晶显示模块、报警模块以及4*4键盘模块。
其中AT89S52单片机主控模块已经给出,我们只需适当增加驱动电路即可。
传感器模块使用的是DHT11数字温湿度传感器。
通过DHT11检测出当前环境下的温湿度,将所测数据交给AT单片机进行分析和处理,并分别存入不同数组以便显示时候用。
1602液晶显示模块就是实现温度检测值和上限值的显示。
其分两行显示,上边一行显示湿度,下边显示温度上限值,正常工作的时候可以通过按键调节上限值,当温度超过上限值时,二极管闪烁并且蜂鸣器鸣响报警。
通过虚拟终端显示检测到的温度值。
报警模块实现了检测值超过上限值的时候二极管闪烁并且蜂鸣器鸣响报警。
无论温度超出范围二极管和蜂鸣器都是以相同频率的闪烁及声音进行报警提示。
提醒此时温度数据出现异常、需及时调整实验室内温度。
4*4矩阵键盘模块通过‘+’(加)‘-’(减)两个按键来上限值设置功能;通过‘*’(乘)‘/’(除)两个按键来切换华氏温度和摄氏温度转换功能。
3、设计和学习步骤
(1)分析题目并查找资料;
(2)编写程序并用Proteus仿真;
(3)在实物上进行液晶的调试;
(4)传感器实物的调试;
(5)加装键盘模块和二极管蜂鸣器报警模块的实物调试。
4、总体设计框图
按照系统功能的具体要求,在保证实现其功能的基础上,尽可能降低系统成本。
总体设计方案围绕上述思想,初步确定系统的方案如下图所示
。
仿真时使用SHT11代替DHT11
从图中可以看出,系统单片机最小系统模块、DHT11传感器模块、1602字符液晶显示模块、4*4矩阵键盘模块、报警模块组成。
在方案设计中,外围模块采用并行控制,以简化系统,提高控制精度。
该设计以AT89S52单片机为控制核心,实现温湿度采集及显示的基本功能。
5、DHT11传感器简介(查找的资料)
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。
每个DHT11传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
产品为4针单排引脚封装。
连接方便,特殊封装形式可根据用户需求而提供。
(1)引脚介绍:
Pin1:
(VDD),电源引脚,供电电压为3~5.5V。
Pin2:
(DATA),串行数据,单总线。
Pin3:
(NC),空脚,请悬浮。
Pin4(VDD),接地端,电源负极。
(2)接口说明:
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
(3)数据帧的描述:
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据
+8bit温度整数数据+8bit温度小数数据
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
(4)电气特性:
VDD=5V,T=25℃,除非特殊标注
表2-1DHT11的电气特性
参数
条件
Min
typ
max
单位
供电
DC
3
5
5.5
V
供电电流
测量
0.5
2.5
mA
平均
0.2
1
mA
待机
100
150
uA
采样周期
秒
1
次
注:
采样周期间隔不得低于1秒钟。
(5)时序描述:
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
二、电路图
1、总体电路连接图
本次课程设计使用的主控模块是由老师给出的一个AT89S52为核心的最小系统。
使用的时候将P1口作为与液晶的数据传输口,P2口作为键盘的数据传输口,P1.0~P1.1作为与传感器SHT11通信的数据口,P3.4~P3.6作为分别于液晶的E和RS、RW端相连接,以控制液晶显示;P1.6接蜂鸣器控制端,P1.7接二极管控制端,以控制报警模块工作。
2、各模块控制电路图
(1)51单片机固定端口模块连接图
(2)4*4矩阵按键模块连接图
(3)液晶显示连接图
(4)传感器与二极管和蜂鸣器报警模块连接图
三、上机程序
部分代码:
#ifndef__TOU_H__
#define__TOU_H__
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
enum{TEMP};
sbitRS=P3^5;
sbitRW=P3^6;
sbitE=P3^4;
sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
sbitDATA=P1^1;
sbitSCK=P1^0;
sbitLED=P1^7;//定义led输出端口
sbitSPK=P1^6;//定义喇叭端口
unsignedcharfrq;
voidDelayUs2x(unsignedchart);//函数声明
voidDelayMs(unsignedchart);
voidDelayUs2x(unsignedchart)
{while(--t);}
voidDelayMs(unsignedchart)
{while(t--)
{DelayUs2x(245);
DelayUs2x(245);}
}
/********DS1602函数声明********/
voidLCD_Initial();
voidGotoXY(unsignedcharx,unsignedchary);
voidPrint(unsignedchar*str);
voidLCD_Write(bitstyle,unsignedcharinput);
/********SHT10函数声明********/
voids_connectionreset(void);
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);
voidcalc_sth10(float*p_temperature);
#endif
#definenoACK0//继续传输数据,用于判断是否结束通讯
#defineACK1//结束数据传输;
//#defineSTATUS_REG_W0x06//00000110
//#defineSTATUS_REG_R0x07//00000111
#defineMEASURE_TEMP0x03//00000011
#defineRESET0x1e//00011110
//写字节程序
chars_write_byte(unsignedcharvalue)
{unsignedchari,error=0;
for(i=0x80;i>0;i>>=1)//高位为1,循环右移
{if(i&value)DATA=1;//和要发送的数相与,结果为发送的位
elseDATA=0;
SCK=1;
_nop_();_nop_();_nop_();//延时3us
SCK=0;}
DATA=1;//释放数据线
SCK=1;
error=DATA;//检查应答信号,确认通讯正常
_nop_();_nop_();_nop_();
SCK=0;
DATA=1;
returnerror;//error=1通讯错误
}//读字节程序
chars_read_byte(unsignedcharack)
{unsignedchari,val=0;
DATA=1;//释放数据线
for(i=0x80;i>0;i>>=1)//高位为1,循环右移
{SCK=1;
if(DATA)val=(val|i);//读一位数据线的值
SCK=0;}
DATA=!
ack;//如果是校验,读取完后结束通讯;
SCK=1;
_nop_();_nop_();_nop_();//延时3us
SCK=0;
_nop_();_nop_();_nop_();
DATA=1;//释放数据线
returnval;}
//启动传输
voids_transstart(void)
{DATA=1;SCK=0;//准备
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;}
//连接复位
voids_connectionreset(void)
{unsignedchari;
DATA=1;SCK=0;//准备
for(i=0;i<9;i++)//DATA保持高,SCK时钟触发9次,发送启动传输,
{SCK=1;
SCK=0;}
s_transstart();}
chars_softreset(void)
{unsignedcharerror=0;
s_connectionreset();//启动连接复位
error+=s_write_byte(RESET);//发送复位命令
returnerror;//error=1通讯错误
}
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)
{unsignederror=0;
unsignedinti;
s_transstart();//启动传输
switch(mode)//选择发送命令
{caseTEMP:
error+=s_write_byte(MEASURE_TEMP);break;//测量温度
default:
break;}
for(i=0;i<65535;i++)if(DATA==0)break;//等待测量结束
if(DATA)error+=1;//如果长时间数据线没有拉低,说明测量错误
*(p_value)=s_read_byte(ACK);//读第一个字节,高字节(MSB)
*(p_value+1)=s_read_byte(ACK);//读第二个字节,低字节(LSB)
*p_checksum=s_read_byte(noACK);//readCRC校验码
returnerror;//error=1通讯错误
}
//温度值标度变换及温度补偿
voidcalc_sth10(float*p_temperature)
{constfloatT1=+0.01;//14位温度精度5V条件修正公式
constfloatT2=+0.00008;//14位温度精度5V条件修正公式
floatt=*p_temperature;//t:
14位温度
floatt_C;//t_C:
温度℃
t_C=t*0.01-40;//补偿温度
*p_temperature=t_C;//返回温度结果
}
unsignedcharLCD_Wait(void)
{RS=0;
RW=1;_nop_();
E=1;_nop_();
E=0;
returnDBPort;}
//向LCD写入命令或数据********************************************************
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,unsignedcharinput)
{E=0;
RS=style;
RW=0;_nop_();
DBPort=input;_nop_();//注意顺序
E=1;_nop_();//注意顺序
E=0;_nop_();
LCD_Wait();
}
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(unsignedcharDisplayMode)
{LCD_Write(LCD_COMMAND,0x08|DisplayMode);}
//设置输入模式************************************************************
#defineLCD_AC_UP0x02
#defineLCD_AC_DOWN0x00//default
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//default
voidLCD_SetInput(unsignedcharInputMode)
{LCD_Write(LCD_COMMAND,0x04|InputMode);}
//初始化LCD************************************************************
voidLCD_Initial()
{E=0;
LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动
}
//液晶字符输入的位置************************
voidGotoXY(unsignedcharx,unsignedchary)
{if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));}
//将字符输出到液晶显示
voidPrint(unsignedchar*str)
{while(*str!
='\0')
{LCD_Write(LCD_DATA,*str);
str++;}
}
//LED闪烁和蜂鸣器鸣响报警
voidLEDSPK(unsignedinttemp)
{while(temp>28)
{SPK=~SPK;
DelayMs(100);//调用延时程序;更改延时数字可以更改延时长度;
LED=~LED;//将P口赋值0,对外输出低电平
DelayMs(100);//调用延时程序;更改延时数字可以更改延时长度;
}
}//#include
typedefunion//定义共用同类型
{unsignedinti;
floatf;
}value;
voidmain()
{unsignedinttemp;
valuetemp_val;//定义wendu
unsignedcharerror;//用于检验是否出现错误
unsignedcharchecksum;//CRC
ucharwendu[6];//用于记录摄氏温度//华氏度=32+摄氏度×1.8
LCD_Initial();//初始化液晶
GotoXY(0,0);//选择温度显示位置
Print("TEMP:
'C");//5格空格
//GotoXY(0,0);//Print("TEMP2:
%F")//打印华氏温度
s_connectionreset();//启动连接复位
while
(1)
{error=0;//初始化error=0,即没有错误
error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP);//温度测量
if(error!
=0)s_connectionreset();////如果发生错误,系统复位
else
{temp_val.f=(float)temp_val.i;//转换为浮点数
calc_sth10(&temp_val.f);//修正相对温度
temp=temp_val.f*10;
GotoXY(5,0);//设置温度显示位置
wendu[0]=temp/1000+'0';//温度百位
wendu[1]=temp%1000/100+'0';//温度十位
wendu[2]=temp%100/10+'0';//温度个位
wendu[3]=0x2E;//小数点
wendu[4]=temp%10+'0';//温度小数点后第一位
Print(wendu);//输出温度
LEDSPK((unsignedint)wendu);//华氏度=32+摄氏度×1.8
//wendu2=32+wendu*1.8;//Print(wendu2);
}
DelayMs(800);//等待足够长的时间,以现行下一次转换
}
}
4、调试结果及结论
结论里我用的是完整的程序,自己画了仿真图。
(1)本系统所要实现的功能是:
1.温度实时检测及显示。
通过LCD1602实时地显示传感器SHT11检测到的温度值,并且固定时间检测更新显示一次。
2.报警上限值的手动设置。
通过三个按键实现温度值的设置,使得系统更加人性化、智能化,具有更高的实用价值。
3.当温度超出上限值时能自动报警。
通过蜂鸣器发出声音并使闪烁灯闪烁实现报警,以提醒用户做出相应的改进措施。
(2)仿真图实现的内容:
1、显示检测到的温度(27摄氏度)及上限值(30摄氏度):
2、通过‘*’(乘)按键来切换到华氏温度;‘/’(除)按键切换到摄氏温度
3、通过‘+’(加)‘-’(减)两个按键来设置上限值(26摄氏度)低于当前温度,二极管闪烁及蜂鸣器鸣响报警。
(3)课题的背景资料
温度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、化工等各类工业中广泛需要对温度湿度的检测与控制。
并且随着人们生活水平的提高,人们对自己的生存环境越来越关注。
而空气中温湿度的变化与人体的舒适度和情绪都有直接的影响,所以对温度湿度的检测及控制就非常有必要了。
8051单片机是常用于控制的芯片,在智能仪器仪表、工业检测控制、机电一体化等方面取得了令人瞩目的成果,用其作为温湿度控制系统的实力也很多。
使用8051单片机能够实现温湿度全程的自动控制,而且8051单片机易于学习掌握,性价比高。
使用8051型单片机设计温湿度控制系统,可以即时精确的反应温室内的温度以及适度的变化。
完成诸如升温到特定的温度、降温到特定的温度。
在温度上下限范围内保持恒温等多种控制方式,在湿度控制方面也是如此。
将此系统应用到温室当中无疑为植被生长提供了更加适宜的环境。
对于大棚种植和花圃、花卉栽培,必须在某些特定环境安装温湿度装置对其进行监控。
本系统可以及时、精确的反映室内的温度以及湿度的变化,能够满足温湿度的控制要求。
温湿度控制已经成为了21世纪热门研究话题之一。
无论是从生产还是生活,与我们人类都是息息相关的。
而智能化的控制温湿度已经发展成为一种必然。
随着世界经济的发展,人们生活水平的提高以及社会的