?? ds18b20-溫度控制.lst
字號:
A51 MACRO ASSEMBLER DS18B20_溫禵縚制 12/20/2006 22:04:19 PAGE 1
MACRO ASSEMBLER A51 V7.08a
OBJECT MODULE PLACED IN DS18B20-溫度控制.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE DS18B20-溫度控制.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;*******************************************************************
2 ;* *
3 ;* ME500單片機開發系統演示程序 - DS18B20溫度控制 *
4 ;* *
5 ;* 數碼管顯示 *
6 ;* *
7 ;* 版本: V1.0 (2006/11/20) *
8 ;* 作者: gguoqing (Email: gguoqing@willar.com) *
9 ;* 網站: www.willar.com(偉納電子) www.mcusj.com(偉納單片機世界) *
10 ;* 時間: 2005/03/15 *
11 ;* *
12 ;*【版權】Copyright(C)偉納電子 www.willar.com All Rights Reserved *
13 ;*【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息! *
14 ;* *
15 ;*******************************************************************
16
0023 17 TIMER_L EQU 23H
0024 18 TIMER_H EQU 24H
0025 19 TIMER_COUN EQU 25H
20
0026 21 TEMPL EQU 26H
0027 22 TEMPH EQU 27H
0028 23 TEMP_TH EQU 28H
0029 24 TEMP_TL EQU 29H
25
002A 26 TEMPHC EQU 2AH
002B 27 TEMPLC EQU 2BH
002C 28 TEMP_ZH EQU 2CH
29
00B7 30 BEEP BIT P3.7
00B3 31 DATA_LINE BIT P3.3
0093 32 RELAY BIT P1.3
33
0000 34 FLAG1 BIT 20H.0
0001 35 FLAG2 BIT 20H.1
36
37 ;-------------------------------------------------
0094 38 K1 EQU P1.4
0095 39 K2 EQU P1.5
0096 40 K3 EQU P1.6
0097 41 K4 EQU P1.7
42 ;=================================================
0000 43 ORG 0000H
0000 800B 44 JMP MAIN
45
000B 46 ORG 000BH
000B 01C2 47 AJMP INT_T0
48 ;--------------------------------------------------
000D 49 MAIN:
000D 758130 50 MOV SP,#30H
0010 758901 51 MOV TMOD,#01H ;T0,方式1
0013 752300 52 MOV TIMER_L,#00H ;50MS定時值
0016 75244C 53 MOV TIMER_H,#4CH
0019 752500 54 MOV TIMER_COUN,#00H ;中斷計數
001C 75A882 55 MOV IE,#82H ;EA=1,ET0=1
56 ;LCALL READ_E2
57 ;LCALL RE_18B20
001F 752000 58 MOV 20H,#00H
A51 MACRO ASSEMBLER DS18B20_溫禵縚制 12/20/2006 22:04:19 PAGE 2
0022 D2B7 59 SETB BEEP
0024 D293 60 SETB RELAY
0026 757F0A 61 MOV 7FH,#0AH ;熄滅符
62
0029 115B 63 CALL RESET ;復位與檢測DS18B20
002B 300002 64 JNB FLAG1,MAIN1 ;FLAG1=0,DS18B20不存在
002E 800A 65 JMP START
66
0030 115B 67 MAIN1: CALL RESET
0032 200005 68 JB FLAG1,START
0035 1203B9 69 LCALL BEEP_BL ;DS18B20錯誤,報警
0038 80F6 70 JMP MAIN1
003A 71 START:
003A 74CC 72 MOV A,#0CCH ; 跳過ROM匹配
003C 1185 73 CALL WRITE
003E 7444 74 MOV A,#044H ; 發出溫度轉換命令
0040 1185 75 CALL WRITE
76
0042 115B 77 CALL RESET
0044 74CC 78 MOV A,#0CCH ; 跳過ROM匹配
0046 1185 79 CALL WRITE
0048 74BE 80 MOV A,#0BEH ; 發出讀溫度命令
004A 1185 81 CALL WRITE
82
004C 119E 83 CALL READ_TEMP ;讀溫度數據
004E 513D 84 CALL CONVTEMP ;溫度數據處理
0050 51AD 85 CALL DISPBCD
0052 51E1 86 CALL TEMP_PLAER ;顯示實時溫度
0054 11FD 87 CALL SCANKEY ;掃描鍵
0056 1201D5 88 LCALL TEMP_COMP ;比較溫度值
0059 80D5 89 JMP MAIN1
90
91 ;=====================================================
92 ;DS18B20 復位與檢測子程序
93 ;FLAG1=1 OK, FLAG1=0 ERROR
94 ;======================================================
005B 95 RESET:
005B D2B3 96 SETB DATA_LINE
005D 00 97 NOP
005E C2B3 98 CLR DATA_LINE
0060 7864 99 MOV R0,#64H ;主機發出延時600微秒的復位低脈沖
0062 7903 100 MOV R1,#03H
0064 D8FE 101 RESET1: DJNZ R0,$
0066 7864 102 MOV R0,#64H
0068 D9FA 103 DJNZ R1,RESET1
006A D2B3 104 SETB DATA_LINE ;然后拉高數據線
006C 00 105 NOP
006D 7825 106 MOV R0,#25H
006F 30B304 107 RESET2: JNB DATA_LINE,RESET3 ;等待DS18B20回應
0072 D8FB 108 DJNZ R0,RESET2
0074 8004 109 JMP RESET4 ; 延時
0076 D200 110 RESET3: SETB FLAG1 ; 置標志位,表示DS1820存在
0078 8004 111 JMP RESET5
007A C200 112 RESET4: CLR FLAG1 ; 清標志位,表示DS1820不存在
007C 8004 113 JMP RESET6
007E 7864 114 RESET5: MOV R0,#064H
0080 D8FE 115 DJNZ R0,$ ; 時序要求延時一段時間
0082 D2B3 116 RESET6: SETB DATA_LINE
0084 22 117 RET
118 ;===========================================================
119 ;
120 ;===========================================================
0085 7A08 121 WRITE: MOV R2,#8 ;一共8位數據
0087 C2D7 122 CLR CY
0089 123 WR1:
0089 C2B3 124 CLR DATA_LINE ;開始寫入DS18B20總線要處于復位(低)狀態
A51 MACRO ASSEMBLER DS18B20_溫禵縚制 12/20/2006 22:04:19 PAGE 3
008B 7B09 125 MOV R3,#09
008D DBFE 126 DJNZ R3,$ ;總線復位保持18微妙以上
008F 13 127 RRC A ;把一個字節DATA 分成8個BIT環移給C
0090 92B3 128 MOV DATA_LINE,C ;寫入一個BIT
0092 7B17 129 MOV R3,#23
0094 DBFE 130 DJNZ R3,$ ;等待46微妙
0096 D2B3 131 SETB DATA_LINE ;重新釋放總線
0098 00 132 NOP
0099 DAEE 133 DJNZ R2,WR1 ;寫入下一個BIT
009B D2B3 134 SETB DATA_LINE
009D 22 135 RET
136 ;========================================================
137 ;讀溫度子程序
138 ;從DS18B20中讀出溫度低位、高位和報警值TH、TL
139 ;存入26H、27H、28H、29H
140 ;========================================================
009E 141 READ_TEMP:
009E 7C04 142 MOV R4,#4
00A0 7926 143 MOV R1,#26H ; 存入26H、27H、28H、29H
00A2 7A08 144 RE00: MOV R2,#8
00A4 C3 145 RE01: CLR C
00A5 D2B3 146 SETB DATA_LINE
00A7 00 147 NOP
00A8 00 148 NOP
00A9 C2B3 149 CLR DATA_LINE ;讀前總線保持為低
00AB 00 150 NOP
00AC 00 151 NOP
00AD 00 152 NOP
00AE D2B3 153 SETB DATA_LINE ;開始讀總線釋放
00B0 7B07 154 MOV R3,#07 ;延時15微妙
00B2 DBFE 155 DJNZ R3,$
00B4 A2B3 156 MOV C,DATA_LINE ;從DS18B20總線讀得一個BIT
00B6 7B17 157 MOV R3,#23
00B8 DBFE 158 DJNZ R3,$ ;等待46微妙
00BA 13 159 RRC A ;把讀得的位值環移給A
00BB DAE7 160 DJNZ R2,RE01 ;讀下一個BIT
00BD F7 161 MOV @R1,A
00BE 09 162 INC R1
00BF DCE1 163 DJNZ R4,RE00
00C1 22 164 RET
165 ;--------------------------------------------
166 ;中斷服務子程序
167 ;200MS對閃動標記 FLAG2 取反一次
168 ;--------------------------------------------
00C2 169 INT_T0:
00C2 C0E0 170 PUSH ACC ;入棧保護
00C4 C0D0 171 PUSH PSW
00C6 85238A 172 MOV TL0,TIMER_L ;重置定時參數
00C9 85248C 173 MOV TH0,TIMER_H
00CC 0525 174 INC TIMER_COUN ;中斷次數加1
00CE E525 175 MOV A,TIMER_COUN
00D0 B40405 176 CJNE A,#04H,INT_END
00D3 752500 177 MOV TIMER_COUN,#00H
00D6 B201 178 CPL FLAG2 ;對 FLAG2 取反
00D8 179 INT_END:
00D8 D0D0 180 POP PSW ;出棧
00DA D0E0 181 POP ACC
00DC 32 182 RETI
183 ;==========================================================
184 ;重新對 DS18B20 初始化
185 ;將設定的溫度報警值寫入 DS18B20
186 ;==========================================================
00DD 187 RE_18B20:
00DD 200001 188 JB FLAG1,RE_18B20A
00E0 22 189 RET
00E1 190 RE_18B20A:
A51 MACRO ASSEMBLER DS18B20_溫禵縚制 12/20/2006 22:04:19 PAGE 4
00E1 115B 191 CALL RESET
00E3 74CC 192 MOV A,#0CCH ;跳過ROM匹配
00E5 120085 193 LCALL WRITE
00E8 744E 194 MOV A,#4EH ;寫暫存寄存器
00EA 120085 195 LCALL WRITE
00ED E528 196 MOV A,TEMP_TH ;TH(報警上限)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -