1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
| T2CON EQU 0C8H T2MOD EQU 0C9H TR2 EQU T2CON.2 TF2 EQU T2CON.7 TL2 EQU 0CCH TH2 EQU 0CDH RCAP2L EQU 0CAH RCAP2H EQU 0CBH T2MODE EQU 0C9H TARGHT EQU 41H COUNTER EQU R3 DS18DQ EQU P1.3 //P1.3与DS18DQ等同,便于理解 TEMPH EQU 29H //保存读出温度的低8位 TEMPL EQU 28H //保存读出温度的高8位 DS18FLAG EQU 40H //设置标志 ORG 0000H ;定时器0中断产生方波用 LJMP START ORG 000BH LJMP WAVE START: MOV 30H,#00 //设置初始值 MOV 31H,#00 MOV 32H,#00 START1: MOV TMOD,#21H MOV TL1,#0F3H MOV TH1,#0F3H MOV PCON,#80H CLR TI MOV SCON,#50H START2: MOV TL0,#000H MOV TH0,#0F9H SETB TR0 SETB ET0 SETB EA; LCALL DS18_GF //设置DS18B20的工作方式 START3: LJMP START3
//初始化子程序 DS18_START: PUSH 07H //保存R7的值,防止改变R7的数值 SETB DS18DQ //将数据线拉高 NOP //延时1us CLR DS18DQ //将数据线拉低 MOV R7,#0 //延时大约512us DJNZ R7,$ SETB DS18DQ //将数据线拉高 MOV R7,#40 DS18_START1: //延时大约160us JNB DS18DQ,DS18_START2 //检查DS18B20是否工作正常 DJNZ R7,DS18_START1 SETB DS18FLAG //工作不正常 DS18_START2: CLR DS18FLAG MOV R7,#100 //延时月200us DJNZ R7,$ POP 07H //恢复R7的值 RET //设置DS18B20工作方式 DS18_GF: CLR DS18FLAG //清除标志 LCALL DS18_START //调用初始化子程序 MOV A,#0CCH //跳跃ROM指令 LCALL DS18_SEND // MOV A,#4EH //向RAM写数据 LCALL DS18_SEND MOV A,#75 LCALL DS18_SEND MOV A,#0 LCALL DS18_SEND MOV A,#7FH //设置工作方式 LCALL DS18_SEND CLR DS18DQ //释放总线 LCALL DELAY500US //延时500us RET
//输出转换温度命令 CONVERT_TEMPERATURE: LCALL DS18_START //调用初始化子程序 MOV A,#0CCH //跳跃ROM指令 LCALL DS18_SEND MOV A,#44H //温度转换 LCALL DS18_SEND RET //读温度数据 GET_TEMPERATURE: LCALL DS18_START //调用初始化子程序 MOV A,#0CCH //跳跃ROM指令 LCALL DS18_SEND MOV A,#0BEH //从RAM中的数据 LCALL DS18_SEND LCALL DELAY60US LCALL DS18_READ MOV TEMPL,A //将获得数据的低八位存到TEMPL LCALL DS18_READ MOV TEMPH,A //将获得数据的高八位存到TEMPH CLR DS18DQ //即复位。否则会一直读到 LCALL DELAY501US //暂存第九字节 RET
//计算获得温度值,便于现实 CAL_TEMPERATURE: PUSH 07H //暂存,防止改变R7的数据 CLR C //进位标志清零 MOV R7,#04H //循环次数
EX2: MOV A,TEMPH // 这些语句的作用是: RRC A // 整数位在:TEMPL中 MOV TEMPH,A //?数位在:TEMPH中的高半 MOV A,TEMPL RRC A MOV TEMPL,A DJNZ R7,EX2 //
MOV A,TEMPH // RLC A //这些语句的作用是: RLC A //把TEMPH得高半移到低四位中 RLC A RLC A // ANL A,#0FH //屏蔽高四位,保留低四位 MOV DPTR,#TAB_TEMP //赋带?数点的数值表的表首地址 MOVC A,@A+DPTR MOV 30H,A //暂存该值,用于显示 MOV A,TEMPL CLR C MOV B,#0AH DIV AB //分离整数位的高低四位 MOV 32H,A //暂存十位 MOV A,B ADD A,#10H MOV 31H,A //暂存个位 POP 07H //恢复R7的值 RET //写数据子程序 DS18_SEND: PUSH 06H //保护Rn的值 PUSH 07H //以下语句是"写 笔毙虻脑? SETB DS18DQ //写时序是有DS18DQ的下降沿决定 NOP //延时1us MOV R6,#08H //循环次数,一个字节 DS18_SEND1: CLR DS18DQ //拉低,产生下降沿 MOV R7,#07 //延时大约15us DJNZ R7,$ RRC A //把要写入得数据的高位移到C中 MOV DS18DQ,C //再把C的值赋给DS18DQ MOV R7,#30 //延时时间约为60us,只要大约45us即可 DJNZ R7,$ SETB DS18DQ //拉高准备,下次产生下降沿 DJNZ R6,DS18_SEND1 //判断循环次数够了没 POP 07H //恢复Rn的数据 POP 06H RET //读数据子程序 DS18_READ: PUSH 06H // 保护Rn的值 PUSH 07H //以下为 岸?钡氖毙? SETB DS18DQ //拉高,准备产生下降沿 MOV R6,#08H //循环次数 CLR A //A清零,准备装值 DS18_READ1: CLR DS18DQ //拉低,产生下降沿 NOP //延时2us,其实有没有都没有什么关系 NOP SETB DS18DQ //释放总线 MOV R7,#07H //等待15us DJNZ R7,$ MOV C,DS18DQ //获?数据 RRC A //将获得数据存到A中 MOV R7,#30 //延时60us DJNZ R7,$ SETB DS18DQ //拉高,准备下次产生下降沿 DJNZ R6,DS18_READ1 POP 07H //恢复Rn的 POP 06H RET
DISPLAY: XCH A,R1 MOV A,#0AH MOV B,32H MUL AB ADD A,31H MOV 33H,A MOV TARGHT,33H XCH A,R1 RET WAVE: CLR EA LCALL CONVERT_TEMPERATURE //调用转子程序 MOV R5,#80 LOOP1: LCALL DISPLAY //调用显示防止掉显,同时等待转换完成 DJNZ R5,LOOP1 LCALL GET_TEMPERATURE //获?转换值 LCALL CAL_TEMPERATURE //计算温度值
MOV SBUF,R1;发送温度到串口4800 JNB TI,$ CLR TI CJNE COUNTER,#30H, ZGENGSHU MOV COUNTER,#25H CLR TF0 MOV TL0,#000H MOV TH0,#0D9H SETB EA RETI FUSHU: SETB P2.0 CLR TF0 MOV TL0,#000H MOV TH0,#0D9H SETB EA RETI ZGENGSHU: INC COUNTER MOV A,COUNTER SUBB A,TARGHT JB ACC.7, FUSHU CLR P2.0 CLR TF0 MOV TL0,#000H MOV TH0,#0D9H SETB EA RETI
|