通过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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务