温湿度论文正文

更新时间:2024-06-17 13:42:01 阅读量: 综合文库 文档下载

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

基于单片机的温度控制系统的设计

摘要 随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类的生活带来了

根本性的改变。尤其是单片机技术的应用产品的出现给人们的生活带来了诸多方便。

本文设计并制作了基于单片机的温度控制系统,以单片机为核心,由液晶显示模块、按键模块、传感器DS18B20、湿度模块组成。该系统与传统的温度计相比,具有读数方便,测温范围广,测温准确,还能设定温度范围等功能。

关键词 单片机 液晶显示 DS18B20

目 录

引 言 ........................................................................................................................................................... 1 第一章 方案选择................................................................................................................................. 2

1.1温度采集器件的选择 ................................................................................................................. 3 1.2时钟模块的选择 .......................................................................................................................... 3 1.3显示模块的选择 .......................................................................................................................... 3 1.4键盘模块的选择 .......................................................................................................................... 3

第二章 硬件电路设计 ...................................................................................................................... 4

2.1系统硬件设计及组成 ................................................................................................................. 4 2.2主控模块 ....................................................................................................................................... 5 2.3温度采集模块 .............................................................................................................................. 7 2.4时钟模块 ..................................................................................................... 错误!未定义书签。 2.5显示模块 ......................................................................................................................................11 2.6键盘模块和报警模块 ................................................................................................................11

第三章 软件设计............................................................................................................................... 14

3.1应用软件设计原则 ................................................................................................................... 14 3.2软件的总体设计 ........................................................................................................................ 14 3.3系统程序流程总框图 ............................................................................................................... 14

3.3.1温度读取函数 ...................................................................................................................... 15 3.3.2显示程序.............................................................................................................................. 16 3.3.3时间读取函数 ...................................................................................... 错误!未定义书签。

第四章 制作与调试 ......................................................................................................................... 16

4.1软件调试 ..................................................................................................................................... 18 4.2硬件制作 ..................................................................................................................................... 18 4.3硬件调试 ..................................................................................................................................... 18

结论 ............................................................................................................................................................ 20 参考文献 ................................................................................................................................................. 21 致谢 ............................................................................................................................................................ 22 附录一 C语言源程序 .................................................................................................................... 23 附录二 原理图 .................................................................................................................................... 39

附录三 PCB图 ................................................................................................................................... 40 附录四 实物图片............................................................................................................................... 41

引 言

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,但人们对它的要求越来越高,要为现代化社会提供更好更方便的设施服务就需要从单片机技术入手,一切向着数字化、智能化控制方向发展。

本设计制作的是一款基于单片机的温度控制系统。传统的温度计测量精度差、显示不直观、不能精确设定测量范围。与传统温度计相比,该温度控制系统具有读数方便,测温范围广,测温准确,、显示直观、功能多样、成本低廉等诸多优点,符合电子仪器仪表的发展趋势。该设计控制器使用单片机STC89C51,测温传感器使用DS18B20,1602液晶显示。该系统功能有显示当前温度,可以自定义温度上下限,当温度超上下限时自动报警,温度回到设定范围时报警消失,并且还具有湿度检测功能。该系统应用范围广泛,具有广阔的市场前景。

第一章 方案选择

2

1.1温度采集器件的选择

方案一:采用具有负温系数的热敏电阻进行温度信号采集,热敏电阻具有体积小,精度高,响应快,耐振动等优点。但是热敏电阻阻值较大,目前阻值最大的达到500KΩ。如果采用分压法,经AD转换求温度,功耗会很大,即使串联3MΩ电阻,电流仍然在1μA左右,而且通过测量,当串联电阻太大时,不仅降低了测量准确性,而且由于电流太小,受外界的干扰会很大,数值不稳。

方案二:采用热电阻进行温度信号采集,它们的阻值随温度的变化而变化,通过常用的AD转换可以很方便的得到温度值。从理论上讲,利用铂电阻测温,精度可以做得很高,比如Pt1000的精度可达0.05℃。另外,铂电阻测温范围宽,可达到数百度。但是由于它阻值较小,若串在电路中功耗会很大,并且价格昂贵。

方案三:采用数字温度传感器,它能将采集到的温度信号直接转换成数字信号,并且方便组网进行多点温度采集,价格相对便宜,功耗也较低,具有很好的温度分辨率,比如DS18B20最大温度分辨率高达0.0625℃,并且由于传输的是数字信号,所以抗干扰能力很强。DS18B20测温范围相对较宽,可达-55℃到125℃,精度为±2℃,其各方面均可达到题目要求。 综合考虑,选择方案三。

1.2时钟模块的选择

