?? 匯編程序.lt
字號:
1 ;這是關于DS18B20的讀寫程序,數據腳P2.2,晶振12MHZ
2 ;溫度傳感器18B20匯編程序,采用器件默認的12位轉化,最大轉化時間750微秒
3 ;可以將檢測到的溫度直接顯示到AT89C51開發實驗板的兩個數碼管上
4 ;顯示溫度00到99度,很準確哦~~無需校正!
5 ORG 0000H
6 ;單片機內存分配申明!
7 TEMPER_L EQU 29H ;用于保存讀出溫度的低8位
8 TEMPER_H EQU 28H ;用于保存讀出溫度的高8位
9 FLAG1 EQU 38H ;是否檢測到DS18B20標志位
10 A_BIT EQU 20H ;數碼管個位數存放內存位置
11 B_BIT EQU 21H ;數碼管十位數存放內存位置
0000 12004B 12 MAIN: LCALL GET_TEMPER ;調用讀溫度子程序
13 ;進行溫度顯示,這里我們考慮用網站提供的兩位數碼管來顯示溫度
14 ;顯示范圍00到99度,顯示精度為1度
15 ;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
16 ;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節,這個字節就是實際測量獲得的溫度
17 ;這個轉化溫度的方法可是我想出來的哦~~非常簡潔無需乘于0.0625系數
0003 E529 18 MOV A,29H
0005 A240 19 MOV C,40H ;將28H中的最低位移入C
0007 13 20 RRC A
0008 A241 21 MOV C,41H
000A 13 22 RRC A
000B A242 23 MOV C,42H
000D 13 24 RRC A
000E A243 25 MOV C,43H
0010 13 26 RRC A
0011 F529 27 MOV 29H,A
0013 1200B4 28 LCALL DISPLAY ;調用數碼管顯示子程序
0016 B290 29 CPL P1.0
0018 0100 30 AJMP MAIN
31 ;這是DS18B20復位初始化子程序
001A D2A2 32 INIT_1820: SETB P2.2
001C 00 33 NOP
001D C2A2 34 CLR P2.2
35 ;主機發出延時537微秒的復位低脈沖
001F 7903 36 MOV R1,#3
0021 786B 37 TSR1: MOV R0,#107
0023 D8FE 38 DJNZ R0,$
0025 D9FA 39 DJNZ R1,TSR1
0027 D2A2 40 SETB P2.2 ;然后拉高數據線
0029 00 41 NOP
002A 00 42 NOP
002B 00 43 NOP
002C 7825 44 MOV R0,#25H
002E 30A205 45 TSR2: JNB P2.2,TSR3 ;等待DS18B20回應
0031 D8FB 46 DJNZ R0,TSR2
0033 02003D 47 LJMP TSR4 ;延時
0036 D238 48 TSR3: SETB FLAG1 ;置標志位,表示DS1820存在
0038 C297 49 CLR P1.7 ;檢查到DS18B20就點亮P1.7LED
003A 020044 50 LJMP TSR5
003D C238 51 TSR4: CLR FLAG1 ;清標志位,表示DS1820不存在
003F C291 52 CLR P1.1
0041 020048 53 LJMP TSR7
0044 7875 54 TSR5: MOV R0,#117
0046 D8FE 55 TSR6: DJNZ R0,TSR6 ;時序要求延時一段時間
0048 D2A2 56 TSR7: SETB P2.2
004A 22 57 RET
58 ;讀出轉換后的溫度值
004B D2A2 59 GET_TEMPER: SETB P2.2
004D 12001A 60 LCALL INIT_1820 ;先復位DS18B20
0050 203803 61 JB FLAG1,TSS2
0053 C292 62 CLR P1.2
0055 22 63 RET ;判斷DS1820是否存在?若DS18B20不存在則返回
0056 C293 64 TSS2: CLR P1.3 ;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!
0058 74CC 65 MOV A,#0CCH ;跳過ROM匹配
005A 120078 66 LCALL WRITE_1820
005D 7444 67 MOV A,#44H ;發出溫度轉換命令
005F 120078 68 LCALL WRITE_1820
69 ;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
0062 1200B4 70 LCALL DISPLAY
0065 12001A 71 LCALL INIT_1820 ;準備讀溫度前先復位
0068 74CC 72 MOV A,#0CCH ;跳過ROM匹配
006A 120078 73 LCALL WRITE_1820
006D 74BE 74 MOV A,#0BEH ;發出讀溫度命令
006F 120078 75 LCALL WRITE_1820
0072 120090 76 LCALL READ_18200 ;將讀出的溫度數據保存到35H/36H
0075 C294 77 CLR P1.4
0077 22 78 RET
79 ;寫DS18B20的子程序(有具體的時序要求)
0078 7A08 80 WRITE_1820: MOV R2,#8 ;一共8位數據
007A C3 81 CLR C
007B C2A2 82 WR1: CLR P2.2
007D 7B06 83 MOV R3,#6
007F DBFE 84 DJNZ R3,$
0081 13 85 RRC A
0082 92A2 86 MOV P2.2,C
0084 7B17 87 MOV R3,#23
0086 DBFE 88 DJNZ R3,$
0088 D2A2 89 SETB P2.2
008A 00 90 NOP
008B DAEE 91 DJNZ R2,WR1
008D D2A2 92 SETB P2.2
008F 22 93 RET
94 ;讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
0090 7C02 95 READ_18200: MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
0092 7929 96 MOV R1,#29H ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
0094 7A08 97 RE00: MOV R2,#8 ;數據一共有8位
0096 C3 98 RE01: CLR C
0097 D2A2 99 SETB P2.2
0099 00 100 NOP
009A 00 101 NOP
009B C2A2 102 CLR P2.2
009D 00 103 NOP
009E 00 104 NOP
009F 00 105 NOP
00A0 D2A2 106 SETB P2.2
00A2 7B09 107 MOV R3,#9
00A4 DBFE 108 RE10: DJNZ R3,RE10
00A6 A2A2 109 MOV C,P2.2
00A8 7B17 110 MOV R3,#23
00AA DBFE 111 RE20: DJNZ R3,RE20
00AC 13 112 RRC A
00AD DAE7 113 DJNZ R2,RE01
00AF F7 114 MOV @R1,A
00B0 19 115 DEC R1
00B1 DCE1 116 DJNZ R4,RE00
00B3 22 117 RET
118 ;顯示子程序
00B4 E529 119 DISPLAY: MOV A,29H ;將29H中的十六進制數轉換成10進制
00B6 75F00A 120 MOV B,#10 ;10進制/10=10進制
00B9 84 121 DIV AB
00BA F521 122 MOV B_BIT,A ;十位在A
00BC 85F020 123 MOV A_BIT,B ;個位在B
00BF 9000E6 124 MOV DPTR,#NUMTAB ;指定查表啟始地址
00C2 7804 125 MOV R0,#4
00C4 79FA 126 DPL1: MOV R1,#250 ;顯示1000次
00C6 E520 127 DPLOP: MOV A,A_BIT ;取個位數
00C8 93 128 MOVC A,@A+DPTR ;查個位數的7段代碼
00C9 F580 129 MOV P0,A ;送出個位的7段代碼
00CB C2A7 130 CLR P2.7 ;開個位顯示
00CD 11E1 131 ACALL D1MS ;顯示1MS
00CF D2A7 132 SETB P2.7
00D1 E521 133 MOV A,B_BIT ;取十位數
00D3 93 134 MOVC A,@A+DPTR ;查十位數的7段代碼
00D4 F580 135 MOV P0,A ;送出十位的7段代碼
00D6 C2A6 136 CLR P2.6 ;開十位顯示
00D8 11E1 137 ACALL D1MS ;顯示1MS
00DA D2A6 138 SETB P2.6
00DC D9E8 139 DJNZ R1,DPLOP ;100次沒完循環
00DE D8E4 140 DJNZ R0,DPL1 ;4個100次沒完循環
00E0 22 141 RET
142 ;1MS延時(按12MHZ算)
00E1 7F50 143 D1MS: MOV R7,#80
00E3 DFFE 144 DJNZ R7,$
00E5 22 145 RET
146 ;實驗板上的7段數碼管0~9數字的共陰顯示代碼
00E6 CF035D5B 147 NUMTAB: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
00EA 93DADE43
00EE DFDB
148 END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -