单片机汇编程序:
- TEMPER_L EQU 31H ;用于保存读出温度低字节
- TEMPER_H EQU 30H ;用于保存读出温度高字节
- TEMPER_SET EQU 32H ;用于保存设定的预期温度
- FLAG EQU 33H ;是否检测到DS18B20标志位
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN:
- MOV R0,#20 ;系统默认预期温度为20℃
- START:
- CLR P2.6 ;点亮“实时温度”指示灯
- SETB P2.5 ;熄灭“设定温度”指示灯
- JNB P2.2,SELSUB ;是进入温度设定
- LCALL GET_TEMPER ;调用温度获取子程序
- LCALL COMPARE ;调用温度比较子程序
- LCALL DISPLAY ;调用显示子程序
- LCALL KEY ;调用显示切换子程序
- LJMP START
- SELSUB:
- MOV A,R0
- MOV B,#10
- DIV AB
- MOV R1,A ;温度十位存R1
- MOV R2,B ;温度个位存R2
- LCALL DISPLAY ;显示温度
- JNB P2.3,INC0
- JNB P2.4,DEC0
- JB P2.2,BACK
- LJMP SELSUB
- INC0: ;温度加1℃
- MOV A,R1
- CJNE A,#63H,ADD0 ;温度是否为99℃,不是则跳到ADD0
- MOV R1,#00H
- INC1:
- LCALL DELAY1 ;延时显示
- JNB P2.3,INC1 ;按键是否松开,松开则程序往下执行
- LJMP SELSUB
- ADD0:
- INC R0
- LCALL DELAY1
- LJMP SELSUB
- DEC0: ;温度减1℃
- MOV A,R1
- JZ SETR1 ;温度是0℃则跳到SETR1
- DEC R0
- DEC1:
- LCALL DELAY1
- JNB P2.4,DEC1 ;按键是否松开,松开则程序往下执行
- LJMP SELSUB
- SETR1:
- MOV R1,#63H
- LCALL DELAY1
- LJMP SELSUB
- BACK:
- LJMP START
- GET_TEMPER:
- SETB P1.2
- LCALL SET_1820 ;DS18B20初始化
- JB FLAG,TSS2 ;检测到DS18B20跳到TSS2
- RET
- TSS2:
- MOV A,#0CCH ;跳过ROM匹配
- LCALL WRITE_1820 ;写DS18B20子程序
- MOV A,#44H ;发出温度转换命令
- LCALL WRITE_1820
- LCALL DISPLAY ;用显示温度来等待AD转换结束
- LCALL SET_1820
- MOV A,#0CCH ;跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ;发出读温度命令
- LCALL WRITE_1820
- LCALL READ_1820 ;读DS18B20的温度数据
- MOV A,TEMPER_L
- MOV R3,#4
- L1:
- SETB C
- RRC A
- DJNZ R3,L1
- MOV TEMPER_L,A
- MOV A,TEMPER_H
- MOV R3,#4
- L2:
- SETB C
- RLC A
- DJNZ R3,L2
- ANL A,TEMPER_L
- MOV R7,A ;读出的温度转化问摄氏温度存R7中
- MOV B,#10
- DIV AB
- MOV R1,A ;读出的温度十位存R1
- MOV R2,B ;读出的温度个位存R2
- RET
- SET_1820: ;DS18B20复位初始化子程序
- SETB P1.2
- NOP
- CLR P1.2
- MOV R3,#3 ;主机发出延时537微秒的复位低脉冲
- TSR1:
- MOV R4,#107
- DJNZ R4,$
- DJNZ R3,TSR1
- SETB P1.2 ;然后拉高数据线
- NOP
- NOP
- NOP
- MOV R4,#25H
- TSR2:
- JNB P1.2,TSR3 ;等待DS18B20回应
- DJNZ R4,TSR2
- LJMP TSR4 ;延时
- TSR3:
- SETB FLAG ;置标志位,表示DS18B20存在
- LJMP TSR5
- TSR4:
- CLR FLAG ;清标志位,表示DS18B20不存在
- LJMP TSR7
- TSR5:
- MOV R4,#117
- TSR6:
- DJNZ R4,TSR6 ;时序要求延时一段时间
- TSR7:
- SETB P1.2
- RET
- WRITE_1820:
- MOV R3,#8 ;一共8位数据
- CLR C
- WR1:
- CLR P1.2
- MOV R4,#6
- DJNZ R4,$
- RRC A
- MOV P1.2,C
- MOV R4,#23
- DJNZ R4,$
- SETB P1.2
- NOP
- DJNZ R3,WR1
- SETB P1.2
- RET
- READ_1820: ;将温度高位和地位从DS18B20中读出
-
- MOV R4,#8
- RE01:
- CLR C
- SETB P1.2
- NOP
- NOP
- CLR P1.2
- NOP
- NOP
- NOP
- SETB P1.2
- MOV R6,#4
- DJNZ R6,$
- MOV C,P1.2
- RRC A
- MOV R6,#30
- DJNZ R6,$
- DJNZ R4,RE01
- MOV TEMPER_L,A ;地位存入31H
- MOV R4,#8
- RE02:
- CLR C
- SETB P1.2
- NOP
- NOP
- CLR P1.2
- NOP
- NOP
- NOP
- SETB P1.2
- MOV R6,#4
- DJNZ R6,$
- MOV C,P1.2
- RRC A
- MOV R6,#30
- DJNZ R6,$
- DJNZ R4,RE02
- MOV TEMPER_H,A ;高位存入32H
- RET
- COMPARE: ;比较温度子程序
- MOV TEMPER_SET,R0
- MOV A,R7
- CJNE A,TEMPER_SET,COMP ;设定温度与实时温度不等则跳COMP
- SETB P1.0 ;关加热器
- SETB P1.1 ;关制冷器
- RET
- COMP:
- MOV A,R7 ;实时温度存入A
- MOV B,R0 ;设定温度存入B
- DIV AB ;A除以B,商给A
- CJNE A,#0H,COMP1 ;若A不等于0,即实时温度高,跳转
- SETB P1.1 ;关制冷器
- CLR P1.0 ;开加热器
- LJMP EXIT
- COMP1:
- SETB P1.0 ;关加热器
- CLR P1.1 ;开制冷器
- EXIT:
- RET
- DISPLAY: ;显示子程序
- MOV DPTR,#DAT
- MOV A,R1
- MOVC A,@A+DPTR
- CLR P2.0
- SETB P2.1
- MOV P0,A ;动态扫描,显示十位
- LCALL DELAY ;延时约12毫秒
- MOV A,R2
- MOVC A,@A+DPTR
- SETB P2.0
- CLR P2.1
- MOV P0,A ;动态扫描,显示个位
- LCALL DELAY
- SETB P2.0
- SETB P2.1 ;关显示
- RET
- DAT:
- DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
- ;“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“灭”
- DELAY1: ;延时子程序,延时并显示
- MOV 36H,#08H
- LOOP0:
- LCALL DISPLAY
- DJNZ 36H,LOOP0
- RET
- DELAY: ;延时子程序,延时约12ms
- MOV 34H,#24H
- LOOP:
- MOV 35H,#0AFH
- LOOP1:
- DJNZ 35H,LOOP1
- DJNZ 34H,LOOP
- RET
- KEY: ;显示切换子程序
- JNB P2.7,KEY1
- RET
- KEY1:
- LCALL DELAY ;延时去抖动
- JNB P2.7,KEY2
- RET
- KEY2:
- LCALL INT
- RET
- INT:
- MOV A,R0 ;显示设定温度
- MOV B,#10
- DIV AB
- MOV R1,A
- MOV R2,B
- MOV R6,#50
- LCALL DELAY1
- DJNZ R6,$
- RET
- END
复制代码
|