精确温度显示的温控自动风扇系统正式版 - 图文

更新时间:2024-01-19 18:45:01 阅读量: 教育文库 文档下载

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

精准温度显示的温控自动风扇系统

戴邵池 周 斌 罗德知

指导老师:曾祥志(助理实验师) (赣南师范学院 江西赣州 341000)

摘要:

本设计为一种温控风扇系统,具有灵敏的温度感测和显示功能,系统AT89C5 单片机作为控制平台对风扇转速进行控制。可由用户设置高、低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度时自动关闭风扇,控制状态随外界温度而定。所设高低温值保存在温度传感器DS18B20内部E2ROM中,掉电后仍然能保存上次设定值,性能稳定,控制准确。

关键词:

自动控制 单片机 温控 风扇

1引言

生活中,我们经常会使用一些与温度有关的设备。比如,现在虽然不少城市家庭用上了空调,但在占中国大部分人口的农村地区依旧使用电风扇作为降温防暑设备,春夏(夏秋)交替时节,白天温度依旧很高,电风扇应高转速、大风量,使人感到清凉;到了晚上,气温降低,当人入睡后,应该逐步减小转速,以免使人感冒。虽然电风扇都有调节不同档位的功能,但必须要人手动换档,睡着了就无能为力了,而普遍采用的定时器关闭的做法,一方面是定时时间长短有限制,一般是一两个小时;另一方面可能在一两个小时后气温依旧没有降低很多,而风扇就关闭了,使人在睡梦中热醒而不得不起床重新打开风扇,增加定时器时间,非常麻烦,而且可能多次定时后最后一次定时时间太长,在温度降低以后风扇依旧继续吹风,使人感冒;第三方面是只有简单的到了定时时间就关闭风扇电源的单一功能,不能满足气温变化对风扇风速大小的不同要求。又比如在较大功率的电子产品散热方面,现在绝大多数都采用了风冷系统,利用风扇引起空气流动,带走热量,使电子产品不至于发热烧坏。要使电子产品保持较低的温度,必须用大功率、高转速、大风量的风扇,而风扇的噪音与其功率成正比。如果要低噪音,则要减小风扇转速,又会引起电子设备温度上升,不能两全其美。为解决上述问题,我们设计了这套温控自动风扇系统。本系统采用高精度集成温度传感器,用单片机控制,能显示实时温度,并根据使用者设定的温度自动在相应温度时作出小风、大风、停机动作,精确度高,动作准确。

2 方案论证

本系统实现风扇的温度控制,需要有较高的温度变化分辨率和稳定可靠的换档停机控制部件。

1

2.1 温度传感器的选用

温度传感器可由以下几种方案可供选择:

方案一:选用热敏电阻作为感测温度的核心元件,通过运算放大器放大由于温度变化引起热敏电阻电阻的变化、进而导至的输出电压变化的微弱电压变化信号,再用AD转换芯片ADC0809将模拟信号转化为数字信号输入单片机处理。

方案二:采用热电偶作为感测温度的核心元件,配合桥式电路,运算放大电路和AD转换电路,将温度变化信号送入单片机处理。

方案三:采用数字式集成温度传感器DS18B20作为感测温度的核心元件,直接输出数字温度信号供单片机处理。

对于方案一,采用热敏电阻有价格便宜、元件易购的优点,但热敏电阻对温度的细微变化不敏感,在信号采集、放大、转换过程中还会产生失真和误差,并且由于热敏电阻的R-T关系的非线性,其本身电阻对温度的变化存在较大误差,虽然可以通过一定电路予以纠正,但不仅将使电路复杂稳定性降低,而且在人体所处温度环境温度变化中难以检测到小的温度变化。故该方案不适合本系统。

对于方案二,采用热电偶和桥式测量电路相对于热敏电阻其对温度的敏感性和器件的非线性误差都有较大提高,其测温范围也非常宽,从-50摄氏度到1600摄氏度均可测量。但是依然存在电路复杂,对温度敏感性达不到本系统要求的标准,故不采用该方案。

对于方案三,由于数字式集成温度传感器DS18B20的高度集成化,大大降低了外接放大转换等电路的误差因素,温度误差很小,并且由于其感测温度的原理与上述两种方案的原理有着本质的不同,使得其温度分辨力极高。温度值在器件内部转换成数字量直接输出,简化了系统程序设计,又由于该传感器采用先进的单总线技术(1-WRIE),与单片机的接口变的非常简洁,抗干扰能力强。关于DS18B20的详细参数参看下面“硬件设计”中的器件介绍。

2.2 控制核心的选择

方案一:采用电压比较电路作为控制部件。温度传感器采用热敏电阻或热电偶等,温度信号转为电信号并放大,由集成运放组成的比较电路判决控制风扇转速,当高于或低于某值时将风扇切换到相应档位。

方案二:采用单片机作为控制核心。以软件编程的方法进行温度判断,并在端口输出控制信号。

对于方案一,采用电压比较电路具有电路简单、易于实现,以及无需编写软件程序的特点,但控制方式过于单一,不能自由设置上下限动作温度,无法满足不同用户以及不同环境下的多种动作温度要求,故不在本系统中采用。

对于方案二,以单片机作为控制器,通过编写程序不但能将传感器感测到的温度通过显示电路显示出来,而且用户能通过键盘接口,自由设置上下限动作温度值,满足全方位的需求。并且通过程序判断温度具有极高的精准度,能精确把握环境温度的微小变化。故本系统采用方案二。

2.3显示电路

方案一:采用五位共阳数码管显示温度,动态扫描显示方式。 方案二:采用液晶显示屏LCD显示温度

对于方案一,该方案成本低廉,显示温度明确醒目,在夜间也能看见,功耗极低,显示驱动程序的编写也相对简单,这种显示方式得到广泛应用。不足的地

2

方是扫描显示方式是使五个LED逐个点亮,因此会有闪烁,但是人眼的视觉暂留时间为20MS,当数码管扫描周期小于这个时间时人眼将感觉不到闪烁,因此可以通过增大扫描频率来消除闪烁感。

对于方案二,液晶体显示屏具有显示字符优美,不但能显示数字还能显示字符甚至图形的优点,这是LED数码管无法比拟的。但是液晶显示模块价格昂贵,驱动程序复杂,从简单实用的原则考虑,本系统采用方案一。

2.4调速方式

方案一:采用变压器调节方式,运用电磁感应原理将220V电压通过线圈降压到不同的电压,控制风扇电机接到不同电压值的线圈上可控制电机的转速,从而控制风扇风力大小。

方案二:采用晶闸管构成无级调速电路。

对于方案一,由于采用变压器改变电压调节,有风速级别限制,不能适应人性化要求。且在变压过程中会有损耗发热,效率不高,发热有不安全因素。

对于方案二,以电位器控制晶闸管的导通角大小,可实现由最大风速到关闭的无级别调速,可将风力调节在关闭无风到最大风之间的任意风力,实现“自由风”。且在调速环节中基本无电力损耗。故本系统采用方案二。

2.5控制执行部件

方案一:采用数模转换芯片AD0832控制,由单片机根据当前温度值送出相应数字量到AD0832,由AD0832产生模拟信号控制晶闸管的导通角,从而配合无级调速电路实现温控时的自动无级风力调节。

方案二:采用继电器,继电器的接有控制晶闸管导通角的电阻的接入电路与否由单片机控制,根据当前温度值在相应管脚送出高/低电平,决定某个继电器的导通角控制电阻是否接入电路。(详见4.2.4)

对于方案一,该方案能够实现在风扇处于温控状态时也能无级调速,但是D/A转换芯片价格较高,与其温控状态下无级调速功能相比性价比不高。

对于方案二,虽然在温控状态下只能实现弱/大风两级调速,但采用继电器价格便宜,控制可靠,且出于在温控状态时无级调速并不是特别需要的功能,综合考虑采用方案二。

3 系统简述

本系统由集成温度传感器、单片机、LED数码管、继电器、双向晶闸管、蜂鸣器及一些其他外围器件组成。使用具有价廉易购的AT89S52单片机编程控制,通过修改程序可方便实现系统升级。系统的框图结构如下:

3

温度传感器DS18B20 单片机AT89S52 数码管显示 无级调速器 被控对象(风扇) 人工控制

图1 系统框图

4 硬件设计

系统主要部件包括DS18B20温度传感器、AT89S52单片机、双向晶闸管、五位

LED数码管和风扇。辅助元件包括继电器、蜂鸣器、电阻、晶振、电源、按键和拨码开关等。

4.1、本系统各器件简介

4.1.1、DS18B20 单线数字温度传感器简介

DS18B20 单线数字温度传感器是Dallas 半导体公司开发的世界上第一片支持“一线总线”接口的温度传感器。它具有3 引脚TO-92 小体积封装形式。温度测量范围为-55℃——+125℃,可编程为9 位——12 位A/D 转换精度,测温分辨率可达0.0625℃。被测温度用符号扩展的16 位数字量方式串行输出。工作电压支持3V——5.5V 的电压范围,既可在远端引入,也可采用寄生电源方式产生。DS18B20 还支持“一线总线”接口,多个DS18B20可以并联到3 根或2 根线上,CPU 只需一根端口线就能与诸多DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。它还有存储用户定义报警温度等功能。 DS18B20 内部结构及管脚

DS18B20 内部结构如图3所示,主要由4 部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH 和TL、配置寄存器。其管脚排列如图4所示,DQ 为数字信号端,GND 为电源地,VDD 为电源输入端。

4

图1 DS18B20 内部结构

图2 DS18B20外形及管脚

4.1.2 AT89C52 单片机简介

AT89C52 是一种带4K字节闪存可编程可擦除只读存储器(FPEROM)256B片内RAM的低电压,高性能CMOS8 位微处理器。该器件采用ATMEL 高密度非易失存储器制造技术制造,与工业标准的MCS-51 指令集和输出管脚相兼容。由于将多功能8 位CPU 和闪烁存储器组合在单个芯片中,ATMEL 的AT89C52 是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 AT89C52 单片机管脚

AT89C52单片机管脚如图3所示。

5

图3 AT89C52单片机管脚

各管脚功能:

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

P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。当P1 口的管脚第一次写1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0 外部必须被拉高。

P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能接收输出4TTL门电流。P1 口管脚写入1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地接 收。

P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接收,输出4 个TTL 门电流,当P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在FLASH 编程和校验时接收高八位地址信号和控制信号。

P3 口:P3 口管脚是8 个带内部上拉电阻的双向I/O 口,可接收输出4 个TTL 门电流。当P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为AT89C51 的一些特殊功能口。P3.0:RXD(串行输入口);P3.1:TXD(串行输出口);P3.2:/INT0(外部中断0);P3.3:/INT1(外部中断1);P3.4:T0(记时器0 外部输入);P3.5:T1(记时器1外部输入);P3.6:/WR(外部数据存储器写选通);P3.7:/RD(外部数据存储器读选通)。 P3 口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作

6

对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE 禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。/EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1 时,/EA 将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加12V 编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。

4.1.3 八段LED 数码管

本系统使用五个七段LED数码管作为温度显示,公共阳极。

4.2 各部分电路设计

4.2.1 电源电路

电源电路采用LM7805集成稳压器作为稳压器件,用典型接法,220V电源整流滤波后送入LM7805稳压,在输出端接一个470U和0.1U电容进一步滤除纹波,得到5V稳压电源。电路如图4所示。

图4 电源

4.2.2 数码管显示电路

显示部分包括如下图5: 5个八段(共阳)数码管、PNP型三极管、电阻等。其连接方式如下:应用单片机P0口连接八段数码管,用P2口的P2.3—P2.7五个端口作为数码管的片选信号输出端口,其中要用8550(PNP型)三极管做驱动。又因为P0口做I/O口时要加上拉电阻,所以我们给P0各位各加一个10K的电阻到电源。为了防止烧坏数码管,所以给数码管各段各加一个300欧姆的限流电阻。要显示的数据通过P0口送给数码管显示,通过P2口的P2.7—P2.3五个端口分别对数码管进行位选,事实上数码管是间断被点亮的,只是其间断时间十分短,扫描周期在20ms以下,利用人眼视觉暂留,我们基本看不出它们的闪烁。

7

图5 显示电路

4.2.3 声响、温度采集、温度设定以及复位电路

电路如图6所示,这一部分主要是由DS18B20,四个按键、一个电容一个三极管和一个蜂鸣器等构成。

声响电路在每按下按键时会响一声,当没有把DS18B20接入到电路中时,单片机就会通过蜂鸣器发出报警声音。

温度采集电路主要是由DS18B20构成,它可以把采集的温度数据转化成二进制数,经过单片机处理后输出送数码管显示。

温度设定主要是通过按键S1、S2|、S3来设定的。按键S1、S2、S3分别接入单片机的

P1.4、P1.5、P1.6脚。

S3是设定键。用于对风速调节的上限和下限值TH、TL的设置。当按下S1时,可以加1,

长按可以快速加1,当按下S2 时,可以减1, 长按可以快速减1。

8

图6 声响、温度采集、温度设置及复位电路

4.2.4 温控自动电路

该电路为控制风速的人工控制与温控两种方式之温控模式时的控制电路,当选择为温控时,单片机默认为弱风,当当前温度低于所设的温度下限TL时继电器1吸合,关闭风扇,当当前温度高于所设的温度上限时继电器2吸合,切换到强风档。电路如图7。

图7 温控自动电路

4.2.5无级调速电路

此电路如图8所示,包括:双向可控硅,双触发二极管、滑动变阻器、电容。 该电路为无级调速电路,通过调节滑动变阻器的阻值来改变通过双向二极管的电流,控制双向晶闸管的导通角,从而控制电机的转速。可实现由最大风速到关闭的无级别调速,可将风力调节在关闭无风到最大风之间的任意风力,实现“自由风”。

图8 无级调速电路

本系统的总电原理图为:

9

图9 总电原理图

10

5 软件设计

程序实现的功能是上电复位时检测温度传感器DS18B20是否存在或它工作是否正常,当不存在或工作不正常时从蜂鸣器发出报警声,提示用户检查DS18B20,安装或者更换。这部分功能由DS18B20复位与检测子程序RESET完成。当检测到传感器工作正常后,发出温度转换命令及读取温度值命令,将从DS18B20读取的二进制温度值转换为七段码在LED上显示出来。显示功能由温度显示子程序DISP1子程序实现。

在温控自动状态,本系统可由用户根据需要自由设置大小风档的切换温度值TH,TL,硬件设计上为通过3个按键,由按键扫描子程序KEYSCAN子程序提供软件支持。按下一次设置键K3,进入低温关风扇温度值TL设置状态,此时按下“加”键K1,TL值加一,长按K1不放可实现快速加1,按下“减”键K2,TL值减1,长按K2不放可实现快速减1。再按一次设置键K3,进入高温切换大风档温度值TH设置状态,此时按下“加”键K1,TH值加一,长按K1不放可实现快速加1,按下“减”键K2,TH值减1,长按K2不放可实现快速减1。下限动作温度值TL和上限动作温度值的设置范围为0-120摄氏度,满足一般使用要求。再按一次设置键K3退出上下限温度设置状态,恢复到当前温度显示状态。在当前温度显示状态,按下“加”键K1一次显示当前TL设定值,再按一下显示当前TH设定值,如此循环,按设置键K3退回到当前温度显示状态。每次设定的TL、TH值均拷备到DS18B20的EEROM内,在单片机掉电后设定值不会丢失,在再次上电时从DS18B20的EEROM中读回上次设定的上下限动作温度值TH、TL,用户

要实现根据当前温度实时的控制风扇的状态,需要在程序中不时的判断当前温度值是否超过设定的动作温度值范围,此部分功能由比较控制子程序

TEMP_COMP来完成。由于单片机的工作频率高达12MHz,在执行程序时不断将当前温度和设定动作温度进行比较判断,当超过设定温度值范围时及时的转去执行超温处理和欠温处理子程序,控制继电器的吸合、断开状态,从而控制风扇实时的切换到关闭、弱风、大风三个状态。在没有超过设定的TL、TH值时默认将风扇置为弱风档。该比较控制程序又由温度比较程序、超温处理子程序和欠温处理子程序构成。

显示驱动程序以查七段码取得各数码管应显数字,逐位扫描显示。 主程序和个主要子程序的流程图如附录1所示。

6 安装调试

将本电路用硬件做出来,用编程器将KEIL软件对源程序编译生成的.HEX文件烧入AT89C52单片机,将单片机插入到目标板中,连好线。

将“控制模式”开关选择在“温控”,打开电源,风扇工作在弱风档,数码管正常显示当前的温度21.6摄氏度,第五位数码管闪烁显示“O”,表示当前温度在TL和TH值之间,没有欠温或超温。按“设置”键及“加”“减”键将下限动作温度值TL设为20摄氏度,将上限动作温度值TH设为23摄氏度,用书对着DS18B20扇动,显示温度逐渐降低,当达到19.9摄氏度时继电器1动作,将风扇关闭,第五位数码管闪烁显示“L”,表示当前温度低于TL值。然后用手握着DS18B20,显示温度逐步上升,当达到23.1摄氏度时继电器2动作,将风扇切换到大风档,第五

11

位数码管闪烁显示“H”,表示当前温度高于TH值。

将“控制模式”开关选择在“人控”,这时数码管依然按照上述规律显示,但是不能对风扇进行控制。用手旋动无级调速旋钮,可以将风扇从关闭一直连续调到最大风速,具有无级调节风扇风力的功能。

测试结果表明,本系统实现了预期功能。

参考文献

[1] 胡汉才.单片机原理及其接口技术.北京:清华大学出版社,2004

[2] 吴金戍,沈庆阳,郭庭吉.8051单片机实践与应用.北京: 清华大学出版

社,2002

[3] 求是科技.单片机典型模块设计实例导航.北京:人民邮电出版社,2004 [4] 王化详,张淑英.传感器原理.天津:天津大学出版社,2002 [5] 荣俊昌.新型电风扇原理与维修.北京:高等教育出版社,2004 [6] 王港元.电工电子实践指导.江西:江西科学技术出版社,2005

12

附录1 程序流程图 主程序流程图

开始 初始化 检测DS18B20 蜂鸣报警 N 正常? Y 温度转换命令 读温度 温度BCD码处理 显示温度 按键扫描及处理 与设定温度对比及处 理

图11 主程序流程图

按键扫描子程序流程图

13

入口 N K1按下? Y 蜂鸣器响一声 设定的TL值转换成各LED的显示数字 N 显示TL值 K1按下? Y 蜂鸣器响一声 设定的TH值转换成各LED的显示数字 N 显示TH值 K1按下? 蜂鸣器响一声 N K2按下? Y

14

蜂鸣器响一声 N K3按下? Y 蜂鸣器响一声 设定TH,TL 将设定TH,TL值写入1820的暂存器 将1820暂存器值写入EEROM 返回

图12 按键扫描子程序流程图

设置上下限动作温度值TH,TL子程序流程图

15

入口 K3按下? N $ Y 显示,闪烁 Y K1按下? 设置的TL加1 =121? N 显示TL Y N 设置的TL=0 K2按下? Y 设置的 TL=0? Y 设置的TL=119 N 设置的TL减1 显示TL N $ N K3按下? Y 蜂鸣一声 N K3松开? Y 闪烁显示 Y K1按下? 设置的TH加1 =121? N 显示TH Y N 设置的TH=0 K2按下? 设置的 TH=0? Y 设置的TL=119 N 设置的TH减1 显示TH N K3按下? Y 蜂鸣一声 返回 N

16

图13 设置上下限动作温度值TH,TL子程序流程图

实时温度值与设定TH,TL值比较及超、欠温处理子程序流程图

入口 TH>当前温度? Y C1=0,C2=0 第五位LED显示H,其它四位显示当前温度 N 200ms定时时间到? Y 第五位LED灭,其它四位显示当前温度 第五位LED显示H,其它四位显示当前温度 TH>当前温度? Y C1=0,C2=0 N 200ms定时时间到? Y 第五位LED灭,其它四位显示当前温度 N 返回 C1=1,C2=1

图14 实时温度值与设定TH,TL值比较及超、欠温处理子程序流程图

温度显示子程序流程图

17

入口 取扫描字 扫描字P2输出 取显示数据 查段码表 从P0口输出 小数点处理 延时 ACC.3=0Y P0,P2复位 N 指向下一位 返回

图15 温度显示子程序流程图

DS18B20复位与检测子程序

18

入口 600us复位低脉冲 拉高总线 Y 总线=0? N 60us到? Y 总线=0? Y 存在标志位置1 N 存在标志位置0 N 延时 总线拉高 返回 图16 DS18B20复位与检测子程序

19

附录2 源程序

;******************************************************************** ;精准温度显示温控自动风扇系统 * ;*说明:

;* 1、K3 → 进入设定低温动作温度值 TL 状态: ;* 2、K3 → 进入设定高温动作温度值 TH 状态: ;* 3、K3 → 返回

;* 4、设定过程: K1 →加键 (UP), K2 →减键 (DOWN),可快速调 ; 5、实际温度在TL和TH之间时,开启弱风档,低于TL时,关闭风扇; ;高于TH时,开启大风档。每次设置的TH和TL均被保存在DS18B20的ROM ;内,掉不需重新设置. *

;******************************************************************** TIMER_L DATA 23H TIMER_H DATA 24H TIMER_COUN DATA 25H

TEMPL DATA 26H TEMPH DATA 27H TEMP_TH DATA 28H TEMP_TL DATA 29H

TEMPHC DATA 2AH TEMPLC DATA 2BH TEMP_ZH DATA 2CH

BEEP EQU P3.7 DATA_LINE EQU P3.3

C1 EQU P3.4 ;C1控制口,接继电器1 C2 EQU P3.5 ;C2控制口,接继电器2

FLAG1 EQU 20H.0 FLAG2 EQU 20H.1

;------------------------------------------------- K1 EQU P1.4 K2 EQU P1.5 K3 EQU P1.6

;================================================= ORG 0000H JMP MAIN

ORG 000BH AJMP INT_T0

20

;-------------------------------------------------- MAIN: MOV SP,#30H

MOV TMOD,#01H ;T0,方式1 MOV TIMER_L,#00H ;50ms定时值 MOV TIMER_H,#4CH

MOV TIMER_COUN,#00H ;中断计数 MOV IE,#82H ;EA=1,ET0=1 LCALL READ_E2 MOV 20H,#00H SETB BEEP SETB C1 setb C2

MOV 7FH,#0AH ;熄灭符

CALL RESET ;复位与检测DS18B20

JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在 JMP START

MAIN1: CALL RESET

JB FLAG1,START

LCALL BEEP_BL ;DS18B20错误,报警 JMP MAIN1 START:

MOV A,#0CCH ; 跳过ROM匹配 CALL WRITE

MOV A,#044H ; 发出温度转换命令 CALL WRITE

CALL RESET

MOV A,#0CCH ; 跳过ROM匹配 CALL WRITE

MOV A,#0BEH ; 发出读温度命令 CALL WRITE

CALL READ ;读温度数据 CALL CONVTEMP CALL DISPBCD CALL DISP1 CALL SCANKEY LCALL TEMP_COMP JMP MAIN1

;===================================================== ;DS18B20 复位与检测子程序

21

;FLAG1=1 OK, FLAG1=0 ERROR

;====================================================== RESET:

SETB DATA_LINE NOP

CLR DATA_LINE

MOV R0,#64H ;主机发出延时600微秒的复位低脉冲 MOV R1,#03H RESET1: DJNZ R0,$ MOV R0,#64H DJNZ R1,RESET1

SETB DATA_LINE ;然后拉高数据线 NOP

MOV R0,#25H

RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回应 DJNZ R0,RESET2

JMP RESET4 ; 延时

RESET3: SETB FLAG1 ; 置标志位,表示DS1820存在 JMP RESET5

RESET4: CLR FLAG1 ; 清标志位,表示DS1820不存在 JMP RESET6 RESET5: MOV R0,#064H

DJNZ R0,$ ; 时序要求延时一段时间 RESET6: SETB DATA_LINE RET

;=========================================================== ;

;=========================================================== WRITE: MOV R2,#8 ;一共8位数据 CLR CY WR1:

CLR DATA_LINE ;开始写入DS18B20总线要处于复位(低)状态

MOV R3,#09

DJNZ R3,$ ;总线复位保持18微妙以上

RRC A ;把一个字节DATA 分成8个BIT环移给C MOV DATA_LINE,C ;写入一个BIT MOV R3,#23

DJNZ R3,$ ;等待46微妙 SETB DATA_LINE ;重新释放总线 NOP

DJNZ R2,WR1 ;写入下一个BIT SETB DATA_LINE RET

22

;============================================================ ;从DS18B20中读出温度低位、高位和动作温度设定值TH、TL ;存入26H、27H、28H、29H

;============================================================

READ: MOV R4,#4 ; 将温度高位和低位从DS18B20中读出 MOV R1,#26H ; 存入26H、27H、28H、29H RE00: MOV R2,#8 RE01: CLR C

SETB DATA_LINE NOP NOP

CLR DATA_LINE ;读前总线保持为低 NOP NOP NOP

SETB DATA_LINE ;开始读总线释放 MOV R3,#09 ;延时18微妙 DJNZ R3,$

MOV C,DATA_LINE ;从DS18B20总线读得一个BIT MOV R3,#23

DJNZ R3,$ ;等待46微妙

RRC A ;把读得的位值环移给A DJNZ R2,RE01 ;读下一个BIT MOV @R1,A INC R1

DJNZ R4,RE00 RET

;-------------------------------------------- ;200ms对闪动标记取反一次

;-------------------------------------------- INT_T0:

PUSH ACC PUSH PSW

MOV TL0,TIMER_L MOV TH0,TIMER_H INC TIMER_COUN MOV A,TIMER_COUN CJNE A,#04H,INT_END MOV TIMER_COUN,#00H CPL FLAG2 INT_END:

POP PSW POP ACC RETI

23

;========================================================== ;重新对 DS18B20 初始化

;将设定的动作温度设定值写入 DS18B20

;========================================================== RE_18B20:

JB FLAG1,RE_18B20A RET RE_18B20A:

CALL RESET

MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE

MOV A,#4EH ;写暂存寄存器 LCALL WRITE

MOV A,TEMP_TH ;TH(动作上限温度) LCALL WRITE

MOV A,TEMP_TL ;TL(动作下限温度) LCALL WRITE

MOV A,#7FH ;12位精确度 LCALL WRITE RET

;==================================================== ;功能键扫描子程序

;==================================================== SCANKEY:

MOV P1,#0F0H JB K1,SCAN_K2 CALL BEEP_BL SCAN_K1: CALL ALERT_TL CALL ALERT_PLAY JB K1,SCAN_K1 CALL BEEP_BL SCAN_K11: CALL ALERT_TH CALL ALERT_PLAY JB K1,SCAN_K11 CALL BEEP_BL SCAN_K2: JB K2,SCAN_K3 CALL BEEP_BL

SCAN_K3: JB K3,SCAN_END CALL BEEP_BL

LCALL RESET_ALERT LCALL RE_18B20 LCALL WRITE_E2 SCAN_END: RET

24

;================================================ ;设置动作温度值TL,TH

;================================================ RESET_ALERT:

CALL ALERT_TL CALL ALERT_PLAY

JNB K3,$ ;K3为位移键 SETB TR0 RESET_TL:

CALL ALERT_PLAY JNB FLAG2,R_TL01

mov 75H,7fh ;送入熄灭符 mov 76H,7fh

CALL ALERT_PLAY JMP R_TL02 R_TL01: CALL ALERT_TL

mov 75h,7Eh ;送设定值 mov 76h,7Dh

CALL ALERT_PLAY ;显示设定值 R_TL02: JNB K1,K011A JNB K2,K011B JNB K3,RESET_TH JMP RESET_TL K011A:

INC TEMP_TL MOV A,TEMP_TL

CJNE A,#120,K012A ;没有到设定上限值,转 MOV TEMP_TL,#0 K012A: CALL TL_DEL JMP RESET_TL K011B:

MOV A,TEMP_TL

CJNE A,#00H,K ;没有到设定下限值,转

MOV TEMP_TL,#120 K: DEC TEMP_TL K012B: CALL TL_DEL JMP RESET_TL

;------------------------------------------------------- RESET_TH:

CALL BEEP_BL JNB K3,$

25

RESET_TH1:

CALL ALERT_PLAY JNB FLAG2,R_TH01

mov 75H,7fh ;送入熄灭符 mov 76H,7fh CALL ALERT_PLAY JMP R_TH02 R_TH01: CALL ALERT_TH

mov 75h,7Eh ; mov 76h,7Dh CALL ALERT_PLAY R_TH02: JNB K1,K021A JNB K2,K021B JNB K3,K002 JMP RESET_TH1 K021A:

INC TEMP_TH MOV A,TEMP_TH

CJNE A,#120,K022A ;没有到设定上限值,转 MOV TEMP_TH,#0 K022A: CALL TH_DEL JMP RESET_TH1

K021B:

MOV A,TEMP_TH

CJNE A,#00H,K023B ;没有到设定下限值,转

MOV TEMP_TH,#120 K023B: DEC TEMP_TH K022B: CALL TH_DEL JMP RESET_TH1

K002: CALL BEEP_BL

CLR TR0 ;关闭中断 RET

;----------------------------------------------------- ;键延时子程序

;多次调用动作温度设定值显示程序来延时

;----------------------------------------------------- TL_DEL: ;动作温度低值TL延时 MOV R2,#0AH TL_DEL1: CALL ALERT_TL CALL ALERT_PLAY

26

DJNZ R2,TL_DEL1 RET

TH_DEL: ;动作温度高值TH延时 MOV R2,#0AH TH_DEL1: CALL ALERT_TH CALL ALERT_PLAY DJNZ R2,TH_DEL1 RET

