完整代码下载:
程序.rar
(15.65 KB, 下载次数: 81)
单片机汇编源程序:
- ;温度上下限自由设定,P3.5设置温度上限,P3.6设置温度下限,P3.7为温度增加键,每按一次温度加一度。
- ;当按P3.5时,数码管显示H00;当按P3.6时,数码管显示L00,设置温度范围为整数,不含小数。
- ORG 0000H
- TEMPER_L EQU 29H
- TEMPER_H EQU 28H
- FLAG1 EQU 38H;是否检测到DS18B20标志位
- bwei equ 22h
- A_BIT EQU 20H ;数码管个位数存放内存位置
- B_BIT EQU 21H ;数码管十位数存放内存位置
- XS EQU 30H
- MOV A,#00H
- MOV P2,A
- MOV R5,#01H
- MAIN:LCALL GET_TEMPER;调用读温度子程序
- MOV A,29H
- MOV B,A
- CLR C
- RLC A
- CLR C
- RLC A
- CLR C
- RLC A
- CLR C
- RLC A
- SWAP A
- MOV 31H,A
- MOV A,B
- MOV C,40H;将28H中的最低位移入C
- RRC A
- MOV C,41H
- RRC A
- MOV C,42H
- RRC A
- MOV C,43H
- RRC A
- MOV 29H,A
- LCALL DISPLAY;调用数码管显示子程序
- AJMP MAIN; 这是DS18B20复位初始化子程序
- INIT_1820:SETB P1.0
- NOP
- CLR P1.0;主机发出延时537微秒的复位低脉冲
- MOV R1,#3
- TSR1:MOV R0,#107
- DJNZ R0,$
- DJNZ R1,TSR1
- SETB P1.0;然后拉高数据线
- NOP
- NOP
- NOP
- MOV R0,#25H
- TSR2:JNB P1.0,TSR3;等待DS18B20回应
- DJNZ R0,TSR2
- LJMP TSR4 ; 延时
- TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在
- LJMP TSR5
- TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在
- LJMP TSR7
- TSR5:MOV R0,#117
- TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间
- TSR7:SETB P1.0
- RET; 读出转换后的温度值
- GET_TEMPER:SETB P1.0
- LCALL INIT_1820;先复位DS18B20
- JB FLAG1,TSS2
- RET ; 判断DS1820是否存在?若DS18B20不存在则返回
- TSS2:MOV A,#0CCH ; 跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#44H ; 发出温度转换命令
- LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
- LCALL DISPLAY
- LCALL INIT_1820;准备读温度前先复位
- MOV A,#0CCH ; 跳过ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ; 发出读温度命令
- LCALL WRITE_1820
- LCALL READ_18200; 将读出的温度数据保存到35H/36H
- RET;写DS18B20的子程序(有具体的时序要求)
- WRITE_1820:MOV R2,#8;一共8位数据
- CLR C
- WR1:CLR P1.0
- MOV R3,#6
- DJNZ R3,$
- RRC A
- MOV P1.0,C
- MOV R3,#23
- DJNZ R3,$
- SETB P1.0
- NOP
- DJNZ R2,WR1
- RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
- READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
- MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
- RE00:MOV R2,#8;数据一共有8位
- RE01:CLR C
- SETB P1.0
- NOP
- NOP
- CLR P1.0
- NOP
- NOP
- NOP
- SETB P1.0
- MOV R3,#9
- RE10: DJNZ R3,RE10
- MOV C,P1.0
- MOV R3,#23
- RE20: DJNZ R3,RE20
- RRC A
- DJNZ R2,RE01
- MOV @R1,A
- DEC R1
- DJNZ R4,RE00
- RET
- DISPLAY:
- MOV A,29H;将29H中的十六进制数转换成10进制
- MOV R3,A
- CLR C
- SUBB A,50H;温度上限
- JNB CY, T3
- SETB P1.2;风扇继电器关
- SETB P2.5;报警关
- MOV A,R3
- CLR C
- SUBB A,60H;温度下限
- JB CY, T2
- SETB P1.1;加热继电器关
- SETB P2.5;报警关
- SJMP XIANSHI
- T2:
- CLR P1.1;加热继电器开
- CLR P2.5;报警开
- LJMP XIANSHI
- T3:
- CLR P1.2;风扇继电器开
- CLR P2.5;报警开
- XIANSHI:
- LCALL SETT
- DISP:
- MOV A,R3
- MOV B,#100 ;10进制/10=10进制
- DIV AB
- mov bwei,a
- mov a,b
- mov b,#10
- div ab
- MOV B_BIT,A ;十位在A
- MOV A_BIT,B ;个位在B
- MOV R0,#4
- CLR C;多加的
- DPL1: MOV R1,#250 ;显示1000次
- DPLOP:
- MOV DPTR,#NUMTAB
- MOV A,bwei
- MOVC A,@A+DPTR ;查通道的7段代码
- MOV P0,A ;送出十位的7段代码
- CLR P2.3 ;开通道显示
- ACALL D1MS ;显示1MS
- SETB P2.3
- MOV DPTR,#NUMTAB1
- MOV A,A_BIT ;取个位数
- MOVC A,@A+DPTR ;查个位数的7段代码
- MOV P0,A ;送出个位的7段代码
- CLR P2.1 ;开个位显示
- ACALL D1MS ;显示1MS
- SETB P2.1
- MOV DPTR,#NUMTAB
- MOV A,B_BIT ;取十位数
- MOVC A,@A+DPTR ;查十位数的7段代码
- MOV P0,A ;送出十位的7段代码
- CLR P2.2 ;开十位显示
- ACALL D1MS ;显示1MS
- SETB P2.2
- JC XSW;多加的
- MOV A,31H
- MOV B,#160
- DIV AB
- MOV XS,B
- XSW:MOV A,XS
- MOVC A,@A+DPTR
- MOV P0,A
- CLR P2.0
- ACALL D1MS
- SETB P2.0
- SETB C;多加的
- DJNZ R1,DPLOP ;250次没完循环
- DJNZ R0,DPL1 ;4个250次没完循环
- RET;1MS延时(按12MHZ算)
- D1MS: MOV R7,#80
- DJNZ R7,$
- RET
- D10MS: MOV R6,#20
- LOOP: MOV R7,#250
- DJNZ R7,$
- DJNZ R6,LOOP
- RET
- D5MS: MOV R6,#10
- LOOP1: MOV R7,#250
- DJNZ R7,$
- DJNZ R6,LOOP1
- RET
- NUMTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,7FH,7FH,7FH,7FH,7FH,7FH
- NUMTAB1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
- SETT:
- TH: JNB P3.6,GS
- JNB P3.5,GSU
- LJMP DISP
- GS: LCALL D10MS
- JB P3.6,TH
- SJMP BIAN3
- GSU: LCALL D10MS
- JB P3.5,TH
- SJMP BIAN
- BIAN3: MOV R1,#00
- BIAN1: MOV P0,#38H
- CLR P2.2
- SETB P2.0
- SETB P2.1
- LCALL D5MS
- MOV A,R1
- MOV B,#10
- DIV AB
- MOV DPTR,#NUMTAB
- MOVC A,@A+DPTR
- MOV P0,A
- CLR P2.1
- SETB P2.0
- SETB P2.2
- LCALL D5MS
- MOV A,B
- MOV DPTR,#NUMTAB
- MOVC A,@A+DPTR
- MOV P0,A
- CLR P2.0
- SETB P2.1
- SETB P2.2
- LCALL D5MS
- MOV 60H,R1
-
- JB P3.7,BIAN1
- JNB P3.7,$
- INC R1
- SJMP BIAN1
- BIAN: MOV R0,#00
- BIAN2: MOV P0,#76H
- CLR P2.2
- SETB P2.0
- SETB P2.1
- LCALL D5MS
- MOV A,R0
- MOV B,#10
- DIV AB
- MOV DPTR,#NUMTAB
- MOVC A,@A+DPTR
- MOV P0,A
- CLR P2.1
- SETB P2.0
- SETB P2.2
- LCALL D5MS
- MOV A,B
- MOV DPTR,#NUMTAB
- MOVC A,@A+DPTR
- MOV P0,A
- CLR P2.0
- SETB P2.1
- SETB P2.2
- LCALL D5MS
- MOV 50H,R0
-
- JB P3.7,BIAN2
- JNB P3.7,$
- INC R0
- SJMP BIAN2
- RET
- END
复制代码
|