程序的数据转化子程序的40H~43H为什么是28H的低4位呢???如何确定出来的???疑惑啊~~~~
;使用DS18B20把温度信号直接转换成数字信号输入单片机 ;经单片机处理后,将实时温度显示在两个7段数码管上 A_BIT EQU 20H ;存放个位数变量 B_BIT EQU 21H ;存放十位数变量 FLAG EQU 38H ;DS1820是否存在标志 DQ EQU P2.7 ;DQ引脚由P2.7控制 MAIN:;主程序 ACALL RE_TEMP ;调用读取温度子程序 ACALL TURN ;调用数据转化子程序 ACALL DISPLAY ;调用显示子程序 JMP MAIN ;循环 ;初始化及读取温度值子程序 RE_TEMP: SETB DQ ACALL RESET_1820;调用复位子程序 JB FLAG,ST ;判断DS1820是否存在 RET ST: ;DS1820存在 MOV A,#0CCH ;跳过ROM匹配 ACALL WRITE_1820;调用写入数据子程序 MOV A,#44H ;发出温度转换命令 ACALL WRITE_1820;调用写入数据子程序 ACALL RESET_1820;准备读温度前先复位 MOV A,#0CCH ;跳过ROM匹配 ACALL WRITE_1820;调用写入数据子程序 MOV A,#0BEH ;发出读温度命令 ACALL WRITE_1820;调用写入数据子程序 ACALL READ_1820;调用数去数据子程序 RET ;复位子程序 RESET_1820: SETB DQ NOP CLR DQ ;------------------------ ;主机发出复位低脉冲 ;将数据线下拉至少500us MOV R1,#3 DLY:MOV R0,#107 DJNZ R0,$ DJNZ R1,DLY ;------------------------- ;然后拉高数据线 SETB DQ NOP NOP NOP ;--------------------------- ;等待DS1820回应 MOV R0,#25H T2: JNB DQ,T3 ;DQ=0,DS1820存在跳转 DJNZ R0,T2 ;等待16~60us JMP T4 ;DQ=1,DS1820不存在 ;-------------------------- ;DS1820存在 ;标志位FLAG=1 T3: SETB FLAG JMP T5 ;--------------------------- ;DS1820不存在 ;标志位FLAG=0 T4: CLR FLAG JMP T7 ;------------------------------ ;DS1820存在.时序要求延时一段时间 T5: MOV R0,#117 T6: DJNZ R0,T6 ;--------------------- T7: SETB DQ RET
;写入子程序 WRITE_1820: MOV R2,#8;一共8位数据 CLR C ;C=0 WR1: CLR DQ ;总线低位,开始写入 MOV R3,#7 DJNZ R3,$;保持16us以上 RRC A ;把字节DATA分成8个位,环移给C MOV DQ,C;写入一个位 MOV R3,#23 DJNZ R3,$;等待,48us SETB DQ;重新释放总线 NOP DJNZ R2,WR1 ;写入下一个位 SETB DQ RET
;读取子程序 READ_1820: MOV R4,#2 ;读出两个字节的数据 MOV R1,#29H ;低位存入29H,高位存入28H RE0: MOV R2,#8 ;数据一共8位 RE1: CLR C SETB DQ NOP NOP CLR DQ ;读前,总线保持为低 NOP NOP NOP SETB DQ ;开始读,总线释放 MOV R3,#9 RE2: DJNZ R3,RE2 ;延时18us MOV C,DQ ;从总线读到一个位 MOV R3,#23 RE3: DJNZ R3,RE3 ;等待50us RRC A ;把读得的位值环移给A DJNZ R2,RE1;读下一位 MOV @R1,A ;存低位(29H) DEC R1 ;存高位 (28H) DJNZ R4,RE0 RET
;数据转化子程序 TURN: MOV A,29H MOV C,40H ;将28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A ;高位与低位合并,存入29H RET
;温度显示子程序 DISPLAY: MOV A,29H MOV B,#10 DIV AB MOV B_BIT,A ;十位在A MOV A_BIT,B ;个位在B MOV DPTR,#TAB ;指定查表起始地址 MOV R0,#4 DP1: MOV R1,#250 ;显示100次 LOOP: MOV A,A_BIT ;取个位数 MOVC A,@A+DPTR MOV P0,A CLR P3.1 ;开个位显示 ACALL DELAY SETB P3.1 MOV A,B_BIT ;取十位显示 MOVC A,@A+DPTR MOV P0,A CLR P3.0 ;开十位显示 ACALL DELAY SETB P3.0 DJNZ R1,LOOP ;250次未完循环 DJNZ R0,DP1 ;4个250次未完循环 RET
;延时子程序 DELAY: ;160us MOV R7,#80 DJNZ R7,$ RET
;代码表 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H END
|