ds18b20的多点测量的汇编程序 点击:1227 | 回复:2



bluefish

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 2回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2003年5月25日
发表于:2003-05-29 13:27:00
楼主
我的DS18B20单点连接还行,多点测量匹配就过不了,小弟十分着急,如有汇编语言的代码,请发到bluefish59@etang.com多谢!



bluefish

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 2回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2003年5月25日
发表于:2003-05-29 13:27:00
1楼
ORG 0000H LJMP MAIN ORG 2000H MAIN:MOV SP,#60H LCALL GET_TEMP SJMP $ GET_TEMP:CLR PSW.4 SETB PSW.3 ;设置工作寄存器当前所在的区域 CLR EA ;使用ds1820一定要禁止任何中断产生 LCALL INT ;调用初使化子程序 MOV A,#0CCH LCALL WRITE ;送入跳过ROM命令 MOV A, #44H LCALL WRITE ;送入温度转换命令 LCALL DELAY ;延时750ms LCALL INT ;温度转换完全,再次初使化ds1820 MOV A,#55H LCALL WRITE ;送入匹配ROM命令 MOV A,#28H LCALL WRITE MOV A,#24H LCALL WRITE MOV A,#0C5H LCALL WRITE MOV A,#39H LCALL WRITE MOV A,#00H LCALL WRITE MOV A,#00H LCALL WRITE MOV A,#00H LCALL WRITE MOV A,#5FH LCALL WRITE MOV A,#0BEH LCALL WRITE ;送入读温度暂存器命令 LCALL READ MOV R7,A ;读出温度值低字节存入R7 LCALL READ MOV R6,A ;读出谩度值高字节存入R6 LCALL INT NOP NOP LCALL DU RET INT: CLR EA ;初始化ds1820子程序 L0:CLR P1.1 ;ds1820总线为低复位电平 MOV R2,#200 L1:CLR P1.1 DJNZ R2,L1 ;总线复位电平保持400us SETB P1.1 ;释放ds1820总线 MOV R2,#30 L4:DJNZ R2,L4 ;释放ds1820总线保持60us CLR C ;清存在信号(存在C=0,不存在C=1) ORL C,P1.1 JC L0 ;存在吗?不存在则重新来 MOV R6,#80 L5:ORL C,P1.1 JC L3 DJNZ R6,L5 SJMP L0 L3:MOV R2,#240 L2:DJNZ R2,L2 RET WRITE: CLR EA ;向ds1820写操作命令子程序 MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit WR1:SETB P1.1 MOV R4,#8 RRC A ;把一个字节data(A)分成8个bit环移给 C CLR P1.1 ;开始写入ds1820总线要处于复位(低)状态 WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us MOV P1.1,C ;写入一个bit MOV R4,#21 WR3:DJNZ R4,WR3 ;等待40us MOV R4,#8 WR4:DJNZ R4,WR4 DJNZ R3,WR1 ;写入下一个bit SETB P1.1 ;重新释放ds1820总线 RET READ:CLR EA MOV R3,#8 ;连续读8个bit RE1:CLR P1.1 ;读前总线保持为低 MOV R0,#4 NOP SETB P1.1 ;开始读,总线释放 RE2:DJNZ R0,RE2 ;持续8us MOV C,P1.1 ;从ds1820总线读得一个bit RRC A ;把读得的位值环移给 A MOV R1,#30 RE3:DJNZ R1,RE3 ;持续60us DJNZ R3,RE1 ;读下一个bit SETB P1.1 ;重新释放ds1820总线 RET DELAY:MOV R0,#100 DEL2:MOV R1,#10 DEL1:MOV R2,#250 DEL3:NOP NOP DJNZ R2,DEL3 DJNZ R1,DEL1 DJNZ R0,DEL2 RET DU:LCALL INT ;温度转换完全,再次初使化ds1820 CLR EA MOV A,#55H LCALL WRITE ;送入匹配ROM命令 MOV A,#28H LCALL WRITE MOV A,#91H LCALL WRITE MOV A,#0C5H LCALL WRITE MOV A,#39H LCALL WRITE MOV A,#00H LCALL WRITE MOV A,#00H LCALL WRITE MOV A,#00H LCALL WRITE MOV A,#0B3H LCALL WRITE MOV A,#0BEH LCALL WRITE ;送入读温度暂存器命令 LCALL READ1 MOV R3,A ;读出温度值低字节存入R5 LCALL READ1 MOV R2,A ;读出谩度值高字节存入R4 SETB EA RET READ1:CLR EA MOV R4,#8 ;连续读8个bit RE11:CLR P1.1 ;读前总线保持为低 MOV R0,#4 NOP SETB P1.1 ;开始读,总线释放 RE22:DJNZ R0,RE22 ;持续8us MOV C,P1.1 ;从ds1820总线读得一个bit RRC A ;把读得的位值环移给 A MOV R1,#30 RE33:DJNZ R1,RE33 ;持续60us DJNZ R4,RE11 ;读下一个bit SETB P1.1 ;重新释放ds1820总线 RET END 其中:28,24,C5等

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2005-10-19 10:56:00
2楼
上面的程序调试好的 吗 ?

热门招聘
相关主题

官方公众号

智造工程师