您好,欢迎来到保捱科技网。
搜索
您的当前位置:首页基于DS18B20的高精度温度采集、显示系统

基于DS18B20的高精度温度采集、显示系统

来源:保捱科技网
2、 设计分析及系统方案设计

通过DS18B20进行小数11位温度转换、采集,通过单片机读取DS18B20采集到的11位温度值进行二进制到十六进制的转换,利用ZLG7290进行八位数码管显示;利用键盘进入中断来设定报警上、下限,当温度高于上限或低于下限时进入报警子程序。利用键盘进入中断来查看当前设置的温度报警上下限值,利用ZLG7290和数码管来显示。主程序不断循环采集温度比较,并可随时进入中断来修改温度上下限和查看温度值。

3、 外围接口模块硬件电路功能描述

1.DS18B20:用于测定温度,测量范围-55~+125,分辨率为0.0625℃,数据格式为二进制补码形式。

2.ZLG7290B:用于数码管动态显示驱动,键盘扫描管理。能够驱动8位共阴极结构的LED数码管或位的LED,同时还能扫描管理多达个按键的扫描识别,其中八个键可以作为功能键使用。接口采用I²C结构。 3.蜂鸣器:这里用作报警,为无源蜂鸣器。

5、 系统电路图 ATC51 P1.0 P1.1 P1.7 /INT0(P3.2) P3.3 P3.4 IC总线 2VCC 上拉电阻 5K×2 ZLG7290B SDA SCL /RST /INT 8位数码管 VDD 5V VDD 5V 4.7K DQ 2 DQ 3 VDD DS 18B20 1 GND B4区 GND VCC 8550 保护电阻47欧 B5区 10K 103 BUZZ 图3温度采集系统的参考电路 设置DS18B20端口参数 THI_WARNING EQU 40H TLI_WARNING EQU 41H

TEMPER_FLAG EQU 42H ;温度符号位数据保存区 TEMPER_POINT EQU 43H ;温度小数部分数据保存区 TEMPER EQU 44H ;温度整数部分数值保存区 TEMPER_H EQU 45H ;温度整数部分高位数值保存区 TEMPER_L EQU 46H ;温度整数部分低位数值保存区 TI_SHOW EQU 47H ;十进制温度整数部分数值保存区 T_SAVE EQU 48H TEMPER_NUM EQU 60H FLAG1 BIT 00H DQ BIT P3.3

;****************************** ;设置ZLG7290端口参数

;****************************** SDA BIT P1.0 SCL BIT P1.1 WSLA EQU 70H RSLA EQU 71H DISDA EQU 20H DISCON EQU 08H

;********************************* ORG 8000H LJMP 8100H ORG 8003H LJMP INT_7290

;********************************* ;初始化部分

;********************************* ORG 8100H MOV SP,#60H CLR P1.7 LCALL DELAY SETB P1.7

;*************************** ;开中断,设置报警上下限值 ;**************************

MOV MOV

TMOD,#11H TL1,#0FCH

TH1,#4BH

MOV

SETB TR1 SETB EX0 SETB EA SETB IT0

MOV THI_WARNING,#22H MOV TLI_WARNING,#20H

;****************************************************************************** ;主程序部分

;****************************************************************************** LP1:

LCALL GET_TEMPER ;从DS18B20读取温度数据

LCALL TEMPER_COV ;转换读取的温度整数、符号位和小数部分数据并保存 LCALL DATA_PRO;数码管显示前对要显示数据的相关处理 LCALL LEDSHOW ;数码管显示程序 MOV A,TEMPER

CJNE A,TLI_WARNING,WAR;判断温度值是否低于报警下限值,低于则报警,不低于则判断 WAR:JNC LOOP10;是否大于报警上限值 LCALL BUZZL SJMP LP1

LOOP10:CJNE A,THI_WARNING,WAR1;判断温度值是否低于报警下限值,低于则报警,不低于则跳转 WAR1:JC LP2 LCALL BUZZH SJMP LP1

LP2: LCALL NOTWINKLE;对ZLG7290写入不闪烁控制字 LJMP LP1

;****************************************************************************** ;获取DS18B20温度值子程序

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

;蜂鸣器报警程序

;蜂鸣器报警程序

GET_TEMPER:

SETB DQ

BCD:LCALL INIT_1820

JB FLAG1,S22 LJMP BCD

S22:LCALL DELAY1

MOV A,#0CCH LCALL WRITE_1820 MOV A,#44H LCALL WRITE_1820 LCALL DELAY

CBA:LCALL INIT_1820

JB FLAG1,ABC LJMP CBA

ABC:LCALL DELAY1

WRITE_1820:

MOV R2,#8 CLR C WR1:CLR DQ MOV R3,#6

DJNZ R3,$ RRC A

MOV DQ,C

MOV A,#0CCH LCALL WRITE_1820 MOV A,#0BEH LCALL WRITE_1820 LCALL READ_18200 RET

MOV R3,#23 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET

READ_18200:

MOV R4,#2

MOV R1,#46H RE00:MOV R2,#8 RE01:CLR C SETB DQ NOP CLR DQ

NOP NOP SETB DQ MOV R3,#2 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET

;****************************************************************************** ;DS18B20温度值提取整数部分、符号位和小数部分的子程序

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

TEMPER_COV:

;整数和小数的位偏移数据存储

MOV A,#0F0H ANL A,TEMPER_L SWAP A

MOV TEMPER_NUM,A MOV A,TEMPER_H ANL A,#07H SWAP A

ADD A,TEMPER_NUM MOV TEMPER_NUM,A

MOV TEMPER,TEMPER_NUM MOV A,#0FH ANL A,TEMPER_L SWAP A

MOV TEMPER_POINT,A MOV A,TEMPER_H ANL A,#08H

SWAP A

MOV TEMPER_FLAG,A RET

;****************************************************************************** ;30H——37H为数据存储区,其中30H--33H为小数值 ;34H--35H为整数值,36为百位值,37为符号位值

;****************************************************************************** DATA_PRO: MOV 37H,#0AH

MOV A,TEMPER_FLAG JZ POSITIVE MOV A,TEMPER CPL A ANL A,#7FH

SET1: MOV A,TEMPER

MOV B,#10

JNZ POINT1

MOV 30H,#00H MOV 31H,#00H MOV 32H,#00H MOV 33H,#00H SJMP SHOW

DIV AB MOV 34H,B MOV 35H,A

MOV A,TEMPER_POINT CLR C RLC A SWAP A RR A

ADD A,#01H

MOV TEMPER,A MOV 37H,#0BH

POSITIVE: MOV A,TEMPER CJNE A,H,SETHUNDREDBIT SETHUNDREDBIT:

JC SETHUNDREDBIT1

SUBB A,#H MOV TEMPER,A

MOV 36H,#01H

SJMP SET1

SETHUNDREDBIT1: MOV 36H,#00H

POINT1: DEC A

JNZ POINT2

MOV 30H,#05H MOV 31H,#02H MOV 32H,#06H MOV 33H,#00H SJMP SHOW

SJMP SHOW

POINT5: DEC A JNZ POINT6

MOV 30H,#05H MOV 31H,#02H MOV 32H,#06H MOV 33H,#00H SJMP SHOW

POINT2: DEC A JNZ POINT3

MOV 30H,#00H MOV 31H,#05H MOV 32H,#02H MOV 33H,#01H SJMP SHOW

POINT6: DEC A JNZ POINT7

MOV 30H,#00H MOV 31H,#05H MOV 32H,#07H MOV 33H,#03H SJMP SHOW

POINT3: DEC A JNZ POINT4

MOV 30H,#05H MOV 31H,#07H MOV 32H,#08H MOV 33H,#01H SJMP SHOW

POINT7:

MOV 30H,#05H MOV 31H,#07H MOV 32H,#03H MOV 33H,#04H

POINT4: DEC A JNZ POINT5

MOV 30H,#00H MOV 31H,#00H

MOV 32H,#05H MOV 33H,#02H

SHOW: JNC SHOW1 MOV A,33H ADD A,#05H MOV 33H,A SHOW1:RET

;****************************************************************************** ;ZLG7290数据显示部分子程序

;****************************************************************************** LEDSHOW: PUSH 00H PUSH 01H

PUSH 02H PUSH 03H

PUSH 07 MOV 24H,A

MOV DPTR,#LEDSEG

