📄 456.lst
字号:
A51 MACRO ASSEMBLER 456 23/03/08 16:07:03 PAGE 1
DOS MACRO ASSEMBLER A51 X4.86
OBJECT MODULE PLACED IN 456.O
ASSEMBLER INVOKED BY: C:\OMF51\BIN\A51.EXE K:\456\456.AQD DB SB XR RB(0) PR(456.LST) OJ(456.O)
LOC OBJ LINE SOURCE
0030 1 TEMP_H EQU 30H
0031 2 TEMP_L EQU 31H
0032 3 TEMP_NUM EQU 32H
0033 4 TEMP_BCD EQU 33H
0034 5 COUNTER_H EQU 34H
0035 6 COUNTER_L EQU 35H
0036 7 BCD_H EQU 36H
0037 8 BCD_L EQU 37H
0036 9 COUNTER EQU 36H
0000 10 FLAG1 BIT 00H
0093 11 DQ BIT P1.3
0092 12 LCD_E BIT P1.2
0090 13 LCD_RS BIT P1.0
0091 14 LCD_RW BIT P1.1
0080 15 LCD_DB EQU P0
0094 16 SWITCH BIT P1.4
0095 17 LARUM BIT P1.5
18
19
0000 20 ORG 0000H
0000 020030 21 LJMP MAIN
22
0030 23 ORG 0030H
0030 758170 24 MAIN: MOV SP,#70H
0033 D295 25 SETB LARUM
0035 758905 26 MOV TMOD,#05H ;设定计数器0工作方式
0038 1201B5 27 LCALL INI_1602 ;LCD初始化子程序调用
003B 120281 28 LCALL TEXT
003E C294 29 CLR SWITCH
30
0040 120049 31 CYC: LCALL TEMP ;DS1820温度检测子程序调用
0043 1200CF 32 LCALL CONVERSION ;温度值转换子程序调用
0046 020040 33 LJMP CYC ;循环检测跳转
34
35 ;********************************************************
36 ; DS1820温度检测模块
37 ;********************************************************
38
0049 D293 39 TEMP: SETB DQ
004B 120157 40 LP1: LCALL INI_1820 ;DS18B20初始化子程序调用
004E 200003 41 JB FLAG1,LP2
0051 02004B 42 LJMP LP1 ;若DS18B20不存在则反复检测
43
0054 74CC 44 LP2: MOV A,#0CCH ;DS1820跳过ROM匹配指令------0CCH
0056 120097 45 LCALL WRITE_1820 ;调用DS1820写入子程序
0059 7444 46 MOV A,#44H ;发出温度转换命令
005B 120097 47 LCALL WRITE_1820 ;调用DS1820写入子程序
48
005E 1201AE 49 LCALL MON ;借用延时执行显示程序,提高利用率(模数转换)
0061 1202AD 50 LCALL DP
51
0064 120157 52 CBA: LCALL INI_1820 ;重新初始化
0067 200003 53 JB FLAG1,ABC
006A 020064 54 LJMP CBA
006D 74CC 55 ABC: MOV A,#0CCH ;跳过ROM匹配
006F 120097 56 LCALL WRITE_1820 ;调用DS1820写入子程序
0072 74BE 57 MOV A,#0BEH ;DS1820读温度命令 ----0BEH
0074 120097 58 LCALL WRITE_1820 ;调用DS1820写入子程序
A51 MACRO ASSEMBLER 456 23/03/08 16:07:03 PAGE 2
0077 1200AC 59 LCALL READ_18200 ;调用DS1820读取子程序读取温度
007A 22 60 RET
61
62 ;------------------读DS18B20子程序,从DS18B20中读出一个字节的数据
007B 7A08 63 READ_1820: MOV R2,#8
007D C3 64 RE1: CLR C
007E D293 65 SETB DQ
0080 00 66 NOP
0081 00 67 NOP
0082 C293 68 CLR DQ
0084 00 69 NOP
0085 00 70 NOP
0086 00 71 NOP
0087 D293 72 SETB DQ
0089 7B07 73 MOV R3,#7
008B DBFE 74 DJNZ R3,$
008D A293 75 MOV C,DQ
008F 7B17 76 MOV R3,#23
0091 DBFE 77 DJNZ R3,$
0093 13 78 RRC A
0094 DAE7 79 DJNZ R2,RE1
0096 22 80 RET
81
82 ;-------------------写DS18B20子程序
0097 7A08 83 WRITE_1820: MOV R2,#8 ;写入位数
0099 C3 84 CLR C
009A C293 85 WR1: CLR DQ ;拉低总线,写开始
009C 7B06 86 MOV R3,#6 ;延时12us+2us
009E DBFE 87 DJNZ R3,$
00A0 13 88 RRC A ;移入一位给CY
00A1 9293 89 MOV DQ,C ;送出
00A3 7B14 90 MOV R3,#20 ;延时40us+2us
00A5 DBFE 91 DJNZ R3,$
00A7 D293 92 SETB DQ ;释放总线,写一位结束
00A9 DAEF 93 DJNZ R2,WR1 ;判断一个字节数据写入
00AB 22 94 RET
95
96 ;-------------------读DS18B20子程序,从DS18B20中读出两个字节的温度数据
00AC 7C02 97 READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
00AE 7931 98 MOV R1,#TEMP_L ;低位存入TEMP_L,高位存入TEMP_H
00B0 7A08 99 READ1: MOV R2,#8 ;一字节判断
00B2 C3 100 READ2: CLR C
00B3 D293 101 SETB DQ
00B5 00 102 NOP
00B6 00 103 NOP
00B7 C293 104 CLR DQ ;拉低总线,读开始
00B9 00 105 NOP ;1us
00BA 00 106 NOP ;1us
00BB D293 107 SETB DQ ;1us
00BD 7B05 108 MOV R3,#5 ;1us
00BF DBFE 109 DJNZ R3,$ ;10us 延时14us
00C1 A293 110 MOV C,DQ ;读入信号
00C3 7B17 111 MOV R3,#23
00C5 DBFE 112 DJNZ R3,$ ;46us
00C7 13 113 RRC A ;读取信号移入A
00C8 DAE8 114 DJNZ R2,READ2 ;循环读取
00CA F7 115 MOV @R1,A
00CB 19 116 DEC R1
00CC DCE2 117 DJNZ R4,READ1
00CE 22 118 RET
119
120 ;-------------------将从DS18B20中读出的温度数据进行转换
00CF E531 121 CONVERSION: MOV A,TEMP_L
00D1 54F0 122 ANL A,#0F0H ; 舍去温度低位中小数点后的四位温度数值
00D3 C4 123 SWAP A
00D4 F532 124 MOV TEMP_NUM,A
A51 MACRO ASSEMBLER 456 23/03/08 16:07:03 PAGE 3
125
00D6 E530 126 MOV A,TEMP_H
00D8 5407 127 ANL A,#07H
00DA C4 128 SWAP A
00DB 4532 129 ORL A,TEMP_NUM
00DD F532 130 MOV TEMP_NUM,A ; 保存变换后的温度数据
131
00DF E531 132 MOV A,TEMP_L
00E1 30E302 133 JNB ACC.3,TEMP_COV1 ; 四舍五入温度值
00E4 0532 134 INC TEMP_NUM
135
00E6 1200EA 136 TEMP_COV1: LCALL BIN_BCD
00E9 22 137 RET
138
139 ;-------------------将16进制的温度数据转换成压缩BCD码
00EA 9000F3 140 BIN_BCD: MOV DPTR,#TEMP_TAB
00ED E532 141 MOV A,TEMP_NUM
00EF 93 142 MOVC A,@A+DPTR
00F0 F533 143 MOV TEMP_BCD,A
00F2 22 144 RET
145
00F3 146 TEMP_TAB:
00F3 00010203 147 DB 00H,01H,02H,03H,04H,05H,06H,07H
00F7 04050607
00FB 08091011 148 DB 08H,09H,10H,11H,12H,13H,14H,15H
00FF 12131415
0103 16171819 149 DB 16H,17H,18H,19H,20H,21H,22H,23H
0107 20212223
010B 24252627 150 DB 24H,25H,26H,27H,28H,29H,30H,31H
010F 28293031
0113 32333435 151 DB 32H,33H,34H,35H,36H,37H,38H,39H
0117 36373839
011B 40414243 152 DB 40H,41H,42H,43H,44H,45H,46H,47H
011F 44454647
0123 48495051 153 DB 48H,49H,50H,51H,52H,53H,54H,55H
0127 52535455
012B 56575859 154 DB 56H,57H,58H,59H,60H,61H,62H,63H
012F 60616263
0133 64656667 155 DB 64H,65H,66H,67H,68H,69H,70H,71H
0137 68697071
013B 72737475 156 DB 72H,73H,74H,75H,76H,77H,78H,79H
013F 76777879
0143 80818283 157 DB 80H,81H,82H,83H,84H,85H,86H,87H
0147 84858687
014B 88899091 158 DB 88H,89H,90H,91H,92H,93H,94H,95H
014F 92939495
0153 96979899 159 DB 96H,97H,98H,99H
160
161 ;-------------------DS18B20初始化程序
0157 D293 162 INI_1820: SETB DQ ;释放总线
0159 00 163 NOP
015A C293 164 CLR DQ ;拉低总线
015C 1201A4 165 LCALL DELAY2 ;延时512us
015F D293 166 SETB DQ ;释放总线
0161 1201A9 167 LCALL DELAY1 ;延时64us
0164 309303 168 JNB DQ,TSR1 ;判断DS1820存在信号
0167 02016F 169 LJMP TSR2
016A D200 170 TSR1: SETB FLAG1 ;置标志位1,表示DS1820存在
016C 020174 171 LJMP TSR3
016F C200 172 TSR2: CLR FLAG1 ;清标志位1,表示DS1820不存在
0171 020178 173 LJMP TSR4
0174 7864 174 TSR3: MOV R0,#100 ;延时200us
0176 D8FE 175 DJNZ R0,$
0178 D293 176 TSR4: SETB DQ
017A 22 177 RET
178
A51 MACRO ASSEMBLER 456 23/03/08 16:07:03 PAGE 4
179 ;------------------重新写DS18B20暂存存储器设定值
017B 200001 180 RE_CONFIG: JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
017E 22 181 RET
017F 74CC 182 RE_CONFIG1: MOV A,#0CCH ; 发SKIP ROM命令
0181 120097 183 LCALL WRITE_1820
0184 744E 184 MOV A,#4EH ; 发写暂存存储器命令
0186 120097 185 LCALL WRITE_1820
186
0189 7400 187 MOV A,#00H ; TH(报警上限)中写入00H
018B 120097 188 LCALL WRITE_1820
018E 7400 189 MOV A,#00H ; TL(报警下限)中写入00H
0190 120097 190 LCALL WRITE_1820
0193 747F 191 MOV A,#7FH ; 选择12位温度分辨率
0195 120097 192 LCALL WRITE_1820
0198 22 193 RET
194
195 ;------------------延时子程序
0199 7F00 196 DELAY: MOV R7,#00H ;延时132ms
019B DF01 197 MIN: DJNZ R7,YS500
019D 22 198 RET
199
019E 1201A4 200 YS500: LCALL DELAY2
01A1 02019B 201 LJMP MIN
202
01A4 7E00 203 DELAY2: MOV R6,#00H ;延时512us
01A6 DEFE 204 DJNZ R6,$
01A8 22 205 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -