高级会员
主题
帖子
积分1391
阅读权限30
注册时间2008-12-27
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2009-5-18 09:14
|
显示全部楼层
附上程序,还有点问题,但我找不出来
就是温度上了100后,十分位要大于5才显示,0-5直接灭了,不解,哪位GG给我找找到底什么原因。
————————————————————————————
D1820 BIT P3.7
COOV BIT 20H.2
COM EQU 39H
ORG 0000H
JMP MAIN
ORG 0050H
MAIN: MOV SP,#60H
SETB COOV ;必须在循环外置位温度转换标志位,
LOOP: LCALL DS18B20 ;否则循环中不会进行温度转换!
LCALL CTEM
LCALL DISPLAY
LJMP LOOP
;DS18B20温度转换子程序
DS18B20:
JNB COOV,CHCO ;检查温度转换完成标志位,未完成的话跳转到温度转换完成度检查
LCALL RES1820
MOV COM,#0CCH ;跳过命令
LCALL WCOM
MOV COM,#0BEH ;读取温度命令
LCALL WCOM
LCALL RDATA
LCALL RES1820
MOV COM,#0CCH ;跳过命令
LCALL WCOM
MOV COM,#44H ;启动温度转换命令,
LCALL WCOM ;紧接着CHCO来检测转换是否完成
CHCO: CLR COOV ;清除转换完成标志位
CLR D1820 ;
NOP ;开始读时隙
SETB D1820 ;
JB D1820,SETCOOV ;温度转换完成的话置位COOV位
JMP OUT ;
SETCOOV: SETB COOV ;
OUT: RET
;温度数据处理子程序
CTEM: MOV R6,#7
MOV R0,38H
C0: MOV A,@R0 ;
CLR A ;显示缓存
MOV @R0,A ;清零
DEC R0 ;
DJNZ R6,C0 ;
CLR 20H.0
MOV A,22H ;
ANL A,#0F0H ;判断温度是否小于0
CJNE A,#0F0H,COUNT ;是的话在20.0H位标记
SETB 20H.0 ;
MOV A,21H ;补码形式
CPL A ;的负温度
ADD A,#1 ;值转换成
MOV 21H,A ;源码形式
MOV A,22H ;
CPL A ;
ADDC A,#0 ;
MOV 22H,A ;
COUNT: ;开始数据处理
MOV A,21H
SWAP A
ANL A,#0FH ;屏蔽小数部分
MOV R1,A
MOV A,22H
SWAP A
ANL A,#0F0H ;屏蔽符号部分
ADD A,R1 ;得温度整数部分
MOV B,#100
CLR C
DIV AB
MOV 38H,A ;百位值存38H单元
MOV A,B
MOV B,#10
CLR C
DIV AB
MOV 37H,A ;十位值存37H单元
MOV A,B
MOV 36H,A ;个位值存36H单元
JNB 21H.3,COUN1 ;开始小数部分处理,处理1/2位,即0.5
MOV 35H,#5
COUN1: JNB 21H.2,COUN2 ;处理1/4位,即0.25
MOV A,35H
ADD A,#2
MOV 35H,A
MOV 34H,#5
COUN2: JNB 21H.1,COUN3 ;处理1/8位,即0.125
MOV A,35H
ADD A,#1
MOV 35H,A
MOV A,34H
ADD A,#2
MOV 34H,A
COUN3: JNB 21H.0,CC ;处理1/16位,即0.0625
MOV A,34H
ADD A,#6
MOV 34H,A
CC: MOV A,34H ;
CJNE A,#4,CC1 ;百分位向十分位四舍五入
JMP BACK ;
CC1: JC BACK ;
INC 35H
BACK: RET
;数码管显示子程序
DISPLAY:
MOV A,37H
CJNE A,#0,NEXT1 ;判断十位是否为零
MOV A,38H
CJNE A,#0,NEXT2 ;判断百位是否为零
MOV 37H,#11 ;十位无显示
MOV 38H,#11 ;百位无显示
JNB 20H.0,D1 ;判断温度是否是负值
MOV 37H,#10 ;十位显示负号
JMP D1
NEXT1: MOV A,38H
CJNE A,#0,NEXT2 ;判断百位是否为零
MOV 38H,#11 ;为零的话无显示
NEXT2: JNB 20H.0,D1 ;判断温度是否位负值
MOV 38H,#10 ;百位显示负号
D1: MOV P3,0FFH
MOV P1,0FFH
MOV DPTR,#TAB
MOV A,38H
MOVC A,@A+DPTR
MOV P1,A
CLR P3.2
LCALL DELAY5mS
SETB P3.2
MOV A,37H
MOVC A,@A+DPTR
MOV P1,A
CLR P3.3
LCALL DELAY5mS
SETB P3.3
MOV A,36H
MOVC A,@A+DPTR
CLR C
SUBB A,#4 ;显示小数点(为了避免飞线,数码管采用了非标准接法,
MOV P1,A ;即DP接的不是PX.7,所以不是减180.
CLR P3.4
LCALL DELAY5mS
SETB P3.4
MOV A,35H
MOVC A,@A+DPTR
MOV P1,A
CLR P3.5
LCALL DELAY5mS
SETB P3.5
RET
;复位18B20
RES1820:
CLR F0
CLR D1820
LCALL DELAY480uS ;延时480uS拉低总线复位
SETB D1820 ;复位结束
LCALL DELAY480uS ;由于只有一个单总线设备且是固定连接,
RET ;所以没有进行
;给18B20写指令
WCOM:
MOV R5,#8 ;一字节即8位
MOV A,COM ;命令吗传给A
W1: RRC A ;最低位移到C
CLR D1820 ;拉低总线,准备传送数据
MOV D1820,C ;C值传给总线,开始传送
LCALL DELAY100uS ;延时100uS,给设备足够的接收时间
SETB D1820 ;释放总线
DJNZ R5,W1
RET
;读取18B20的温度值
RDATA: MOV R1,#21H ;21H接收低8位温度值
MOV R6,#2
RE1: MOV R5,#8
RE2: CLR D1820 ;拉低总线,准备接收数据
NOP
NOP
SETB D1820
MOV C,D1820 ;接收数据
RRC A ;数据转移到A中
LCALL DELAY100uS ;延时100uS,
SETB D1820 ;释放总线
DJNZ R5,RE2
MOV @R1,A
INC R1 ;高8位温度值存放在22H单元
DJNZ R6,RE1
RET
;延时程序
DELAY480uS:
MOV R7,#240
DJNZ R7,$
RET
DELAY100uS:
MOV R7,#50
DJNZ R7,$
RET
DELAY5mS:
MOV R6,#25
DE1: MOV R7,#40
DJNZ R7,$
DJNZ R6,DE1
RET
;数码管显示码表
TAB: DB 005H,0DDH,046H,054H,09CH,034H,024H,05DH,004H,014H,0FEH,0FFH
END |
评分
-
查看全部评分
|