单片机的温、湿度测量系统.doc

上传人:scccc 文档编号:14392583 上传时间:2022-02-05 格式:DOC 页数:22 大小:307.50KB
返回 下载 相关 举报
单片机的温、湿度测量系统.doc_第1页
第1页 / 共22页
单片机的温、湿度测量系统.doc_第2页
第2页 / 共22页
单片机的温、湿度测量系统.doc_第3页
第3页 / 共22页
单片机的温、湿度测量系统.doc_第4页
第4页 / 共22页
单片机的温、湿度测量系统.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《单片机的温、湿度测量系统.doc》由会员分享,可在线阅读,更多相关《单片机的温、湿度测量系统.doc(22页珍藏版)》请在三一文库上搜索。

1、单片机应用系统设计课 题:单片机的温、湿度测量系统 姓 名: 班 级: 学 号: 指导老师: 日 期: 目录一、绪论二、系统总体方案设计三、硬件系统设计四、系统软件设计五、设计总结一、绪论现在的精密测量和精密加工中,环境因素是影响精度的主要因素之一,其中的温度、湿度是环境的两项主要指标。当前,已经开发了很多温湿度测量系统,一些高精度温度传感器的精度可到0.01,然而价格非常昂贵,一般只作为高分辨力的精度测量和用作测温仪器的标准。而对于生产应用中的较低精度温湿度测量系统,现有的系统多采用了与计算机直接结合的工作模式,增加了系统的成本。鉴于目前的情况,我们提出以价格低廉的单片机作为控制核心,以多个

2、温度、湿度传感器作为测量元件,构成了低成本的智能温湿度测量系统。在该系统中,根据测量空间或设备的实际需要,由多路温度、湿度传感器对关键温度点进行测量,由安装于仪器内的单片机对各路数据进行循环检测、存储,实现温、湿度的智能测量。经初步预算,该系统的成本仅为数百元人民币,价格低廉。另外,该系统具有与计算机的通讯功能,在长时间数据采集完成后,可以将数据在传送到计算机进行相关的研究分析。因此,该系统即具有现有的计算机控制的智能测量功能,又节省硬件成本。另外,我们所设计的智能温湿度测量系统外形尺寸小,即可用于实验室环境温度的测量,又可用于仪器、大型设备等的内部环境测量。其功能如下: 1.测量空间多点的温

3、度和湿度:根据测量空间或设备的实际需要,由多路温度、湿度传感器对关键温、湿度敏感点进行测量,由安装于仪器内的单片机对各路数据进行循环检测、数据处理、存储,实现温湿度的智能、多空间点的测量。 2.长时间测量数据记录功能:可以根据需要设置数据记录时间间隔,数据存入数据存储器。 3.通讯功能:与计算机通讯功能,最远传输距离为20米。采用此通讯方式成本低。将采集的数据传入计算机,在Windows环境下通过对温湿度数据进行分析,得出空间温度场和湿度场的分布情况。要求达到的技术指标: 测温范围: -20 100 测温精度:0.1 测湿范围: 0100%RH 测湿精度:3.5%RH测量仪特点: 1 长周期数

4、据自动记录 2 空间温度场、湿度场测量 3. 精度较高4. 价格低廉 二、系统总体设计 硬件框图以单片机为控制核心,采用温湿度测量,通信技术,误差修正等关键技术,以温湿度传感器作为测量元件,构成智能温湿度测量系统。本系统采用AT89C52 单片机作为控制核心,控制系统主要包括温湿度传感器、LED1602数码管显示、按键、蜂鸣器报警驱动等部件。三、硬件系统设计 硬件原理图AT89C52 的单片微机接口为串行接口(两线双向)。数据传输期间,在时钟高电平时,DATA 必须保持稳定。为避免信号冲突,微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻(例如:10k)将信号提拉至高电平,上拉电阻通常

