找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4219|回复: 2
收起左侧

单片机智能精准自动温控风扇的设计文档下载

[复制链接]
ID:218849 发表于 2017-7-11 16:05 | 显示全部楼层 |阅读模式

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

摘 要

目 录

1引言

2 方案论证

2.1 温度传感器的选用
2.2 控制核心的选择
2.3显示电路
2.4调速方式
2.5控制执行部件

3 系统简述

4 硬件设计

4.1、本系统各器件简介
4.1.1 DS18B20 单线数字温度传感器简介
4.1.2 AT89C52 单片机简介
4.1.3 八段LED 数码管
4.2 各部分电路设计
4.2.1 电源电路
4.2.2 数码管显示电路
4.2.3 声响、温度采集、温度设定以及复位电路
4.2.4 温控自动电路
4.2.5无级调速电路

5  软件设计

6  安装调试

参考文献

附录1 程序流程图

附录2 源程序


1引言

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


2 方案论证

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

2.1 温度传感器的选用

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

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

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

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

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

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

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

2.2 控制核心的选择

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

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

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

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

2.3显示电路

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

方案二:采用液晶显示屏LCD显示温度

对于方案一,该方案成本低廉,显示温度明确醒目,在夜间也能看见,功耗极低,显示驱动程序的编写也相对简单,这种显示方式得到广泛应用。不足的地方是扫描显示方式是使五个LED逐个点亮,因此会有闪烁,但是人眼的视觉暂留时间为20MS,当数码管扫描周期小于这个时间时人眼将感觉不到闪烁,因此可以通过增大扫描频率来消除闪烁感。

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

2.4调速方式

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

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

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

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

2.5控制执行部件

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

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

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

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


3 系统简述

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

图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 为电源输入端。

1.002.jpg

图1 DS18B20 内部结构

1.003.jpg

图2 DS18B20外形及管脚

4.1.2 AT89C52 单片机简介

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

AT89C52单片机管脚

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

1.004.jpg

图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。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个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所示。

1.005.jpg

图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以下,利用人眼视觉暂留,我们基本看不出它们的闪烁。

1.006.jpg

图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。

1.007.jpg

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

4.2.4 温控自动电路

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

1.008.jpg

图7 温控自动电路

4.2.5无级调速电路

此电路如图8所示,包括:双向可控硅,双触发二极管、滑动变阻器、电容。

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

1.009.jpg

图8  无级调速电路

本系统的总电原理图为:

1.010.jpg

图9 总电原理图

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动作,将风扇切换到大风档,第五位数码管闪烁显示“H”,表示当前温度高于TH值。

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

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


参考文献

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

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

[3] 求是科技.单片机典型模块设计实例导航.北京:人民邮电出版社,2004

[4] 王化详,张淑英.传感器原理.天津:天津大学出版社,2002

[5] 荣俊昌.新型电风扇原理与维修.北京:高等教育出版社,2004

[6] 王港元.电工电子实践指导.江西:江西科学技术出版社,2005











附录1 程序流程图

主程序流程图

1.011.jpg

图11  主程序流程图

按键扫描子程序流程图

1.012.jpg

1.013.jpg

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

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

1.014.jpg

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

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

1.015.jpg

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

温度显示子程序流程图

1.016.jpg

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

DS18B20复位与检测子程序

1.017.jpg

图16  DS18B20复位与检测子程序

附录2 源程序

单片机源程序如下:


  1. ********************************************************************
  2. ;精准温度显示温控自动风扇系统     *
  3. ;*说明:
  4. ;*    1、K3 → 进入设定低温动作温度值 TL 状态:
  5. ;*    2、K3 → 进入设定高温动作温度值 TH 状态:
  6. ;*    3、K3 → 返回
  7. ;*    4、设定过程: K1 →加键 (UP), K2 →减键 (DOWN),可快速调
  8. ;     5、实际温度在TL和TH之间时,开启弱风档,低于TL时,关闭风扇;
  9. ;高于TH时,开启大风档。每次设置的TH和TL均被保存在DS18B20的ROM
  10. ;内,掉不需重新设置.         *
  11. ;********************************************************************
  12.           TIMER_L     DATA  23H
  13.           TIMER_H     DATA  24H
  14.           TIMER_COUN  DATA  25H

  15.           TEMPL       DATA  26H
  16.           TEMPH       DATA  27H
  17.           TEMP_TH     DATA  28H
  18.           TEMP_TL     DATA  29H

  19.           TEMPHC      DATA  2AH
  20.           TEMPLC      DATA  2BH
  21.           TEMP_ZH     DATA  2CH

  22.           BEEP        EQU   P3.7
  23.           DATA_LINE   EQU   P3.3
  24.           C1          EQU   P3.4    ;C1控制口,接继电器1
  25.           C2          EQU   P3.5    ;C2控制口,接继电器2

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

  28. ;-------------------------------------------------
  29.           K1   EQU  P1.4
  30.           K2   EQU  P1.5
  31.           K3   EQU  P1.6
  32. ;=================================================
  33.           ORG 0000H
  34.           JMP  MAIN

  35.           ORG  000BH
  36.           AJMP  INT_T0
  37. ;--------------------------------------------------
  38. MAIN:     MOV    SP,#30H
  39.           MOV    TMOD,#01H       ;T0,方式1
  40.           MOV    TIMER_L,#00H     ;50ms定时值
  41.           MOV    TIMER_H,#4CH
  42.           MOV    TIMER_COUN,#00H  ;中断计数
  43.           MOV    IE,#82H          ;EA=1,ET0=1
  44.           LCALL  READ_E2
  45.           MOV    20H,#00H
  46.           SETB    BEEP
  47.     SETB  C1
  48.     setb  C2   
  49.           MOV    7FH,#0AH         ;熄灭符

  50.           CALL   RESET            ;复位与检测DS18B20
  51.           JNB    FLAG1,MAIN1       ;FLAG1=0,DS18B20不存在
  52.           JMP    START

  53. MAIN1:    CALL   RESET
  54.           JB     FLAG1,START
  55.           LCALL  BEEP_BL        ;DS18B20错误,报警
  56.           JMP    MAIN1
  57. START:
  58.           MOV    A,#0CCH         ; 跳过ROM匹配
  59.           CALL   WRITE
  60.           MOV    A,#044H         ; 发出温度转换命令
  61.           CALL   WRITE

  62.           CALL   RESET
  63.           MOV    A,#0CCH         ; 跳过ROM匹配
  64.           CALL   WRITE
  65.           MOV    A,#0BEH         ; 发出读温度命令
  66.           CALL   WRITE

  67.           CALL   READ           ;读温度数据
  68.           CALL   CONVTEMP
  69.           CALL   DISPBCD
  70.           CALL   DISP1
  71.           CALL   SCANKEY
  72.           LCALL  TEMP_COMP
  73.           JMP     MAIN1

  74. ;=====================================================
  75. ;DS18B20 复位与检测子程序
  76. ;FLAG1=1 OK, FLAG1=0 ERROR
  77. ;======================================================
  78. RESET:
  79.           SETB   DATA_LINE
  80.           NOP
  81.           CLR    DATA_LINE
  82.           MOV    R0,#64H            ;主机发出延时600微秒的复位低脉冲
  83.           MOV    R1,#03H
  84. RESET1:   DJNZ   R0,$
  85.           MOV    R0,#64H
  86.           DJNZ   R1,RESET1
  87.           SETB   DATA_LINE        ;然后拉高数据线
  88.           NOP
  89.           MOV    R0,#25H
  90. RESET2:   JNB    DATA_LINE,RESET3  ;等待DS18B20回应
  91.           DJNZ   R0,RESET2
  92.           JMP    RESET4            ; 延时
  93. RESET3:   SETB   FLAG1            ; 置标志位,表示DS1820存在
  94.           JMP    RESET5
  95. RESET4:   CLR    FLAG1             ; 清标志位,表示DS1820不存在
  96.           JMP    RESET6
  97. RESET5:   MOV    R0,#064H
  98.           DJNZ   R0,[        DISCUZ_CODE_2        ]nbsp;            ; 时序要求延时一段时间
  99. RESET6:   SETB   DATA_LINE
  100.           RET
  101. ;===========================================================
  102. ;
  103. ;===========================================================
  104. WRITE:  MOV      R2,#8            ;一共8位数据
  105.         CLR      CY
  106. WR1:
  107.         CLR      DATA_LINE        ;开始写入DS18B20总线要处于复位(低)状态
  108.         MOV      R3,#09
  109.         DJNZ     R3,[        DISCUZ_CODE_2        ]nbsp;           ;总线复位保持18微妙以上
  110.         RRC      A                ;把一个字节DATA 分成8个BIT环移给C
  111.         MOV      DATA_LINE,C      ;写入一个BIT
  112.         MOV      R3,#23
  113.         DJNZ     R3,[        DISCUZ_CODE_2        ]nbsp;           ;等待46微妙
  114.         SETB     DATA_LINE       ;重新释放总线
  115.         NOP
  116.         DJNZ     R2,WR1          ;写入下一个BIT
  117.         SETB     DATA_LINE
  118.         RET
  119. ;============================================================
  120. ;从DS18B20中读出温度低位、高位和动作温度设定值TH、TL
  121. ;存入26H、27H、28H、29H
  122. ;============================================================
  123. READ:    MOV     R4,#4            ; 将温度高位和低位从DS18B20中读出
  124.          MOV     R1,#26H          ; 存入26H、27H、28H、29H
  125. RE00:    MOV     R2,#8
  126. RE01:    CLR     C
  127.          SETB    DATA_LINE
  128.          NOP
  129.          NOP
  130.          CLR     DATA_LINE        ;读前总线保持为低
  131.          NOP
  132.          NOP
  133.          NOP
  134.          SETB    DATA_LINE       ;开始读总线释放
  135.          MOV     R3,#09           ;延时18微妙
  136.          DJNZ    R3,$
  137.          MOV     C,DATA_LINE      ;从DS18B20总线读得一个BIT
  138.          MOV     R3,#23
  139.          DJNZ    R3,[        DISCUZ_CODE_2        ]nbsp;           ;等待46微妙
  140.          RRC     A                ;把读得的位值环移给A
  141.          DJNZ    R2,RE01         ;读下一个BIT
  142.          MOV    @R1,A
  143.          INC    R1
  144.          DJNZ    R4,RE00
  145.          RET      
  146. ;--------------------------------------------
  147. ;200ms对闪动标记取反一次
  148. ;--------------------------------------------
  149. INT_T0:
  150.           PUSH   ACC
  151.           PUSH   PSW
  152.           MOV    TL0,TIMER_L
  153.           MOV    TH0,TIMER_H
  154.           INC    TIMER_COUN
  155.           MOV    A,TIMER_COUN
  156.           CJNE   A,#04H,INT_END
  157.           MOV    TIMER_COUN,#00H
  158.           CPL    FLAG2
  159. INT_END:
  160.           POP    PSW
  161.           POP    ACC
  162.           RETI
  163. ;==========================================================
  164. ;重新对 DS18B20 初始化
  165. ;将设定的动作温度设定值写入 DS18B20
  166. ;==========================================================
  167. RE_18B20:
  168.         JB     FLAG1,RE_18B20A
  169.         RET
  170. RE_18B20A:
  171.         CALL   RESET
  172.         MOV    A,#0CCH       ;跳过ROM匹配
  173.         LCALL  WRITE
  174.         MOV    A,#4EH        ;写暂存寄存器
  175.         LCALL  WRITE
  176.         MOV    A,TEMP_TH     ;TH(动作上限温度)
  177.         LCALL  WRITE
  178.         MOV    A,TEMP_TL     ;TL(动作下限温度)
  179.         LCALL  WRITE
  180.         MOV    A,#7FH        ;12位精确度
  181.         LCALL  WRITE
  182.         RET

  183. ;====================================================
  184. ;功能键扫描子程序
  185. ;====================================================
  186. SCANKEY:
  187.               MOV    P1,#0F0H
  188.               JB     K1,SCAN_K2
  189.               CALL   BEEP_BL
  190. SCAN_K1:      CALL   ALERT_TL
  191.               CALL   ALERT_PLAY
  192.               JB     K1,SCAN_K1
  193.               CALL   BEEP_BL
  194. SCAN_K11:     CALL   ALERT_TH
  195.               CALL   ALERT_PLAY
  196.               JB     K1,SCAN_K11
  197.               CALL   BEEP_BL
  198. SCAN_K2:      JB     K2,SCAN_K3
  199.               CALL   BEEP_BL
  200. SCAN_K3:      JB     K3,SCAN_END
  201.               CALL   BEEP_BL
  202.               LCALL  RESET_ALERT
  203.               LCALL  RE_18B20
  204.               LCALL  WRITE_E2
  205. SCAN_END:     RET

  206. ;================================================
  207. ;设置动作温度值TL,TH
  208. ;================================================
  209. RESET_ALERT:
  210.           CALL    ALERT_TL
  211.           CALL    ALERT_PLAY
  212.           JNB     K3,[        DISCUZ_CODE_2        ]nbsp;             ;K3为位移键
  213.           SETB    TR0
  214. RESET_TL:
  215.           CALL    ALERT_PLAY
  216.           JNB     FLAG2,R_TL01
  217.           mov     75H,7fh          ;送入熄灭符
  218.           mov     76H,7fh
  219.           CALL     ALERT_PLAY
  220.           JMP     R_TL02
  221. R_TL01:   CALL    ALERT_TL
  222.           mov     75h,7Eh          ;送设定值
  223.           mov     76h,7Dh
  224.           CALL    ALERT_PLAY      ;显示设定值
  225. R_TL02:   JNB     K1,K011A
  226.           JNB     K2,K011B
  227.           JNB     K3,RESET_TH
  228.           JMP     RESET_TL
  229. K011A:
  230.           INC     TEMP_TL
  231.           MOV     A,TEMP_TL
  232.           CJNE    A,#120,K012A    ;没有到设定上限值,转
  233.           MOV     TEMP_TL,#0
  234. K012A:    CALL    TL_DEL
  235.           JMP     RESET_TL
  236. K011B:

  237.           MOV     A,TEMP_TL
  238.           CJNE    A,#00H,K     ;没有到设定下限值,转

  239.           MOV     TEMP_TL,#120
  240. K:        DEC     TEMP_TL
  241. K012B:    CALL    TL_DEL
  242.           JMP     RESET_TL
  243. ;-------------------------------------------------------
  244. RESET_TH:
  245.           CALL    BEEP_BL
  246.           JNB     K3,$
  247. RESET_TH1:
  248.           CALL    ALERT_PLAY
  249.           JNB     FLAG2,R_TH01
  250.           mov     75H,7fh          ;送入熄灭符
  251.           mov     76H,7fh
  252.           CALL    ALERT_PLAY
  253.           JMP     R_TH02
  254. R_TH01:   CALL    ALERT_TH
  255.           mov    75h,7Eh          ;
  256.           mov    76h,7Dh
  257.           CALL   ALERT_PLAY
  258. R_TH02:   JNB    K1,K021A
  259.           JNB    K2,K021B
  260.           JNB    K3,K002
  261.           JMP    RESET_TH1
  262. K021A:
  263.           INC    TEMP_TH
  264.           MOV    A,TEMP_TH
  265.           CJNE   A,#120,K022A   ;没有到设定上限值,转
  266.           MOV    TEMP_TH,#0
  267. K022A:    CALL   TH_DEL
  268.           JMP    RESET_TH1

  269. K021B:

  270.           MOV   A,TEMP_TH
  271.           CJNE  A,#00H,K023B   ;没有到设定下限值,转

  272.           MOV   TEMP_TH,#120
  273. K023B:    DEC   TEMP_TH
  274. K022B:    CALL  TH_DEL
  275.           JMP   RESET_TH1

  276. K002:     CALL  BEEP_BL
  277.           CLR   TR0             ;关闭中断
  278.           RET
  279. ;-----------------------------------------------------
  280. ;键延时子程序
  281. ;多次调用动作温度设定值显示程序来延时
  282. ;-----------------------------------------------------
  283. TL_DEL:                        ;动作温度低值TL延时
  284.           MOV   R2,#0AH
  285. TL_DEL1:  CALL  ALERT_TL
  286.           CALL  ALERT_PLAY
  287.           DJNZ  R2,TL_DEL1
  288.           RET
  289. TH_DEL:                        ;动作温度高值TH延时
  290.           MOV   R2,#0AH
  291. TH_DEL1:  CALL  ALERT_TH
  292.           CALL  ALERT_PLAY
  293.           DJNZ  R2,TH_DEL1
  294.           RET
  295. ;====================================================
  296. ;实时温度值与动作温度设定值 TH、TL 比较子程序
  297. ;当实际温度大于 TH 的设定值时,显示"H",继电器1吸合,继电器2吸合
  298. ;当实际温度小于 TH 的设定值时,显示“O”,继电器1、2断开,
  299. ;当实际温度小于 TL 的设定值时,显示“L”。继电器1吸合,继电器2断开
  300. ;闪动显示标记符 H、L、O
  301. ;====================================================
  302. TEMP_COMP:
  303.           SETB  TR0             ;启动中断
  304.           MOV   A,TEMP_TH
  305.           SUBB  A,#01H         
  306.           SUBB  A,TEMP_ZH       ;减数>被减数,则
  307.           JC    CHULI1            ;借位标志位C=1,转
  308.           MOV   A,TEMP_ZH
  309.           SUBB  A,TEMP_TL       ;减数>被减数,则
  310.           JC    CHULI2            ;借位标志位C=1,转
  311.           JNB   FLAG2,T_COMP1    ;FLAG2=0,显示标记字符
  312.           MOV   74H,#0AH         ;熄灭符
  313.           LCALL  DISP1
  314.           JMP    T_COMP2
  315. T_COMP1:  MOV    74H,#00H
  316.           LCALL  DISP1          ;显示"O"
  317. T_COMP2:
  318.           SETB   C1          ;继电器1断开
  319.           SETB   C2          ;继电器2断开
  320.           CLR    TR0              ;关闭中断
  321.           RET
  322. ;---------------------------------------------
  323. ;超温处理
  324. ;---------------------------------------------
  325. CHULI1:
  326.         CLR    C1           ;继电器1吸合
  327.           CLR    C2           ;继电器2吸合
  328.           JNB    FLAG2,CHULI10
  329.           MOV    74H,#0AH         ;熄灭符
  330.           LCALL  DISP1
  331.           JMP    CHULI11
  332. CHULI10:  MOV    74H,#0DH        
  333.           LCALL  DISP1          ;显示"H"
  334. CHULI11:
  335.           CLR   TR0              ;关闭中断
  336.           RET
  337. ;---------------------------------------------
  338. ;欠温处理
  339. ;---------------------------------------------
  340. CHULI2:   CLR    C1              ;继电器1吸合
  341.           SETB   C2              ;继电器2断开
  342.           JNB    FLAG2,CHULI20
  343.           MOV    74H,#0AH         ;熄灭符
  344.           LCALL  DISP1
  345.           JMP    CHULI21
  346. CHULI20:  MOV    74H,#0CH        
  347.           LCALL  DISP1          ;显示"L"
  348. CHULI21:  CLR    TR0              ;关闭中断
  349.           RET
  350. ;------------------------------------------------------------
  351. ;把 DS18B20 暂存器里的动作温度设定值拷贝到EEROM
  352. ;------------------------------------------------------------
  353. WRITE_E2:
  354.         CALL    RESET
  355.         MOV     A,#0CCH        ;跳过ROM匹配
  356.         LCALL   WRITE
  357.         MOV     A,#48H         ;动作温度设定值拷贝到EEROM
  358.         LCALL   WRITE
  359.         RET
  360. ;--------------------------------------------------------------
  361. ;把 DS18B20 EEROM 里的动作温度设定值拷贝回暂存器
  362. ;-------------------------------------------------------------

  363. ……………………

  364. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整文档下载(word格式 可编辑):

文档.doc (433.5 KB, 下载次数: 40)

回复

使用道具 举报

ID:1 发表于 2017-7-11 16:44 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:209608 发表于 2017-7-16 17:26 来自手机 | 显示全部楼层
很有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表