为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

仓库温湿度

2017-11-14 50页 doc 582KB 81阅读

用户头像

is_721103

暂无简介

举报
仓库温湿度仓库温湿度 上海电机学院 本科生毕业论文,设计, 课题名称 仓库温度、湿度综合参数显示器_ 学 院 电气学院 专 业 测控技术与仪器 班 级 学 号 姓 名 指导教师 定稿日期: 2011 年 4月28 日 仓库温度、湿度综合参数显示器 1 摘 要 目前,仓储式物流企业快速发展、迅速崛起。库是用于存放物品的场所,通风以及温度、湿度的监测是仓库重要条件,它直接影响到储备物资的使用寿命和工作可靠性。温、湿度的测量和控制在纺织工业、林业、化工以及气象观测等领域中也同样有着广泛的应用。实际应用中,温度、湿度等环境条件对...
仓库温湿度
仓库温湿度 上海电机学院 本科生毕业论文,设计, 课题名称 仓库温度、湿度综合参数显示器_ 学 院 电气学院 专 业 测控技术与仪器 班 级 学 号 姓 名 指导教师 定稿日期: 2011 年 4月28 日 仓库温度、湿度综合参数显示器 1 摘 要 目前,仓储式物流企业快速发展、迅速崛起。库是用于存放物品的场所,通风以及温度、湿度的监测是仓库重要条件,它直接影响到储备物资的使用寿命和工作可靠性。温、湿度的测量和控制在纺织工业、林业、化工以及气象观测等领域中也同样有着广泛的应用。实际应用中,温度、湿度等环境条件对该类企业可以说是严格监控的目标,通过人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大,需要一种造价低廉、使用方便且测量准确的温湿度测量仪,因此,该课题对仓储式企业来说,具有实际应用价值,可以有效保证企业的服务品质和正常运转。 关键词:单片机,LED显示,温度传感器,温度传感器 1 仓库温度、湿度综合参数显示器 2 ABSTRACT At present, the rapid development of warehouse logistics enterprises, the rapid rise. Library is a place for storage of goods, ventilation and temperature and humidity monitoring is an important condition for the warehouse, it directly affects the life and work of stockpile reliability. Temperature and humidity measurement and control in the textile industry, forestry, chemical, and meteorological observations and other areas are also widely used. Practical application, temperature, humidity and other environmental conditions can be said for that type of business goals is strictly monitored by manual testing, temperature and humidity do not meet the requirements of the Treasury for ventilation, dehumidification and cooling and so on. This time-consuming manual testing methods, low efficiency, and the test temperature and humidity error, random big need for a low cost, easy to use and accurate measurement of temperature and humidity measuring instrument, therefore, the subject of the warehouse enterprises That have practical value, can effectively guarantee the quality of service and normal business operation. Keywords: microcontroller, LED display, temperature sensor, temperature sensor 2 仓库温度、湿度综合参数显示器 3 目 录 1 绪论 1.1文献综述 1.2选题背景及意义 2 设计内容及任务 2.1设计任务 3 方案设计及器件选择 3.1温度湿度采集部分 3.2显示部分 3.3时钟部分 3.4按键部分 4 工作原理 4.1工作原理 4.2电路原理图 5 硬件电路设计 5.1 AT89S52单片机最小系统 5.2温湿度测量模块 5.3 LED温湿度显示模块 5.3.1 74LS47 5.3.2 74LS373 5.3.3 74LS224 5.4时钟显示模块EDM1190 3 仓库温度、湿度综合参数显示器 4 5.5电源电路 5.6时钟、报警部分电路 5.7总电路图 5.8总PCB图 6 系统软件部分设计 6.1单片机的图 6.2中断流程图 7 程序 8 结论 8.1单片机系统调试 8.2硬件系统调试 8.3软件系统调试 参考文献 致谢 4 仓库温度、湿度综合参数显示器 5 1 绪论 仓库物品在储藏期间, 由于受环境、季节、天气和通风条件等因素的影响, 仓库内温度或湿度会发生异常,极易造成仓库物品的霉烂, 造成不必要的经济损失。实时掌握仓内的温湿度变化, 一旦发现温湿度发生异常时,及时做出正确处理, 是保证仓库物品安全存储的关键。另一方面, 仓库物品温湿度检测技术将完善检测系统, 只需精确检测仓库物品各部位温度和湿度这两项生态因子, 结合仓库储存的原始资料、仓库物品储藏技术、空气动力学原理就能以简单的投入, 以最适宜的控制模式实现对粮堆的控制,达到不用药剂熏蒸, 实现绿色环保现代化储藏的管理。所以一般仓库主要是做温湿度检测, 且意义重大。而是用单片机驱动的温度湿度综合参数显示器能很好的显示出当前的温度湿度,使仓库管理人员能更好的了解当前仓库的实际情况,适时作出调整 1.1文献综述 防潮、防霉、防腐、防爆是仓库日常工作的重要内容,是衡量仓库管理质量的重要 [1]指标。为保证日常工作的顺利进行,首要问题是加强仓库内温度与湿度的监测工作。传统测量温度和湿度的方法是通过干湿度表、双金属式测量计和温度试纸等测试仪器,通过人工进行检测,对不符合温度和湿度要求的仓库进行通风、去湿和降温等工作。这 [2]种人工测试方法费时费力,效率低且测量的温度及湿度的误差大,随机性大。利用单 [2]片机的仓库温度和湿度自动测试仪的组成和原理能解决这个问题。 MCS-51系列单片机的应用很广泛,是学习单片机技术较好的系统平台,同时也是开发单片微型计算机应用系统的一个重要系列。一片MCS-51系列芯片内部包含有1个8位CPU、振荡器和时钟电路,4K/8K字节的程序存储器(ROM或EPROM),128字节的数据存储器,可寻址外部程序存储器和数据存储器(各64K字节),2个16位定时器/计数器,5/6个中断源,提供2个终端优先级,可实现二级中断服务程序嵌套。具有位寻址功能,有 [4,5,6]较强的布尔处理能力。 可以使用传感器把测得的数据给单片机,人们通常将能把被测物理量或化学量转化 [7,8,9]为与之有确定对应关系的电学量输出的装置称为传感器。随着微电子技术的不断发展,可以容易地将计算机技术与测量控制技术结合在一起,组成新一代的所谓“智能化 [10,11,12]测量控制系统”。利用LED显示技术,能把传感器测得的数据通过单片机的处理传输到显示器上,基于单片机的LED显示屏控制电路,可实现一行任意多个文字图形符号的水平平滑移动显示,可广泛应用于工矿企业、学校、商场、店铺、公共场所等进行文 [13,14]字广告宣传,信息发布等。 5 仓库温度、湿度综合参数显示器 6 1.2选题背景及意义 目前,仓储式物流企业快速发展、迅速崛起。在进行仓库管理时,对库房的环境控制,有时候是非常有必要的,不管是对货品,还是对货架,温度和湿度的有效控制,都有着至关重要的作用,为了维护仓储商品的质量完好,创造适宜商品存储的环境,当库房内的湿度和温度适宜商品存储时,就要设法防止库外气候对库内的不利影响;当库内湿度和温度不适宜商品储存时,就要及时采取有效措施调节库内的温湿度。传统的方法是人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大。实际应用中,温度、湿度等环境条件对该类企业可以说是严格监控的目标,所以利用传统的方法很不利于商品的存储,以为它无法有效的监控当前的温度湿度的实时数据,所以利用传感器测量仓库内的温度和湿度,通过单片机的处理,利用LED电子显示屏的显示可以直观的看到当前仓库内的温度和湿度的具体情况,便于能及时处理和解决库房内一些不利于商品储存的因素 本课题中仓库温度湿度参数显示系统主要是,利用传感器搜集数据,利用单片机的处理和分析,显示到LED电子显示屏上。 6 仓库温度、湿度综合参数显示器 7 2 设计内容和任务 2.1设计任务 设计一台可测量温度、湿度并由LED数码管显示其数值且具有报警功能的仪器,该仪器可用于监视仓库中的温度、湿度,当温度或湿度超过限定值会自动报警。该仪器应具有以下功能: 1.具有24小时连续计时并显示时、分功能; 2.具有温度测试并显示环境温度,记录24小时内最高、最低温度功能; 3.具有湿度测试并显示环境湿度,还可记录绝对湿度功能; 4.具有打印功能,每天8点打印前24小时内最高、最低温度值,相对湿度、绝对湿度等功能; 5.具有掉电记忆功能,要求掉电24小时内,仍具有计时功能,恢复供电后自动恢复显示。 7 仓库温度、湿度综合参数显示器 8 3 方案设计及器件选择 3.1 温度湿度采集部分 一开始设计使用AD590,它的测温范围在-55?,+150?之间,而且精度高。M档在测温范围内非线形误差为?0.3?。AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会损坏作为电流输出型传感器的一个特点是,和电压输出型相比,它有很强的抗外界干扰能力。但是AD590需要进行AD转换才能使单片机读出数据,比较麻烦,而且AD590只能测量温度。不如才用DHT90能测量温度湿度。 。集成温湿度传感器测量精度高,能把温度转化成数采用集成温湿度传感器DHT90 字,测得的温湿度值的存储在自带RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。 DHT90介绍:DHT90插针型温湿度传感器采用原装进口数字温湿度传感器芯片,引脚插针为标准2.54插针。该传感器品质卓越、响应超快、抗干扰能力强、性价比极高。 图3-1 温湿度传感器DHT90 8 仓库温度、湿度综合参数显示器 9 3.2 显示部分 温湿度显示部分采用静态显示,虽然使用元件多,且线路比较复杂,但是显示占用机时少,显示可靠,用起来比较方便。适合于单片机长时间做其他工作不管理显示的情况。使用的是4个八段数码管来显示温度和湿度,而使用EDM1190液晶显示器来显示时间。 图3-2 液晶显示器EDM1190 EDM1190段码式液晶显示模块的I/O口特性 表3-1 I/O接口表 表3-2 时序图 表3-3 数据输入方向 9 仓库温度、湿度综合参数显示器 10 3.3 时钟部分 我采用DS1302作为主要计时芯片,主要为了提高计时精度,更重要的就是DS1302可以在很小的后备电源下继续计时,并可编程选择充电电流来对后备电源进行充电,可以保证后备电源基本不耗电。 图3-3 DS1302的接脚图 DS1302是美国DALLAS 公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5,5.5V。采用三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM 寄存器。DS1302 是DS1202 的升级产品,与DS1202 兼容,但增加了主电源,后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 表3-4 DS1302引脚功能表 10 仓库温度、湿度综合参数显示器 11 3.4 按键部分 调整时间用3个调整按钮,1个做为移位控制用,另外两个做为加减用,分别定义控制按钮、加按钮、减按钮。在调整时间过程中,要调整的那位与别的位应该有区别,所以增加了闪烁功能,即调整的那位一直在闪烁直到调整下一位。闪烁原理就是让要调整的那一位,每隔一定时间熄灭一次,比如说50MS。利用定时器计时,当达到50MS溢出时,就送给该位熄灭符,在下一次溢出时,再送正常显示的值,不断交替,直到调整该位结束,此时送正常显示值给该位,再进入下一位调整闪烁程序。 我采用了时钟芯片DS1302,所以只需从DS1302各寄存器中读出小时、分钟、秒,再处理即可。在首次对DS1302进行操作之前,必须对它进行初始化,然后从DS1302中读取数据,再经过处理后,送给显示缓冲单元。流程图下图: 11 仓库温度、湿度综合参数显示器 12 4 工作原理 4.1 工作原理 利用单片机AT89S52单片机作为本系统的总控模块。一片AT89S52单片机可把由DHT90读来的数据利用软件计算出温湿度,再把数据传输到静态显示模块,实现温度、湿度的显示。通过串口把温湿度数据传输到另一片AT89S52上,在通过软件语言命令实现打印,报警功能。同时单片机从时钟芯片DS1302中读取数据用EDM1190(4位数字显示液晶屏)完成显示。 4.2 电路原理图 图4-1 总电路图 12 仓库温度、湿度综合参数显示器 13 5 硬件电路设计 5.1 AT89S52单片机最小系统 图5-1 单片机所需最小系统 5.2 温湿度测量模块 DHT90接口电路图下 图5-2 温度湿度测量模块 13 仓库温度、湿度综合参数显示器 14 5.3 数码管显示模块 所用的主要芯片74LS47、74LS373、74LS244 其中74LS373是个八 D 锁存器,当三态允许控制端 OE 为低电平时,O0~O7 为正常逻辑状态,可用来驱动负载或总线。当 OE 为高电平时,O0~O7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。 当锁存允许端 LE 为高电平时,O 随数据 D 而变。当 LE 为低电平时,O 被 LE 端施密特触发器的输入滞后作用,使交流和直流噪声锁存在已建立的数据电平。当 抗扰度被改善 400mV。 而74LS244是3态8位缓冲器,一般用作总线驱动器它主要用于三态输出,作为地址驱动器,时钟驱动器和总线驱动器,定向发送器等。 74LS47是BCD-7 段数码管译码器/驱动器,74LS47 的功能用于将 BCD 码转化成数码块中的数字,通过它解码,可以直接把数字转换为 数码管的显示数字 图5-3 数码显示模块 14 仓库温度、湿度综合参数显示器 15 5.3.1 74LS47 图5-4 74LS47的管脚图 表5-1 74LS47真值表 15 仓库温度、湿度综合参数显示器 16 5.3.2 74LS373 74LS373 的输出端 O0~O7 可直接与总线相连。 当三态允许控制端 OE 为低电平时,O0~O7 为正常逻辑状态,可用来驱动负载 或总线。当 OE 为高电平时,O0~O7 呈高阻态,即不驱动总线,也不为总线的负 载,但锁存器内部的逻辑操作不受影响。 当锁存允许端 LE 为高电平时,O 随数据 D 而变。当 LE 为低电平时,O 被锁存在已建立的数据电平。当 LE 端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善 400mV。 引出端符号: D0,D7 数据输入端 OE 三态允许控制端(低电平有效) LE 锁存允许端 O0~O7 输出端 图5-5 74LS373管脚图 表5-2 74LS373真值表 16 仓库温度、湿度综合参数显示器 17 5.3.3 74LS224 图5-6 74LS224引脚图 表5-3 74LS224真值表 5.4 时钟显示模块 时钟显示使用的是EDM1190的液晶显示器,其中图片右上部是EDM1190液晶显示器, 图5-7 时钟显示模块 17 仓库温度、湿度综合参数显示器 18 5.5电源电路 使用一个桥式整流电路让220V的交流电变换成5V的直流电源,使真个系统可以接在220V的普通交流电上。停电时由图中的BATTERY供电,二极管后接一个蓄电池,对蓄电池浮充 图5-8 电源电路 5.6时钟、报警部分电路 图5-9 报警时钟电路 18 仓库温度、湿度综合参数显示器 19 5.7总电路图 . 19 仓库温度、湿度综合参数显示器 20 5.8总PCB图 20 仓库温度、湿度综合参数显示器 21 6 系统软件部分设计 6.1单片机的流程图 第一个单片机 第二个单片机 21 仓库温度、湿度综合参数显示器 22 6.2中断流程图 串口中断: INT0中断: 22 仓库温度、湿度综合参数显示器 23 INT1中断: 23 仓库温度、湿度综合参数显示器 24 7 程 序 #include "chen.h" #include "ds1302.c" //------------------------------------------------------------------------- void serial(void) interrupt 4 //串口中断函数 { if(RI) { rxdbuf[rxdcout]=SBUF; rxdcout++; if(rxdcout>3) { rxdbuf[0]=0x00; //清零 rxdcout=0; } if((rxdbuf[0]==0x76)&&(rxd_chuli_qi==0))//判断第一个字节是否正确 { if(rxdcout>=3) { rxd_chuli_qi=1; rxdbuf[0]=0x00; rxdcout=0; } } else 24 仓库温度、湿度综合参数显示器 25 { rxdbuf[0]=0x00; rxdcout=0; } RI=0; } } //------------------------------------------------------------------------- void IntTimer0() interrupt 1 { tjia1++; if(tjia1>=20) //1S { tjia1=0; if(she_biao==0) { sz_qi=1; lcd_qi=1; } } edmssuoxian(); TH0=0x3c; //定时50MS TL0=0xb0; TF0=0; } 25 仓库温度、湿度综合参数显示器 26 //------------------------------------------------------------------------- void edmwrite_byte(unsigned char wzhi) { unsigned char aa=0; for(aa=0;aa<8;aa++) { _nop_(); if(wzhi&0x80) din=1; else din=0; wzhi<<=1; _nop_();_nop_(); clk=1; _nop_();_nop_(); _nop_();_nop_(); clk=0; } clk=0; } //------------------------------------------------------------------------- void edmdisplay(void)//刷新LCD { if(lcd_qi==1) { edmwrite_byte(0xff); edmwrite_byte(cout0);//显示时间 edmwrite_byte(cout1); 26 仓库温度、湿度综合参数显示器 27 edmwrite_byte(cout2); edmwrite_byte(cout3); lcd_qi=0; } } //------------------------------------------------------------------------- void edmssuoxian(void)//设置闪烁程序 { if(she_biao==1) { ssuo_biao=~ssuo_biao; switch(shezhi) { case 1: { if(ssuo_biao) edmwrite_byte(cout0); else edmwrite_byte(0x00); break; } case 2: { if(ssuo_biao) edmwrite_byte(cout1); 27 仓库温度、湿度综合参数显示器 28 else edmwrite_byte(0x00); break; } case 3: { if(ssuo_biao) edmwrite_byte(cout2); else edmwrite_byte(0x00); break; } case 4: { if(ssuo_biao) edmwrite_byte(cout3); else edmwrite_byte(0x00); break; } default:break; } } } //------------------------------------------------------------------------- ------ 28 仓库温度、湿度综合参数显示器 29 unsigned char BCD_TO_BIN(unsigned char i)//BCD 数转化成二进制数 { unsigned char j; j=i>>4; j&=0x0f; j*=10; j+=i&0x0f; return j; } //------------------------------------------------------------------------- ------ unsigned char BIN_TO_BCD(unsigned char i)//二进制数转化成BCD 数 { unsigned char j; j=i/10; j<<=4; j&=0xf0; j|=i%10; return j; } //------------------------------------------------------------------------- -- void key_jian(void) //按键检测程序 { if(key1) key1_biao=0; if((key1_biao==0)&&(key1==0)) //设置键 { 29 仓库温度、湿度综合参数显示器 30 if((key1_biao==0)&&(key1==0)) { key1_biao=1; she_biao=1; shezhi++; if(shezhi>=5)//时间设置 { she_biao=0; shezhi=0; simtime_bufer[4]=cout0*10;//时 simtime_bufer[4]+=cout1; simtime_bufer[5]=cout2*10;//分 simtime_bufer[5]+=cout3; v_Set1302(0x80,simtime_bufer); //设置初始值 } } } if(key1) key1_biao=0; if((key1_biao==0)&&(key1==0)) //加键 { if((key1_biao==0)&&(key1==0)) { key1_biao=1; switch(shezhi) { case 1: 30 仓库温度、湿度综合参数显示器 31 { cout0++; if(cout0>9) cout0=0; break; } case 2: { cout1++; if(cout1>9) cout1=0; break; } case 3: { cout2++; if(cout2>9) cout2=0; break; } case 4: { cout3++; if(cout3>9) cout3=0; break; 31 仓库温度、湿度综合参数显示器 32 } default:break; } } } if(key1) key1_biao=0; if((key1_biao==0)&&(key1==0)) //减键 { if((key1_biao==0)&&(key1==0)) { key1_biao=1; switch(shezhi) { case 1: { if(cout0==0) cout0=10; cout0--; break; } case 2: { if(cout1==0) cout1=10; cout1--; break; 32 仓库温度、湿度综合参数显示器 33 } case 3: { if(cout2==0) cout2=10; cout2--; break; } case 4: { if(cout3==0) cout3=10; cout3--; break; } default:break; } } } } //------------------------------------------------------------------------- void jieshou_chuli(void) //接受数据处理程序 { if(rxd_chuli_qi==1) { shidu=rxdbuf[1];//温度 33 仓库温度、湿度综合参数显示器 34 wendu=rxdbuf[2];//湿度 if((shidu>=50)||(wendu>=50)) feng=0;//报警 else feng=1; rxd_chuli_qi=0; } } //------------------------------------------------------------------------- void init(void) //单片机初始化程序 { TCON=0x00; TMOD=0x21; //定时器0设置为16位定时模式 TH0=0x3c; //定时50MS TL0=0xb0; TF0=0; //标志位清零 TR0=0; ET0=1; //定时器0中断使能 TH1=0xfd; //波特率9600 TL1=0xfd; TF1=0; //标志位清零 TR1=0; ET1=0; //定时器0中断使能 34 仓库温度、湿度综合参数显示器 35 PCON=0x00; //?串口波特率 SCON=0x50; //使能接受 ES=1; //?串口中断使能 EA=1; //总中断打开 TR0=1; //启动定时器0 TR1=1; feng=1; } //------------------------------------------------------------------------- void main(void) { init(); initialize_DS1302(); //初始化DS1302 while(1) { edmdisplay();//刷新LCD ds1302_zhu_han();//DS1302主函数 jieshou_chuli(); //接受数据处理程序 key_jian(); //按键检测程序 } } //------------------------------------------------------------------------- #include #include 35 仓库温度、湿度综合参数显示器 36 #include "ds1302.h" //------------------------------------------------------------------------- sbit clk=P2^4; sbit din=P2^3; sbit key1=P2^6; sbit key2=P2^7; sbit key3=P3^7; sbit feng=P1^6; //------------------------------------------------------------------------- void edmwrite_byte(unsigned char wzhi); void edmdisplay(void); void edmssuoxian(void); unsigned char BCD_TO_BIN(unsigned char i); unsigned char BIN_TO_BCD(unsigned char i); void key_jian(void); void jieshou_chuli(void); void init(void); //------------------------------------------------------------------------- unsigned char code lg_data[10]={0x77,0x44,0x3e,0x6e,0x4d,0x6b,0x7b,0x46,0x7f,0x6f};//0---9 unsigned char idata cout0=0,cout1=0,cout2=0,cout3=0; unsigned char idata shidu=0,wendu=0,rxdcout=0,rxdbuf[3]={0}; unsigned char idata shezhi=0,tjia1=0; //------------------------------------------------------------------------- 36 仓库温度、湿度综合参数显示器 37 bit key1_biao=0,key2_biao=0,key3_biao=0,she_biao=0,ssuo_biao=0,lcd_qi=0,sz_qi=0 ; bit rxd_chuli_qi=0; //------------------------------------------------------------------------- void v_RTInputByte(unsigned char ucdat) //往DS1302 写入 1Byte 数据 { unsigned char data i,zhi=0; zhi=ucdat; for(i=8;i>0;i--) { DS1302_IO = (zhi & 0x01); _nop_();_nop_();_nop_(); DS1302_SCLK = 1; _nop_();_nop_();_nop_(); DS1302_SCLK = 0; _nop_();_nop_();_nop_(); zhi >>= 1; } } //------------------------------------------------------------------------- unsigned char uc_RTOutputByte(void) //往 DS1302读取1Byte数据 { unsigned char data i; unsigned char data ucdat=0; for(i=8;i>0;i--) { 37 仓库温度、湿度综合参数显示器 38 ucdat >>= 1; if(DS1302_IO) ucdat|=0x80; _nop_();_nop_();_nop_(); DS1302_SCLK = 1; _nop_();_nop_();_nop_(); DS1302_SCLK = 0; _nop_();_nop_();_nop_(); } return(ucdat); } //------------------------------------------------------------------------- void v_W1302(unsigned char address,unsigned char ucdat) //往DS1302 某地址写入数据 { DS1302_RST = 0; DS1302_SCLK = 0; //默认为低电平 DS1302_RST = 1; v_RTInputByte(address); //地址,命令î v_RTInputByte(ucdat); //写 1Byte 数据 DS1302_SCLK = 1; DS1302_RST =0; } //------------------------------------------------------------------------- unsigned char uc_R1302(unsigned char address) //读取 DS1302 某地址的数据 { unsigned char data ucdat; 38 仓库温度、湿度综合参数显示器 39 DS1302_RST=0; DS1302_SCLK=0; //默认为低电平 DS1302_RST=1; v_RTInputByte(address); //地址,命令 ucdat = uc_RTOutputByte(); //写 1Byte 数据 DS1302_SCLK = 1; DS1302_RST =0; return(ucdat); } //------------------------------------------------------------------------- void v_Set1302(unsigned char address,unsigned char *p1302) //设置初始化时间 { unsigned char data zcbufer[7]={0}; unsigned char data aa=0; for(aa=0;aa<7;aa++) //时间颠倒 { zcbufer[aa]=BIN_TO_BCD(p1302[6-aa]); } v_W1302(0x8e,0x00); //控制命令WP=0 for(aa=0;aa<7;aa++) { v_W1302(address,zcbufer[aa]); //秒 分 时 日 月 星期年 address+=2; } v_W1302(0x8e,0x80); //控制命令,WP=1写保护? } 39 仓库温度、湿度综合参数显示器 40 //------------------------------------------------------------------------- void v_Get1302(unsigned char address,unsigned char *p1302) //读取 DS1302 当前时间 { unsigned char data zcbufer[7]={0}; unsigned char data aa=0; for(aa=0;aa<7;aa++) { zcbufer[aa]=uc_R1302(address); address+=2; } for(aa=0;aa<7;aa++) { p1302[aa]=BCD_TO_BIN(zcbufer[6-aa]); } } //------------------------------------------------------------------------- //外调程序 //------------------------------------------------------------------------- void initialize_DS1302(void) /初始化 DS1302 { DS1302_SCLK=0; //默认低电平 DS1302_RST=0; v_W1302(0x8e,0x00); v_W1302(0x90,0x00); //初始化设置 v_Set1302(0x80,simtime_bufer); //设置初始值 40 仓库温度、湿度综合参数显示器 41 } //------------------------------------------------------------------------- void ds1302_zhu_han(void) //DS1302主函数 { if((sz_qi==1)&&(she_biao==0)) { sz_qi=0; v_Get1302(0x81,simtime_bufer); cout0=simtime_bufer[4]/10;//时 cout1=simtime_bufer[4]%10; cout2=simtime_bufer[5]/10;//分 cout3=simtime_bufer[5]%10; } } //------------------------------------------------------------------------- //外调程序 //------------------------------------------------------------------------- /-------------------------------------------------------------------------- sbit DS1302_RST =P1^4; //DS1302复位脚 sbit DS1302_SCLK=P1^2; //DS1302时钟脚 sbit DS1302_IO =P1^3; //DS1302数据脚 //------------------------------------------------------------------------- void v_RTInputByte(unsigned char ucdat); 41 仓库温度、湿度综合参数显示器 42 unsigned char uc_RTOutputByte(void); void v_W1302(unsigned char address, unsigned char ucdat); unsigned char uc_R1302(unsigned char address); void v_Set1302(unsigned char address ,unsigned char *p1302); void v_Get1302(unsigned char address ,unsigned char *p1302); void initialize_DS1302(void); void ds1302_zhu_han(void); //------------------------------------------------------------------------- Unsigned char idata simtime_bufer[7]={0x0b,0x04,0x01,0x13,0x16,0x00,0x00};//用来储存时间 //------------------------------------------------------------------------- UAN.H" #include "SHT10.C" //------------------------------------------------------------------------- void serial(void) interrupt 4 //串口中断函数 { if(RI) { RI=0; } } //------------------------------------------------------------------------- 42 仓库温度、湿度综合参数显示器 43 void IntTimer0() interrupt 1 //用来输出频率 { tjia1++; if(tjia1>=60) //3S { tjia1=0; qi_biao=1; //启动检测 } TH0=0x3c; //定时50MS TL0=0xb0; TF0=0; } //------------------------------------------------------------------------- void init(void) { TCON=0x00; TMOD=0x21; TH0=0x3c; TF0=0; TR0=0; ET0=1; TH1=0xfd; TL1=0xfd; TF1=0; 43 仓库温度、湿度综合参数显示器 44 TR1=0; ET1=0; PCON=0x00; SCON=0x50; ES=1; EA=1; TR0=1; TR1=1; g1=0; g2=0; c1=0; c2=0; } //------------------------------------------------------------------------- -- void smg_display(void) //数据显示 { unsigned char zhi=0; zhi=cout0; zhi<<=4; zhi|=cout1;//湿度 c1=1; 44 仓库温度、湿度综合参数显示器 45 P0=zhi; delay_ms(1); c1=0; zhi=cout2; zhi<<=4; zhi|=cout3;//温度 c2=1; P0=zhi; delay_ms(1); c2=0; } //------------------------------------------------------------------------- -- void shujvchuli(void) //数据采集处理后显示 { if(qi_biao==1) { s_measure(HUMI);//启动传感器湿度度检测 s_measure(TEMP);// 启动传感器温度度度检测 calc_sth11(rhvalue,temvalue);/修正采集数据 cout0=rhvalue/10; cout1=rhvalue%10; cout2=temvalue/10; cout3=temvalue%10; 45 仓库温度、湿度综合参数显示器 46 TI=0; SBUF=rhvalue;//发送串口数据 while(TI==0); TI=0; delay_ms(2); SBUF=temvalue; while(TI==0); TI=0; delay_ms(2); smg_display();//数据显示 qi_biao=0; } } //---------------------------------------------------------------------- void delay_ms(unsigned char timedata) //毫秒延迟 { unsigned char data aa=250,cc=0; cc=timedata; while(cc--) { while(--aa); } } //------------------------------------------------------------------------- 46 仓库温度、湿度综合参数显示器 47 void main(void) { init(); while(1) { shujvchuli(); //数据采集处理后送显示 } } //------------------------------------------------------------------------ //------------------------------------------------------------------------- unsigned char s_write_byte(unsigned char value) //写一字节数据,应答ACK { unsigned char i,error=0; for(i=0x80;i>0;i/=2) //shift bit for masking { if(i&value) DATA=1; //masking value with i , write to SENSI-BUS else DATA=0; _nop_(); SCK=1; //clk for SENSI-BUS _nop_();_nop_();_nop_(); //pulswith approx. 5 us SCK=0; _nop_(); } DATA=1; //release DATA-line SCK=1; //clk #9 for ack error=DATA; //check ack (DATA will be pulled down by SHT11) 47 仓库温度、湿度综合参数显示器 48 SCK=0; return error;//error=1 in case of no acknowledge } //------------------------------------------------------------------------- unsigned char s_read_byte(unsigned char ack) //写一段数据控制是否应答 { unsigned char i,val=0; DATA=1; //release DATA-line for(i=0x80;i>0;i/=2) //shift bit for masking { SCK=1; //clk for SENSI-BUS _nop_(); if(DATA) val=(val | i); //read bit _nop_(); SCK=0; _nop_();_nop_(); } DATA=!ack; //in case of "ack==1" pull down DATA-Line SCK=1; //clk #9 for ack _nop_();_nop_();_nop_(); //pulswith approx. 5 us SCK=0; DATA=1; //release DATA-line return val; } //------------------------------------------------------------------------- void s_transstart(void) //启动总线 48 仓库温度、湿度综合参数显示器 49 { DATA=1; SCK=0; //Initial state _nop_();_nop_(); SCK=1; _nop_();_nop_(); DATA=0; _nop_();_nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_();_nop_(); DATA=1; _nop_();_nop_(); SCK=0; } //------------------------------------------------------------------------- unsigned char s_measure(unsigned char mode) //启动传感器测量 { unsigned char data error=0,p_checksum=0; unsigned int data i=0,p_value=0; s_transstart(); //transmission start switch(mode) { //send command to sensor case TEMP : error+=s_write_byte(MEASURE_TEMP); break; case HUMI : error+=s_write_byte(MEASURE_HUMI); break; default : break; 49 仓库温度、湿度综合参数显示器 50 } for(i=0;i<65535;i++) { delay_ms(1); if(DATA==0) break; //wait until sensor has finished the measurement } if(DATA) error+=1; // or timeout (~2 sec.) is reached if(mode==0) //温度 { p_value =s_read_byte(ACK); //read the first byte (MSB) p_value<<=8; p_value|=s_read_byte(ACK); //read the second byte (LSB) p_checksum =s_read_byte(noACK); //read checksum temvalue=p_value; //温度赋值 } else //湿度 { p_value =s_read_byte(ACK); //read the first byte (MSB) p_value<<=8; p_value|=s_read_byte(ACK); //read the second byte (LSB) p_checksum =s_read_byte(noACK); //read checksum rhvalue=p_value; //湿度赋值 } return error; //返回错误值 } //------------------------------------------------------------------------- 50 仓库温度、湿度综合参数显示器 51 void calc_sth11(unsigned int p_humidity ,unsigned int p_temperature)//修正采 集数据 { float code C1=-4.0; // for 12 Bit float code C2= 0.0405; // for 12 Bit float code C3=-0.0000028; // for 12 Bit float code T1=0.01; // for 14 Bit @ 5V float code T2=0.00008; // for 14 Bit @ 5V float data rh=p_humidity; // rh: Humidity [Ticks] 12 Bit float data t=p_temperature; // t: Temperature [Ticks] 14 Bit float data rh_lin; // rh_lin: Humidity linear float data rh_true;// rh_true: Temperature compensated humidity float data t_C; // t_C : Temperature [C] t_C=t*0.01-40; //calc. Temperature from ticks to [C] rh_lin=C3*rh*rh + C2*rh + C1; //calc. Humidity from ticks to [%RH] rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. Temperature compensated humidity [%RH] if(rh_true>100)rh_true=100; //cut if the value is outside of if(rh_true<0.1)rh_true=0.1; //the physical possible range temvalue=(unsigned int)(t_C); //return temperature [C] //以下是测试程序 SBUF=temvalue; while(TI==0) TI=0; delay_ms(2); temvalue>>=8; SBUF=temvalue; 51 仓库温度、湿度综合参数显示器 52 while(TI==0) TI=0; */ rhvalue=(unsigned int)(rh_true);//return humidity[%RH] 保留小数点后1位ô } //-------------------------------------------------------------------- #include #include #include "SHT10.H" //------------------------------------------------------------------------- sbit c1=P2^7; sbit c2=P2^6; sbit g1=P2^5; sbit g2=P2^4; //------------------------------------------------------------------------- void init(void); void delay_ms(unsigned char timedata); void lg_shao(unsigned char d,unsigned char c,unsigned char b,unsigned char a); void lgcout(void); void shujvchuli(void); //------------------------------------------------------------------------- unsigned char idata cout0=0,cout1=0,cout2=0,cout3=0; unsigned char idata tjia1=0; 52 仓库温度、湿度综合参数显示器 53 //------------------------------------------------------------------------- bit qi_biao=0; //-------------------------------------------------- //------------------------------------------------------------------------- sbit DATA=P1^0; sbit SCK =P1^1; //------------------------------------------------------------------------- #define noACK 0 #define ACK 1 #define TEMP 0 #define HUMI 1 //湿度 //adr command r/w #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define RESET 0x1e //000 1111 0 //------------------------------------------------------------------------- unsigned char s_write_byte(unsigned char value); unsigned char s_read_byte(unsigned char ack); void s_transstart(void); unsigned char s_measure(unsigned char mode); void calc_sth11(unsigned int p_humidity ,unsigned int p_temperature); 53 仓库温度、湿度综合参数显示器 54 //-------------------------------------------------------------------------unsigned int idata rhvalue=0,temvalue=0;//温度数据 湿度数据 //------------------------------------------------------------------ 54 仓库温度、湿度综合参数显示器 55 8结 论 8.1 单片机系统调试 首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的“X10”档。另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。另外还要注意的地方是,如果使用片内ROM的话(大部分情况下如此,现在已经很少有用外部扩ROM的了),一定要将EA引脚拉高,否则会出现程序乱跑的情况。有时用仿真器可以,而烧入片子不行,往往是因为EA引脚没拉高的缘故(当然,晶振没起振也是原因之一)。经过上面几点的检查,一般即可排除故障了。如果系统不稳定的话,有时是因为电源滤波不好导致的。在单片机的电源引脚跟地引脚之间接上一个0.1uF的电容会有所改善。如果电源没有滤波电容的话,则需要再接一个更大滤波电容,例如220uF的。遇到系统不稳定时,就可以并上电容试试(越靠近芯片越好)。 在单片机开发过程中,从硬件设计到软件设计几乎是开发者针对本系统特点亲自完成的。这样虽然可以降低系统成本,提高系统的适应性,但是每个系统的调试占去了总开发时间的2,3,可见调试的工作量比较大。单片机系统的硬件调试和软件调试是不能分开的,许多硬件错误是在软件调试中被发现和纠正的。但通常是先排除明显的硬件故障以后,再和软件结合起来调试以进一步排除故障。可见硬件的调试是基础,如果硬件调试不通过,软件设计则是无从做起。 8.2 硬件系统调试 首先是焊接的顺序问题。当初板子做好以后,如果一口气就把所有的元件焊上去了,这样对于没有调试过的板子,就很难找到原因。所以焊接的顺序很重要,应该是应该按功能划分的器件进行焊接,顺序是功能部件的焊接--调试(OK)--另一功能部件的焊接,这样容易找到问题的所在。 如果在调试按功能划分的器件上出现问题,可以按以下步骤进行: (1)检查原理图连接是否正确 (2)检查原理图与PCB图是否一致 (3)检查原理图与器件的DATASHEET上引脚是否一致 (4)用万用表检查是否有虚焊,引脚短路现象 (5)查询器件的DATASHEET,分析一下时序是否一致。 (6)飞线。用别的的口线进行控制,看看能不能对其进行正常操作,多试验,才能找到问题出现在什么地方。 55 仓库温度、湿度综合参数显示器 56 8.3 软件系统调试 本系统采用51系列单片机作为硬件开发核心,软件采用符合C51的KEIL C编译器,C51简单易懂,并且有强大的库函数。 单片机软件部分采用C51语言开发,用C51语言具有开发周期短,可读性好,可靠性高,可移植性好,代码转换质量高等特点。一般情况下,完成同样的任务,使用C51 -10倍。在调试阶段跟容易体会到这一点。单片机C语言语言比用汇编提高工作效率5 的特点是同时兼有高级语言和汇编语言的优点,还能像汇编语言那样直接利用 CPU的硬件特性进行程序设计,直接操作单片机的硬件接口。C51语言简单,易学,是一种结构化的程序设计语言。一个完整的程序可由一个或多个独立编译的源程序文件组成。目前,在单片机应用领域,C51越来越受到人们的关注。 系统的单片机开发平台为KEIL C编译器如图8-1 56 仓库温度、湿度综合参数显示器 57 参考文献: [1] 左现刚. 贾蒙. 基于微控制器的仓库温度湿度控制系统的设计[J]. 内江科技, Neijiang Science & Technology, 2010,(2):61. [2] 吴炜. 基于8031单片机的仓库温度与湿度自动测试仪设计[J]. 南通航运职业技术 学院学报, Journal of Nantong Vocational & Technical Shipping College, 2009, (4):66-68. [3] 沈德金,陈粤初. MCS-51系列单片机接口电路与应用程序实例[M]. 北京航空航天 大学出版社,1990. [4] 李江华. 基于MCS_51单片机安防系统监控主机的设计与实现[M].国防科学技术大 学硕士学位论文,2007. [5] 唐颖主编. 唐颖主编. 单片机原理与应用及C51程序设计. 北京市:北京大学出版 社, 2008.08. [6] 曹卫芳. 基于MCS-51系列单片机的通用控制模块的研究[M]. 山东科技大学,2005. [7] 李志全等. 智能仪表设计原理及应用[M].国防工业出版社,1998.6 [8] 何希才,刘洪梅编著. 传感器应用接口电路[M]. 北京市:机械工业出版社, 1997. [9] 张琳娜,刘武发. 传感检测技术及应用[M]. 中国计量出版社,1999 [10] 杨华中等著. 模拟集成电路的自动综合方法[M]. 北京市:科学出版社, 1999. [11] 杨振江等编著. 智能仪器与数据采集系统中的新器件及应用[M]. 西安市:西安电 子科技大学出版社, 2001. [12] 黄凌云. 低成本多位LED动态扫描方法[J]. 电脑开发与应用, Computer Development & Applications, 2010,(8):77. [13] 陈红丽. 点阵LED电子显示屏控制系统设计与实现[J]. 福建电脑, Fujian (5):146-147. Computer, 2010, [14] 李秀忠. 基于单片机的LED显示屏控制电路设计[J].现代电子技术, Modern Electronics Technique, 2010,(15):200-202. [15] 蒋敏. 气温自动记录仪设计与制作[J]. 科技创新导报, Science and Technology Innovation Herald,2010,(0):22-23. [16] 伦翠芬, 张小芹, 李艳萍 ,马继伟, 刘策. 基于STC单片机和无线数传模块的 粮仓温湿度监控系统[J]. 粮油加工, Cereals and Oils Processing, 2010, (7):64-67. [17] 王晓员, 姚旻. 基于单片机多点温度控制的硬件构建设计[J]. 湛江师范学院学 报, Journal of Zhanjiang Normal College, 2010,(3):70-73. 57 仓库温度、湿度综合参数显示器 58 致 谢 四年的读书生活在这个季节即将划上一个句号,而于我的人生却只是一个逗号,我将面对又一次征程的开始。四年的求学生涯在师长、亲友的大力支持下,走得辛苦却也收获满囊,在论文即将付梓之际,思绪万千,心情久久不能平静。 伟人、名人为我所崇拜,可是我更急切地要把我的敬意和赞美献给一位平凡的人,我的导师高桂革老师。我不是您最出色的学生,而您却是我最尊敬的老师。您治学严谨,学识渊博,思想深邃,视野雄阔,为我营造了一种良好的精神氛围。授人以鱼不如授人以渔,置身其间,耳濡目染,潜移默化,使我不仅接受了全新的思想观念,树立了宏伟的学术目标,领会了基本的思考方式,从论文题目的选定到论文写作的指导,经由您悉心的点拨,再经思考后的领悟,常常让我有“山重水复疑无路,柳暗花明又一村”。 感谢我的爸爸妈妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿。在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚谢意~ 同时也感谢学院为我提供良好的做毕业设计的环境。 最后再一次感谢所有在毕业设计中曾经帮助过我的良师益友和同学,以及在设计中被我引用或参考的论著的作者。 58 仓库温度、湿度综合参数显示器 59 指 导 教 师 意 见 指导教师签名: 年 月 日 59 仓库温度、湿度综合参数显示器 60 1、论文选题:?有理论意义;?有工程背景;?有实用价值;?意义不大。 2、论文的难度:?偏高;?适当;?偏低。 3、论文的工作量:?偏大;?适当;?偏小。 4、设计或研究方案的可行性:?好;?较好;?一般;?不可行。 5、学生对文献资料及课题的了解程度:?好;?较好;?一般;?较差。 评议 6、学生在论文选题报告中反映出的综合能力和表达能力: 小组?好;?较好;?一般;?较差。 7、学生在论文选题报告中反映出的创新能力: 意见 ?好;?较好;?一般;?较差。 8、对论文选题报告的总体评价:?好;?较好;?一般;?较差 (在相应的方块内作记号“?”) 二级 学院组长: 所确 定评组员: 、 、 、 议小 组名 单 单位盖章 主管领导签名: (3-5 人) 年 月 日 评议 结论 评议小组组长签名: 评议小组组员签名: 年 月 日 60
/
本文档为【仓库温湿度】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索