方案一:使用DHT11进行湿度检测,但是与单片机直接通讯的精确度不是很高。 方案二:湿度传感器将当前的湿度转换为电压,通过ADC0809对电压进行AD采集。 综合考虑,采用方案二。

1.3显示模块的选择

方案一:采用数码管显示。数码管体积小、重量轻,适合显示数字,价格也相对比较便宜,但是由于数码管不能显示汉字跟一些基本的符号,并且本课题需要显示的信息内容比较多,所以不适宜选用数码管。

方案二:采用液晶显示器,它不仅可以显示基本数字信息,而且可以显示丰富的符号信息以及文字信息,显示信息丰富且直观易懂。液晶显示有功耗低,体积小,重量轻,寿命长,不产生电磁辐射污染,界面清晰,操作方便等优点。目前市场上已经推出多种低电压(3V)供电液晶。

系统采用方案二,选用LCD1602显示。

1.4键盘模块的选择

方案一:采用独立式按键电路,每个键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。但是当按键较多时占用单片机的I/O数目较多。

方案二:采用阵列式键盘,此类键盘是采用行列扫描方式,当按键较多时可以降低占用单片机的I/O口数目。

3

由于本系统所使用的按键不多,所以采用独立式按键电路。

第二章 硬件电路设计

2.1系统硬件设计及组成

系统的硬件设计原理结构图如图2-1所示。该系统由主控模块STC89C51、时钟模块DS1302、

4

温度传感器模块DS18B20、键盘接口模块、显示模块和报警模块6个部分组成[2]。

温度采集电路 时钟信号输入电路 键盘输入电路 AT89S52 单片机 报警电路 液晶显示电路

图2-1 系统硬件设计原理图

2.2主控模块

该系统中央控制器采用的是单片机STC89C51,复位电路采用按键复位。STC89C51单片机的管脚说明如图2-2所示。

STC89C51是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS -51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机STC89C51可为许多嵌入式控制应用系统提供高性价比的解决方案。

STC89C51具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个 全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

此外,STC89C51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求[1],[8],[11]。

5

图2-2 STC89C51管脚图

VCC:供电电压。 GND:接地。

P0 口:P0口是一个漏极开路的8位准双向I/O端口。作为输出口,每位能驱动8个LLS型TTL负载。对P0端口写1时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在此期间,P0内部上拉电阻有效。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节;程序校验时,需要外部上拉电阻。

P1 口:P1 口是一个带有内部上拉电阻的8 位双向I/O 端口。P1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写1时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,在flash编程和校验时,P1口接收低8位地址字节。

P1口几个特殊管脚作用:

1. P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出

2. P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) 3. P1.5 MOSI(在系统编程用) 4. P1.6 MISO(在系统编程用) 5. P1.7 SCK(在系统编程用)

P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写1时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器时,P2 口送出高八位地址。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,P3 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写1时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在flash编程和校验时,P3口也接收一些控制信号。

P3口特殊管脚:

1. P3.0 RXD(串行输入) 2. P3.1 TXD(串行输出) 3. P3.2 INT0(外部中断0) 4. P3.3 INT0(外部中断0) 5. P3.4 T0(定时器0外部输入) 6. P3.5 T1(定时器1外部输入) 7. P3.6 WR(外部数据存储器写选通)

6

8. P3.7 RD(外部数据存储器写选通)

RST: 复位信号输入端,高电平有效。当晶振工作时,RST脚持续2 个机器周期高电平,就可以使单片机复位。

ALE/PROG:地址锁存允许信号端。地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用作对外输出时钟或定时信号。

PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当STC89C51从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。

EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。

2.3温度采集模块

本系统采用的温度采集模块为温度传感器DS18B20。此温度传感器内部自带A/D转换功能,能直接输出数字信号,通过I/O口 P2.0送入单片机进行处理,其电路如图2-3所示。

7

图2-3 温度采集电路

DS18B20管脚图如图2-4所示。

图2-4 DS18B20管脚图

DS18B20是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器。主要特点有: 1. 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处

理器与DS18B20的双向通讯。

2. 测温范围 -55℃~+125℃,固有测温分辨率0.5℃。

3. 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,

如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温。

4. 工作电源: 3-5V/DC。

5. 在使用中不需要任何外围元件。

6. 测量结果以9-12位数字量方式串行传送。 DS18B20内部结构图如图2-5所示。

图2-5 DS18B20内部结构图

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度灵敏元件、非易失性温度报警触发器TH和TL、配置寄存器。

8

光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。高速暂存RAM的结构为9字节的存储器,结构如表2-1所示。

表2-1 高速缓存RAM结构图

温度 LSB 温度 MSB TH用户字节1 TL用户字节2 配置寄存器 保留 保留 保留 CRC

其中前2位字节用于存储测得的温度信息,第3字节和第4字节是拷贝的,容易丢失,每次上电

复位时被刷新。第5位字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。该字节各位的定义如图2-6所示。

..TMR1R0111.11.

图2-6 配置寄存器各位定义

低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动。R1和R0决定温度转换的精度位数,来设置分辨率,如表2-2所示。

表2-2 DS18B20温度转换时间及分辨率表

R0 R1 0 0 1 1 0 1 0 1 分辨率/位 9 10 11 12 温度最大转向时间/ms 93.75 187.5 375 750 由表2-2可知,分辨率越高,转换时间久越长因此,在实际应用中要将分辨率和转换时间权衡考虑。

高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。

9

DS18B20的测温原理是这样的,器件中低温系数晶振,用于产生固定频率的脉冲信号送给减法计数器1;高温系数晶振的振荡频率受温度的影响较大,其所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数从而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1何温度寄存器中,并且将计数器1和温度寄存器预置在-55℃所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20→发ROM功能命令→发存储器操作命令→处理数据。

2.4湿度模块和采集模块

ADC0809芯片为28引脚为双列直插式封装,其引脚排列见图9.8。 对ADC0809主要信号引脚的功能说明如下:

IN7~IN0——模拟量输入通道

ALE——地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。

START——转换启动信号。START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。本信号有时简写为ST.

A、B、C——地址线。 通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。其地址状态与通道对应关系见表9-1。

CLK——时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号

EOC——转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。

D7~D0——数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低

10

位,D7为最高

OE——输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。

Vcc—— +5V电源。

Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V, Vref(-)=-5V).

湿敏电阻是利用湿敏材料吸收空气中的水分而导致本身电阻值发生变化这一原理而制成的。 工业上流行的湿敏电阻主要有:氯化锂湿敏电阻,有机高分子膜湿敏电阻多片电阻组合式氯化锂湿敏传感器是利用湿敏元件的电气特性(如电阻值),随湿度的变化而变化的原理进行湿度测量的传感器,湿敏元件一般是在绝缘物上浸渍吸湿性物质,或者通过蒸发、涂覆等工艺制各一层金属、半导体、高分子薄膜和粉末状颗粒而制作的,在湿敏元件的吸湿和脱湿过程中,水分子分解出的离子H+的传导状态发生变化,从而使元件的电阻值随湿度而变化。 氯化锂湿度传感器具有稳定性、耐温性和使用寿命长多项重要的优点,氯化锂湿敏传感器已有了五十年以上的生产和研究的历史,有着多种多样的产品型式和制作方法,都应用了氯化锂感湿液具备的各种优点尤其是稳定性最强,

氯化锂湿敏器件属于电解质感湿性材料,在众多的感湿材料之中,首先被人们所注意并应用于制造湿敏器件,氯化锂电解质感湿液依据当量电导随着溶液浓度的增加而下降。电解质溶解于水中降低水面上的水蒸气压的原理而实现感湿。

氯化锂感湿基片的结构为选用绝缘材料的衬底,在上方制作一对金属电极,涂覆一层电解质溶液感湿膜,氯化锂是典型的离子晶体,属于非亲合型电解质,氯化锂溶液中,Li+对极性水分子的吸引力极强,离子水分程度最高。氯化锂感湿膜由氯化锂和聚乙烯醇混合制作,其主要特性:

1) 是可在120度高温环境中稳定工作,这一点是其他高分子电容是湿度传感器不可比拟的;

2)氯化锂湿敏元件线性测湿量程较窄大约在20%RH左右,在该测量范围内,其线性误差小于2%RH。所以,在全范围湿度测量环境中要想达到高精度的湿度测量,目前普遍采用的单片湿敏元件测量方法就很难实现了。

2.5显示模块

LCD1602可以在LCD显示屏上完整显示32个英文字符和日文等一些字符,适合显示英文文字信息量较小的地方.可以应用在计算器、频率计、信号发生器、时钟等产品上。显示部分电路如图2-7所示。

LCD1602液晶屏主要技术参数和显示特性: 显示容量:16*2个字符 芯片工作电压:4.5-5.5V

工作电流:2.0mA(5.0V) 不包括背光电流。

11

模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm 带有英文和日文字库,使用方便

图2-7 显示电路

LCD1602管脚功能如表2-3所示:

表2-3 LCD1602管脚功能 引脚引脚名功能说明 号 称 1 Vss 电源地 2 Vdd 电源正极 3 Vl 液晶显示偏压信号 4 RS 数据/命令选择端(H/L) 5 R/W 读/写选择端(H/L) 6 E 使能信号 7 D0 DATA I/O 8 D1 DATA I/O 9 D2 DATA I/O 10 D3 DATA I/O 11 D4 DATA I/O 12 D5 DATA I/O 13 D6 DATA I/O 14 D7 DATA I/O 15 BLA 背光源正极 16 BLK 背光源负极 2.7键盘模块和报警模块

本设计中的键盘输入系统由P1.0-P1.3口和4个微动开关组成,开关的另一端连接

12

到地线上。当无键按下时P1.0-P1.3口输入为高电平,有键按下时P2口所对应I/O口会被拉低,P1.0-P1.3中有低电平输入。报警模块由2个发光二极管组成,当前温度超过设定温度上限时红灯亮,低于设定温度下限时黄灯亮,两灯分别接在单片机的P2.4和P2.2口上。键盘模块和报警模块分别如图2-8和2-9所示。

图2-8 按键电路

图2-9 报警电路

13

第三章 软件设计

软件设计是单片机系统设计的核心部分,也是能否实现预定功能的关键。单片机编程常用的语言是C语言和汇编语言,最终都要转为Intel HEX格式或二进制格式(Binary)文件拷入单片机芯片内。这里我们使用的是C语言进行编程设计[3],[4],[10]。

3.1应用软件设计原则

应用系统中的应用软件是根据系统功能要求设计的,应可靠实现系统的各种功能。在本设计中,软件设计要力求做到以下几点:

1.软件结构清晰,简捷,流程合理。

2.各功能程序实现模块化,子程序化。这样,即便于调试、链接,又便于移植、修改。 3.程序存储区,数据存储区要合理规划,既能节约内存容量,又使操作方便。

4.运行状态实现标志化管理。各个功能程序运行状态,运行结果以及运行要求都要设置状态标志以便查询,程序的转移、运行、控制都可通过状态标志条件来控制。

5.经过调试修改后的程序应进行规范化,除去修改的痕迹,以便于交流和借鉴,也为以后的软件模块化、标准化打下基础。

6.实现全面软件抗干扰设计。软件抗干扰是单片机应用系统提高可靠性的有利措施。

3.2软件的总体设计

系统整机工作是由STC89C51单片机控制,所以系统软件应该完成的工作应该分为系统初始化部分和主体循环部分2个部分。

系统初始化部分主要是对系统的按键值、时钟芯片、液晶显示器进行设置,本系统的时间是通过时钟芯片DS1302来取得,并将值送入主控芯,通过液晶显示器来显示,时间、日期的修改通过按键来控制。所以要对按键、时钟芯片、液晶显示器进行初始化。而其他模块的初始化在各模块函数中初始化。系统初始化还对一些变量进行定义、赋初值。

3.3系统程序流程总框图

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次,这样可以在一秒之内测量一次被测温度[5],[6]。其程序流程见图3-1所示。

14

初始化

调用显示子程序 1S到? N Y Y 初次上电 N 读出温度值、 时间数据,显 示数据刷新 发温度转换开始命令 图3-1 主程序流程图

3.3.1温度读取函数

温度检测相关函数包括:DS18B20的初始化函数,DS18B20的温度读取函数,DS18B20的温度转换函数等,通过在函数中调用温度读取函数将一次循环内的温度值存入全局变量tvalue中。

1 .DS18B20的初始化函数

由于DS18B20是单总线的时序工作方式,所以每次工作前都需要初始化。首先由总线拉低480-960us,而后释放总线60-120us,此后会有DS18B20自己拉地60-240us,然后释放总线。这样就完成了DS18B20的初始化过程。

2.DS18B20的温度读取函数

读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图3-2所示。

15

发DS18B20复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 Y N 9字节完? Y CRC校验正?N 移入温度暂存器 结束 图3-2 读出温度子程序流程图

3.DS18B20的温度转换函数

通过写字节函数向DS18B20写命令字采集并转换温度值,然后通过读字节函数从DS18B20读取转换后的数字两温度值并保存于全局变量tvalue中。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。

3.3.2显示程序

1602字符型LCD流程设计如下:

16

1602初始化 延时15ms 显示模式设置 延时5ms 显示关闭 延时5ms 显示清屏 延时5ms 显示光标移动设置 延时5ms 显示开及光标设置 显示位置设置 延时 显示温度各位数值

图4-3 1602液晶驱动程序流程图

显示器1602初始化后延时15ms,显示模式设置,再延时5ms,显示关闭,延时5ms显示清屏,再延时5ms显示光标移动设置延时5ms显示开及光标设置,然后显示位置设置,延时,显示温度各位数值。此部分主要程序过长,参见附录二。

17

第四章 制作与调试

4.1软件调试

在程序编写的过程中,我遇到了很多难题,在参考了许多C语言编程类书籍及其他C语言程序加上老师和同学的帮助下,终于完成了此次编程。

硬件就像人的躯体,软件就好比人的灵魂,两者缺一不可。通过此次编程中,我总结了以下的一点个人经验:

1.先把程序需要实现的几个不同功能分块,然后对每个功能进行编程,最终在主程序中进行调用。

2.在主程序中分别对每一个功能子程序进行调用,在PC机上进行仿真,确定在单独一个子程序下能实现它需要完成的功能。

3.对所有子程序进行总和,在PC机上进行仿真,确定所有子程序一起作用时功能完好。 4.下载到单片机,观察程序运行是否正确,不正确的话,先确认电路是否正确,在找相应功能程序进行校对与修改。C语言是一种对语法要求很高的语言,所以检查的时候要小心,仔细。

4.2硬件制作

1.画PCB图

启动protel DXP,建立一个新的项目文件并保存。在项目文件下,建立一个原理图设计文件,将原理图画在此文件中,对每个器件的封装进行修改,并保存。新建PCB文件,将画好的原理图导入PCB中,修改焊盘,进行布线。布好线后,对某些地方进行填充,这样可以节约腐蚀的时间,也可以节约腐蚀液的使用量[9]。

2.制板

(1)检查印制板的印制线是否有断路,是否与其它线或是焊盘粘连,焊盘是否有脱落等等。 (2) 先用万用表复核目测中认为可疑的连接或是接点,检查它们的通短状态是否与设计规定相符。再检查各种电源线与地线之间是否有短路现象。短路现象一定要在器件安装及加电前检查出。

(3)打孔时要注意选择合适的位置。 3.编译程序

启动Keil,新建一个工程,选择单片机,保存。新建文本,复制程序,点保存如果是C语言则后缀为.C,如果是汇编语言则后缀位.asm,保存,在编译。

[7]

4.3硬件调试

1.显示电路调试

编写一段小程序,在液晶任一位置显示确认显示电路无误。在此显示功能成功实现。 2.温度传感器电路调试

DS18B20接线简单,GND接地,VCC接+5V,DQ接单片机P3.6口并上拉一4.7K电阻,根据电路图检测电路无误。通过温度检测程序调试无法正常显示室内温度,在更换过2只DS18B20后仍无

18

法正常显示温度,经多次确认硬件连接无误发现由于其时序工作方式,温度检测方面的主要问题出在软件方面。经过几次的软件修改能正常显示室温,确认DS18B20硬件电路正确,DS18B20可以正常工作。

3.时钟电路调试

根据时钟检测电路原理图搭建时钟检测电路。其中主要器件是串行实时时钟芯片DS1302和32.756kHz晶振。通过时钟检测程序进行写时间的调试:经单步运行观察时间寄存器的数据成功变化。通过时钟检测程序进行读时间的调试:经运行在液晶显示器上成功显示数据,并且随时间的变化而变化。

4.报警电路调试

拉高单片机P3.7口输出电平,确认蜂鸣器是否会发出声音,在拉低P3.7口电平,确认蜂鸣器是否停止发出声音。

19

结 论

本系统充分利用了STC89C51系统单片机软、硬件资源,引入了智能化分析功能,提高了系统的可靠性和安全性。该温度控制系统具有以下几个特点:①利用单片机去控制硬件电路,打破传统的专用硬件的形式,使电路更加灵活,更加快捷。②采用单片机作为核心的控制元件具有功能强、性能可靠、电路简单、成本低等特点。③该系统具有读数方便,测温范围广,测温准确,、显示直观、功能多样、成本低廉等诸多优点。④该系统能够应用于各个领域范围,具有广阔的市场前景。但是,该系统也还有自身的不足之处,主要表现在以下几个方面:①该系统由于采用不锈钢封装温度传感器DS18B20,虽然可以进行对水温或潮湿环境的监测,但是也延迟了温度数据传递的时间,具有一定的延时性。②该系统可以继电器对外部器件操作来降低或提高外界环境温度,但是却无法控制升温或降温的速度。③该系统具有所有电子产品的通病,电子器件越多,越复杂化,故障机率必然越高,加上电子器件怕潮湿,怕强磁电,怕强震动,使它对使用环境有一定要求。

从这次的毕业设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

20

参考文献

[1]王超群.不断发展的8051单片机[J].电子产品世界,2006,(06)

[2]王永刚.浅议单片机硬件设计和软件设计的相互关系[J].赤峰学院学报(自然科学版),2008,(08) [3]赵文博.单片机语言C51程序设计[M].北京:人民邮电出版社,2006. [4]谭浩强.C语言设计.北京:清华大学出版社.2005.7

[5]赵丽娟,邵欣.基于单片机的温度监控系统的设计与实现.机械制造,2006 [6]张开生,郭国法.MCS-51单片机温度控制系统的设计.微计算机信息,2005 [7]C51 Compiler User’s Guide.Keil Elektronik. GmbHand Keil Software.1999 [8]ATMEL.B-bit Microcontroller with 8K Bytes Flash AT89C52.2000 [9]Protel DXP2004 SP2印制电路板.机械工业出版社.2009年04月

[10]马磊娟,陆剑.AT89S系列单片机的编程探索[J].技术与市场, 2009,(03). [11]李朝青.单片机原理及接口技术.北京航空航天大学出版社.2006.12

21

致 谢

电子专业是一个很热门的专业,电子制作是枯燥而又具有挑战性的。在这里首先要感谢我的导师谢建平老师。谢建平老师平日里工作繁多,但在我做毕业设计的每个阶段,从论文的选题、文献的采集、框架的设计、结构的布局到最终的论文定稿,从内容到格式,从标题到标点,都给予了我悉心的指导。我的设计较为复杂烦琐,但是谢建平老师仍然细心地纠正其中的错误。除了敬佩谢建平老师的专业水平外,他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。

感谢大学四年来所有的老师和电信062本的各位同学,与他们的交流使我受益颇多。正是因为有了你们的支持和鼓励。此次毕业设计才会顺利完成。

22

附录一 C语言源程序

#include #include #include #define uchar unsigned char #define uint unsigned int sbit beep = P3^7;//定义扬声器 sbit DQ = P2 ^ 0;//ds18B20数据位 uint tvalue;//温度值

uchar tflag,flagdat,t;//温度正负标志 sbit KEY_1 = P2^7;

sbit KEY_2 = P2^6; sbit KEY_3 = P2^5; sbit KEY_4 = P2^4;

sbit LED1 = P1^0; //电源指示灯 sbit LED2 = P1^1; //温度超上限 sbit LED3 = P1^2; //温度超下限 sbit RS = P1^5; sbit RW = P1^6;

sbit E = P1^7; #define Lcd_Bus P0

sbit clock_clk = P2 ^ 1;//ds1302_clk(时钟线) sbit clock_dat = P2 ^ 2;//ds1302_dat(数据线) sbit clock_Rst = P2 ^ 3;//ds1302_Rst(复位线) sbit a0 = ACC ^ 0; sbit a1 = ACC ^ 1; sbit a2 = ACC ^ 2; sbit a3 = ACC ^ 3; sbit a4 = ACC ^ 4; sbit a5 = ACC ^ 5; sbit a6 = ACC ^ 6; sbit a7 = ACC ^ 7;

23

unsigned char hh,mm,ss,n,n1,n2,e=0; bit w = 0;

static unsigned char menu = 0; static unsigned char keys = 0; static unsigned char timecount = 0; void DelayM(unsigned int a){ unsigned char i; while( --a != 0){

for(i = 0; i < 125; i++);

}

}

void Delay(int num){ while(num--) ; }

void chk_busy(){ RS=0; RW=1; E=1;

Lcd_Bus=0xff;

while((Lcd_Bus&0x80)==0x80); E=0; }

void write_com(unsigned char cmdcode){ chk_busy(); RS=0; RW=0; E=1;

Lcd_Bus=cmdcode; E=0; }

void write_data(unsigned char Dispdata){ chk_busy(); RS=1; RW=0; E=1;

Lcd_Bus=Dispdata;

24

E=0; }

void lcm_init(){

write_com(0x30); write_com(0x0c); write_com(0x01); }

void lcm_w_word(unsigned char *s){ while(*s>0){ write_data(*s); s++; } }

void write_data1(unsigned char Dispdata){

chk_busy(); RS=1; RW=0; E=1;

Lcd_Bus=Dispdata; DelayM(10); E=0; }

void lcm_w_word1(unsigned char *s){ while(*s>0){ write_data1(*s); s++; } }

void lcm_w_test(bit i,unsigned char word){ if(i == 0){

write_com(word);

}else{ write_data(word);

} }

void lcm_clr(void){

25

lcm_w_test(0,0x01); }

void delay_18B20(unsigned int i) {

while(i--); }

void ds1820rst()//ds1820 { unsigned char x=0; DQ = 1; delay_18B20(4); DQ = 0; delay_18B20(100); DQ = 1; delay_18B20(40); }

unsigned char ds1820rd() { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) dat|=0x80; delay_18B20(10); }

return(dat); }

void ds1820wr(uchar wdata) {unsigned char i=0; for (i=8; i>0; i--) { DQ = 0;

DQ = wdata&0x01; delay_18B20(10); DQ = 1;

26

wdata>>=1; } }

read_temp() {uchar a,b; ds1820rst(); ds1820wr(0xcc); ds1820wr(0x44); ds1820rst(); ds1820wr(0xcc); ds1820wr(0xbe); a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else

{tvalue=~tvalue+1; tflag=1; }

tvalue=tvalue*(0.625); return(tvalue); }

void lcm_w_ss(void);void lcm_w_mm(void); void lcm_w_hh(void);void lcm_w_dd(void); void lcm_w_mo(void);void lcm_w_yy(void); void lcm_w_xq(void); unsigned char clock_in(void); void clock_out(unsigned char dd); void Init_1302(void);

unsigned char read_clock(unsigned char ord); void read_clockS(void); void Set_time(unsigned char sel);

void write_clock(unsigned char ord, unsigned char dd);

27

void updata (void);

void Set_time(unsigned char sel) {

signed char address,item; signed char max,mini; lcm_w_test(0,0x9a); lcm_w_word(\调整\

if(sel==2) {lcm_w_word(\秒钟\ if(sel==1) {lcm_w_word(\分钟\ if(sel==0) {lcm_w_word(\小时\ item=((read_clock(address+1))/16)*10 + (read_clock(address+1)); if(KEY_2 == 0) {

item++; }

if(KEY_4 == 0) { item--; }

if(item>max) item=mini;

if(item

write_clock(address,(item/10)*16+item); write_clock(0x8e,0x80); updata (); }

void Init_1302(void){ unsigned char f;

if(read_clock(0xc1) != 0xaa){ write_clock(0x8e,0x00); write_clock(0x8c,0x07); write_clock(0x8a,0x01); write_clock(0x88,0x01); write_clock(0x86,0x01);

write_clock(0x84,0x00);

28

write_clock(0x82,0x00); write_clock(0x80,0x00); write_clock(0x90,0xa5); write_clock(0xc0,0xaa); for(f=0;f<60;f=f+2){ write_clock(0xc2+f,0x00);

}

write_clock(0x8e,0x80);

} }

void write_clock(unsigned char ord, unsigned char dd){ clock_clk=0; clock_Rst=0; clock_Rst=1; clock_out(ord); clock_out(dd); clock_Rst=0; clock_clk=1; }

void clock_out(unsigned char dd){ ACC=dd;

clock_dat=a0; clock_clk=1; clock_clk=0; clock_dat=a1; clock_clk=1; clock_clk=0; clock_dat=a2; clock_clk=1; clock_clk=0; clock_dat=a3; clock_clk=1; clock_clk=0; clock_dat=a4; clock_clk=1; clock_clk=0; clock_dat=a5; clock_clk=1; clock_clk=0; clock_dat=a6; clock_clk=1; clock_clk=0; clock_dat=a7; clock_clk=1; clock_clk=0; }

unsigned char clock_in(void){ clock_dat=1; a0=clock_dat;

clock_clk=1; clock_clk=0; a1=clock_dat; clock_clk=1; clock_clk=0; a2=clock_dat; clock_clk=1; clock_clk=0; a3=clock_dat;

29

clock_clk=1; clock_clk=0; a4=clock_dat; clock_clk=1; clock_clk=0; a5=clock_dat; clock_clk=1; clock_clk=0; a6=clock_dat; clock_clk=1; clock_clk=0; a7=clock_dat; return(ACC); }

unsigned char read_clock(unsigned char ord){ unsigned char dd=0; clock_clk=0; clock_Rst=0; clock_Rst=1; clock_out(ord); dd=clock_in(); clock_Rst=0; clock_clk=1; return(dd); }

void Beep(void) {

unsigned char a; for(a=60;a>0;a--) {

beep = ~beep; Delay(100);

}

for(a=100;a>0;a--) {

beep = ~beep; Delay(80);//

}

for(a=100;a>0;a--) { beep = ~beep; Delay(30);//

} beep = 1;

30

}

void Beep_set(void){ unsigned char a; for(a=50;a>0;a--){ beep = ~beep; Delay(100);

}

for(a=100;a>0;a--){ beep = ~beep; Delay(50); }

for(a=50;a>0;a--){ beep = ~beep; Delay(100); } beep = 1; }

void Beep_key(void){ unsigned char a; for(a=100;a>0;a--){ beep = ~beep; Delay(50); } beep = 1; }

void lcm_w_hh(void){ if(read_clock(0x85) != hh){ hh = read_clock(0x85); if (hh > 0x07 && hh < 0x22 && w == 0){ Beep();

}

}

lcm_w_test(0,0x92); lcm_w_test(1,(hh/16)+0x30); lcm_w_test(1,hh+0x30);

}

31

void lcm_w_mm(void){ if(read_clock(0x83) != mm) {

mm = read_clock(0x83);

}

lcm_w_test(0,0x93); lcm_w_test(1,0x3a); //\ lcm_w_test(1,(mm/16)+0x30); lcm_w_test(1,mm+0x30); lcm_w_test(1,0x3a); //\

}

void write1() {

uchar w1,w2,w3,w4; w1=tvalue/1000+0x30; w2=tvalue00/100+0x30; w3=tvalue0/10+0x30; w4=tvalue+0x30; if(tflag==0) flagdat=0x20; else

flagdat=0x2d; if(w1==0x30) {w1=0x20; if(w2==0x30) {w2=0x20; } }

lcm_w_test(0,0x8c); lcm_w_test(1,0x20); lcm_w_test(1,flagdat); //lcm_w_test(1,w1); lcm_w_test(1,w2); lcm_w_test(1,w3); lcm_w_test(1,0x2e); lcm_w_test(1,w4);

32

lcm_w_word(\℃\

t=(tvalue00/100)*10+tvalue0/10; } void updata (void){ lcm_w_ss(); lcm_w_mm(); lcm_w_hh();

}

void lcm_w_ss(void) {

unsigned int i=0;

unsigned char a=0,b=0,c=0; if(read_clock(0x81) != ss){ ss = read_clock(0x81); lcm_w_test(0,0x95);

lcm_w_test(1,(ss/16)+0x30);

lcm_w_test(1,ss+0x30); } }

void welcome(void){

lcm_w_word1(\ 温度控制系统 } void del() { while(1) {

if (KEY_3 == 0) // {

DelayM(20); if(KEY_3 == 0 ) {

Beep_key(); while(KEY_3 == 0); n1++;

if (n1 >= 100 ){n1 = 0;}

当前温度 上限 ℃下限℃\33

}

}

if (KEY_2 == 0) // {

DelayM(20); if(KEY_2 == 0 ) {

Beep_key(); while(KEY_2 == 0); n2++;

if (n2>= 100 ){n2 = 0;} }

}

lcm_w_test(0,0x8a);

lcm_w_test(1,(n1/10)+0x30); lcm_w_test(1,n1+0x30); lcm_w_test(0,0x8e); lcm_w_test(1,(n2/10)+0x30); lcm_w_test(1,n2+0x30); if (KEY_1 == 0) // {

DelayM(20);

if(KEY_1 == 0 && w == 0) {

Beep_key(); while(KEY_1 == 0); Beep();

lcm_clr();

welcome(); break; }

}

} }

void tiaoshi() {

34

while(1)

{

if (KEY_3 == 0)

{

DelayM(20); if(KEY_3 == 0 && w == 1) {

Beep_key(); e++;

if (e >= 3 ){e = 0;}

Set_time(e);

}

if(KEY_3 == 0 && w == 0) { Beep_set(); lcm_clr(); w=1;

Set_time(e);

}

while(KEY_3 == 0);

}

if (KEY_1 == 0)

{

DelayM(20);

if(KEY_1 == 0 && w == 1)

{

Beep_set(); w = 0;

e = 0;

}

lcm_clr();

welcome();

break;

}

if (KEY_2 == 0 && w == 1)

{

35

DelayM(20);

if(KEY_2 == 0 && w == 1)

{

Beep_key();

Set_time(e);

}

while(KEY_2 == 0);

}

if (KEY_4 == 0 && w == 1)

{

DelayM(20); if(KEY_4 == 0 && w == 1) {

Beep_key();

Set_time(e);

}

while(KEY_4 == 0);

}

} } main() {

KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1; hh=0xff;mm=0xff;ss=0xff; n1=90; n2=5; LED1=0; Init_1302(); lcm_init(); lcm_clr(); welcome(); while(1) { LED2=1; LED3=1;

read_temp();

36

write1(); lcm_w_ss(); lcm_w_mm(); lcm_w_hh();

if (KEY_4 == 0)

{

DelayM(20); if(KEY_4 == 0 ) {

Beep_key(); while(KEY_4 == 0);

lcm_clr();

lcm_w_test(0,0x80);

lcm_w_word(\ \

del(); } }

if (KEY_3 == 0) {

DelayM(20); if(KEY_3 == 0 ) {

Beep_key(); while(KEY_3 == 0);

Beep_set();

lcm_clr(); w=1; Set_time(e); tiaoshi(); }

}

lcm_w_test(0,0x9a);

lcm_w_test(1,(n1/10)+0x30); lcm_w_test(1,n1+0x30); lcm_w_test(0,0x9e);

设置温度上限 ℃下限℃ 37

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

Top