📄 汇编程序.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 + -