功能说明:
使用单线数字温度传感器DS18B20,把温度信号直接转换成数字信号输入单片机,经单片机处理后,将实时温度显示在两个7段LED数码管上。
程序:DA1405.ASM
01 A_BIT EQU 20H ;存放个位数变量 02 B_BIT EQU 21H ;存放十位数变量
03 FLAG EQU 38H ;DS18B20是否存在标志 04 DQ EQU P2.5 ;DQ引脚由P2.5控制 05 MAIN: ;
06 ACALL RE_TEMP ;调用读取温度子程序 07 ACALL TURN ;数据转化子程序 08 ACALL DISPLAY ;显示子程序
09 JMP MAIN ;循环 主程序 10
11 RE_TEMP: ;初始化及读取温度值 12 SETB DQ
13 ACALL RESET_1820 ;调用复位子程序
14 JB FLAG, ST ;判断DS1820是否存在? 15 RET 16 ST: ;DS18B20存在 17 MOV A,#0CCH ;跳过ROM匹配
18 ACALL WRITE_1820 ;调用写入数据子程序 19 MOV A,#44H ;发出温度转换命令 20 ACALL WRITE_1820 ;调用写入数据子程序 21 ACALL RESET_1820 ;准备读温度前先复位 22 MOV A,#0CCH ;跳过ROM匹配
23 ACALL WRITE_1820 ;调用写入数据子程序 24 MOV A,#0BEH ;发出读温度命令 25 ACALL WRITE_1820 ;调用写入数据子程序
26 ACALL READ_1820 ;调用读取数据子程序 设置传感器 27 RET 读取温度数据 28
29 RESET_1820: ;复位(有具体的时序要求) 30 SETB DQ 31 NOP
32 CLR DQ 33 ;―――――――――――― 34 ;主机发出复位低脉冲 35 MOV R1,#3 36 DLY: MOV R0,#107 37 DJNZ R0,$ 38 DJNZ R1,DLY
39 ;―――――――――――― 40 ;然后拉高数据线
41 SETB DQ 42 NOP 43 NOP 44 NOP
45 ;―――――――――――― 46 ;等待DS18B20回应
47 MOV R0,#25H 48 T2: JNB DQ ,T3 49 DJNZ R0, T2
50 JMP T4 51 ;――――――――――――
52 ;标志位FLAG=1,表示DS1820存在 53 T3: SETB FLAG 54 JMP T5
55 ;――――――――――――
56;标志位FLAG=0,表示DS1820不存在 57 T4: CLR FLAG 58 JMP T7
59 ;―――――――――――― 60 ;时序要求延时一段时间 61 T5: MOV R0,#117
62 T6: DJNZ R0,T6 63 ;―――――――――――― T7: SETB DQ
65 RET 复位子程序 66
67 WRITE_1820: ;写入DS18B20(有具体的时序要求) 68 MOV R2,#8 ;一共8位数据 69 CLR C ;C=0 70 WR1:
71 CLR DQ ;总线低位,开始写入 72 MOV R3,#7
73 DJNZ R3,$ ;保持16微秒以上 74 RRC A ;把字节DATA分成8个BIT环移给C 75 MOV DQ, C ;写入一个BIT 76 MOV R3,#23
77 DJNZ R3,$ ;等待
78 SETB DQ ;重新释放总线 79 NOP
80 DJNZ R2,WR1 ;写入下一个BIT 81 SETB DQ
82 RET 写入子程序
83
84 READ_1820: ;将温度高位和低位读出 85 MOV R4,#2 ;读出两个字节的数据 86 MOV R1,#29H ;低位存入29H,高位存入28h 87 RE0:
88 MOV R2,#8 ;数据一共有8位 RE1: 90 CLR C
91 SETB DQ 92 NOP
93 NOP
94 CLR DQ ;95 NOP 96 NOP 97 NOP
98 SETB DQ ;99 MOV R3,#9 100 RE2:
101 DJNZ R3,RE2 ;102 MOV C, DQ ;103 MOV R3,#23
104 RE3: ;
105 DJNZ R3,RE3 ;106 RRC A ;107 DJNZ R2,RE1 ;108 MOV @R1,A 109 DEC R1 110 DJNZ R4,RE0
111 RET 112
113 TURN:
114 MOV A,29H
115 MOV C,40H ;116 RRC A 117 MOV C,41H 118 RRC A 119 MOV C,42H 120 RRC A 121 MOV C,43H 122 RRC A 123 MOV 29H,A
124 RET 125
读前总线保持为低 开始读总线释放 延时18微妙
从总线读到一个BIT 等待50微妙
把读得的位值环移给A 读下一个BIT 读取子程序 将28中的最低位移入C 数据转化子程序 126 DISPLAY: ;将29H中的十六进制数成10进制 127 MOV A,29H
128 MOV B,#10 ;10进制/10=10进制 129 DIV AB
130 MOV B_BIT, A ;十位在A 131 MOV A_BIT, B ;个位在B
132 MOV DPTR,#TABLE ;指定查表启始地址 133 MOV R0,#4 134 DP1:
135 MOV R1,#250 ;显示1000次 136 LOOP:
137 MOV A,A_BIT ;取个位数
138 MOVC A,@A+DPTR ;查个位数的7段代码 139 MOV P0,A ;送出个位的7段代码 140 CLR P2.3 ;开个位显示 141 ACALL DELAY ; 142 SETB P2.3
143 MOV A,B_BIT ;取十位数
144 MOVC A,@A+DPTR ;查十位数的7段代码 145 MOV P0,A ;送出个十位的7段代码 146 CLR P2.2 ;开十位显示 147 ACALL DELAY ;显示1MS 148 SETB P2.2
149 DJNZ R1,LOOP ;250次没完循环 150 DJNZ R0,DP1 ;4个250次没完循环
151 RET 温度显示子程序 152
153 DELAY: ; 154 MOV R7,#80 155 DJNZ R7,$
156 RET 延时子程序 157
158 TABLE: ;数码管共阳极0~9代码 159 DB 0C0H,0F9H,0A4H,0B0H,99H
160 DB 92H,82H,0F8H,80H,90H 代码表 161
162 END 程序结束