引用全国电子设计大赛专题——温度传感器的使用(1)

引用 全国电子设计大赛专题——温度传感器的使用(1)

2010-02-24 19:16:04 阅读4 评论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

敬告:复制使用请留言,转载请注明链接:或,负责侵权后果自负。

<#--{zx1}日志--> <#--推荐日志--> <#--引用记录--> <#--相关日志--> <#--推荐日志--> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构-->
郑重声明:资讯 【引用全国电子设计大赛专题——温度传感器的使用(1)】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——