;==================================================== ;实时温度值与动作温度设定值 TH、TL 比较子程序

;当实际温度大于 TH 的设定值时,显示\继电器1吸合,继电器2吸合 ;当实际温度小于 TH 的设定值时,显示“O”,继电器1、2断开, ;当实际温度小于 TL 的设定值时,显示“L”。继电器1吸合,继电器2断开 ;闪动显示标记符 H、L、O

;==================================================== TEMP_COMP:

SETB TR0 ;启动中断 MOV A,TEMP_TH

SUBB A,#01H

SUBB A,TEMP_ZH ;减数>被减数,则

JC CHULI1 ;借位标志位C=1,转 MOV A,TEMP_ZH

SUBB A,TEMP_TL ;减数>被减数,则

JC CHULI2 ;借位标志位C=1,转 JNB FLAG2,T_COMP1 ;FLAG2=0,显示标记字符 MOV 74H,#0AH ;熄灭符 LCALL DISP1 JMP T_COMP2 T_COMP1: MOV 74H,#00H

LCALL DISP1 ;显示\T_COMP2:

SETB C1 ;继电器1断开 SETB C2 ;继电器2断开 CLR TR0 ;关闭中断 RET

;--------------------------------------------- ;超温处理

;--------------------------------------------- CHULI1:

CLR C1 ;继电器1吸合 CLR C2 ;继电器2吸合 JNB FLAG2,CHULI10

MOV 74H,#0AH ;熄灭符 LCALL DISP1

27

JMP CHULI11

CHULI10: MOV 74H,#0DH

LCALL DISP1 ;显示\CHULI11:

CLR TR0 ;关闭中断 RET

;--------------------------------------------- ;欠温处理

;--------------------------------------------- CHULI2: CLR C1 ;继电器1吸合 SETB C2 ;继电器2断开 JNB FLAG2,CHULI20

MOV 74H,#0AH ;熄灭符 LCALL DISP1 JMP CHULI21

CHULI20: MOV 74H,#0CH

LCALL DISP1 ;显示\CHULI21: CLR TR0 ;关闭中断 RET

;------------------------------------------------------------ ;把 DS18B20 暂存器里的动作温度设定值拷贝到EEROM

;------------------------------------------------------------ WRITE_E2:

CALL RESET

MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE

MOV A,#48H ;动作温度设定值拷贝到EEROM LCALL WRITE RET

;-------------------------------------------------------------- ;把 DS18B20 EEROM 里的动作温度设定值拷贝回暂存器

;------------------------------------------------------------- READ_E2:

CALL RESET

MOV A,#0CCH ;跳过ROM匹配 LCALL WRITE

MOV A,#0B8H ;动作温度值拷贝回暂存器 CALL WRITE RET

;***************************************************** ; 处理温度 BCD 码子程序

;**************************************************** CONVTEMP: MOV A,TEMPH ;判温度是否零下

28

ANL A,#80H

JZ TEMPC1 ;温度零上转 CLR C

MOV A,TEMPL ;二进制数求补(双字节) CPL A ;取反加1 ADD A,#01H MOV TEMPL,A

MOV A,TEMPH ;- CPL A

ADDC A,#00H

MOV TEMPH,A ;TEMPHC HI = MOV TEMPHC,#0BH SJMP TEMPC11

TEMPC1: MOV TEMPHC,#0AH ; TEMPC11: MOV A,TEMPHC SWAP A

MOV TEMPHC,A MOV A,TEMPL

ANL A,#0FH ; MOV DPTR,#TEMPDOTTAB MOVC A,@A+DPTR

MOV TEMPLC,A ;TEMPLC LOW=

MOV A,TEMPL ; ANL A,#0F0H SWAP A

MOV TEMPL,A MOV A,TEMPH ANL A,#0FH SWAP A

ORL A,TEMPL

MOV TEMP_ZH,A ; LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A

ORL A,TEMPHC ;TEMPHC LOW = MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH

SWAP A ;TEMPLC HI = ORL A,TEMPLC MOV TEMPLC,A

符号位 乘0.0625 小数部分 BCD 整数部分 组合后的值存入TEMP_ZH 十位数 BCD 个位数 BCD 29

MOV A,R7 JZ TEMPC12 ANL A,#0FH SWAP A MOV R7,A

MOV A,TEMPHC ;TEMPHC HI = 百位数 BCD ANL A,#0FH ORL A,R7

MOV TEMPHC,A TEMPC12: RET

;----------------------------------------------------------- ; 小数部分码表

;----------------------------------------------------------- TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09H

;===========================================================

;显示区 BCD 码温度值刷新子程序

;===========================================================

DISPBCD: MOV A,TEMPLC ANL A,#0FH

MOV 70H,A ;小数位 MOV A,TEMPLC SWAP A

ANL A,#0FH

MOV 71H,A ;个位 MOV A,TEMPHC ANL A,#0FH

MOV 72H,A ;十位 MOV A,TEMPHC SWAP A

ANL A,#0FH

MOV 73H,A ;百位 MOV A,TEMPHC ANL A,#0F0H

CJNE A,#010H,DISPBCD0 SJMP DISPBCD2

DISPBCD0: MOV A,TEMPHC ANL A,#0FH

JNZ DISPBCD2 ;十位数是0

30

MOV A,TEMPHC SWAP A

ANL A,#0FH

MOV 73H,#0AH ;符号位不显示 MOV 72H,A ;十位数显示符号 DISPBCD2: RET

;***************************************************************

; 温度显示子程序

;***************************************************************

;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据, ;P2 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。

DISP1: MOV R1,#70H ;指向显示数据首址 MOV R5,#7FH ;扫描控制字初值 PLAY: MOV P0,#0FFH

MOV A,R5 ;扫描字放入A MOV P2,A

MOV A,@R1 ;取显示数据到A MOV DPTR,#TAB ;取段码表地址

MOVC A,@A+DPTR ;查显示数据对应段码 MOV P0,A ;段码放入P0口 MOV A,R5

JB ACC.6,LOOP5 ;小数点处理 CLR P0.7

LOOP5: LCALL DL_MS ;显示2MS

INC R1 ;指向下一个地址 MOV A,R5 ;放回 R5 内

JNB ACC.3,ENDOUT ;ACC.3=0时一次显示结束 RR A ;A 中数据循环左移 MOV R5,A ;放入 R5 中

AJMP PLAY ;跳回 PLAY 循环

ENDOUT: MOV P0,#0FFH ;一次显示结束,P0口复位 MOV P2,#0FFH ;P2口复位 RET

TAB:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H ; “0\“1\“2\“3\“4\“5\“6\“7\“8\“9\“灭\“-\“L”“H\

DL_MS: MOV R6,#0AH ;2MS延时程序,LED 显示程序用 DL1: MOV R7,#64H

31

DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET

;****************************************************** ;单字节十六进制转 BCD

;****************************************************** HEX2BCD1: MOV B,#064H DIV AB MOV R7,A MOV A,#0AH XCH A,B

DIV AB SWAP A ORL A,B RET

;=============================================== ;报警值 TH、TL 数据转换

;=============================================== ALERT_TL:

MOV 79H,#0CH MOV 78H,#0BH MOV A,TEMP_TL MOV R0,#77H MOV B,#064H DIV AB

CJNE A,#01H,ALERT_TL1 MOV @R0,A

JMP ALERT_TL2

ALERT_TL1: MOV A,#0BH ;显示“-” MOV @R0,A ALERT_TL2: MOV A,#0AH XCH A,B DIV AB DEC R0 MOV @R0,A MOV 7DH,A DEC R0 MOV @R0,B MOV 7EH,B RET

;----------------------------------------------- ALERT_TH:

MOV 79H,#0DH

32

MOV 78H,#0BH MOV A,TEMP_TH MOV R0,#77H MOV B,#064H DIV AB

CJNE A,#01H,ALERT_TH1 MOV @R0,A

JMP ALERT_TH2

ALERT_TH1: MOV A,#0BH ;显示“-” MOV @R0,A ALERT_TH2: MOV A,#0AH XCH A,B DIV AB DEC R0 MOV @R0,A MOV 7DH,A DEC R0 MOV @R0,B MOV 7EH,B RET

;=============================================== ;动作温度设定值显示子程序

;=============================================== ALERT_PLAY:

MOV R1,#75H ;指向显示数据首址 MOV R5,#7FH ;扫描控制字初值 A_PLAY: MOV P0,#0FFH

MOV A,R5 ;扫描字放入A MOV P2,A

MOV A,@R1 ;取显示数据到A MOV DPTR,#ALERT_TAB ;取段码表地址

MOVC A,@A+DPTR ;查显示数据对应段码 MOV P0,A ;段码放入P0口 LCALL DL_MS1 ;显示2MS

INC R1 ;指向下一个地址 MOV A,R5

JNB ACC.3,ENDOUT1

RR A ;A 中数据循环左移 MOV R5,A ;放入 R5 中

AJMP A_PLAY ;跳回 PLAY 循环

ENDOUT1: MOV P0,#0FFH ;一次显示结束,P0口复位 MOV P2,#0FFH ;P2口复位 RET

33

ALERT_TAB:

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H ;共阳段码表 “0\“1\“2\“3\“4\“5\“6\“7\“8\“9\“灭\“-\

DL_MS1: MOV R6,#0AH ;2MS延时程序,LED 显示程序用 ADL1: MOV R7,#64H ADL2: DJNZ R7,ADL2 DJNZ R6,ADL1 RET

;=============================================== ;蜂鸣器响一声子程序

;=============================================== BEEP_BL:

MOV R6,#100 BL2: CALL DEX1

CPL BEEP ;对 P3.7 取反 DJNZ R6,BL2 MOV R5,#10 CALL DELAY RET

DEX1: MOV R7,#180 DE2: NOP

DJNZ R7,DE2 RET

DELAY: ;(R5)*延时10MS MOV R6,#50 DEL1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEL1 DJNZ R5,DELAY RET

;================================================== END

34

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

Top