?? 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 + -