CLR A MOV R7,#08H MOV R0,#20H MOV R1,#30H LOOP1:MOV A,@R1 MOVC A,@A+DPTR

MOV @R0,A INC R1 INC R0 DJNZ R7,LOOP1 MOV A,24H ADD A,#01H

LOOP: MOV R7,#08H

MOV R0,#20H MOV R2,#10H MOV R3,#WSLA LCALL WRNBYT LCALL DELAY0 POP 07H POP 03H POP 02H POP 01H POP 00H

RET

;****************************************************************************** ;延时子程序 DELAY0: PUSH 00H

PUSH 01H MOV R0,#00H

DELAY1: MOV R7,#20H

DJNZ R7,$ RET

DELAY: PUSH 00H

PUSH 01H MOV R0,#00 LP: MOV R1,#00H

DJNZ R1,$ DJNZ R0,LP POP 01H POP 00H RET

DELAY2: MOV R1,#00H

DJNZ R1,$ DJNZ R0,DELAY2 POP 01H POP 00H RET

;****************************************************************************** ;蜂鸣器子程序

;****************************************************************************** BUZZL:

PUSH

04H

MOV R4,#200 MOV TL0,#66H

MOV TH0,#0FCH SETB

TR0

MOV R4,#128 MOV TL0,#66H MOV TH0,#0FCH SETB

TR0

LOOP002:JNB TF0,$

CLR TF0 CPL P3.4 MOV TL0,#55H MOV TH0,#0FCH DJNZ

R4,LOOP002

LOOP003:JNB TF0,$

CLR TF0 CPL P3.4 MOV TL0,#55H MOV TH0,#0FCH DJNZ

R4,LOOP003

LCALL TWINKLE POP 04H RET

LCALL TWINKLE POP 04H RET

BUZZH:

PUSH

04H

;****************************************************************************** ;数码管闪烁子程序

;****************************************************************************** TWINKLE:

PUSH 00H PUSH 02H PUSH 03H PUSH 07H

RET NOTWINKLE:

PUSH 00H PUSH 02H PUSH 03H PUSH 07H POP 03H POP 02H POP 00H

MOV 38H,#70H

MOV 39H,#0FFH MOV R7,#02H MOV R0,#38H MOV R2,#07H MOV R3,#WSLA LCALL WRNBYT MOV 3AH,#00H MOV R7,#01H MOV R0,#3AH MOV R2,#0CH MOV R3,#WSLA LCALL WRNBYT POP 07H

MOV 38H,#70H

MOV 39H,#00H MOV R7,#02H MOV R0,#38H MOV R2,#07H MOV R3,#WSLA LCALL WRNBYT MOV 3AH,#00H MOV R7,#01H MOV R0,#3AH

MOV R2,#0CH MOV R3,#WSLA LCALL WRNBYT POP 07H

POP 03H POP 02H POP 00H

RET

;****************************************************************************** ;中断子程序

;****************************************************************************** INT_7290:

PUSH PUSH PUSH PUSH PUSH PUSH PUSH PUSH

00H 01H 02H 03H 04H 07H ACC PSW

LCALL NOTWINKLE MOV 50H,#00H MOV 51H,#00H MOV 52H,#00H MOV 53H,#00H MOV 54H,#00H MOV 55H,#00H MOV 56H,#00H MOV 57H,#00H

LOOP_1: CLR C

LCALL DISP1 JB P3.2,$ LCALL INITREAD MOV A,29H DEC A CJNE

A,#0FH,DOWN

;判断是F键吗,是F关中断退出

SJMP TAIL1

DOWN: CJNE A,#0EH,DOWN1 ;判断是E键吗,是E显示设定的温度上限

MOV A,THI_WARNING MOV B,#10 DIV AB

MOV DPTR,#LEDSEG MOVC A,@A+DPTR MOV 51H,A

MOV A,B

MOVC A,@A+DPTR MOV 50H,A MOV 52H,#12H MOV 53H,#6EH LCALL DISP1

JB P3.2,$

SJMP TAIL1

DOWN1:CJNE A,#0DH,DOWN2 ; MOV A,TLI_WARNING MOV B,#10 DIV AB

MOV DPTR,#LEDSEG MOVC A,@A+DPTR MOV 51H,A

MOV A,B

MOVC A,@A+DPTR MOV 50H,A MOV 52H,#12H MOV 53H,#1CH LCALL DISP1

JB P3.2,$

SJMP TAIL1

DOWN2: CJNE A,#0CH,DOWN3 ; MOV 50H,#00H

MOV 51H,#00H

MOV 52H,#12H

MOV 53H,#1CH

LCALL SET_TLIMIT

判断是D键吗,是D显示设定的温度下限 判断是C键吗,是C设定的温度下限

MOV TLI_WARNING,T_SAVE JB P3.2,$ SJMP TAIL1

DOWN3:CJNE A,#0BH,TAIL1 ;判断是B键吗,是B设定的温度上限

MOV 52H,#12H MOV 53H,#6EH

LCALL SET_TLIMIT

MOV THI_WARNING,T_SAVE JB P3.2,$ SJMP TAIL1

;必须清标志

TAIL1: CLR IE0

POP

PSW

ACC 07H 04H 03H 02H

POP POP POP POP POP

POP 01H POP RETI

00H

;****************************************************************************** ;设置报警温度上下限值子程序

;****************************************************************************** SET_TLIMIT:

LCALL DISP1 AGAIN:JB P3.2,$

LCALL INITREAD MOV A,29H DEC A CJNE

A,#0FH,STEP1

SJMP TAIL

STEP1:CJNE A,#0DH,STEP2 SJMP AGAIN

STEP2:CJNE A,#0CH,STEP3 SJMP AGAIN

STEP3:CJNE A,#0BH,STEP4 JNC AGAIN

STEP4:CJNE A,#0AH,STEP5

JNC AGAIN STEP5: MOV T_SAVE,A

MOV DPTR,#LEDSEG MOVC

A,@A+DPTR

SJMP AGAIN1 STEP13:CJNE A,#0BH,STEP14 SJMP AGAIN1 STEP14:CJNE A,#0AH,STEP15

SJMP AGAIN1

MOV 51H,A LCALL DISP1

STEP15: MOV 50H,A

MOV A,T_SAVE MOV B,#10 MUL AB ADD A,50H MOV T_SAVE,A MOV A,50H MOV DPTR,#LEDSEG MOVCA,@A+DPTR MOV 50H,A LCALL DISP1 TAIL:RET

AGAIN1: JB P3.2,$ LCALL INITREAD

NOP MOV A,29H DEC A

CJNE A,#0FH,STEP11

SJMP TAIL

STEP11: CJNE A,#0DH,STEP12

SJMP AGAIN1

STEP12: CJNE A,#0CH,STEP13

;****************************************************************************** ;数码管显示子程序

;****************************************************************************** DISP1: PUSH

PUSH PUSH PUSH PUSH

02H 03H 04H 07H

00H

LCALL WRNBYT LCALL DELAY POP 07H POP 04H POP 03H POP 02H POP 00H RET

MOV R7,#08H MOV R0,#50H MOV R2,#10H MOV R3,#WSLA

;****************************************************************************** ;读取键值子程序

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

INITREAD:

MOV R0,#29H

MOV R7,#01H MOV R2,#01H

MOV R3,#WSLA MOV R4,#RSLA

LCALL RDADD RET

;****************************************************************************** ;初始化DS18B20子程序

;****************************************************************************** INIT_1820:

SETB DQ NOP CLR DQ MOV R0,#80H TSR1:DJNZ R0,TSR1

SETB DQ MOV R0,#25H TSR2:DJNZ R0,TSR2

JNB DQ,TSR3

LJMP TSR4 TSR3:SETB FLAG1 LJMP TSR5 TSR4:CLR FLAG1 LJMP TSR7 TSR5: MOV R0,#06BH TSR6:DJNZ R0,TSR6 TSR7:SETB DQ RET

;********************************* ;ZLG7290相关子程序

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

;(1)带有内部单元地址的多字节写操作子程序 WRNBYT

;******************************************************************* ;通用的I2C通讯子程序(多字节写操作) ;入口参数R7字节数,R0:源数据块首地址

;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写) ;

WRBYT、STOP、CACK、STA

;******************************************************************* WRNBYT: PUSH

PUSH

PSW

ACC

WRADD: MOV A,R3

LCALL STA LCALL WRBYT LCALL CACK JB F0,WRADD MOV A,R2 LCALL WRBYT LCALL CACK

;取外围器件地地址(包含r/w=0) ;发送起始信号S

;发送外围地址

;检测外围器件的应答信号 ;如果应

;发送内部寄存器首地址

;检测外围器件的应答信号

JB F0,WRADD ;如果应答不正确返回重来

WRDA: MOV A,@R0

LCALL WRBYT LCALL CACK JB F0,WRADD INC R0 DJNZ R7,WRDA LCALL STOP POP ACC POP PSW RET

;发送外围地址

;检测外围器件的应答信号 ;如果应答不正确返回重来

;(2)带有内部单元地址的多字节读操作子程序 RDADD

;******************************************************************* ;通用的I2C通讯子程序(多字节读操作);入口参数R7字节数; ;R0目标数据块首地址;R2从器件内部子地址; ;R3器件地址(写);R4器件地址(读) ;

WRBYT、STOP、CACK、STA、MNACK

;******************************************************************* RDADD: PUSH PUSH

ACC

PSW

;从PCF8563的02H单元读入7个参数

;存放于20H-26H单元

RDADD1: LCALL STA

MOV A,R3

;取器件地址(写)

;发送外围地址

;检测外围器件的应答信号

LCALL WRBYT LCALL CACK JB MOV

F0,RDADD1 ;如果应答不正确返回重来 A,R2

;取内部地址 ;发送外围地址

;检测外围器件的应答信号

LCALL WRBYT LCALL CACK JB

F0,RDADD1 ;如果应答不正确返回重来

LCALL STA MOV

A,R4

;取器件地址(读) ;发送外围地址

;检测外围器件的应答信号

LCALL WRBYT LCALL CACK JB

F0,RDADD1 ;如果应答不正确返回重来

RDN: LCALL RDBYT

MOV DJNZ

@R0,A R7,ACK

LCALL MNACK LCALL STOP POP POP RET

LCALL MACK INC SJMP

R0 RDN ACC PSW

ACK:

;(3)I2C各个信号子程序

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

启动信号子程序S

;********************************************************************** STA:

SETB SETB NOP NOP NOP NOP NOP CLR

SDA SDA SCL

;产生4.7US延时

;启动信号S

NOP NOP NOP NOP NOP CLR RET

SCL

;产生4.7US延时

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

停止信号子程序P

;********************************************************************* STOP: CLR

SDA

;停止信号P

;产生4.7US延时

NOP NOP NOP NOP NOP CLR CLR RET

SCL SDA

;产生4.7US延时

SETB SCL NOP NOP NOP NOP NOP SETB SDA

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

应答信号子程序 MACK

;********************************************************************** MACK: CLR

SETB NOP NOP NOP

SDA ;发送应答信号ACK SCL

;产生4.7US延时

NOP NOP CLR SETB RET

SCL SDA

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

非应答法信号子程序MNACK

;********************************************************************** MNACK:SETB SDA ;发送非应答信号NACK

SETB NOP NOP NOP

SCL

;产生4.7US延时

NOP NOP CLR CLR RET

SCL SDA

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

应答检测子程序CACK

;********************************************************************** CACK: SETB SDA;应答位检测子程序

SETB SCL CLR F0

MOV C,SDA ;采样SDA

JNC CEND;应答正确时转CEND SETB F0;应答错误时F0置一

SCL

CEND: CLR

RET

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

发送一个字节子程序WRBYT

;********************************************************************** WRBYT: PUSH

06H

NOP NOP NOP CLR SCL DJNZ R6,WLP POP RET

06H

MOV R6,#08H;发送一个字节子程序 WLP: RLC

A ;(入口参数A)

MOV SDA,C SETB NOP NOP

SCL

;产生4.7US延时

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

接收一个字节子程序RDBYT

;********************************************************************** RDBYT: PUSH 06H

MOV R6,#08H ;接收一个字节子程序

SDA

RLP: SETB

SETB SCL

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

NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP

;!!!!!产生大于15微秒的延时!!!!!! ;注意这是专门为ZLG7290 ;添加的20微秒延时部分

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

MOV C,SDA MOV A,R2 RLC A MOV R2,A CLR SCL DJNZ R6,RLP POP 06H RET

;(出口参数R2)

;********************************************************************** LEDSEG:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H,00H,02H

END

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务