5、已包含在微处理器的I/O 电路中。 温湿度数据采集与转换由温湿度传感器芯片来完成,提供全标定的数字输出,该传感器包括电容性聚合体测湿敏感元件,一个用能隙材料制成的测温元件,并在同一芯片上,与14 位 的A/D 转换器以及串行接口电路实现无缝连接,该传感器芯片为插针型温湿度传感器芯片 ,全量程标定,两线数字输出;湿度测量范围:0100%RH;湿度测量范围:-40+123.8;湿度测量精度:3.0.%RH ;温度测量精度:0.2 ,响应时间:4s; ;低功耗 (typ. 30W) ,可完全浸没。温湿度传感器进行温湿度测量的原理是利用环境温度、湿度变化引起材料电特性变化。温度检测电路温度检测电路选用

6、一线式数字温度传感器作为温度检测器件,该器件只有个引脚(即电源、地线、数据线),且不需要外部元件,而是共用一条数据线进行通信,使用一根线通信时,电源电压是以寄生方式供电的,因此,只需将其和端接地即可。该电路的检测温度范围为;精度为;用数字量来表示温度;每次将温度转换成数字量需。实现对实验室环境温度的检测,是为了更好地保持温度的恒定。湿度检测电路湿度信号的获取采用电容式湿敏传感器作为湿度检测器件。环境湿度与传感器电容成线性关系,所以可方便地将湿度转换成可以接受的电信号,从而使湿度传感器的线性和灵敏度处于较好状态;基准电路和频率转换电路可将湿度传感器的电容变化转换成频率变化。调整时,可先设定湿度为

7、,然后输出电压即可。 LED 显示器有两种工作方式,即静态显示和动态显示方式。本设计采用数码管动态扫描实时显示当前的温度和湿度值。并由单片机I/O 口驱动的6 位数码管显示,具体分配如下:温度显示4 位,分别是百位,十位,个位,小数点后一位。湿度显示两位,分别是百位,十位。 按键部分: 是人向机器输入数据和对系统进行干预的基本设备,用于输入数据和命令,显示CPU 的运行状态、命令和计算结果。在单片机控制系统中,常常只需要用到功能键。少量的功能键一般采用独立式结构,是指各按键相互独立地接通一条输入数据线,每个键的工作不会影响其他的I/O 口,本设计的采用独立式按键形式,采样为按键P1.3操作,通

8、过按键P1.0可切换温度和湿度设置界面,通过按键P1.1(递增键)和按键P1.2(递减键)选择报警上下限值,按键P1.3为取消键。通过按键可设置温度和湿度的上限和下限的报警值,当变送器检测到环境温度或湿度超过所设定的上限和下限值时,CPU 的I/O 口通过驱动电路控制蜂鸣器发声来报警。定时及控制驱动电路定时主要用于提前预热仪器设备和定时语音提醒等,该功能的实现由单片机来完成。时钟频率选用,该频率可使单片机工作在最小功耗状态并可简化分频、定时程序的编写。可 控制驱动电路用于保护仪器。各个电磁阀的导通要有一定的时间间隔,为了便于扩展该装置的功能,系统应留有足够的扩展空间。该系统最多可控制个设备以满

9、足不同需要。继电器采用交流固态继电器,其内部采用光电隔离方式,可有效地避免电磁干扰。当单片机检测到温湿度信号超过设定值时,通过光耦产生大于的触发电流使固态继电器启动相应的电器工作,从而实现对相应设备的控制。设计时应注意各个电器不要同时启动以免冲击电网,这部分工作可由软件延时完成。四、系统软件设计本系统软件设计采用结构化和模块化设计方法,便于功能扩展,本系统的软件设计采用C 语言编写。温湿度采样芯片将当前的温湿度数据转换成二进制值通过两线制接口传送给单片机,单片机将采样芯片送来的数据进行补偿算法获得精确实际采样值。然后根据需要将其送到数码管显示。 系统上电以后,初始化I/O 口,读取存在温湿度上

10、下限报警值。进入主循环程序首先对按键是否触发进行判断,如有按键触发则进入设置上下限报警值界面设置相应的上下限报警值;而后访问温湿度采样芯片获取温湿度采样二进制值经补偿处理转换成精确数据并显示数,接着判断当前温度或湿度值是否超限,若温度或湿度超限,则驱动蜂鸣器报警,直到环境的温度和湿度都下降到报警值以下则停止报警。 数据采集系统广泛的应用于工业过程控制中,生产工作现场常弥布着各种干扰信号。这样,由于干扰的作用会在被测电流或电压上叠加上干扰信号(即噪声)。而由传感器输出的信号一般比较微弱,所以干扰信号的作用会显得突出,称为数据采集的主要障碍.因此,采取适当的抗干扰措施是必要的。如在电源、地线、去耦

11、电路、硬件设计上采用了单片机上电复位电路,而在软件设计中则加入采用抗干扰措施。 系统主程序软件流程图 五、设计总结本文介绍的了温湿度变送器硬件及软件的设计针对温度、湿度的测量特点,采用数字温湿度传感器,可与单片机直接相连,并且由于它温湿一体的高度集成化,改变传统温湿度变送器硬件包含温度传感器、湿度传感器、信号处理器、A/D 等部分,从而简化外围电路并降低费用,提高了电路工作的可靠性和稳定性,达到了较高的性价比。温湿度检测仪充分利用了单片机的自身资源,使温湿度测量范围和精度大大提高。六、 主要参考资料:1 林志琦.基于Proteus的单片机可视化软硬件仿真M.北京:北京航空航天大学出版社,200

12、6.92 周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真M.北京:北京航空航天大学出版社,2006.53 张靖武,周灵彬.单片机系统的PROTEUS设计与仿真M.北京:电子工业出版社,2007.44 周润景,张丽娜.PROTEUS入门实用教程M.北京:机械工业出版社,2007.95 楼然苗,李光飞.51系列单片机设计实例M.北京:北京航空航天大学出版社,2003.36 楼然苗,李光飞.单片机课程设计指导M.北京:北京航空航天大学出版社,2007.77. 贾东耀,汪仁煌. 数字温度传感器在仓库温度检测系统的应用J. 传感器世界,200178 DALLAS DS18B20数据手册Z

