发表于:2004-05-23 19:55:00
楼主
我的程序读不出来.谁能把程序(已通过)发给我看看吗。这是我的程序不能正确显示,你也可以帮我看看那里错了。谢谢了!!!这是我毕业设计中的一段。很紧急!!1
;温度转换和读取
;|---------------------------获取单个ds1820转化的温度值的应用程序,P1.3接ds1820 |
TEMPER_L EQU 16H
TEMPER_H EQU 15H
TEMPER_NUM EQU 17H
TEMPER_P EQU 18H
DQ BIT P1.3
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN: MOV SP,#60H
LCALL GET_TEMP
SJMP $
GET_TEMP:
CLR EA ;使用ds1820一定要禁止任何中断产生
LCALL INT ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转换完全,再次初使化ds1820
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV TEMPER_L,A ;读出温度值低字节存入TEMPER_L
LCALL READ
MOV TEMPER_H,A ; 读出谩度值高字节存入TEMPER_H
LCALL TEMPER_COV ;将从DS18B20中读出的温度数据进行转换
SETB EA
RET
INT:CLR EA ;初始化ds1820子程序
L0:CLR DQ ;ds1820总线为低复位电平
MOV R2,#200
L1:CLR DQ
DJNZ R2,L1 ;总线复位电平保持400us
SETB DQ ;释放ds1820总线
MOV R2,#30
L4:DJNZ R2,L4 ;释放ds1820总线保持60us
CLR C ;清存在信号
ORL C,DQ
JC L0 ;存在吗?不存在则重新来
MOV R6,#80
L5:ORL C,DQ
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 DQ
MOV R4,#8
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR DQ ;开始写入ds1820总线要处于复位(低)状态
WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV DQ,C ;写入一个bit
MOV R4,#20
WR3:DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB DQ ;重新释放ds1820总线
RET
READ: CLR EA
MOV R6,#8 ;连续读8个bit
RE1:CLR DQ ;读前总线保持为低
MOV R4,#4
NOP
SETB DQ ;开始读总线释放
RE2:DJNZ R4,RE2 ;持续8us
MOV C,DQ ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV R5,#30
RE3:DJNZ R5,RE3 ;持续60us
DJNZ R6,RE1 ;读下一个bit
SETB DQ ;重新释放ds1820总线
RET
;-------------------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:MOV TEMPER_P,#80H
MOV A,TEMPER_L ;判定小数点后精度
JNB ACC.3,TEMPER_COV0
MOV TEMPER_P,#85H
TEMPER_COV0:MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ; 保存变换后的温度数据
;-------------------将16进制的温度数据转换成压缩BCD码
MOV A,TEMPER_NUM
MOV B,#100
DIV AB
MOV TEMPER_NUM,A ;TEMPER_NUM存入百位
MOV A,#10
XCH A,B
DIV AB ;A是BCD码的十位B是个位
MOV TEMPER_H,A
MOV TEMPER_L,B
;-------------------显示温度部分
MOV R0,TEMPER_NUM ;百位
MOV R1,#01H
LCALL TRT
MOV R0,TEMPER_H ;十位
MOV R1,#02H
LCALL TRT
MOV R0,TEMPER_L ;个位
MOV R1,#03H
LCALL TRT
MOV R0,TEMPER_P ;小数
MOV R1,#04H
LCALL TRT
RET
;TRT为发送LED显示子程序