源代码如下:
******************************************************
;室温的采集与控制系统,此系统主要分为初始化模块MAIN1,采集温度模块GET_TEMPER,温度转换模块CONVERT
;显示模块DISP1。具体的实现过程为先从GET_TEMPER模块获得室温存储在TEMPL和TEMPH中
;转换模块对他们进行转换之后将小数位,个位,十位,百位分别存储在70H,71H,72H,73H.
;预置的温度存放在地址74H,75H,76H,77H中
;显示模块disp1将小数,个,十,百位送入数码管显示
TMPL EQU 29H;采集温度的低八位
TMPH EQU 28H;采集温度的高八位
FLAG1 EQU 38H;DS18B20复位标志,1表示复位成功
DATAIN BIT P3.7 ;DS18B20数据口DQ
ORG 00H
LJMP MAIN1
ORG 03H
LJMP ZINT0
ORG 13H
LJMP ZINT1
ORG 30H
MAIN1: SETB IT0
SETB EA
SETB EX0
SETB IT1
SETB EX1
SETB P3.6
SETB P3.2
SETB P3.3
MOV 74H,#3
MOV 75H,#3
MOV 76H,#4
MOV 77H,#0
MAIN: LCALL GET_TEMPER
LCALL CVTTMP
LCALL DISP1
AJMP MAIN
;与DS18B20通信的模块。
;与DS18B20通信的过程为:每次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令
;最后发送RAM指令进行读写RAM。复位要求主CPU将数据线下拉500us,DS18B20受到信号后等待
;60us左右,发出60——240us的低脉冲,主CPU收到此信息代表复位成功
INIT_1820: SETB DATAIN
NOP
CLR DATAIN
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DATAIN
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DATAIN,TSR3
DJNZ R0,TSR2
CLR FLAG1
SJMP TSR7
TSR3: SETB FLAG1 ;复位成功
CLR P1.7 ;???
MOV R0,#117 ;等待60-240的低脉冲
TSR6: DJNZ R0,$
TSR7: SETB DATAIN
RET
GET_TEMPER: SETB DATAIN
LCALL INIT_1820
JB FLAG1,TSS2
NOP
RET
TSS2: MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H
LCALL WRITE_1820
ACALL DISP1
LCALL INIT_1820 ;每次通信前都需要初始化???
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#0BEH
LCALL WRITE_1820
LCALL READ_1820
RET
;R2R3只是做循环计数器,累加器A是传递进来的送到DATAIN的数据
WRITE_1820: MOV R2,#8
CLR C
WR1: CLR DATAIN
MOV R3,#6
DJNZ R3,$
RRC A
MOV DATAIN,C
MOV R3,#23
DJNZ R3,$
SETB DATAIN
NOP
DJNZ R2,WR1
SETB DATAIN
RET
;读取的数据存放在28H29H中,R4=2是采集两次数据,R2=8是每次采集8位,R3做延时参数
READ_1820: MOV R4,#2
MOV R1,#29H
RE00: MOV R2,#8
RE01: CLR C
SETB DATAIN
NOP
NOP
CLR DATAIN
NOP
NOP
NOP
SETB DATAIN
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DATAIN
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;温度转换模块,由于DS18B20采集的数据只是一一对应的关系,而且要将小数位,个位,十位,百位分开存储
;以便送入显示。具体的转换算法为;DS18B20采取12位转换模式,精度为0.0625即1/16,所以低四位转换后为小数位
;高四位为符号位,中间八位即为整数位,整数位/100即为百位,剩下的余数/10即为十位,最后的余数即为个位
CVTTMP: MOV A,TMPH
ANL A,#80H ;查看符号位
JZ TMPC1
CLR C
MOV A,TMPL
CPL A
ADD A,#1
MOV TMPL,A
MOV A,TMPH
CPL A
ADDC A,#0
MOV TMPH,A
MOV 73H,#0BH
SJMP TMPC11
TMPC1: MOV 73H,#0AH
TMPC11: MOV A,TMPL
ANL A,#0FH
MOV DPTR,#TMPTAB
MOVC A,@A+DPTR
MOV 70H,A
MOV A,TMPL
ANL A,#0F0H
SWAP A
MOV TMPL,A
MOV A,TMPH
ANL A,#0FH
SWAP A
ORL A,TMPL
H2BCD: MOV B,#100
DIV AB
JZ B2BCD1
MOV 73H,A
B2BCD1: MOV A,#10
XCH A,B
DIV AB
MOV 72H,A
MOV 71H,B
TMPC12: NOP
DISBCD: MOV A,73H
ANL A,#0FH
CJNE A,#1,DISBCD0
SJMP DISBCD1
DISBCD0: MOV A,72H
ANL A,#0FH
JNZ DISBCD1
MOV A,73H
MOV 72H,A
;MOV 72H,#0AH
MOV 73H,#0AH
DISBCD1: RET
TMPTAB: DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
;显示模块,显示70H71H72H73H中的实际温度及74H75H76H77H中的预置温度
DISP1: MOV R1,#70H
MOV R0,#74H
MOV R5,#0FEH
; MOV P0,#00H
PLAY:
MOV P2,#00H
MOV A,R5
MOV P0,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
;LCALL DL1MS
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV A,R5
JB ACC.1,LOOP1
SETB P2.7 ;设置实际温度显示的小数点
;SETB P1.7 ;设置预置温度显示的小数点
LOOP1: LCALL DL1MS
INC R1
INC R0
MOV A,R5
JNB ACC.3,ENDOUT ;百位显示之后结束显示
RL A
MOV R5,A
MOV A,73H
CJNE A,#1,DD2
SJMP LEDH
;完成实际温度与预制温度的比较,主要是为了控制加热的发光二极管及蜂鸣器
DD2: MOV A,72H
CJNE A,#0AH,DD3
MOV 72H,#0
DD3: MOV A,76H
CJNE A,72H,DDH
SJMP DDL
DDH: JNC PLAY1
SJMP LEDH
DDL: MOV A,75H
CJNE A,71H,DDL1
SJMP LEDH
DDL1: JNC PLAY1
LEDH: CLR P3.6
CLR P3.4
SJMP PLAY
PLAY1: SETB P3.6
SETB P3.4
SJMP PLAY
ENDOUT: MOV P0,#0FFH
MOV P2,#00H
RET
TAB: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H,40H
;延时子程序
DL1MS: MOV R6,#50
DL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
RET
;外部中断,预置温度的设置时通过中断实现的,每按一次键,相应的位数做模为9的加法,实现对温度的设置
ZINT0: PUSH ACC
INC 75H
MOV A,75H
CJNE A,#10,ZINT01
MOV 75H,#0
ZINT01: POP ACC
RETI
ZINT1: PUSH ACC
INC 76H
MOV A,76H
CJNE A,#10,ZINT11
MOV 76H,#0
ZINT11: POP ACC
RETI
ZZZ1: MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
RETI
END