13、.http:/9 法国Humirel公司.HS1101使用说明手册.10 长沙太阳人电子有限公司.SMC1602A LCM使用说明手册.附录:/*/#include#include#include #include #define uchar unsigned char#define uint unsigned int#define BUSY 0x80 /lcd忙检测标志#define DATAPORT P0 /定义P0口为LCD通讯端口#define T_cont 0.0625; /温度转换常数#define CYCLE 50000; sbit P1_0=P10; /模式调整sbit P1_

14、1=P11; /温湿度值加sbit P1_2=P12; /温湿度值减sbit P1_3=P13;sbit scl=P22;sbitsda=P23; /温湿度交替显示sbit DQ = P24; /定义ds18b20通信端口 sbit LCM_RS=P25; /数据/命令端sbit LCM_RW=P26; /读/写选择端sbit LCM_EN=P27;sbit P3_7=P37;sbit BUZZER=P30;/蜂鸣器报警的接口sbit light=P31;/灯光报警接口bit alarm_f=0; /是否取消声音报警标志,为1时取消声音bit alarm_out=0;/在报警时,按下模式调整键

15、,是否进入调整状态,是0不进入uchar alarm_break=0;/在报警时,判断温湿度采集标志uchar T_bai,T_shi,T_ge,T_fen;uint T2,T3,T4;float temp,temp1; /转换好的温度数值bit T_sign; bit ack; /温度正负符号 uchar HL=30,HH=70; /湿度上下限; char TL=0,TH=50,UTL; /温度上下限uchar x;uchar set=0;/模式调节uchar N=0; /计数器计数单元uchar a=0;uchar in=0,de=0; /判断长加/长减标志 uchar T0H=0,T0L

16、=0; /计数值uchar RH; /测量的湿度值extern uchar * read_rom(void);extern bit match_rom(uchar *rom);uchar code wel= -WELCOME-;uchar code by = By:Xie Yang ;uchar code str0=U= T= ;uchar code str1=HR: - ;uchar code str2=TR: - ;uchar ds18b20_num28=0xb9,0x00,0x00,0x00,0xb8,0xc5,0x31,0x28;uchar ds18b20_num18=0x8e,0x0

17、0,0x00,0x00,0xb8,0xc5,0x30,0x28;int code b1126 = 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,82,84,85,86,87,88,89,90,90,91,91,92,92,92,93,93,93,93,94,94,94,94,94,94,94,94,65,68,70,73,75,76,78,79,81,82,83,83,84,85,85,86,86,87,87,88,88,89,89,

18、89,89,47,52,56,60,63,65,68,70,71,73,74,76,77,78,78,79,80,81,81,82,82,83,83,84,84,84,31,37,42,47,51,54,57,60,62,65,66,68,69,71,72,73,74,75,76,76,77,78,78,79,79,79,14,22,27,35,40,44,48,51,54,56,59,61,62,64,65,67,68,69,70,71,72,72,73,74,74,74,0,8,16,23,28,34,38,42,46,49,51,54,56,58,59,61,62,64,65,66,67

19、,68,68,69,70,70,0,0,3,11,18,24,29,33,37,41,44,47,49,51,53,55,57,58,60,61,62,63,64,65,65,66,0,0,0,0,7,14,20,25,30,34,37,40,43,46,48,50,52,53,55,56,57,58,59,60,61,61,0,0,0,0,0,5,11,17,22,27,30,34,37,40,42,44,46,48,50,51,53,54,55,56,57,57,0,0,0,0,0,0,3,9,15,20,24,28,31,34,37,39,42,44,45,47,48,50,51,52,

20、53,53;void delay_LCM(uint); /LCD延时子程序void initLCM( void); /LCD初始化子程序void lcd_wait(void); /LCD检测忙子程序void WriteCommandLCM(uchar WCLCM,uchar BusyC); /写指令到ICM子函数void WriteDataLCM(uchar WDLCM); /写数据到LCM子函数void DisplayOneChar(uchar X,uchar Y,uchar DData); /显示指定坐标的一个字符子函数void DisplayListChar(uchar X,uchar

21、Y,uchar code *DData); /显示指定坐标的一串字符子函数void displayfun0(void);void displayfun1(void);void displayfun2(void);void displayfun3(void);void displayfun4(void);void displayfun5(void);void keyscan(void ) ; /键盘扫描子程序void set_adj(void);void inc_key(void);void dec_key(void);extern void delay_18B20(uint i);extern

22、 void Init_DS18B20(void) ;extern void DataChange(void);extern void Temp_RH(void);void start_I2C() ;/启动i2cvoid stop_I2C() ; /停止i2cwritex(uchar j) ;/向24c01写一个字节uchar x24c01_read(uchar address);/从24c01对应的地址读一个字节void sack_I2C(bit a); /向24c01发送应答与非应答信号uchar readx() ;/从24c01读一个字节void x24c01_write(uchar ad

23、dress,uchar info);/向24c01相应的地址写入数据void alarm(void);/声光报警程序keyscan_alarm(void); /检测是否取消声音报警程序void alarm_delay(uchar v);/报警时,对温湿度进行采集R_T();/当进行修改温湿度上下限值和地址码时,在24c01相应地址中写入修改后的数据store();/*延时K*1ms,12.000mhz*/void delay_LCM(uint k) uint i,j; for(i=0;ik;i+) for(j=0;j60;j+); /*写指令到LCM子函数*/void WriteCommand

24、LCM(uchar WCLCM,uchar BusyC) if(BusyC)lcd_wait();DATAPORT=WCLCM; LCM_RS=0; / 选中指令寄存器 LCM_RW=0; / 写模式 LCM_EN=1; _nop_(); _nop_();_nop_(); LCM_EN=0; /*写数据到LCM子函数*/void WriteDataLCM(uchar WDLCM) lcd_wait( ); /检测忙信号 DATAPORT=WDLCM; LCM_RS=1; / 选中数据寄存器 LCM_RW=0; / 写模式 LCM_EN=1; _nop_();_nop_();_nop_(); L

25、CM_EN=0;/*lcm内部等待函数*/void lcd_wait(void) DATAPORT=0xff; LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); while(DATAPORT&BUSY) LCM_EN=0; _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); LCM_EN=0;/*LCM初始化子函数*/void initLCM( ) DATAPORT=0;delay_LCM(15);WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号 delay_LCM(5); WriteComm

26、andLCM(0x38,0); delay_LCM(5); WriteCommandLCM(0x38,0); delay_LCM(5); WriteCommandLCM(0x38,1); /8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x08,1); /关闭显示,检测忙信号 WriteCommandLCM(0x01,1); /清屏,检测忙信号 WriteCommandLCM(0x06,1); /显示光标右移设置,检测忙信号 WriteCommandLCM(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号/*显示指定坐标的一个字符子函数*/v

27、oid DisplayOneChar(uchar X,uchar Y,uchar DData) Y&=1; X&=15; if(Y)X|=0xC0; /若y为1(显示第二行),地址码+0XC0 X|=0x80; /指令码为地址码+0X80 WriteCommandLCM(X,1); WriteDataLCM(DData);/*显示指定坐标的一串字符子函数*/void DisplayListChar(uchar X,uchar Y,uchar code *DData) uchar ListLength=0; Y&=0x01; X&=0x0f; while(X=3)HL+=5;else HL+;i

28、f(HL=50) HL=50; break;case 2: if(in=3)HH+=5;else HH+;if(HH=100) HH=100; break;case 3: if(in=3)TL+=5;else TL+;if(TL=50) TL=50; break; case 4: if(in=3)TH+=5;else TH+;if(TH=100) TH=100; break;default:break;/*按键减法子函数*/void dec_key(void)switch(set) case 1: if(de=3)HL-=5;else HL-;if(HL=50) HL=0; break; /因

29、为04减去05是ff,00减去05是fb,所以是从251 255case 2: if(de=3)HH-=5;else HH-;if(HH=3)TL-=5;else TL-;if(TL=3)TH-=5;else TH-;if(TH=50) TH=50; break;default:break;/*湿度计算程序*/ float fun(int x1,int x2,float y1,float y2,float t) / 线性插值计算函数。 float y ; y =y1+(t-x1)*(y2-y1)/(x2-x1) ; return(y) ; void Temp_RH(void) int i,j,

30、t1,t2,k1,k2; float u,u1,u2,t,tr; t=T2; tr=T4; / 输入干球温度,干湿球温差 i=tr/10; k1=10*i; k2=k1+10; j=t/20; t1=20*j; t2=t1+20 ; /计算数组元素的行标和列标。 u1=fun(t1,t2,bij,bij+1,t); /调函数求出Ui-1(t0) 和Ui(t0) u2=fun(t1,t2,bi+1j,bi+1j+1,t); u=fun(k1,k2,u1,u2,tr); / 调函数求出Ut0(t0) RH=(int)u; /输出Ut0(t0)/24C01读写驱动程序/*void start_I2C

31、() /启动I2C总线sda=1; _nop_();scl=1; _nop_();_nop_();_nop_();_nop_();_nop_();sda=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();scl=0; _nop_();_nop_();void stop_I2C() /停止I2C总线sda=0; _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); writex(uc

32、har j) /写一个字节 uchar i,temp0; temp0=j; for (i=0;i8;i+)temp0=temp01; sda=CY; scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=0;sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();if(sda=1)ack=0;else ack=1;scl=0;return(ack);uchar readx() /读一个字节uchar i,j,k=0;sda=1;for (i=0;i8;i+) scl=1; if (sda=

33、1) j=1;else j=0;k=(k1)|j; _nop_(); _nop_(); _nop_();scl=0;return(k);void sack_I2C(bit a) if(a=0)sda=0;else sda=1;scl=1;_nop_(); _nop_();_nop_();_nop_();_nop_();scl=0;*/从24c01的地址address中读取一个字节数据/*uchar x24c01_read(uchar address)uchar i;start_I2C(); writex(0xa0);if(ack=1)writex(address);if(ack=1) star

34、t_I2C();writex(0xa1); if(ack=1)i=readx(); sack_I2C(1);stop_I2C(); return(i);*/向24c01的address地址中写入一字节数据info/*void x24c01_write(uchar address,uchar info)start_I2C(); writex(0xa0); if(ack=1) writex(address); if(ack=1) writex(info);if(ack=1) stop_I2C(); */*the main funtion*/ void main(void) uchar i; P1=0xff; /初始化p1口,全设为1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1