求救。DS18B20!!! 点击:1098 | 回复:1



markgan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 0回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2003年5月13日
发表于:2003-05-14 16:16:00
楼主
各位大哥:我在做一个单点的温度测试,我DQ直接接在单片机的P1.2口,VDD=5V。GND=0这样可以吗?我也想问问我只要超上限就报警,不用温度显示,上限应该如何设置啊!下面的对吗?请解答,我在做毕业设计!! ; FLAG1: 标志位,为"1"时表示检测到DS18B20 ; DQ: DS18B20的数据总线接脚 ; TEMPER_NUM:保存读出的温度数据 ;RAM TEMPER_L EQU 36H TEMPER_H EQU 35H TEMPER_NUM EQU 37H ;BIT FLAG1 EQU 20H DQ BIT P1.1 ORG 0000H LJMP MAIN MAIN: NOP MOV SP,#0E0H;设置堆栈指针 MAIN_1: CALL INIT_1820;转到初始花 CALL RE_CONFIG;写DS18B20暂存存储器设定值 CALL GET_TEMPER;读出转换后的温度值 CALL TEMPER_COV;从DS18B20中读出的温度数据进行转换 JMP MAIN_1 ; DS18B20初始化程序 INIT_1820: SETB P1.1;置1 NOP CLR P1.1 MOV R0,#06BH MOV R1,#03H TSR1: DJNZ R0,TSR1 ; 延时 MOV R0,#6BH DJNZ R1,TSR1 SETB P1.1 NOP NOP NOP MOV R0,#25H TSR2: JNB P1.1,TSR3 DJNZ R0,TSR2 LJMP TSR4 ; 延时 TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在 LJMP TSR5 TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在 LJMP TSR7 TSR5: MOV R0,#06BH TSR6: DJNZ R0,TSR6 ; 延时 TSR7: SETB P1.1 RET ; 重新写DS18B20暂存存储器设定值 RE_CONFIG: JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1 RET RE_CONFIG1: MOV A,#0CCH ; 发SKIP ROM命令 LCALL WRITE_1820 MOV A,#4EH ; 发写暂存存储器命令 LCALL WRITE_1820 MOV A,#00H ; TH(报警上限)中写入00H LCALL WRITE_1820 MOV A,#00H ; TL(报警下限)中写入00H LCALL WRITE_1820 MOV A,#1FH ; 选择9位温度分辨率 LCALL WRITE_1820 RET ; 读出转换后的温度值 GET_TEMPER: SETB P1.1 ; 定时入口 LCALL INIT_1820 JB FLAG1,TSS2 RET ; 若DS18B20不存在则返回 TSS2: MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#44H ; 发出温度转换命令 LCALL WRITE_1820 LCALL INIT_1820 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 MOV TEMPER_NUM,A ; 将读出的温度数据保存 MOV A,#0ECH CALL WRITE_1820 RET ; 读DS18B20的程序,从DS18B20中读出一个字节的数据 READ_1820: MOV R2,#8 RE1: CLR C SETB P1.1 NOP NOP CLR P1.1 NOP NOP NOP SETB P1.1 MOV R3,#7 DJNZ R3,$ MOV C,P1.1 MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE1 RET ; 写DS18B20的程序 WRITE_1820: MOV R2,#8 CLR C WR1: CLR P1.1 MOV R3,#6 DJNZ R3,$ RRC A MOV P1.1,C MOV R3,#23 DJNZ R3,$ SETB P1.1 NOP DJNZ R2,WR1 SETB P1.1 RET ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_18200: MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H) RE00: MOV R2,#8 RE01: CLR C SETB P1.1 NOP NOP CLR P1.1 NOP NOP NOP SETB P1.1 MOV R3,#09 RE10: DJNZ R3,RE10 MOV C,P1.1 MOV R3,#23 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET ; 将从DS18B20中读出的温度数据进行转换 TEMPER_COV: MOV A,#0F0H ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值 SWAP A MOV TEMPER_NUM,A MOV A,TEMPER_L JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值 INC TEMPER_NUM TEMPER_COV1: MOV A,TEMPER_H ANL A,#07H SWAP A ORL A,TEMPER_NUM MOV TEMPER_NUM,A ; 保存变换后的温度数据 LCALL BIN_BCD RET ; 将16进制的温度数据转换成压缩BCD码 BIN_BCD: MOV DPTR,#TEMP_TAB MOV A,TEMPER_NUM MOVC A,@A+DPTR MOV TEMPER_NUM,A RET TEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H DB 08H,09H,10H,11H,12H,13H,14H,15H DB 16H,17H,18H,19H,20H,21H,22H,23H DB 24H,25H,26H,27H,28H,29H,30H,31H DB 32H,33H,34H,35H,36H,37H,38H,39H DB 40H,41H,42H,43H,44H,45H,46H,47H DB 48H,49H,50H,51H,52H,53H,54H,55H DB 56H,57H,58H,59H,60H,61H,62H,63H DB 64H,65H,66H,67H,68H,69H,70H END



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-05-14 16:16:00
1楼
请查看邮箱

热门招聘
相关主题

官方公众号

智造工程师