📄 cewen1.lst
字号:
A51 MACRO ASSEMBLER CEWEN1 12/04/2007 14:46:48 PAGE 1
MACRO ASSEMBLER A51 V8.00d
OBJECT MODULE PLACED IN cewen1.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE cewen1.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1
2
3
4
5
0000 6 ORG 0000H
7
8 ;单片机内存分配申明!
0029 9 TEMPER_L EQU 29H;用于保存读出温度的低8位
0028 10 TEMPER_H EQU 28H;用于保存读出温度的高8位
0038 11 FLAG1 EQU 38H;是否检测到DS18B20标志位
0020 12 a_bit equ 20h ;数码管个位数存放内存位置
0021 13 b_bit equ 21h ;数码管十位数存放内存位置
14
15 ;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
16 ;显示范围00到99度,显示精度为1度
17 ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
18 ;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
19 ;这个转化温度的方法非常简洁无需乘于0.0625系数
20
0000 12004E 21 MAIN: LCALL GET_TEMPER;调用读温度子程序
0003 E529 22 MOV A,29H
0005 A240 23 MOV C,40H;将28H中的最低位移入C
0007 13 24 RRC A
0008 A241 25 MOV C,41H
000A 13 26 RRC A
000B A242 27 MOV C,42H
000D 13 28 RRC A
000E A243 29 MOV C,43H
0010 13 30 RRC A
0011 F529 31 MOV 29H,A
0013 1200B1 32 LCALL DISPLAY;调用数码管显示子程序
0016 303804 33 JNB FLAG1,MM1
0019 C290 34 CLR P1.0
001B 80E3 35 SJMP MAIN
001D D290 36 MM1: SETB P1.0
001F 80DF 37 SJMP MAIN
38
0021 D2A2 39 INIT_1820: SETB P2.2 ; 这是DS18B20复位初始化子程序
0023 00 40 NOP
0024 C2A2 41 CLR P2.2
0026 7903 42 MOV R1,#3 ;主机发出延时537微秒的复位低脉冲
0028 786B 43 TSR1: MOV R0,#107
002A D8FE 44 DJNZ R0,$
002C D9FA 45 DJNZ R1,TSR1
002E D2A2 46 SETB P2.2 ;然后拉高数据线
0030 00 47 NOP
0031 00 48 NOP
0032 00 49 NOP
0033 7825 50 MOV R0,#25H
0035 30A205 51 TSR2: JNB P2.2,TSR3 ;等待DS18B20回应
0038 D8FB 52 DJNZ R0,TSR2
003A 020042 53 LJMP TSR4 ; 延时
003D D238 54 TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
003F 020047 55 LJMP TSR5
0042 C238 56 TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
0044 02004B 57 LJMP TSR7
58
A51 MACRO ASSEMBLER CEWEN1 12/04/2007 14:46:48 PAGE 2
0047 7875 59 TSR5: MOV R0,#117
0049 D8FE 60 TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
004B D2A2 61 TSR7: SETB P2.2
004D 22 62 RET
63
004E D2A2 64 GET_TEMPER: SETB P2.2 ; 读出转换后的温度值
0050 120021 65 LCALL INIT_1820;先复位DS18B20
0053 203801 66 JB FLAG1,TSS2
0056 22 67 RET ; 判断DS1820是否存在?若DS18B20不存在则返回
0057 74CC 68 TSS2: MOV A,#0CCH ; 跳过ROM匹配
0059 120075 69 LCALL WRITE_1820
005C 7444 70 MOV A,#44H ; 发出温度转换命令
005E 120075 71 LCALL WRITE_1820
0061 1200B1 72 LCALL DISPLAY ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话7
50微秒
73
0064 120021 74 LCALL INIT_1820;准备读温度前先复位
75
0067 74CC 76 MOV A,#0CCH ; 跳过ROM匹配
0069 120075 77 LCALL WRITE_1820
78
006C 74BE 79 MOV A,#0BEH ; 发出读温度命令
006E 120075 80 LCALL WRITE_1820
81
0071 12008D 82 LCALL READ_18200; 将读出的温度数据保存到35H/36H
0074 22 83 RET
84
0075 7A08 85 WRITE_1820: MOV R2,#8;写DS18B20的子程序(有具体的时序要求),一共8位数据
0077 C3 86 CLR C
0078 C2A2 87 WR1: CLR P2.2
007A 7B05 88 MOV R3,#5
007C DBFE 89 DJNZ R3,$
007E 13 90 RRC A
007F 92A2 91 MOV P2.2,C
0081 7B15 92 MOV R3,#21
0083 DBFE 93 DJNZ R3,$
0085 D2A2 94 SETB P2.2
0087 00 95 NOP
0088 DAEE 96 DJNZ R2,WR1
008A D2A2 97 SETB P2.2
008C 22 98 RET
99
008D 7C02 100 READ_18200: MOV R4,#2 ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据,将温度高位和低位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -