单片机控制的恒温箱的设计

更新时间:2024-01-29 00:29:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

南京信息职业技术学院

毕业设计论文

作者 葛昌洋 学号 11212P03 系部 电子信息学院 专业 电子信息工程技术 题目 单片机控制的恒温箱的设计 指导教师 徐瑞亚 评阅教师

完成时间: 2015年 4 月 17日

毕业设计(论文)中文摘要

(题目):单片机控制的恒温箱的设计 摘要:温度测量的利用在许多的地方都有比较大的发展空间。随着现代电子信息技术的发展,许多质量好而且便宜的温度传感器被设计开发,在温度的检测控制得到了较大的利用。恒温箱的设计是常采用温度传感器采集温度,然后用单片机处理后,再控制需要加温还是减温。 本文是基于单片机AT89C52的恒温箱的设计,硬件设计包括:温度传感器,按键控制,时钟,LCD显示,加温设计,控制和报警LED闪烁;软件设计包括:程序的设计等。编写的程序会在实物上做出调试,可以实现按键控制上限温度,时间显示,显示采集的温度,超限报警及LED指示闪烁。本设计考虑设计体积需求下,精度要求比较高,所以设计中用数字式温度传感元件DS18B20来采集需要的温度信息,以单片机问控制核心,12864LCD作为显示输出,实现了超限报警和恒温的控制。 关键词:AT89C52; DS18B20; 超限报警:液晶显示

毕业设计(论文)外文摘要

Title: Design of constant temperature box controlled by single chip microcomputer Abstract:The temperature measurement has a relatively large space for development in many places.With the development of modern electronic information technology, a lot of good quality andcheap temperature sensor is designed to develop, has been greatly used in the detection and control of temperature. Design of constant temperature box is often used in temperature acquisition and temperature sensor, and then use the single-chip processing, then control theheating or temperature reduction. This paper is the design of constant temperature box based on MCU AT89C52, the hardware design including: temperature sensor, keyboard control,clock, LCD display, heating design, control and alarm flashing LED; software design includes:program design. The program will make debugging in kind, can achieve the control button the upper limit temperature, time display, display the temperature of collection, alarm and LED indicator flashes. This design consider the design volume of demand, the accuracy requirements are relatively high, so in the design of digital temperature sensor DS18B20 to collect temperature information need to ask, SCM control core, 12864LCD as the displayoutput, can control the temperature and alarm. keywords: AT89C52; DS18B20; alarm: liquid crystal display

目录

1. 引言......................................................... 6

1.1. 开发背景............................................... 6 1.2. 设计现状............................................... 7

1.2.1. 国内恒温控制的发展现状........................... 7 1.2.2. 国外恒温控制的发展现状........................... 8 1.3. 设计意义............................................... 8 1.4. 设计要求............................. 错误!未定义书签。 2. 系统架构..................................................... 9

2.1. 设计要求.............................................. 9 2.2. 系统框架............................................... 9 2.3. 系统运行概述.......................................... 10 3. 主要元器件介绍.............................................. 11 3.1. 单片机................................................ 11

3.2. 12864LCD显示屏 ....................................... 12 3.3. 温度传感器............................................ 13 4. 系统电路图设计.............................. 错误!未定义书签。 5. 系统电路图设计.............................................. 13

5.1. 单元电路设计.......................................... 14

5.1.1. 复位电路........................................ 14 5.1.2. 时钟电路........................................ 14 5.1.3. 12864显示部分 .................................. 15 5.1.4. 蜂鸣器电路...................................... 15 5.1.5. 传感器电路...................................... 16 5.1.6. 时钟芯片电路.................................... 16 5.1.7. 变压器电路...................................... 17 5.1.8. 继电器模块...................................... 17 5.1.9. 指示灯电路...................................... 18 5.1.10. 按键电路....................................... 18

6. 系统程序框图................................................ 18 7. 系统的硬件调试及软件调试.................................... 20

7.1. 硬件调试部分:........................................ 20 7.2. 软件调试部分:........................................ 20 8. 附录:...................................... 错误!未定义书签。

8.1. 系统主程序............................ 错误!未定义书签。 8.2. 12864程序: .......................... 错误!未定义书签。 8.3. 时钟程序.............................. 错误!未定义书签。 8.4. 温度传感器程序........................ 错误!未定义书签。

9. 实物图展示.................................. 错误!未定义书签。 参考文献....................................................... 22

1. 引言

随着多年的发展,产品质量的要求越来越高,迫使各个行业规范化的要求越来越高,许多医院,建设,化工等行业都需要利用到恒温箱的使用。为了满足恒温箱满足各个地方的使用要求,还必须达到国家规定的标准,首先必须做好质量检测,以保证其安全可靠的实用性。基于上述考虑,本设计中的恒温箱的设计很好的满足了各个地方的要求。

考虑到温度控制在控制系统当中也是比较复杂的一种,因为控制和改变温度的不及时性给设计带来了比较大的困难,而且温度即使在停止加温或者降温的情况下也会惯性的增减,反应速度比较慢。所以在温度控制这一块需要用到高级的控制处理办法。 恒温箱的温度信息的采集和保存控制方面,我们采用温度传感器来设计温度信号,温度传感器将采集来的温度信号处理后发送到单片机,单片机接收并处理,然后将处理好的信号发送到12864液晶显示器上显示。单片机控制这个系统,是系统运行的核心,外设按键电路,传感器电路12864液晶显示电路,蜂鸣器报警电路等,可以通过按键控制,方便操作。

本设计可以显示温度采集器采集来的实时温度信息和设置的上下限温度报警信息。当温度超过所设置的上限和下限温度时,LED指示灯闪亮,蜂鸣器报警,起提示报警作用,保证恒温箱使用的范围,保证了恒温箱在工作过程中安全可靠。

1.1. 开发背景

随着现代点阵信息技术的告诉发展,电子应用的技术得到的广泛的发展和利用,而数据的接收与处理伴随着超大规模的集成电路的出现也得到高速发展。在运用过程中,因为其体积比较小,实现的功能比较多,价格低廉等,在家庭,企业,军事等各个研究领域都得到广泛的应用。他让产品更加的小巧和多功能化。在提高了设备的技术要求和功能多样化的情况下,又可以做到减少设计成本,更加的人性化。随着单片机在各个领域的快速发展,人们了解到单片机的发展空间,因为其多功能也得到了广泛的发展。同时,单片机也在不断的更新和更加的完善。

本设计中的恒温箱采用电加热的方式,在生活生产以及医疗方面很多的应用领域,所以温度传感器采集温度经单片机处理等方面在应用中非常重要。市场上

比较多的温度传感器都是采集信号后转换成电压需要后输出,不同的问百度传感器输出曲线也不一样,不能够满足电子产品的通用性,也不可以实现产品的互换。

温度传感器在很多的地方都得到了广泛的使用,但是在我们生活中,因为温度受周围环境的影响,往往测量的温度不够精准,所以温度是比较难以精准测量的物理量。我们创建温度测量方法,测量温度浮度大,变化快,存在数据滞后性。但是伴随这我国温度传感器集成化,智能化和网络化的快速发展,为我们开发一款新的温度测量提供了良好的条件。在本次设计的基于单片机的恒温箱的设计中,温度传感器采集到温度信号后,转换后输入到单片机,经单片机处理后,发送到12864液晶显示屏上,同时做出比较,是否不再设置的温度范围内,如果不再设置的范围,蜂鸣器报警,LED指示等闪烁,提醒人们做好采取相应措施。恒温箱的重要作用是用来控制温度的稳定,他在研究农业的生产,生物技术的开发,为其提供相应的数据,模拟生产生活的环境,所以在医药,食品等需要稳定环境和温度的情况下,可以快速的提供模拟的环境情况,方便做出原材料的性能分析等信息。因为他具有体积小,功能多样化,价格低廉等优点,而且单片机运用到本设计中可以更好的控制温度,恒温箱是单片机控制温度,模拟环境的典型应用,使用单片机作为恒温箱的控制部分,可以实现传感器对温度信号的采集与处理的需求。

1.2. 设计现状

随着现代电子技术的发展,温度恒温技术在生活生产等领域得到的广泛的应用,他给我们带来了客观的收入和良好的社会反响,不同的领域,因为环境的影响,目标的不同和成本控制的不同,需要考虑到实际情况做出在相应的设计和实现相应功能,这样就可以实现在不同领域的多功能运用。自动控制的恒温控制系统在生活和社会生产中发展尤其重要。

1.2.1. 国内恒温控制的发展现状

因为我国起步晚,目前的恒温控制技术发展比较落后,只可以实现在比较简单的温度系统的控制,而温度的惯性以及温度变化快等难的问题,目前在我国还没有得到比较好的解决办法,在要求比较高的温度控制系统中,我国的技术要求

有的还无法满足要求,这样导致了我国温度控制系统的成熟化设备比较少,所以我国的恒温箱有很大的发展空间,和我国等存在一定的技术不足和落后性。

我国电子信息技术的快速发展和嵌入式系统的开发,在各个领域得到了广泛的发展,人们对电子产品的要求变得更高,像小型化和更加的智能化发展,作为高科技技术代表性的单片机因为他的体积小,价格低廉,功能多样化等有点,在诸多的领域得到运用。

1.2.2. 国外恒温控制的发展现状

因为上个世纪70年代工业发展的需要,特别是现代现代电子信息工程的高速发展,伴随着自动控制系统的出现,以及设计发展的需求下,国外的电加热恒温控制系统发展的非常快,而且发展的越来越人性化,操作简单,可以根据需求更改设置的温度等功能取得了突破性进展。像日本,美国,德国,等这些国家的技术最为先进,并且基于这些高科技理论以及技术的前提下,生产出了满足不同情况需求的多功能设备。金亨国这些年的发展,外国温度控制系统的发展越来越体现出高科技,设备越来越小巧,越来越多功能化,发展的十分迅速。实现了在我国多功能领域的发展,而我国因为技术的难以突破,我国恒温系统发展比较慢,和我国相比,有比较大的差距。

1.3. 设计意义

、本设计中的电加热的恒温箱,因为考虑到他的实用性,所以恒温箱的主要设计集中在对对温度的有效管理,使它可以在我们控制的大致范围内,不会出现太大的偏差。本设计我使用的是单片机AT89C52单片机作为控制核心,通过温度采集系统采集温度信号,

恒温箱的性能在很大程度上取决于对温度的控制性能,本课题采用单片机为主控制器,然后通过转换后实现发信号传送到单片机处理,在由单片机发送到各个处理后的显示部件中这样就完成了整个电路硬件的设计。本次设计的恒温箱可以人温度保持在设定的温度范围内,如果温度低于设置的温度时,蜂鸣器报警,单片机控制加热装置加热,温度慢慢升高,如果恒温箱里面的温度高于设置的温度时,单片机控制加热装置停止加热,温度慢慢降低,本设计是基于现代普通的

温度测量以及处理装置,具有非常多的特点,在本设计当中,实现了多功能的智能化检测和控制,操作更加的人性化,简单实用。在硬件的基础上实现了软件的开发和多功能的控制,他的人性化水平依靠软件的开发程度。因为考虑到交互信息,故在设备上进行远距离的信息传输,方便管理和控制。

2. 系统架构

2.1. 设计要求

恒温箱在我们生活中有许多方面的运用,本事设计需要更据以前学习的知识,运用单片机作为控制核心,结合数字电路以及检测原理,设计出一台基于单片机AT89C52的恒温箱,按键可以控制恒温箱的报警上下限。总体设计需要完成恒温箱里面温度的实时检测和先12864液晶显示器上显示,单片机控制信号的输出,温度超过设限报警并LED指示灯闪烁,12864上过海可以显示时间信息,时间休息用时钟电路实现。本设计的参数要求如下:

1:利用按键(自行定义)进行温度的上限和下限的设定,同时将当前温度的测量值显示在12864液晶显示器上。

2:恒温箱的恒温温度设定在100摄氏度——50摄氏度以内。低于或者高于设置的这个温度,蜂鸣器报警而且LED指示等闪烁。

2) 恒温箱控制的允许误差在±1度中间。

3) 温度信号接收器输入范围在30摄氏度——120摄氏度之间,电流在4——20mA之间。

2.2. 系统框架

本系统以AT89C52,DS18B20温度传感器,DS1302实时时钟,12864液晶显示模块,蜂鸣器,固态继电器模块等元件构成一个自动恒温加热装置。AT89C52做本设计的主控芯片,主要处理来自外部信号检测,采集以及控制。DS18B20温度传感器主要检测加热的实时温度,经单片机处理后显示在12864LCD液晶显示屏上。DS1302为实时钟芯片,做为系统显示时间用。电源电路经变压器变压

后,再经7805稳压后为系统提供稳定的5V工作电压。蜂鸣器报警,用于系统温度超高报警用。超温指示灯当温度超出时闪烁。按键控制设置上下限温度的设置。启动/停止按键为开始启动加热和停止加热按键,每按一次可在开和关之间转换。K1为电源总开关。如图1:

最小系统 单 片 机 12864显示线路 温度采集电路 指示电路 按键控制

电炉加热 时钟电路

蜂鸣器电路 图1:系统框架 2.3. 系统运行概述

系统上电复位后对系统初始化,接着在12864液晶显示时间,上下限温度参数,当前温度,然后打开定时器,在定时器中断服务程序采集DS18B20的温度值并转换成实际温度值显示在12864液晶屏上。进入while(1)函数里面不断的检测设置,加减按键和启动按键。当启动按键按下时系统进入加热状态,屏幕显示正在加热,当温度大于系统设置的上限温度时停止加热,蜂鸣器报警,LED灯闪烁,屏幕显示停止加热。当温度低于上限温度时停止报警,LED灯熄灭。当温度低于系统设置的下限温度时,系统立刻开始加热,屏幕显示正在加热,一直循环检测达到恒温的目的。在加热期间如果按下启动按键系统马上停止加热,重新检测按键。

3. 主要元器件介绍

3.1. 单片机

单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器(CPU)、存储器、振荡器、I/O接口、定时器/计时器等集成到一块芯片上构成的一个小而完善的微型计算机系统。

其优点是:

(1)体积小、质量轻; (2)单片机可靠性高; (3)处理功能强,速度快;

(4)低电压,低功耗,便于生产便携式产品; (5)控制功能强、环境适应能力强等;

本设计是基于单片机的设计,所选用的是AT98C51单片机,下面对AT98SC51单片机进行介绍。

主要特性 ·与MCS-51 兼容

·4K字节可编程FLASH存储器 ·寿命:1000写/擦循环 ·数据保留时间:10年 ·全静态工作:0Hz-24MHz ·三级程序存储器锁定 ·128×8位内部RAM ·32可编程I/O线 ·两个16位定时器/计数器 ·5个中断源 ·可编程串行通道 ·低功耗的闲置和掉电模式 ·片内振荡器和时钟电路

引脚图如下图2:

图2:AT89C51引脚图

3.2. 12864LCD显示屏

12864LCD是128*64的点阵液晶模块的简称,因为在本设计中,显示的文字比较多,而汉字的格式是8*8的,普通的LCD无法显示这么多电费内容,故在本设计中选用13864LCD液晶显示器,这个液晶显示屏成本比较低,方便和各个电路连接,在本设计中,采用三线串口通信方式。实物图与电路图如下:

实物图 电路图

3.3. 温度传感器

本设计中温度传感器采用的是DS18B20温度传感器,因为起体积比较小,而且抗干扰能力强,测量的温度比较准确,所以是目前最常见的温度传感器之一。由于它具有独特的接线方式,DS18B20在与单片机连接时只要有一根数据线就可以实现单片机和DS18B20温度传感器的数据交换。而且它的测量温度的范围比较广,在 -55℃~+125℃,工作电压也在本设计使用的电压中,只要单单一个单片机就可以完成温度的测量,比较方便。实物图以及电路图如下:

实物图 电路图

4. 系统电路图设计

AT89C52单片机最小系统

单片机最小系统结构图,如图下图3所示。

定义:单片机最小系统,,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统. 最小系统一般应该包括:单片机、电源、晶振电路、复位电路。

笨设计由40管脚接+5V电压为单片机提供电源,把晶振电路,复位电路,单片机统一接起来,够成最小系统。

图3:单片机最小系统

4.1. 单元电路设计 4.1.1. 复位电路

本设计中因为用的是AT89C51单片机,所以采用上电复位电路,故只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。如图4:

图4:复位电路

4.1.2. 时钟电路

本设计中的时钟电路给这个设计提供频率,控制它的快慢。本次设计采用的

晶振为16MHz。如图5:

图5:时钟电路 4.1.3. 12864显示部分

12864LCD是128*64的点阵液晶模块的简称,本设计中,采用三线串口通信方式与单片机连接。如下图6:

图6:12864显示

4.1.4. 蜂鸣器电路

本次设计选用的是单片机的P1口的P1.3口与蜂鸣器相连,来控制蜂鸣器信号的输出,检测温度不再范围内时,单片机的P1.3口输出低电平时,蜂鸣器报警,用于系统温度超高报警用;当输出高电平时,蜂鸣器停止工作。如图7:

图7:蜂鸣器电路

4.1.5. 传感器电路

本设计中温度传感器采用的是DS18B20温度传感器,因为起体积比较小,而且抗干扰能力强,测量的温度比较准确,所以是目前最常见的温度传感器之一。由于它具有独特的接线方式,DS18B20在与单片机连接时只要有一根数据线就可以实现单片机和DS18B20温度传感器的数据交换。而且它的测量温度的范围比较广,在 -55℃~+125℃,工作电压也在本设计使用的电压中,只要单单一个单片机就可以完成温度的测量,比较方便。

DS18B20和AT89C52的P3.0管脚连接,主要检测加热的实时温度,系统每隔0。5秒采集一次温度。图8:

图8:传感器电路

4.1.6. 时钟芯片电路

DS1302实时时钟芯片是SPI通信方式的时钟芯片,VCC1是外部电池输入端,为系统保存时间用,当系统掉电后通过外接电池给芯片供电,以保证系统重新上电后时间不变。芯片的X1和X2是外接晶体,频率为32。768KHZ。为内

部运行提供时钟源。芯片的CE脚为片选端,低电平时禁止往DS1302写入数据,高电平时才可以写入数据。芯片的IO脚是双向数据传传输线。CLK引脚为时钟线,数据传输时,在CLK的时钟作用下把IO端的数据一位一位的传输。DS1302可以通过指令把小时、分钟、秒钟,写入或者读出。如图9:

图9:时钟芯片电路

4.1.7. 变压器电路

变压器T1是把220V的交流电变为电压9V交流电,经过D1,D2整流,电容C1,C2滤波后再经7805稳压后为系统提供稳定的5V工作电压。如图10:

图10:变压器电路

4.1.8. 继电器模块

固态继电器模块KR1主要是控制加热装置工作电流通路,其控制信号的IN-接到单片机的P3.7引脚,当P3.7输出低电平时,KR1的输出端AC-IN和AC-OUT呈导通状态。

图11:变压器电路

4.1.9. 指示灯电路

超温指示灯接到P3.3引脚,低电平有效果,当温度超出时闪烁。如图12:

图12:指示灯电路

4.1.10. 按键电路

a. 设置按键S1为系统参数设置选择用,每按下一次可在温度上限,温度下限,

时间之间选择。选中后光标闪烁,按加减按键S2,S3可以对所选择的参数修改。

b. 启动/停止按键为开始启动加热和停止加热按键,每按一次可在开和关之间转

换。K1为电源总开关。 如图13:

如图13:按键电路

5. 系统程序框

开始

系统初始化 显示初始化内容 采集温度 液晶显示 是 调整温度上限 按键加? 启动按键? 否 停止加热 否 调整温度上限 是 按键减? 加热 LED停止 否 无

有无超热? 有

蜂鸣器报警 LED闪烁 程序流程如下:

系统上电复位后首先对定时器初始化,12864初始化,DS18B20温度传感器初始化,接着在12864液晶显示时间,上下限温度参数,当前温度,然后打开定时器,在定时器中断服务程序采集DS18B20的温度值并转换成实际温度值显示在12864液晶屏上。进入while(1)函数里面不断的检测设置,加减按键和启动按键。当启动按键按下时系统进入加热状态,屏幕显示正在加热,当温度大于系统设置的上限温度时停止加热,蜂鸣器报警,LED灯闪烁,屏幕显示停止加热。当温度低于上限温度时停止报警,LED灯熄灭。当温度低于系统设置的下限温

度时,系统立刻开始加热,屏幕显示正在加热,一直循环检测达到恒温的目的。在加热期间如果按下启动按键系统马上停止加热,并跳出while(1)循环,重新回到mian函数的while(1)循环里面重新检测按键。

6. 系统的硬件调试及软件调试

6.1. 硬件调试部分:

单片机应用系统的硬件调试和软件调试是分不可的,许多硬件故障是在调试软件时才发现的。但通常是先排除系统中明显的硬件故障后才和软件结合起来调试的。通常我们采取软件与硬件联调,然后根据实物显示出的数据在走具体的更改,当然实物调试和软件调试是可以分开的,下面为硬件调试和软件调试做简单介绍:

硬件调试分脱机调试和联机调试,脱机调试就说在系统不上电的情况下,通过其他检测设备,像万用表这些检测下电路连接的正确性,靠观察看这个电路连接是否连接正确,电路焊接有没有稀罕漏焊等情况。联机调试可以检测出靠肉眼无法看出的故障,系统通电后,检测运行是否正常。若不正常,及时发现问题并解决。可以更据示波器,观察示波器上的波形等,有故障寻找原因。

6.2. 软件调试部分:

软件调试主要是对程序的检测和各个分电路的检测,软件程序主要通过 Keil uVision4软件来检测,保证错误率为零,对于子电路,分开来一个一个的检测,符合程序的环境。

6.3. 实物图展示

按键设置上限和下限的报警温度,本图设置为设置上限79.下限50,当前温度为26度。

系统运行,检测到当前温度低于设置的温度范围,为26度,所以加热装置开始加热。

结束语

经过长时间的学习与努力,我的毕业论文终于完成了,先对此做如下总结: 1:通过这次恒温箱的设计,在很大程度上提高了自己的独立思考能力和单片机的专业知识,也深刻熟悉了做一个设计的的步骤和格式,相信有过这样的一次训练,在相关软件的运用上肯定更进一步,对于大学所学的单片机,模电等相关课程有了一个更加深入的了解和学习,相信在以后的日子里我会做的更好。

2:我所做的设计主要是根据目前国内市场的发展趋势和国内实际的应用特点和要求,实现恒温的设计。采用单片机为核心,以温度传感器采集信号,在通过单片机在12864上显示。实现了预期的设计目标,完成了全部的设计任务。

3:在设计过程中,我发现了对单片机相关知识的严重不足,但也推广本次设计认识到自己需要经常学习,通过本次设计得到了知识的丰富和知识的加强,

同时培养了我自主学习的意思,为以后学习其他知识打下基础。

致谢

感谢徐瑞亚老师对我的指导,他不厌其烦的倾听我的问题,在我不懂时为我提供解决思路,让我豁然开朗,他的工作严谨的态度值得我们在以后学习和生活中不断学习。他不拘一格的态度细心的指导让我往往自己脑子里面乱了的思路有了新的缺口。感写于徐瑞亚师花费了大量的精力,在各个环节中给了我许多宝贵的意见,让我可以顺利完成这篇毕业论文。在此,谨向徐瑞亚老师的指导之恩表示最深的谢意! 同时在这里我也感谢我的辅导员和我的任课老师,在大学三年中,兢兢业业,勤勤恳恳的教我们学习,都说大学是小社会,老师在同学里面不仅教会了我知识,还教会了我做人的道理,在这里我也对他们特别感谢,还有就说感谢在我论文中给我提宝贵意见的同学,他们给我的素材很主要,让我可以明确自己的目标,从什么地方开始,在这里也衷心地感谢他们! 在我的这边论文快完成的时候,我的心情久久不能平静,从刚刚开始写论文到现在,有非常多可敬的老师、同学、朋友给了我非常多的帮助,在这里请接受我诚挚的谢意 !

由于才疏学浅,论文之中难免有不足之处,恳请批评指正。 最后,感谢所有关心、支持和帮助过我的人们!

参考文献

1. 徐凤霞, 赵成安. AT89C51单片机温度控制系统[J]. 齐齐哈尔大学学

报,2004,3.

2. 褚斌, 徐力.多参数新型智能变送器的设计[J]. 仪表技术与传感器,2000. 3. Design And Implementation of Temperature & Humidity Control System Based

on AT89C51 [J], 2007.

4. 高鹏等. Protel99入门与提高[M]. 人民邮电出版社,2000.

5. 李华.电子线路设计指导[M].北京:北京航空航天大学出版社.2005,6 6. 赖寿宏.微型计算机控制技术[M].北京:机械工业出版社,2006:91-111

7. 黄贤武,郑筱霞.传感器原理与应用[M].成都:电子科技大学出版社,高等教育

出版社,2005:76-108.

8. 曹琳琳,曹巧嫒.单片机原理及接口技术[M].长沙:国防科技大学出版社,2000 9. 潘新民,王燕芳.微型计算机控制技术[M].北京:高等教育出版社,2001.7 10. 王忠显.智能化电能参数测试仪[J].煤炭技术,2003.12:35-39 11. 胡汉才.单片机原理及系统设计[M].北京:清华大学出版社,2002

12. 沈红卫.单片机应用系统设计实例与分析[M].北京:北京航空航天大学出版

社,2003

13. 涂时亮.单片微机控制技术[M].上海:复旦大学出版社,1994

14. 何立民. 单片机高级教程应用与设计[M]. 北京航空航天大学出版社,2007.1. 15. 李德振. 湿度监测系统设计方案[J]. 电子制作, 2010.

附录:

系统主程序

#include\ #include \#include \#include \#include

/***************************************************************/ sbit jian=P1^6; //减按键 sbit jia=P1^5; //加按键 sbit ks=P1^7; //启动按键 sbit jr=P3^7; //控制加热 sbit fengming=P1^3;//蜂鸣器 sbit LED=P3^3;//LED灯 sbit shezhi=P1^4;//设置按键

/***************************************************************/ uint wd;

uint time;

uint hc=65535-800; uint tt=0; uchar wei=0;

uchar shang=100,xia=50; uchar bs=0; uchar sjwd=0;

/***************************************************************/ void zhuping()//主屏显示 {

songzhiling(0x0c);////关光标和反白 hzdisp(\葛昌洋毕业设计\ hzdisp(\上限\ dispshuju(shang,0x92); hzdisp(\下限\ dispshuju(xia,0x96); hzdisp(\时间=\ }

/***************************************************************/ void gb()//光标程序 {

switch(wei)

{ case 0: break; case 1:

songzhiling(0x0f); songzhiling(0x92); break; case 2:

}

songzhiling(0x0f); songzhiling(0x96); break; case 3:

songzhiling(0x0f); songzhiling(0x9b); break; case 4:

songzhiling(0x0f); songzhiling(0x9d); break; }

/***************************************************************/ void jcan()//检测按键程序 {

if(shezhi==0)//检测设置键

{

delay_ms(10);

if(shezhi==0) {

while(shezhi!=1);

wei++; if(wei==5) { wei=1; }

gb();

}

}

/**************************************/ if(wei>0)//如果选择了设置选项。就检测加,减按键 {

if(jia==0)//检测加按键

{

delay_ms(10);

if(jia==0) {

songzhiling(0x0c);////关光标和反白

if(wei==1)

{

if(shang<100) {

shang++;

dispshuju(shang,0x92);

} if(wei==2) {

if(xia<50) } if(wei==3) { shi++;

{ xia++;

dispshuju(xia,0x96); } }

}

}

if(shi>12) { shi=1; }

dispsj(shi,fen,miao,0x9b);//显示时间 DS1302_Write( miao,fen,shi);

if(wei==4) { fen++; } gb();

if(fen>60) { fen=1; }

dispsj(shi,fen,miao,0x9b);//显示时间 DS1302_Write( miao,fen,shi);

}

/*******************************************/ if(jian==0)//检测减按键 {

delay_ms(10);

if(jian==0) {

songzhiling(0x0c);////关光标和反白

if(wei==1)

{

if(shang>50)

{ shang--;

dispshuju(shang,0x92);

} if(wei==2) {

if(xia>10) } if(wei==3) { } if(wei==4) {

if(fen>1)

{ fen--; if(shi>1) { shi--;

dispsj(shi,fen,miao,0x9b);//显示时间 DS1302_Write( miao,fen,shi); } { xia--;

dispshuju(xia,0x96); } }

}

}

}

dispsj(shi,fen,miao,0x9b);//显示时间 DS1302_Write( miao,fen,shi); }

gb();

}

}

/***************************************************************/ void jcqd()//检测启动按键 {

if(ks==0)

{

delay_ms(10);

if(ks==0) {

songzhiling(0x0c);////关光标和反白 while(ks!=1); bs=1; wei=0; LED=1; fengming=1; delay_ms(100); fengming=0;

hzdisp(\ \

hzdisp(\正在加热........\

jr=0;//开始加热

while(1) {

/***************************************************/

if(ks==0)//检测停止加热

{

delay_ms(10);

if(ks==0) {

songzhiling(0x0c);////关光标和反白 while(ks!=1); fengming=0; jr=1; bs=0; wei=0;

hzdisp(\ \ hzdisp(\上限\ dispshuju(shang,0x92); hzdisp(\下限\ dispshuju(xia,0x96);

break;

}

/**********************************************/ if(bs==1) {

if(sjwd>shang)

{

songzhiling(0x0c);////关光标和反白 fengming=1;

hzdisp(\停止加热........\

jr=1; }

}

}

bs=2;

}

} if(bs==2) {

if(sjwd

{

fengming=0; }

if(sjwd

songzhiling(0x0c);////关光标和反白 hzdisp(\正在加热........\ }

fengming=0; jr=0; LED=1; bs=1;

}

}

/***************************************************************/

void main() {

fengming=0; bs=0; jr=0;

//初始化定时器 TMOD=0x01; ET0=1; EA=1; time=hc; TL0=time; TH0=time>>8; tt=0;

//初始化12864 delay_ms(100); lcdinit(); delay_ms(100);

//初始化DS18B20 ds18b20_init(); zhuping();//主菜单

DS1302_readtime();//读出时间 dispsj(shi,fen,miao,0x9b);//显示时间 TR0=1; while(1) {

jcan();//检测按键 jcqd();//检测启动键

} }

void time0()interrupt 1 {

time=hc; TL0=time; TH0=time>>8; tt++; if(tt==100) {

if(bs==2)

{

LED=!LED;//报警灯闪烁 }

tt=0;

wd=ds18b20_readTemperaData();//读DS18B20温度数据 wd=wd*(0.0625*10);//温度转换 sjwd=wd/10;

songzhiling(0x0c);////关光标和反白

hzdisp(\当前温度=\显示温度 dispwd(wd,0x8d);

hzdisp(\℃\ } }

DS1302_readtime();

dispsj(shi,fen,miao,0x9b);//显示时间 gb();

6.4. 12864程序:

#include \

#define uchar unsigned char #define uint unsigned int #include #include

sbit SCLK=P2^6;//E //12864引脚定义 sbit SID=P3^6; //RW sbit CS=P2^7; //RS

//////////////////////////////////液晶程序///////////////////////////////////////////////////////// void lcdinit() {

songzhiling(0x30); songzhiling(0x02);

songzhiling(0x06); songzhiling(0x0c);

songzhiling(0x01); }

/******************************************************************

* 名称 : sendbyte()

* 功能 : 按照液晶的串口通信协议,发送数据 * 输入 : zdata

songzhiling(0x80);

* 输出 : 无

***********************************************************************/

void sendbyte(uchar zdata) { }

/********************************************************************

* 名称 : write_com() * 功能 : 写串口指令 * 输入 : cmdcode * 输出 : 无

***********************************************************************/

for(i=0; i<8; i++) { }

if((zdata << i) & 0x80) { } else { } SCLK = 0; SCLK = 1;

SID = 0; SID = 1;

uint i;

void songzhiling(uchar cmdcode) { }

/********************************************************************

* 名称 : write_data() * 功能 : 写串口数据

***********************************************************************/

void songshuju(uchar Dispdata) { }

/********************************************************************

* 名称 : hzkdis() * 功能 : 显示字符串

***********************************************************************/

void hzdisp(uchar code *s,uchar dz) {

CS = 1; sendbyte(0xfa);

sendbyte(Dispdata & 0xf0); sendbyte((Dispdata << 4) & 0xf0); delay_ms(2); CS = 1; sendbyte(0xf8);

sendbyte(cmdcode & 0xf0); sendbyte((cmdcode << 4) & 0xf0); delay_ms(2);

songzhiling(0x03);

songzhiling(dz);//送显示位置

while(*s > 0)

{

songshuju(*s); s++;

} }

void delay_ms(uint zz) {

uint yy=800; if(zz>0) {

while(zz) {

while(yy--); yy=400; zz--; }

} }

void dispwd(uint s,uchar dz) {

songzhiling(0x03);

songzhiling(dz);//送显示位置

songshuju((s/1000)+48);

songshuju((s/100)+48);

songshuju((s/10)+48);

}

void dispsj(uchar s,uchar f,uchar m,uchar dz) {

songzhiling(0x03);

songzhiling(dz);//送显示位置

songshuju((s/10)+48); songshuju((s)+48);

songshuju(58);

songshuju((f/10)+48);

songshuju((f)+48);

songshuju(58);

songshuju((m/10)+48);

songshuju((m)+48);

}

void delayXus(uchar mm) {

while(mm) //这种写法有利于减小us=0时的机器周期 {

mm--; }

}

void dispshuju(uchar s,uchar dz) {

songzhiling(0x03);

songzhiling(dz);//送显示位置 songshuju((s/100)+48); songshuju((s/10)+48); songshuju((s)+48); }

6.5. 时钟程序

#include \#include #include #define uchar unsigned char #define uint unsigned int uchar DS1302_addr[]={

0x80, //0,写入秒(Second)寄存器 0x81, //1,读出秒(Second)寄存器 0x82, //2,写入分(Minute)寄存器 0x83, //3,读出分(Minute)寄存器 0x84, //4,写入小时(Hour)寄存器 0x85, //5,读出小时(Hour)寄存器

0x8e, //14,写保护_寄存器 } ;

/***************************************************************/ sbit T_SCLK = P3^6; //ds1302时钟引脚 sbit T_DIO= P3^5; //ds1302数据引脚 sbit T_CE = P3^4; //ds1302片选引脚(高电平有效果)

/**************************************************************/ sbit ACC_0 = ACC^0; sbit ACC_1 = ACC^1; sbit ACC_2 = ACC^2; sbit ACC_3 = ACC^3; sbit ACC_4 = ACC^4; sbit ACC_5 = ACC^5; sbit ACC_6 = ACC^6; sbit ACC_7 = ACC^7;

/***************************************************************/

uchar miao,fen,shi; //时间变量

/***************向***********************/

void DS1302_Input_Byte(uchar Input) { uchar i; ACC =Input; for(i=8; i>0; i--) {

T_DIO = ACC_0; T_SCLK = 1;

DS1302

入一字节数据或者指令

T_SCLK = 0; ACC = ACC >> 1; } }

/**************从DS1302读取一字节数据,返回读到的数据****************************/

uchar DS1302_Output_Byte(void) {

uchar i; for(i=8; i>0; i--) {

ACC>>=1; T_DIO= 1; ACC_7 = T_DIO;

T_SCLK = 1; T_SCLK = 0; }

return(ACC); }

/**************

DS1302

*******************************/

void DS1302_Write_one( uchar addr,dat ) {

T_CE=0; 送中止

T_SCLK=0; T_CE = 1; 有效

DS1302_Input_Byte(addr); 定的地

址写

入数据

// 写入地址、数据子程序 //T_CE引脚为低,数据传 //清零时钟总线

//T_CE引脚为高,逻辑控制 // 地址,命令

DS1302_Input_Byte(dat); // 写1Byte数据 T_SCLK = 1; T_CE = 0; }

//************从DS1302指定的地址读取数据,返回读到的数据*******************************/

uchar DS1302_Read ( uchar addr ) //数据读取子程序 {

uchar date;

T_CE=0; T_SCLK=0; T_CE = 1;

DS1302_Input_Byte(addr); // 地址,命令 date = DS1302_Output_Byte(); // 读1Byte数据 T_SCLK = 1; T_CE = 0; return(date); }

//************

DS1302

****************************************************/

void DS1302_Write( uchar sec_w,min_w,hour_w) { DS1302_Write_one(0x8e,0x00);//使能数据写入 DS1302_Write_one(0x80,sec_w);//写入秒 DS1302_Write_one(0x82,min_w);//写入分 DS1302_Write_one(0x84,hour_w);//写入时 DS1302_Write_one(0x8e,0x80);//禁止写入数据

}

/************从DS1302读取时间数据

**********************************************************/

void DS1302_readtime() {

miao=DS1302_Read(0x81); //读秒 fen=DS1302_Read(0x83); //读分 shi=DS1302_Read(0x85); //读时 }

6.6. 温度传感器程序

#include \#include \#define uchar unsigned char #define uint unsigned int

#include #include sbit DQ=P3^0;

/******************************************************************

当主机总线t0时刻从高拉至低电平时就产生写时间隙 从to 时刻开始的1us之后,15us之前将所需写的位送到总线上

DSl820 在t0后的15-60us 对总线采样若低电平写入的位是0 ,若高电平写入的位是1

连续写2 个位之间的间隙应大于1us

写1,总时间大于60us,在t0开始延时1us就可以写1,15us之后ic来采样,采样时间最大45us

写0,总时间是60~120us,15~60us是ic在采样,120以外就没必要了,mcu总得

释放总线吧

不管写1还是写0,大于60us的话,ic肯定已经采样完成了,那mcu就可以释放了

*******************************************************************/

void ds18b20_writeByte(uchar dat) //mcu向ic写一个字节 {

uchar i; uchar tmep=dat; for(i=0;i<8;i++) {

DQ=0; //产生读写时序的起始信号 _nop_(); //要求至少1us的延时 DQ=dat & 0x01; //对总线赋值,从最低位开始写起

delayXus(10);//延时74us,写0在60~120us之间释放,写1的话大于60us均可释放

DQ=1; //释放总线,为下一次mcu送数据做准备, dat>>=1; //有效数据移动到最低位,2次写数据间隙至少需1us } }

/**************************************************************************

下降沿产生读时序

整个读时序必须至少有60us的持续时间,相邻两个读时序必须要有至少1us的恢复时间

DS18B20在读时序产生1us后输出数据到总线上,也有可能需要2~3个微秒,但不会更多

而要求主机释放总线和采样总线等动作要在15μs内完成,那么让mcu采样的最佳时机

是读时序产生后的5~13us之间,在15~60us这段时间是18b20的私有时间,它会在这段

时间内的任意时刻释放总线,是不稳定期,我们不要让mcu在这段时间里对总线操作

*******************************************************/ uchar ds18b20_readByte() //mcu读一个字节 {

uchar i,value=0; for(i=0;i<8;i++) {

DQ=0; //起始信号

value>>=1; //顺便延时3~4个机器周期 DQ=1; //mcu释放总线 _nop_();_nop_();_nop_(); //再延时3.3us if(DQ) {

value|=0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0

}

delayXus(8); //延时60.76us }

return value; }

uint ds18b20_readTemperaData() //读取温度值 {

uint temp=0; if(ds18b20_init()) {

ds18b20_writeByte(0xcc); //写指令:跳过rom检测 ds18b20_writeByte(0x44); //写指令:温度转换 //delayms(750);// 转换延时需要750ms以上,我们不等它

//首次转换未完成时,得到的初始化数据是85度,处理一下就可以了 //温度转换电路是硬件独立的,不会阻塞初始化功能 if(ds18b20_init()) {

ds18b20_writeByte(0xcc); //写指令:跳过检测rom ds18b20_writeByte(0xbe); //写指令:读取温度值 temp=ds18b20_readByte(); //先读低8位数据

temp|=(uint)ds18b20_readByte()<<8; //再读高8位数据,然后合并

temp&= 0x0FFF; //高4位数据反正没用上,我们用来存放错误码

} }

return temp; }

uchar ds18b20_init() //初始化 {

uchar checkState=0;

DQ=1; //总线初始状态 _nop_();_nop_();

DQ=0; //mcu先将总线拉低

delayXus(80); //延时530us,要求480us~960us的低电平信号

//当ic接受到此复位信号后会回发一个存在信号 //mcu若要接收此存在信号则先要释放总线,让ic控制该总线

//当mcu释放总线后的15~60us之后,ic才向总线发一个低电平信号

//该信号存在时间为60~240us DQ=1; //mcu释放总线

delayXus(10); //mcu释放15~60us以上,(8+6*10)*1.085=73us, //这时DS18B20已经拉低信号,大约60~240us应答保持时间,

checkState=DQ; //在这段60~240us时间内,mcu采样是否有器件响应,0表示有响应

delayXus(70); //延时464us,加上之前的73us,共537us

//虽然ic在拉低电平60~240us之后,会释放总线,但整个时间至少480us

//故我们共用时537us,这样是为了不影响后续的操作

return 1; //初始化成功 }

本文来源:https://www.bwwdw.com/article/2wqw.html

Top