📄 text1.lst
字号:
A51 MACRO ASSEMBLER TEXT1 05/11/2009 10:12:46 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN Text1.OBJ
ASSEMBLER INVOKED BY: E:\k51\C51\BIN\A51.EXE Text1.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;
;;
3 ;; 综合实验:LCD显示时间和温度
;;
4 ;;
;;
5 ;;1302引脚定义:P2.0-----DIO 数据端
;;
6 ;; P2.1-----SCLK 时钟端
;;
7 ;; P2.2-----RST 复位端 ;;
8 ;;1602引脚定义:P2.5----E
;;
9 ;; P2.6----RW
;;
10 ;; P2.7----RS
;;
11 ;; P0 ----数据口 ;;
12 ;;18B20引脚定义:P3.3----DQ ;;
13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14
0029 15 TEMPER_L EQU 29H ;用于保存读出温度的低8位
0028 16 TEMPER_H EQU 28H ;用于保存读出温度的高8位
0038 17 FLAG1 EQU 38H ;是否检测到DS18B20标志位
00B3 18 DQ BIT P3.3
19
00A7 20 RS EQU P2.7
00A6 21 RW EQU P2.6
00A5 22 E EQU P2.5
0080 23 LCD_DB EQU P0
007E 24 DAT EQU 7EH ;用于MCU与LCD传送的数据
25
26
00A0 27 DIO EQU P2.0
00A1 28 SCLK EQU P2.1
00A2 29 RST EQU P2.2
30
31
0000 32 ORG 0000H
0000 758160 33 MOV SP,#60H
0003 120310 34 LCALL LCDRESET
0006 120161 35 LCALL WRITE
36
37
0009 12004E 38 MAIN: LCALL GET_TEMPER ;调用读温度子程序
000C 1200B6 39 LCALL TEMPER_COV ;调用温度转换子程序
000F 120198 40 LCALL READ
0012 1201AF 41 LCALL DONE
0015 1201D7 42 LCALL DISP ;调用显示子程序
0018 120389 43 LCALL DEL200
001B 80EC 44 SJMP MAIN
45
46
47 ; 这是DS18B20复位初始化子程序
001D 48 INIT_1820:
001D D2B3 49 SETB DQ
001F 00 50 NOP
A51 MACRO ASSEMBLER TEXT1 05/11/2009 10:12:46 PAGE 2
0020 C2B3 51 CLR DQ
52
0022 7903 53 MOV R1,#3 ;主机发出延时537微秒的复位低脉冲
0024 786B 54 TSR1: MOV R0,#107
0026 D8FE 55 DJNZ R0,$
0028 D9FA 56 DJNZ R1,TSR1
002A D2B3 57 SETB DQ ;然后拉高数据线
002C 00 58 NOP
002D 00 59 NOP
002E 00 60 NOP
61
002F 7825 62 MOV R0,#25H
0031 30B305 63 TSR2: JNB DQ,TSR3 ;等待DS18B20回应
0034 D8FB 64 DJNZ R0,TSR2
0036 020040 65 LJMP TSR4 ; 延时
0039 66 TSR3:
0039 D238 67 SETB FLAG1 ; 置标志位,表示DS1820存在
003B C297 68 CLR P1.7 ;检查到DS18B20就点亮P1.7LED
003D 020047 69 LJMP TSR5
0040 70 TSR4:
0040 C238 71 CLR FLAG1 ; 清标志位,表示DS1820不存在
0042 C291 72 CLR P1.1
0044 02004B 73 LJMP TSR7
74
0047 75 TSR5:
0047 7875 76 MOV R0,#117
0049 77 TSR6:
0049 D8FE 78 DJNZ R0,TSR6 ; 时序要求延时一段时间
004B 79 TSR7:
004B D2B3 80 SETB DQ
004D 22 81 RET
82
83 ; 读出转换后的温度值
004E 84 GET_TEMPER:
004E D2B3 85 SETB DQ
0050 12001D 86 LCALL INIT_1820 ;先复位DS18B20
0053 203801 87 JB FLAG1,TSS2
0056 22 88 RET ; 判断DS1820是否存在?若DS18
B20不存在则返回
89
0057 74CC 90 TSS2: MOV A,#0CCH ; 跳过ROM匹配
0059 120075 91 LCALL WRITE_1820
92
005C 7444 93 MOV A,#44H ; 发出温度转换命令
005E 120075 94 LCALL WRITE_1820
95
0061 1200B1 96 LCALL D1MS ;等待AD转换结束,12位的话750微秒
97
0064 12001D 98 LCALL INIT_1820 ;准备读温度前先复位
99
0067 74CC 100 MOV A,#0CCH ; 跳过ROM匹配
0069 120075 101 LCALL WRITE_1820
102
006C 74BE 103 MOV A,#0BEH ; 发出读温度命令
006E 120075 104 LCALL WRITE_1820
105
0071 12008D 106 LCALL READ_18200 ; 读出温度数据
107
0074 22 108 RET
109
110 ;写DS18B20的子程序(有具体的时序要求)
0075 111 WRITE_1820:
0075 7A08 112 MOV R2,#8 ;一共8位数据
0077 C3 113 CLR C
0078 C2B3 114 WR1: CLR DQ
007A 7B05 115 MOV R3,#5
A51 MACRO ASSEMBLER TEXT1 05/11/2009 10:12:46 PAGE 3
007C DBFE 116 DJNZ R3,$
007E 13 117 RRC A
007F 92B3 118 MOV DQ,C
0081 7B15 119 MOV R3,#21
0083 DBFE 120 DJNZ R3,$
0085 D2B3 121 SETB DQ
0087 00 122 NOP
0088 DAEE 123 DJNZ R2,WR1
008A D2B3 124 SETB DQ
008C 22 125 RET
126
127 ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
008D 128 READ_18200:
008D 7C02 129 MOV R4,#2 ; 将温度高位和低位从DS18B20
中读出
008F 7929 130 MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H
(TEMPER_H)
0091 131 RE00:
0091 7A08 132 MOV R2,#8 ;数据一共有8位
0093 133 RE01:
0093 C3 134 CLR C
0094 D2B3 135 SETB DQ
0096 00 136 NOP
0097 00 137 NOP
0098 C2B3 138 CLR DQ
009A 00 139 NOP
009B 00 140 NOP
009C 00 141 NOP
009D D2B3 142 SETB DQ
009F 7B08 143 MOV R3,#8
00A1 DBFE 144 RE10: DJNZ R3,RE10
00A3 A2B3 145 MOV C,DQ
00A5 7B15 146 MOV R3,#21
00A7 DBFE 147 RE20: DJNZ R3,RE20
00A9 13 148 RRC A
00AA DAE7 149 DJNZ R2,RE01
00AC F7 150 MOV @R1,A
00AD 19 151 DEC R1
00AE DCE1 152 DJNZ R4,RE00
00B0 22 153 RET
154
155
156 ;1MS延时
00B1 7F50 157 D1MS: MOV R7,#80
00B3 DFFE 158 DJNZ R7,$
00B5 22 159 RET
160
161
162
00B6 163 TEMPER_COV: ;温度数据转换
00B6 C27F 164 CLR 7FH
00B8 E528 165 MOV A,28H ;判断温度的正,负
00BA C4 166 SWAP A
00BB 540F 167 ANL A,#0FH
00BD 600D 168 JZ QQ2
00BF E528 169 MOV A,28H
00C1 F4 170 CPL A
00C2 F528 171 MOV 28H,A
00C4 E529 172 MOV A,29H
00C6 F4 173 CPL A
00C7 04 174 INC A
00C8 F529 175 MOV 29H,A
00CA D27F 176 SETB 7FH ;负温度标志
177
00CC E529 178 QQ2: MOV A,29H
00CE 540F 179 ANL A,#0FH
A51 MACRO ASSEMBLER TEXT1 05/11/2009 10:12:46 PAGE 4
00D0 F530 180 MOV 30H,A ;提取小数
181
00D2 E528 182 MOV A,28H
00D4 C4 183 SWAP A
00D5 F528 184 MOV 28H,A
00D7 E529 185 MOV A,29H
00D9 C4 186 SWAP A
00DA 540F 187 ANL A,#0FH
00DC 2528 188 ADD A,28H
00DE F529 189 MOV 29H,A ;提取整数
190
00E0 1200E7 191 LCALL XSZH
00E3 12010D 192 LCALL HBCD
00E6 22 193 RET
194
195
196
197
198
00E7 900141 199 XSZH: MOV DPTR,#TAB ;小数查表,4位BCD存放在34H,35H,36H,37H
00EA E530 200 MOV A,30H
00EC 23 201 RL A
00ED F5F0 202 MOV B,A
00EF 93 203 MOVC A,@A+DPTR
00F0 F535 204 MOV 35H,A
00F2 E5F0 205 MOV A,B
00F4 A3 206 INC DPTR
00F5 93 207 MOVC A,@A+DPTR
00F6 F537 208 MOV 37H,A
00F8 E535 209 MOV A,35H
00FA C4 210 SWAP A
00FB 540F 211 ANL A,#0FH
00FD F534 212 MOV 34H,A
00FF 53350F 213 ANL 35H,#0FH
0102 E537 214 MOV A,37H
0104 C4 215 SWAP A
0105 540F 216 ANL A,#0FH
0107 F536 217 MOV 36H,A
0109 53370F 218 ANL 37H,#0FH
010C 22 219 RET
220
010D E529 221 HBCD: MOV A,29H
010F 75F064 222 MOV B,#100
0112 84 223 DIV AB
0113 F531 224 MOV 31H,A ;31H中存放百位
0115 E5F0 225 MOV A,B
0117 75F00A 226 MOV B,#10
011A 84 227 DIV AB
011B F532 228 MOV 32H,A ;32H中存十位
011D 85F033 229 MOV 33H,B ;33H中存个位
230
0120 207F0F 231 JB 7FH,HH1
0123 E531 232 MOV A,31H
0125 700A 233 JNZ HH2
0127 753170 234 MOV 31H,#70H ;31H为0则不显示
012A E532 235 MOV A,32H
012C 7003 236 JNZ HH2
012E 753270 237 MOV 32H,#70H ;32H为0则不显示
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -