2010-02-24 19:16:04 阅读5 评论0 字号:大中小
引用
的
;************************************
;名称:简单温度计源程序代码
;文件名:ds18b20.asm
作者:wht&zk&zwp
时间:2009-7-10
;利用两位数码管显示0~99的简单
;温度计。
;说明:p0口是数码管的字控制
;位控制分别是p2.0、p2.1
;************************************
TEML EQU 29H ;温度的低8位
TEMH EQU 28H ;温度的高8位
FLAG BIT 21H ;是B否检测到DS18B20标志位
DQ EQU P3.7 ;DS18B20与单片机通信
ORG 0000H
AJMP MAIN
ORG 0030H
;*************************************
;主程序
;*************************************
MAIN:
MOV SP,#60H
START:
ACALL READ_COV ;调用读出转换后温度值子程序
ACALL BIN_BCD1;数码转换
ACALL DISPLAY ;调用显示子程序
AJMP START
;*************************************
;显示子程序
;*************************************
DISPLAY:
MOV R2,#04H
MOV R3,#0FEH
MOV R0,#4AH
DISLOP:
MOV A,R3
MOV P2,A
MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY2
DEC R0
MOV A,R3
RL A
MOV R3,A
DJNZ R2,DISLOP
RET
DELAY2:
MOV R4,#032H
DELLOP:
MOV R5,#064H
DJNZ R5,$
DJNZ R4,DELLOP
RET
;;*************************************
;DS18B20初始化子程序
;;*************************************
INIT:
SETB DQ
NOP
CLR DQ
MOV R7,#34 ;延时510ms
CALL DELAY
SETB DQ
MOV R7,#04 ;延时60ms
CALL DELAY
CLR FLAG
JB DQ,BACK ;
SETB FLAG
MOV R7,#28 ;延时420ms
CALL DELAY
SETB DQ ;然后拉高数据线
BACK:
RET
;**************************************
;读出转换后的温度值;
;;*************************************
READ_COV:
SETB RS1 ; 改变寄存器位置
SETB DQ
CALL INIT ;先复位DS18B20
JB FLAG,TSS2
RET ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM匹配
CALL WRITE
MOV A,#44H ;发出温度转换命令
CALL WRITE
MOV R7,#50 ;延时750ms转换时间
CALL DELAY
CALL INIT ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
CALL WRITE
MOV A,#0BEH ;发出读温度命令
CALL WRITE
CALL READ
RET
;;**************************************
;写DS18B20的子程序(注意时序)
;;**************************************
WRITE:
CLR C
MOV R2,#8 ;一共8位数据
WR1:
CLR DQ
MOV R7,#1
CALL DELAY
RRC A
MOV DQ,C
MOV R7,#1
CALL DELAY
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;;****************************************
;读DS18B20的子程序(注意时序)
;;****************************************
READ:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#29H ;低位存入29H(TemL),高位存入28H(TemH)
RED00:
MOV R2,#8 ;数据一共有8位
RED01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R7,#01
CALL DELAY
MOV C,DQ
MOV R7,#03
CALL DELAY
RRC A
DJNZ R2,RED01
MOV @R1,A
DEC R1
DJNZ R4,RED00
RET;*****************************************
; 将从DS18B20中读出的温度数据进行转换
;*****************************************BIN_BCD1:
MOV 47H,#00H
MOV A,TEMH
JB ACC.7,FUTEMR
MOV A,TEMH
MOV R4,A
MOV A,TEML
MOV R5,A
ZHUANHUAN:
MOV R7,#10H
ACALL ZH
MOV A,46H
MOV B,#64H
DIV AB
MOV 48H,A
MOV A,B
MOV B,#0AH
DIV AB
MOV 49H,A
MOV 4AH,B
MOV A,47h
JZ ZHEN
AJMP BFH
ZHEN:
MOV 47H,#0EH
BFH:
RET
;******************************************
;多字节BCD码取补
;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中
;影响资源:PSW、A、R2、R3 堆栈需求:2字节
;******************************************
FUTEMR:
MOV B,TEMH
MOV A,#0FFH
SUBB A,B
MOV R4,A
MOV B,TEML
MOV A,#0FFH
SUBB A,B
MOV R5,A
MOV A,R5
ADD A,#01h
MOV R5,A
MOV A,R4
ADDC A,#00H
MOV R4,A
MOV 47H,#0FH
LJMP ZHUANHUAN
;*********************************************
;;;入口条件:被除数在R4、R5中,除数在R7中。
;出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源:PSW、A、R3~R7 堆栈需求: 2字节
;*********************************************
ZH:
CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV ; ;商溢出
RET
DV50:
MOV R6,#8; ;求平均值(R4R5/R7-→R3)
DV51:
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52:
CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
MOV 46H,R3
RET
;*******************************************
;延时程序
;*******************************************
DELAY: MOV R6,#06H ;延时=R7*15us
D1:DJNZ R6,D1 ;通过对R7赋不
DJNZ R7,DELAY ;同的值实现延
RET ;时时间的不同
;*******************************************
TAB:
DB 3FH,06H,5BH,4Fh,66H,6Dh,7DH,07H,7FH,6FH
END敬告:复制使用请留言,转载请注明链接:或,负责侵权后果自负。