基于8051单片机的温度报警器.docx
《基于8051单片机的温度报警器.docx》由会员分享,可在线阅读,更多相关《基于8051单片机的温度报警器.docx(26页珍藏版)》请在冰点文库上搜索。
![基于8051单片机的温度报警器.docx](https://file1.bingdoc.com/fileroot1/2023-5/27/aed1dccb-122f-4edf-b073-d185ff3faa60/aed1dccb-122f-4edf-b073-d185ff3faa601.gif)
基于8051单片机的温度报警器
目录
第1章系统设计1
1.1温度报警器的整体方框图1
第2章硬件设计2
2.1测温和控制电路2
2.2显示控制电路5
2.3声光报警电路6
第3章软件设计8
设计总结及心得9
参考文献10
附录1整体电路图11
附录2源程序12
第1章系统设计
1.1温度采集报警系统
图1.1所示为温度采集报警系统设计总体方框图。
该系统在温度采集时主要应用DS18B20芯片,该器件经过初始化后单片机首先进行ROM匹配,当受到测温器件发回的信号时证明该器件正常工作,接着单片机发送温度转换命令进行温度采集,测温的精确度很高,可以精确到小数点后四位。
设计中还应用了HD7279芯片进行数码管显示的驱动,一共应用了3位数码管。
报警电路采用由NE555所组成多谐振荡电路以单片机控制的温度采集系统为主,利用单片机完成对温度的检测,在安全温度内正常显示温度值,超出设定的温度上限时进行声光报警。
控制电路
显示电路
显示控
制电路
图1.1系统框图
第2章硬件设计
2.1测温和控制电路
(1)测温
测温使用的DS18B20是典型的应用单总线技术的器件。
独特的一线接口,只需要一条口线通信 多点能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为3.0V至5.5V 无需备用电源 测量温度范围为-55°C至+125℃。
华氏相当于是-67°F到257华氏度 -10°C至+85°C范围内精度为±0.5°C
温度传感器可编程的分辨率为9~12位 温度转换为12位数字格式最大值为750毫秒 用户可定义的非易失性温度报警设置 应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统
描述该DS18B20的数字温度计提供9至12位(可编程设备温度读数。
信息被发送到/从DS18B20 通过1线接口,所以中央微处理器与DS18B20只有一个一条口线连接。
为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。
因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于一条总线。
这使得温度传感器放置在许多不同的地方。
它的用途很多,包括空调环境控制,感测建筑物内温设备或机器,并进行过程监测和控制。
设备(主机或从机)通过一个漏极开路或三态端口,连接至该数据线,这样允许设备在不发送数据时释放数据总线,以便总线被其它设备所使用。
单总线端口为漏极开路,其内部等效电路如图1所示。
单总线要求外接一个约5k的上拉电阻;这样,单总线的闲置状态为高电平。
不管什么原因,如果传输过程需要暂时挂起,且要求传输过程还能够继续的话,则总线必须处于空闲状态。
位传输之间的恢复时间没有限制,只要总线在恢复期间处于空闲状态(高电平)。
如果总线保持低电平超过480μs,总线上的所有器件将复位。
另外,在寄生方式供电时,为了保证单总线器件在某些工作状态下(如温度转换期间、EEPROM写入等)具有足够的电源电流,必须在总线上提供强上拉[1]。
(2)控制
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
主要功能特性:
·兼容MCS-51指令系统
·4k可反复擦写(>1000次)ISPFlashROM
·32个双向I/O口
·4.5-5.5V工作电压
·2个16位可编程定时/计数器
·时钟频率0-33MHz
·全双工UART串行中断口线
·128x8bit内部RAM
·2个外部中断源
·低功耗空闲和省电模式
·中断唤醒省电模式
·3级加密位
·看门狗(WDT)电路
·软件设置空闲和省电功能
·灵活的ISP字节和分页编程
·双数据寄存器指针
引脚功能说明
VCCT:
电源电压
GND:
地
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口;作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或者程序存储器时,这组口线分时转换地址(低8位)和数据总线复用;在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时要求外接上拉电阻
P1口:
P1是一个带内部上拉电阻的8位双向I/O口;P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口;作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低会输出一个电流。
Flash编程和程序校验期间,P1接收低8位地址
P2口:
P2口是一个带有内部上拉电阻的8位双向I/O口;P2的输出缓冲级可驱动个(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口;作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低会输出一个电流。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据;在访问8位地址的外部数据存储器(如执行MOVX@RI)时,P2口线上的内容(即特殊功能寄存器(SFR)区中的R2寄存器的内容),在整个访问期间不改变;Flash编程或校验时,P2亦接收高位地址和其它控制信号。
P3口:
P3口是一个带有内部上拉电阻的8位双向I/O口;P2的输出缓冲级可驱动个(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口;作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低会输出一个电流。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能;如下表2-1所示:
表2.1
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外中断0)
P3.3
(外中断1)
P3.4
T0(定时/计数器0)
P3.5
T1(定时/计数器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器读选通)
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:
复位输入;当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位
ALE/PROG:
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节;即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的;要注意的是,每当访问外部数据存储器时将跳过一个ALE脉冲。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作,该位置位后,只有一条MOVX和MOVC指令ALE才会被激活,此外该引脚会被微弱拉高,单片机执行外部程序时,应该置ALE无效。
EA/VPP:
外部访问允许;欲使CPU仅访问外部程学存储器(地址为0000HFFFFH),EA端必须保持低电平(接地)。
需要注意的是,如果加密位LB1被编程,复位时内部会锁存EA端的状态[3]。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
XTML1:
振荡器反相放大器的及内部时钟发生器的输入端。
XTML2:
振荡器反相放大器的输出端。
图2.1测温和控制电路
2.2显示控制电路
HD7279是一片具有串行接口的,可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可联接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。
HD7279A内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式,此外,还具有多种控制命令,如消隐、闪烁、左移、右移、段寻址等。
HD7279A具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。
HD7279与单片机仅需4条接口线,其中CS为片选信号。
当MCU访问HD7279时,应将片选端置为低电平。
DATA为串行数据/输出端,当向HD7279发送数据时,DATA为输入端;当HD7279A输出键盘代码时,DATA为输出端。
其特点为:
-串行接口,无需外围元件可直接驱动LED
-各位独立控制译码/不译码及消隐和闪烁属性
-(循环)左移/(循环)右移指令
-具有段寻址指令,方便控制独立LED
-64键键盘控制器,内含去抖动电路
-有DIP和SOIC两种封装形式供选择
图2.2显示控制电路
2.3声光报警电路
555集成定时器是一种模拟和数字电路相混合的集成电路。
它结构简单,使用灵活,用途十分广泛,可以组成多种波形发生器、多谐振荡器、定时延时电路、双稳触发电路、报警电路、检测电路、频率变换电路等。
555含有两个比较器A1、A2,其中5端为电压控制端,通过外接一个参考电源,可以改变上、下触发电位值,不用时,可通过一个0.01μF旁路电容接地。
4端为触发器复位端,不用时应接高电平。
总之,555相当于一个可用模拟电压来控制翻转的R-S触发器。
图2.5就是用555构成的多谐振荡电路,产生的振荡脉冲信号经过三极管放大后驱动扬声器报警,由单片机的P1.5端口输出高电平发出报警。
555定时器的电路原理图及管脚排列图分别如图2.3和2.4所示。
图2.5报警电路
第3章软件设计
课程设计中主要利用DS18B20芯片进行测温,该芯片是单总线器件,在通信时时序十分重要。
在程序中测温时首先要对DS18B20进行初始化,初始化过程由单片机发出的复位脉冲和芯片响应的应答脉冲组成,应答脉冲使主机知道,总线上有从机设备,且准备就绪。
由于总线上只挂接了一片测温芯片,因此可直接跳过ROM匹配发出测温命令。
该设计可实时显示温度值,便于连续观测。
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图3.1
系统源程序见附录2。
软件流程图如下所示:
图3.1软件流程图
总结
通过本次课程设计,我掌握了很多实践知识,并在老师和同学们的帮助下对单片机的原理及应用有了进一步的了解和认识,也对温度报警器的工作原理有了进一步的掌握。
本次课程设计使我深深的懂得了理论与实际相结合的重要性,二者缺一不可,只有把所学的理论知识与实践两者结合起来,从实践中得出结论,才能对自己的动手能力和思考能力有所提高。
整个设计过程并不顺利,其中很多知识已经淡忘,还有很多新的东西没能及时掌握,所以在本次设计过程中不断地学习、复习,受益匪浅,也使我对单片机的运用有了进一步的了解和掌握,也为今后的学习生活和工作打下良好的基础。
参考文献
[1]单片机典型外围器件及应用实例北京人民邮电出版社,2006
[2]张友德,赵志英,徐时亮.单片微机原理应用与实验[M].上海:
复旦大学出版社,2000.
[3]蔡美琴,张为民,沈新群,张荣娟.MCS-51系列单片机系统及其应用[M].北京:
高等教育出版社,1992.
附录1整体电路图
附录2源程序
数字温度计程序清单
S1OK EQU5FH
TEMPUTER EQU39H
TEMPHEQU5EH
TEMPL EQU5DH
MS50 EQU5CH
SIGN EQU5BH
S1BITP1.0
S2BITP1.1
S3BITP1.2
S4BITP1.3
ORG0000H
LJMPMAIN
ORG000BH
LJMP TOIT
ORG0030H
MAIN:
MOVSP,#60H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H
SETBET0
SETBTR0
SETBEA
MOVTEMPH,#30
MOVTEMPL,#9
MOVTEMPUTER,#15;温度最始值
MOVS1OK,#00H
MOVSIGN,#00H
MOV38H,#0BH
MOV37H,#0CH
MOV36H,#0BH
ACALLDISP
ACALLT1S
;主程序
START:
JBS1,NET1
ACALLT12MS
JBS1,NET1
JNBS1,$
INCSIGN
MOVA,SIGN
CJNEA,#1,TIAO
ACALLTIAOTL
TIAO:
CJNEA,#2,NET1
MOVSIGN,#0
ACALLTIAOTH
;
NET1:
MOVA,S1OK
CJNEA,#1,START
MOVA,TEMPUTER
SUBBA,TEMPH
JNBACC.7,ALEM
MOVA,TEMPUTER
SUBBA,TEMPL
JBACC.7,ALEM
SETBP2.1
ACALLWENDU
ACALLDISP
MOVS1OK,#00H
AJMPSTART
ALEM:
MOV36H,#0CH
MOV37H,#0CH
MOV38H,#0CH
CLRP2.1
ACALLDISP
ACALLT1S
LCALLWENDU
LCALLDISP
MOVS1OK,#00H
SJMPSTART
TIAOTL:
MOV50H,TEMPUTER
MOV37H,TEMPL
ACALLBIN_BCD
ACALLDISP
ACALLT12MS
ACALLT12MS
ACALLT12MS
ACALLT12MS
MOV36H,#0AH
MOV37H,#0AH
MOV38H,#0AH
ACALLDISP
ACALLT12MS
ACALLT12MS
ACALLT12MS
ACALLT12MS
JBS2,ADD1
ACALLT12MS
JBS2,ADD1
JNBS2,$
INCTEMPL
MOVA,TEMPL
CJNEA,#100,ADD1
MOVTEMPL,#0
ADD1:
JBS3,ADD2
ACALLT12MS
JBS3,ADD2
JNBS3,$
DECTEMPL
MOVA,TEMPL
CJNEA,#00,ADD2
MOVTEMPL,#100
ADD2:
JBS4,TIAOTL
ACALLT12MS
JBS4,TIAOTL
JNBS4,$
MOVTEMPUTER,50H
LJMPSTART
;高位调整:
TIAOTH:
MOV50H,TEMPUTER
MOV37H,TEMPH
ACALL BIN_BCD
ACALL DISP
ACALL T12MS
ACALL T12MS
ACALL T12MS
ACALL T12MS
MOV 36H,#0AH
MOV 37H,#0AH
MOV 38H,#0AH
ACALL DISP
ACALL T12MS
ACALL T12MS
ACALL T12MS
ACALL T12MS
JB S2,ADD11
ACALLT12MS
JBS2,ADD11
JNBS2,$
INCTEMPH
MOVA,TEMPH
CJNEA,#100,ADD11
MOVTEMPH,#0
ADD11:
JBS3,ADD22
ACALLT12MS
JBS3,ADD22
JNBS3,$
DECTEMPH
MOVA,TEMPH
CJNEA,#00,ADD22
MOVTEMPH,#100
ADD22:
JBS4,TIAOTH
ACALLT12MS
JBS4,TIAOTH
JNBS4,$
MOVTEMPUTER,50H
LJMPSTART
;一秒定时中段
;
TOIT:
PUSHPSW
PUSHACC
MOVTH0,#3CH
MOVTL0,#0B0H
INCMS50
MOVA,MS50
CJNEA,#14H,RETURN
MOVS1OK,#1
MOVMS50,#00H
RETURN:
POPACC
POPPSW
RETI
;
;温度总子程序
;wendu:
ACALLINIT_1820
ACALLRE_CONFIG
ACALLGET_TEMPER
ACALLTEMPER_COV
RET
;DS18B20初始化程序
;INIT_1820:
SETBP2.0
NOP
CLRP2.0
MOVR0,#06BH
MOVR1,#03H
TSR1:
DJNZR0,TSR1;延时
MOVR0,#6BH
DJNZR1,TSR1
SETBP2.0
NOP
NOP
NOP
MOVR0,#25H
TSR2:
JNBP2.0,TSR3
DJNZR0,TSR2
LJMPTSR4;延时
TSR3:
SETB20H.1;置标志位,表示DS1820存在
LJMPTSR5
TSR4:
CLR20H.1;清标志位,表示DS1820不存在
LJMPTSR7
TSR5:
MOVR0,#06BH
MOVR1,#03H
TSR6:
DJNZR0,TSR6;延时
MOVR0,#6BH
DJNZR1,TSR6
TSR7:
SETBP2.0
RET
;
;重新写DS18B20暂存存储器设定值
;RE_CONFIG:
JB20H.1,RE_CONFIG1;若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOVA,#0CCH;发SKIPROM命令
LCALLWRITE_1820
MOVA,#4EH;发写暂存存储器命令
LCALLWRITE_1820
MOVA,#00H;TH(报警上限)中写入00H
LCALLWRITE_1820
MOVA,#00H;TL(报警下限)中写入00H
LCALLWRITE_1820
MOVA,#1FH;选择9位温度分辨率
LCALLWRITE_1820
RET
;;读出转换后的温度值
;GET_TEMPER:
SETBP2.0;定时入口
LCALLINIT_1820
JB20H.1,TSS2
RET;若DS18B20不存在则返回
TSS2:
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换命令
LCALLWRITE_1820
LCALLINIT_1820
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH;发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200
MOV37H,A;将读出的温度数据保存
RET
;
;写DS18B20的程序
;WRITE_1820:
MOVR2,#8
CLRC
WR1:
CLRP2.0
NOP
NOP
NOP
NOP
RRCA
MOVP2.0,C
MOVR3,#35
DJNZR3,$
SETBP2.0
NOP
DJNZR2,WR1
SETBP2.0
RET
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;READ_18200:
MOVR4,#2;将温度高位和低位DS18B20中读
RE00:
MOVR2,#8
RE01:
CLRC
SETBP2.0
NOP
NOP
CLRP2.0
NOP
NOP
NOP
SETBP2.0
NOP
NOP
MOVC,P2.0
MOVR3,#35
RE20:
DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
;将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOVA,#0F0H
ANLA,36H;舍去温度低位中小数点
SWAPA
MOV37H,A
MOVA,36H
JNBACC.3,TEMPER_COV1;四舍五入去温度值
INC37H
TEMPER_COV1:
MOVA,35H
ANLA,#07H
SWAPA
ADDA,37H
MOV37H,A;保存变换后的温度数据
LCALLBIN_BCD
RET
将16进制的温度数据转换成压缩BCD码
;38H中放百位,37十位,36个位
BIN_BCD:
MOV39H,37H
MOVA,37H
MOVB,#100
DIVAB
MOV38H,A
MOV37H,B
XCHA,B
MOVB,#10
DIVAB
MOV