郑州轻工业学院
课程设计说明书
题 目: 温度监控报警系统
姓 名: xxxxxxxxxxx 院 (系): 电气信息工程学院 专业班级:电气工程及其自动化xxxx班 学 号: xxxxxxxxxxxxxxxxx 指导教师: xxxxxxxx
成 绩:
时间:2013年12月23日至 2014年1月10日
郑州轻工业学院 课 程 设 计 任 务 书
题目 温度监控报警系统设计 专业、班级: 电气工程10-01班 学号: 26 姓名 刘湘军 主要内容、基本要求、主要参考资料等:
一、设计内容
1.用DS18B20设计一款能够显示当前温度值的温度计; 2.通过切换按钮可以切换华氏和摄氏度显示; 3.创新部分。
二、设计文件及图纸要求
1.设计说明书一份;
2.系统原理图一份; 3.印刷电路图PCB一份。
完 成 期 限:
指导教师签名:
课程负责人签名:
2013年12月
目录
摘要 ................................................................................................................................................................. 1 1 绪论 ............................................................................................................................................................. 3
1.1背景及意义 ...................................................................................................................................... 3 1.2工作原理 .......................................................................................................................................... 3 2 系统硬件设计 ............................................................................................................................................. 5
2.1电源电路 .......................................................................................................................................... 5 2.1主控制器STC89C52 .......................................................................................................................... 5
2.1.1 系统结构图 .......................................................................................................................... 5 2.1.3 功能特性描述 ...................................................................................................................... 6 2.1.4 各引脚功能 .......................................................................................................................... 6 2.2单总线数字温度传感器DSl8B20 .................................................................................................... 8
2.2.1功能特性描述 ....................................................................................................................... 8 2.2.2引脚结构............................................................................................................................... 8 2.3 存储模块AT24C02 .........................................................................................................................10 2.5 USB串行通信接口PL232 ..............................................................................................................11 2.4 数码管显示模块............................................................................................................................12 2.5 键盘输入模块................................................................................................................................12 3 系统软件设计 ...........................................................................................................................................13
3.1 软件开发环境................................................................................................................................13
3.1.1 Keil简介 ...........................................................................................................................13 3.1.2 系统概述............................................................................................................................13 3.1.3 Keil C51单片机软件开发系统的整体结构 ...................................................................13 3.2 主程序 ...........................................................................................................................................14 3.3数码管显示功能.............................................................................................................................14 3.4存储功能电路.................................................................................................................................15 3.5温度采集电路.................................................................................................................................16 结论 ...............................................................................................................................................................18 致谢 ...............................................................................................................................................................19 参考文献 ....................................................................................................................................................... 20 附录
电气工程及其自动化专业课程设计 2010级01班26号
摘要
随着社会的发展和技术的进步,人们越来越注重温度检测与显示的重要性。温度检测与状态显示技术与设备已普遍应用于各行各业,市场上的产品层出不穷。温度检测及显示也逐渐采用自动化控制技术来实现监控。对现代社会来说,不管是医学还是工业,温度的检测与监控尤为重要。
本文设计了一种基于51系列单片机的无线智能精密温控系统,可对外界温度进行测量、误差修正、判定传感器故障与高温报警,并具有键盘控制数码管显示功能。该系统采用了智能数字温度传感器DSl8820来对温度数据进行采集,并把采集的信号直接送入单片机进行处理,实时显示温度值,可以通过按键切换摄显示摄氏或华氏温度,并且拥有记忆同能,关机或者复位后设置温度仍然不变。本系统由单片机最小系统、温度采集、自动报警以及显示模块组成。实现功能:温度实时显示;可设定温度的上限或下限,当温度超过设定域值时发出声光报警信号;测量温度值可通过警报鸣响和报警灯发出讯息。
关键词: 单片机;DSl8B20;报警
1
电气工程及其自动化专业课程设计 2010级01班26号
Abstract
With the social development and technological progress, there is a growing emphasis on the importance of temperature measurement and display. Temperature detection and status display technology and equipment have been widely used in various industries, products on the market after another. Temperature measurement and display technology has gradually achieved by automatic control monitoring. Modern society, whether medical or industrial temperature detection and control is particularly important.
This paper presents a series of single-chip based on 51 wireless intelligent precision temperature control system, which can be measured on the outside temperature, error correction, and temperature sensor failure alarm determination and keyboard control with digital display. The system uses an intelligent digital temperature sensor DSl8820 tocollect data on the temperature and the signal acquisition directly into the micro controller for processing, real-time display temperature values, according to the parameters set to complete the corresponding intelligent control. The system consists of the smallest single-chip systems, temperature acquisition, automatic alarm and display module. Functions:Real-time temperature display; may set upper or lower temperature audible alarm signal when the temperature exceeds the set threshold; measuring temperature values can besent a message by sirens and warning lights.
Keywords Microprocessor;DSl8B20;nRF905
2
电气工程及其自动化专业课程设计 2010级01班26号
1 绪论
1.1背景及意义
随着社会的发展和技术的进步,人们越来越注重温度检测与显示的重要性。温度检测与状态显示技术与设备已普遍应用于各行各业,市场上的产品层出不穷。温度检测及显示也逐渐采用自动化控制技术来实现监控。对现代社会来说,不管是医学还是工业温度的检测与监控尤为重要。
本课题就是一个温度检测及状态显示监控系统,该系统由无线接收和发射模块、语音播报、温度采集、自动报警以及显示模块组成。由于单片机技术比较成熟,在价格方面也比较低廉,而且易于控制,所以选用一块8051单片机来控制外围的电路。系统硬件设计主要包括温度传感器模块、单片机系统模块、显示电路模块等。系统利用了当今成熟的先进技术,具有高度的可靠性,其温度显示、各种报警功能及各项可用性指标均达到相关的规定。同时简洁、实用、性能价格比高也是其优点。另外,在单片机程序设计方面采用C语言。
该课题的设计是对电子信息工程专业主干课程电子技术基础、单片机原理与应用、程序设计语言(C语言)以及相关课程设计等的延伸与拓展,是将理论与技术联系生产实际的主要内容,对我们的基础知识及相关专业知识的实际应用、计算机应用能力、文献资料检索等均有较高的提升。
1.2工作原理
无线温度采集系统是一种基于射频技术的无线温度检测装置。本系统由传感器和接收机,以及显示芯片组成。传感器部分由数字温度传感器芯片18B20、单片机89C52组成,传感器采用电源供电;接收机无线接收来自传感器的温度数据,经过处理、保存后在数码管上显示,所存储的温度数据通过报警装置传出警报信息。
温度的采集主要基于单线数字温度传感器DS18B20芯片。Dallas 半导体公司的单线数字温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,支持3V~5.5V的电压范围,DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
3
电气工程及其自动化专业课程设计 2010级01班26号
数字单总线温度传感器是目前最新的测温器件,它集温度测量,A/D转换于一体,具有单总线结构,数字量输出,直接与微机接口等优点。既可用它组成单路温度测量装置,也可用它组成多路温度测量装置,文章介绍的单路温度测量装置已研制成产品,产品经测试在-10°C ~70°C间测得误差为0.25°C,80°C≤T≤105°C时误差为0.5°C,当T>105°C误差为增大到1°C左右。
经温度传感器采集温度并由单片机处理后,温度数据信息将在数码管显示芯片上进行显示。数码管也称LED数码管,晶美、光电、不同行业人士对数码管的称呼不一样,其实都是同样的产品。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。本系统采用了两块4位共阴极数码管显示实时温度。
本系统的温度采集与显示,监控和报警功能均有STC89C52单片控制完成。相比较而言STC公司的89C51更实用,因它不但和8051指令、管脚完全兼容,而且其片内的4K程序存储器是Flash工艺的,这种工艺的存储器用户可以用电的方式瞬间擦除、改写,一般专为STC89xx做的编程器均带有这些功能。显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短。写入单片机内的程序还可以进行加密,这又很好地保护了我们的劳动成果。
4
图2-1 电源电路 2.1电源电路
2.1.1 系统结构图
统,其他工能模块见后述。
2.1主控制器STC89C52
2 系统硬件设计
电气工程及其自动化专业课程设计 2010级01班26号
端滤波电容,D3为电源指示。当输出电较大时,7805应配上散热板。
9V直流电压的稳压电源电路。IC采用集成稳压器7805,C2~C5分别为输入端和输出
如下所示为单片机温度监控报警系统的系统图,分别由单片机最小系统和报警系
78XX系列集成稳压器的典型应用电路如下图所示,这是一个输入电压为220V输出正
图2-2 系统结构
5
电气工程及其自动化专业课程设计 2010级01班26号
2.1.3 功能特性描述
STC89C52是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。它与MCA-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51系列产品没有的功能。
STC89C52可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。只要程序长度小于4K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比,不易损坏器件,没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。工作电压范围宽(2.7V~6V),全静态工作,工作频率宽在0Hz~24MHz之间,比8751/87C51等51系列的6MHz~12MHz更具有灵活性,系统能快能慢。STC89C52芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。
2.1.4 各引脚功能
VCC:电源 GND:地
P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1口:P1口是一个具有内部上拉电阻的8位双向I/O 口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示:
P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入
6
电气工程及其自动化专业课程设计 2010级01班26号
口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在Flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89C52特殊功能(第二功能)使用,如下表所示。
表2-1 P3口特殊功能
引脚号 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD(串行输入) TXD(串行输出) INT0(外部中断0) INT1(外部中断1) T0(定时器0外部输入) T1(定时器1外部输入) WR(外部数据存储器写选通) RD(外部数据存储器读选通) RST:复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。
ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置 “1”,ALE操作将无效。这一位置 “1”,ALE仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89C52
从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在Flash编程期间,EA也接收12伏VPP电压。
7
电气工程及其自动化专业课程设计 2010级01班26号
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。
2.2单总线数字温度传感器DSl8B20
2.2.1功能特性描述
无线温度的采集主要基于单线数字温度传感器DS18B20芯片。Dallas 半导体公司的单线数字温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,支持3V~5.5V的电压范围,DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
数字单总线温度传感器是目前最新的测温器件,它集温度测量、A/D转换于一体,具有单总线结构、数字量输出、直接与微机接口等优点。既可用它组成单路温度测量装置,也可用它组成多路温度测量装置,文章介绍的单路温度测量装置已研制成产品,产品经测试在-10°C ~70°C间测得误差为0.25°C,80°C≤T≤105°C时误差为0.5°C,当T>105°C误差为增大到1°C左右。
其主要件能指标:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V; ●零待机功耗;
●温度以9或12位数字; ●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; ●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
2.2.2引脚结构
DS18B20采用如图2-2所示的3脚PR-35封装或8脚SOIC封装。DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二
8
DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。
电气工程及其自动化专业课程设计 2010级01班26号
进制补码读数形式提供,以0.0625°C/LSB形式表达,其中S为符号位。12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
图2-3 DS18B20芯片
DS18B20温度传感器的存储器:
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0。R1和R0用来设置分辨率,如表2-2所示:
表2-2 分辨率设置表
R1 0 0 1 1 R0 0 1 0 1 分辨率 9位 10位 11位 12位 温度最大转换时间 96.75ms 187.5ms 375ms 750ms 根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240
图2-4 DS18B20模块
9
电气工程及其自动化专业课程设计 2010级01班26号
微秒的存在低脉冲,主CPU收到此信号表示复位成功。
在硬件上,DS18B20与单片机的连接有两种方法,一种是Vcc接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时Vcc、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。
单片机对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
DS18B20有六条控制命令,如表2-3所示:
表2-3 DS18B20控制命令
指令 温度转换 读暂存器 写暂存器 复制暂存器 重新调E2RAM 读电源供电方式 约定代码 44H BEH 4EH 48H B8H B4H 操作说明 启动DS18B20进行温度转换 读暂存器9个字节内容 将数据写入暂存器的TH、TL字节 把暂存器的TH、TL字节写到E2RAM中 把E2RAM中的TH、TL字节写到暂存器TH、TL字节 启动DS18B20发送电源供电方式的信号给主CPU 2.3 存储模块AT24C02
AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号
的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1
图2-5 AT24C02存储模块 和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。
10
电气工程及其自动化专业课程设计 2010级01班26号
表2-4 AT24C02引脚说明
管脚名称 A0 A1 A2 SDA SCL WP Vcc Vss SCL 串行时钟
功能 器件地址选择 串行数据/地址 串行时钟 写保护 +1.8V~ 6.0V 工作电压 地 AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。
SDA 串行数据/地址
AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。
A0、A1、A2 器件地址输入端
这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02 时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。
WP 写保护
如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss 或悬空允许器件进行正常的读/写操作。
2.5 USB串行通信接口PL232
PL2303 是Prolific 公司生产的一种高度集成的RS232-USB接口转换器,可提供一个RS232 全双工异步串行通信装置与USB 功能接口便利连接的解决方案。该器件内置USB功能控制器、USB 收发器、振荡器和带有全部调制解调器控制信号的UART, 只需外接几只电容就可实现USB 信号与RS232 信号的转换,能够方便嵌入到各种设备;该器件作为USB/RS232 双向转换器,一方面从主机接收USB 数据并将其转换为RS232 信息流格式发送给外设;另一方面从RS232 外设接收数据转换为USB 数据格式传送回主机。这些工作全部由器件自动完成,开发者无需考虑固件设计。
PL2303 的高兼容驱动可在大多操作系统上模拟成传统COM 端口,并允许基于COM 端口应用可方便地转换成USB接口应用,通讯波特率高达6 Mb/s。在工作模式和休眠模式时都具有功耗低,是嵌入式系统手持设备的理想选择。该器件具有以下特征:完全兼容USB1.1协议;可调节的3~5 V 输出电压,满足3V、3.3V和5V不同应用需求;支持
11
电气工程及其自动化专业课程设计 2010级01班26号
完整的RS232接口,可编程设置的波特率:75b/s~6 Mb/s,并为外部串行接口提供电源;512字节可调的双向数据缓存;支持默认的ROM和外部EEPROM存储设备配置信息,具有
I2C
总线接口,支持从外部
MODEM 信号远程唤醒;支持
Windows98,Windows2000,WindowsXP,Windows Vista,Windows7等操作系统;28引脚的SOIC封装。
2.4 数码管显示模块
LED数码管与单片机的P0口相连,单片机将采集到的温度值转化为与数码管对应的数据,通过P0口输出显示。即信号通过译码管的端口a、b、c、d、e、f、g 、dp 端来控制每段译码管的亮灭与否,同时通过各端口来控制两块四数码管显示。在本次设计中,用74HC138译码器选择驱动控制数码管,可同时显示实时温度、设定温度以及报警功能的工作状态,并能通过按键切换摄氏或华氏显示。同时当采集到的温度值超过所设置的范围时,单片机会输出一信号,通过CPU处理后驱动蜂鸣器发出报警信号。LED数码管报警电路如下图所示所示。
图2-5 八段数码管
2.5 键盘输入模块
本系统由于使用按键较少,可只是用独立按键即可简单控制系统工作,如下图所示。分别是总开关、复位按键、摄氏或华氏切换按键、温度设定按键。
12
图2-6 独立按键
电气工程及其自动化专业课程设计 2010级01班26号
3 系统软件设计
3.1 软件开发环境
3.1.1 Keil简介
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
3.1.2 系统概述
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。
3.1.3 Keil C51单片机软件开发系统的整体结构
13
电气工程及其自动化专业课程设计 2010级01班26号
C51工具包的整体结构中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
使用独立的Keil仿真器时,注意事项:
* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。
* 仿真器上的复位按钮只复位仿真芯片,不复位目标系统。
* 仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。
3.2 主程序
该系统的软件采用模块结构,由C语言编写完成。主要是对各功能模块子程序调用和处理。该系统用两片4位一体的单片机进行显示,采用了动态扫描显示,所以需注意主程序的延时问题。
3.3数码管显示功能
LED显示器工作方式有两种:静态显示方式和动态显示方式,本系统采用的是动态显示,通过译码器输出作为位选,P0口输出作为段选信号。静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
图3-2 数码管模块
这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显
14
电气工程及其自动化专业课程设计 2010级01班26号
示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。数码管分为共阴极和共阳极两种,本系统采用的共阴极数码管,以下是其内部电路图:
3.4存储功能电路
图3-3 数码管内部电路
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化如有图所示为该芯片电路图。
起始和终止信号 :SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
数据传送格式(1)字节传送与应答
每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,TX-1B实验板上三根地址线都为0。最后一位R/W为告诉从机下一字节数据是要读还是写,0为写入,1为读出。
15
电气工程及其自动化专业课程设计 2010级01班26号
图3-4 AT24C02数据书写时序
3.5温度采集电路
DS18B20的工作严格遵守单总线器件的通信协议,以保证数据的完整性。单总线协议定义了复位脉冲、应答脉冲、写0、写1、读0和读1几种类型的信号,所有的单总线命令序列都是由这些基本的信号类型组成。在这些信号中,除了应答脉冲外,其他均由主机发出同步信号,并且发送的所有命令和数据都是字节的低位在前。在本设计中,总线上只有一个温度传感器,转换精度为12位。读温度的流程如图3-1所示:
图3-1 温度控制流程
16
电气工程及其自动化专业课程设计 2010级01班26号
17
电气工程及其自动化专业课程设计 2010级01班26号
结论
通过这次试验,更加深入的了解了温度传感器,EEPROM AT24C02芯片,以及51单片机的结构功能和具体应用,对电路PCB板有了更深的认识,开阔了眼界,丰富了知识,增长了见识。
在老师和同学们的帮助下,完成了本次试验,所设计的温度监控报警系统,可以实现温度的实时数据采集,能够设置温度上限,实现报警功能,并且在系统复位或者掉电后不会丢失设定温度上限值。通过这次课程设计,得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是C语言)的掌握方面都能向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
这次设计过程中,虽然系统结构比较简单,但是由于自己的知识有限,在设计过程中遇到不少问题。其中一个是数码管动态扫描循环受主程序影响的问题,另外还有AT24C02多字节换页读写等问题;不过最后通过老师和同学的帮助下,一一解决,使得该系统完成任务的基本要求,并且增加了创新部分,使得该温度监控报警系统更加完善,使用方便。
18
电气工程及其自动化专业课程设计 2010级01班26号
致谢
在这次课程设计的完成过程中,我得到了许多人的帮助。
首先我要感谢我的老师在课程设计上给予我的指导、提供给我的支持和帮助,这是我能顺利完成这次报告的主要原因,更重要的是老师帮我解决了许多技术上的难题,让我能把系统做得更加完善。在此期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
其次,我要感谢帮助过我的同学,他也为我解决了不少我不太明白的设计上的难题。同时也感谢学院为我提供良好的做毕业设计的环境。
最后再一次感谢所有在设计中曾经帮助过我的良师益友和同学。
19
电气工程及其自动化专业课程设计 2010级01班26号
参考文献
[1]李朝青.单片机原理及接口技术[M].杭州:北京航空航天大学出版社,1998:4-9. [2]张毅坤. 单片微型计算机原理及应用[M].西安:西安电子科技大学出版社,1998:3-11. [3]余锡存,曹国华.单片机原理及接口技术[M].陕西:西安电子科技大学出版社,2000:2-8. [4]雷丽文.微机原理与接口技术[M].北京:电子工业出版社,1997.2:4-15. [5]李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994:5-12.
[6]黄贤武.传感器实际应用电路设计[M].成都:成都电子科技大学出版社,1997:30-44. [7]廖常初.现场总线概述[J].电工技术,1999:4-16.
[8]汤绮婷.基于射频模块nRF905的粮库无线温湿度监控系统[J].电子产品世界,2007(7) :23-28.
20
电气工程及其自动化专业课程设计 2010级01班26号
附录
/******************************************************************** * 文件名 : 温度采集DS18B20.c
* 任务描述: 1.用DS18B20设计一款能够显示当前温度值的温度计; 2.通过切换按钮可以切换华氏和摄氏度显示; 3.创新部分:(1)监控报警功能;(2)记忆功能;
***********************************************************************/ #include #define uchar unsigned char #define uint unsigned int #define jump_ROM 0xCC //Skip ROM(跳过ROM) #define start 0x44 //Convert Temperature(温度转换) #define read_EEROM 0xBE //Read Scratchpad(读暂存存储器) sbit SCL=P1^5; //24c08 SCL sbit SDA=P3^6; //24c08 SDA sbit DQ = P2^3; //DS18B20数据口 sbit IRIN=P3^3; sbit KEY2=P3^4; sbit KEY3=P3^2; sbit BELL=P3^5; sbit a=P1^0; sbit b=P1^1; sbit c=P1^2; sbit d=P1^3; sbit e=P1^4; sbit g=P1^6; sbit h=P1^7; unsigned char TMPH,TMPL,i,KEY1,temp,flag,n,sh,ge,m=1,cf=1; //m报警状态标志,cf摄氏华氏显示标志 uchar IRCOM[7]; uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管真值表 /******************************************************************** * 名称 : flash() * 功能 : 延时,时间为2个NOP,大概为2US * 输入 : 无 * 输出 : 无 ***********************************************************************/ 21 电气工程及其自动化专业课程设计 2010级01班26号 void flash(void) { _nop_(); _nop_(); } /******************************************************************** * 名称 : delay() * 功能 : 延时函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void delay(uint N) { int i; for(i=0; i * 功能 : 延时子程序,延时时间为 0.5ms * x 148 * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i)//1ms延时 { uchar x,j; for(j=0;jfor(x=0;x<=40;x++); } /******************************************************************** * 名称 : x24c02_init() * 功能 : 24c02初始化子程序 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void x24c02_init(void) { SCL = 1; flash(); SDA = 1; flash(); } 22 电气工程及其自动化专业课程设计 2010级01班26号 /******************************************************************** * 名称 : start(void) * 功能 : 启动I2C总线 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void start_24C02(void) { SCL = 1; flash(); SDA = 1; flash(); SDA = 0; flash(); SCL = 0; flash(); } /******************************************************************** * 名称 : stop() * 功能 : 停止I2C总线 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void stop() { SCL = 0; flash(); SDA = 0; flash(); SCL = 1; flash(); SDA = 1; flash(); } /******************************************************************** * 名称 : writex() * 功能 : 写一个字节 * 输入 : j(需要写入的值) * 输出 : 无 ***********************************************************************/ void writex(uchar j) { 23 电气工程及其自动化专业课程设计 2010级01班26号 uchar i,temp; temp = j; for(i=0; i<8; i++) { SCL = 0; flash(); SDA = (bit)(temp & 0x80); flash(); SCL = 1; flash(); temp = temp << 1; } SCL = 0; flash(); } /******************************************************************** * 名称 : readx() * 功能 : 读一个字节 * 输入 : 无 * 输出 : 读出的值 ***********************************************************************/ uchar readx(void) { uchar i, j, k = 0; for(i=0; i<8; i++) { SCL = 0; flash(); if(SDA == 1) { j = 1; } else j = 0; k = (k << 1) | j; SCL = 1; flash(); } return(k); } /******************************************************************** * 名称 : ack() * 功能 : I2C总线时钟 24 电气工程及其自动化专业课程设计 2010级01班26号 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void ack(void) { uchar i = 0; SCL = 1; flash(); while((SDA == 1) && (i < 255)) { i++; } SCL = 0; flash(); } /******************************************************************** * 名称 : x24c02_read() * 功能 : 从24c02中读出值 * 输入 : address(要在这个地址读取值) * 输出 : 从24c02中读出的值 ***********************************************************************/ uchar x24c02_read(uchar address) { uchar i; start_24C02(); writex(0xa0); ack(); writex(address); ack(); start_24C02(); writex(0xa1); ack(); i = readx(); stop(); return(i); } /******************************************************************** * 名称 : x24c02_write() * 功能 : 想24c02中写入数据 * 输入 : address(地址) , info(值) * 输出 : 无 ***********************************************************************/ 25 电气工程及其自动化专业课程设计 2010级01班26号 void x24c02_write(uchar address, uchar info) { start_24C02(); writex(0xa0); ack(); writex(address); ack(); writex(info); ack(); stop(); } /******************************************************************** * 名称 : Reset() * 功能 : 复位DS18B20 * 输入 : 无 * 输出 : 无 ***********************************************************************/ uchar Reset(void) { uchar deceive_ready; DQ = 0; delay(29); //480~960us DQ = 1; //释放总线 delay(3); //15~60us deceive_ready = DQ; delay(25); //480us左右 return(deceive_ready); } /******************************************************************** * 名称 : read_bit() * 功能 : 从DS18B20读一个位值 * 输入 : 无 * 输出 : 从DS18B20读出的一个位值 ***********************************************************************/ uchar read_bit(void) { uchar i; DQ = 0; //17ts后产生读时间间隙 DQ = 1; for(i=0; i<3; i++); //60us后释放总线 return(DQ); } 26 电气工程及其自动化专业课程设计 2010级01班26号 /******************************************************************** * 名称 : write_bit() 写时间隙 * 功能 : 向DS18B20写一位 * 输入 : bitval(要对DS18B20写入的位值) * 输出 : 无 ***********************************************************************/ void write_bit(uchar bitval) { DQ=0;if(bitval==1) //写0或1 DQ=1; delay(5); //延时60us以上 DQ=1; //1us } /******************************************************************** * 名称 : read_byte() * 功能 : 从DS18B20读一个字节 * 输入 : 无 * 输出 : 从DS18B20读到的值 ***********************************************************************/ uchar read_byte(void) { uchar i,m,receive_data; m = 1; receive_data = 0; for(i=0; i<8; i++) { if(read_bit()) { receive_data = receive_data + (m << i); } delay(6); } return(receive_data); } /******************************************************************** * 名称 : write_byte() * 功能 : 向DS18B20写一个字节 * 输入 : val(要对DS18B20写入的命令值) * 输出 : 无 ***********************************************************************/ void write_byte(uchar val) 27 电气工程及其自动化专业课程设计 2010级01班26号 { uchar i,temp; for(i=0; i<8; i++) { temp = val >> i; temp = temp & 0x01; write_bit(temp); delay(5); } } /******************************************************************** * 名称 : 数码管显示程序 * 功能 : 分别显示实时温度、设定温度和报警状态值 * 输入 : 无 * 输出 : cf状态值 *描述 :cf=1,报警器开启;cf=0,报警器关闭; ***********************************************************************/ void display1(uchar one,wei1) { P2=wei1; P0=table[one%10]; Delay_1ms(8); } void display2(uchar two,wei1,wei2) { P0 = table[two/10%10]; //数码管显示摄氏 f=c*9/5+32 P2 = wei1; Delay_1ms(8); P0 = table[two%10]; P2 = wei2; Delay_1ms(8); } void display3(uchar three,wei1,wei2,wei3) { uchar f; f=three*9/5+32; //华氏温度显示 P0=table[f/100%10]; P2=wei1; Delay_1ms(8); P0=table[f/10%10]; P2=wei2; Delay_1ms(8); 28 电气工程及其自动化专业课程设计 2010级01班26号 P0=table[f%10]; P2=wei3; Delay_1ms(8); } /******************************************************************** * 名称 : 摄氏温度和华氏温度切换 * 功能 : 按键切换摄氏、华氏显示 * 输入 : 输入显示段选、位选 * 输出 : 无 ***********************************************************************/ uchar cfqh(void) //摄氏、华氏切换 { a=1; b=1; c=1; d=0; if(h==0) { while(h==0) { display1(m,7); if(cf) { display2(temp,0,1); display2(flag,4,5); } else { display3(temp,0,1,2); display3(flag,4,5,6); } } KEY1=1; } if(KEY1==1) { KEY1=0; cf=!cf; } return(cf); } /******************************************************************** 29 电气工程及其自动化专业课程设计 2010级01班26号 * 名称 : Main() * 功能 : 主函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void main() { uint sh,ge; P2 = 0xFF; while(1) { x24c02_init(); //初始化24C02 flag = x24c02_read(1); Reset(); write_byte(jump_ROM); //跳过ROM write_byte(start); //温度转换 Reset(); write_byte(jump_ROM); //跳过ROM write_byte(read_EEROM); //读暂存存储器 TMPL = read_byte(); //低字节 TMPH = read_byte(); //高字节 temp = TMPL / 16 + TMPH * 16; cf=cfqh(); display1(m,7); if(cf) display2(temp,0,1); else display3(temp,0,1,2); if(!KEY3) { while(!KEY3) { display1(m,7); if(cf) { display2(temp,0,1); display2(flag,4,5); } else { display3(temp,0,1,2); display3(flag,4,5,6); } } 30 电气工程及其自动化专业课程设计 2010级01班26号 flag--; if(flag==-1) flag=99; } if(!KEY2) { while(!KEY2) { display1(m,7); if(cf) { display2(temp,0,1); display2(flag,4,5); } else { display3(temp,0,1,2); display3(flag,4,5,6); } } flag++; if(flag==100) flag=0; } x24c02_write(1,flag); Delay_1ms(10); if(cf) display2(flag,4,5); else display3(flag,4,5,6); a=0; b=1; c=1; d=1; if(h==0) { while(!h) { display1(m,7); if(cf) { display2(temp,0,1); display2(flag,4,5); } 31 电气工程及其自动化专业课程设计 2010级01班26号 else { display3(temp,0,1,2); display3(flag,4,5,6); } } m=!m; } if(temp>flag) { if(m) { for(i=0;i<25;i++) //(200;5;20;250x3) { BELL = 0; Delay_1ms(5); // BELL = 1; Delay_1ms(5); // } } } } } 或(10;延时10毫秒 延时10毫秒 32 ;1)1 电气工程及其自动化专业课程设计 2010级01班26号 1 因篇幅问题不能全部显示,请点此查看更多更全内容