⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1820shangweijitongxun.asm

📁 程序是89S52的数字钟有案键,一个的DS18b20该程序测温以后能与上位机通讯.
💻 ASM
字号:
TEMP_ZH  DATA  24H ;  实时温度存放单元
TEMPL    DATA  25H ; 实时温度低8位存放单元
TEMPH    DATA  26H ; 实时温度高8位存放单元
TEMP_TH  DATA  27H ; 高温报警值存放单元
TEMP_TL  DATA  28H ; 低温报警值存放单元
TEMPHC   DATA  29H ; 温度转换后各位和十位值
TEMPLC   DATA  2AH  ;温度转换后小数值
LCD_RS   EQU  P2.5  ; LCD RS控制线
LCD_RW   EQU  P2.6  ; LCD RW控制线
LCD_EN  EQU  P2.7  ; LCD EN控制线
FLAG1    EQU  20H.0; DS18B20是否存在标记
KEY_UD   EQU  20H.1; 设定KEY的UP 与DOWN标记
DATE_LINE EQU  P2.0 ; DS18B20数据线
SJ        EQU  P0  ;LCD液晶屏数据端口
; *******************************************                 
; 主程序
;********************************************
      ORG   0000H
      JMP   MAIN
      ORG   0030H
  MAIN:MOV  SP,#60H
       MOV  A,#00H
       MOV  R0,#20H  ;将20H~2FH单元清零
       MOV  R1,#10H
  CLEAR:MOV  @R0,A
        INC  R0
        DJNZ  R1,CLEAR
        CALL  RE_18B20
   START:CALL RESET ;  复位子程序
         JNB  FLAG1,START1 ;DS18B20不存在
         CALL  MENU_OK
         JMP  START2
  START1:CALL  MENU_ERROR
        CALL  DISPLAY
        SJMP $
  START2:CALL  RESET
         JNB  FLAG1,START1 ;DS18B20 不存在
         MOV  A,#0CCH      ;跳过ROM匹配
         CALL  WRITE
         MOV  A,#44H     ; 发出温度转换命令
         CALL  WRITE
         CALL RESET
         MOV  A,#0CCH     ; 跳过ROM匹配
         CALL WRITE           
         MOV  A,#0BEH    ; 发出读温度命令
         CALL  WRITE
         CALL READ
         CALL  CONVTEMP
         CALL  DISPLAY
         CALL  FASHONG
         CALL  YANSHI 
         AJMP  START2
;******************************************************************         
;DISPLAY显示程序,读内存40H~4FH显示第一行 ,读内存50H~5FH显示第二行      
;*******************************************************************                              
DISPLAY:  CALL DELAY ; 延时一段时间
          MOV  SJ,#38H
          CALL  ENABLE ;  写指令38H
          MOV  SJ,#38H
          CALL  ENABLE  ;  写指令38H
          MOV  SJ,#38H
          CALL  ENABLE ;   写指令38H
          MOV  SJ,#38H
          CALL  ENABLE  ;   写指令38H
          MOV  SJ,#08H
          CALL  ENABLE   ;   写指令08H
          MOV  SJ,#01H
          CALL  ENABLE   ;     写指令01H
          MOV  SJ,#06H
          CALL  ENABLE    ;   写指令06H
          MOV  SJ,#0CH
          CALL  ENABLE   ;   写指令0CH
          MOV  SJ,#80H   ;    第一行显示第一个字符的位置
          CALL  ENABLE   ;   调用写指令
          MOV  R1,#40H    ;   第一行表头指令
          CALL  WRITEL_1  ;    调用第一行写子程序
          MOV  SJ,#0C0H   ;    第二行位置
          CALL  ENABLE    ;   调用写指令
          MOV  R1,#50H   ;    第二行表头指令
          CALL  WRITEL_2 ;    调用第二行写子程序
          RET         ;       返回主程序
 ENABLE: CLR  LCD_RS  ;      写命令时序
         CLR  LCD_RW   
         CLR  LCD_EN
         CALL  DELAY
         SETB  LCD_EN
         RET
  WRITEL_1:NOP
    AL_1:MOV  A,@R1  ;把R1的值送到A
         CALL  WRITE2 ;调用写程序写入单个字节
         INC  R1    ; 将工作寄存器指针加一
         CJNE R1,#4FH,AL_1   ;R1 的内容加到4FH后就返回到A1处
         RET
 WRITEL_2:NOP
    AL_2:MOV  A,@R1 ;把R1的值送到A
         CALL  WRITE2  ;调用写程序写入单个字节
         INC  R1           ; 将工作寄存器指针加一
         CJNE R1,#5FH,AL_2      ;R1 的内容加到5FH后就返回到A1处
         RET                         
  WRITE2:MOV  SJ,A    ; 写单个字符,写数据到显示端口
         SETB LCD_RS  ;写数据时序
         CLR  LCD_RS  
         CLR  LCD_RW   
         CLR  LCD_EN 
         CALL DELAY
         SETB LCD_EN
         RET
   DELAY:MOV  R7,#5  ;延时5MS
      D1:MOV  R6,#100
      D2:DJNZ R6,D2
         DJNZ R7,D1
         RET
;***********************************************                         
;DS18B20 正确时显示:DS18B20  OK   TEMP:   .  oC
;*************************************************          
 MENU_OK:
         MOV  R2,#00H
         MOV  R1,#40H
         MOV  R3,#20H
         MOV  DPTR,#M_OK
    DD2: MOV  A,R2
         MOVC  A,@A+DPTR
         MOV  @R1,A
         INC  R1
         INC  R2
         DJNZ  R3,DD2
         RET         
    M_OK:DB  "   DS18B20  OK  "
         DB  "   TEMP:   .oC  "

;********************************************************
;  DS18B20错误时显示:DS18B20  ERROR TEMP:   ----oC
;********************************************************
   MENU_ERROR:
              MOV  R2,#00H
              MOV  R1,#40H
              MOV  R3,#20H
              MOV  DPTR,#ERR
         DD1: MOV  A,R2
              MOVC  A,@A+DPTR
              MOV  @R1,A
              INC  R1
              INC  R2
              DJNZ  R3,DD1
              RET
         ERR:
             DB  " DS18B20  ERROR  "
             DB  " TEMP:   ----oC  "
;***************************************************            
; 设置DS18B20工作方式,  12位精确
;***************************************************
RE_18B20:
        JB  FLAG1,RE_18B20A
        RET
RE_18B20A:
        CALL  RESET
        MOV  A,#0CCH                    ;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#4EH                      ;写暂存寄存器
        LCALL  WRITE
        MOV  A,TEMP_TH                ;TH(报警上限)
        LCALL  WRITE
        MOV  A,TEMP_TL                ;TL(报警下限)
        LCALL  WRITE
        MOV  A,#7FH                      ;12位精确度
        LCALL  WRITE
        RET
;********************************************        
;复位DS18B20程序
;********************************************
 RESET:SETB  DATE_LINE
       NOP
       CLR  DATE_LINE
       MOV  R0,#6BH   ;主机发出延时复位低脉冲
       MOV  R1,#04H
  TSR1:DJNZ  R0,$
       MOV  R0,#6BH
       DJNZ  R1,TSR1
       SETB  DATE_LINE      ;然后拉高数据线
       NOP
       NOP
       NOP
       MOV  R0,#32H
  TSR2:JNB  DATE_LINE,TSR3    ;等待DS18B20回应
       DJNZ  R0,TSR2
       JMP  TSR4       ; 延时
  TSR3:SETB  FLAG1         ; 置标志位,表示DS1820存在
       JMP  TSR5
  TSR4:CLR  FLAG1    ; 清标志位,表示DS1820不存在
       JMP  TSR7
   TSR5:MOV  R0,#06BH 
   TSR6:DJNZ  R0,$         ; 时序要求延时一段时间
   TSR7:SETB  DATE_LINE
        RET
;*******************************************
; 写DS18B20程序
;*******************************************
WRITE:
      MOV  R2,#8            ;一共8位数据
      CLR  C
   WR1: CLR  DATE_LINE    ;开始写入DS18B20总线要处于复位(低)状态
        MOV  R3,#07
        DJNZ  R3,$       ;总线复位保持16微妙以上
        RRC  A            ;把一个字节DATA 分成8个BIT环移给C
        MOV  DATE_LINE,C        ;写入一个BIT
        MOV  R3,#3CH
        DJNZ  R3,$         ;等待100微妙
        SETB  DATE_LINE      ;重新释放总线
        NOP
        DJNZ  R2,WR1      ;写入下一个BIT
        SETB  DATE_LINE
        RET
;****************************************************
; 将温度低位、高位、TH、TL从DS18B20中读出
;  存入25H、26H、27H、28H  
;******************************************************
 READ:
      MOV  R4,#4      ; 将温度低位、高位、TH、TL从DS18B20中读出
      MOV  R1,#TEMPL  ; 存入25H、26H、27H、28H
RE00:  
      MOV  R2,#8
RE01:
        CLR  CY
        SETB  DATE_LINE
        NOP
        NOP
        CLR  DATE_LINE      ;读前总线保持为低
        NOP
        NOP
        NOP
        SETB  DATE_LINE                ;开始读总线释放
        MOV  R3,#09                       ;延时18微妙
        DJNZ  R3,$
        MOV  C,DATE_LINE              ;从DS18B20总线读得一个BIT
        MOV  R3,#3CH
        DJNZ  R3,$                         ;等待100微妙
        RRC  A                              ;把读得的位值环移给A
        DJNZ  R2,RE01                    ;读下一个BIT
        MOV  @R1,A
        INC   R1
        DJNZ  R4,RE00
        RET
;*****************************************************
;把TEMPL和TEMPH中的内容转化成对应的温度值TEMPLC和TEMPHC
;*******************************************************
      CONVTEMP:MOV  A,TEMPH         ;判温度是否零下
               ANL  A,#80H
               JZ  TEMPC1                     ;温度零上转
               CLR  C
               MOV  A,TEMPL                 ;二进制数求补(双字节)
               CPL  A                            ;取反加1
               ADD  A,#01H
               MOV  TEMPL,A
               MOV  A,TEMPH
               CPL  A
               ADDC  A,#00H
               MOV  TEMPH,A
               SJMP  TEMPC11
        TEMPC1:MOV  TEMPHC,#0AH     
       TEMPC11:MOV  A,TEMPHC
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH            ;乘0.0625
               MOV  DPTR,#TEMPD0TTAB
               MOVC  A,@A+DPTR
               MOV  TEMPLC,A            ;TEMPLC LOW=小数部分 BCD
               MOV  A,TEMPL     ;整数部分
               ANL  A,#0F0H           ;取出高四位
               SWAP  A
               MOV  TEMPL,A
               MOV  A,TEMPH               ;取出低四位
               ANL  A,#0FH
               SWAP  A
               ORL  A,TEMPL              ;重新组合
               MOV  TEMP_ZH,A
               CALL  HEX2BCD1  ;整数部分百位在R4,十位个位在A中
               CALL  XIANSHI
               NOP
       TEMPC12:RET
;*******************************************************       
; 0~9查表程序
;*******************************************************
XIANSHI:MOV  30H,A
        ANL  A,#0FH
        MOV  A,30H
        SWAP  A
        ANL  A,#0FH
        MOV  32H,A
        MOV  33H,R4
        MOV  DPTR,#XIAN
        MOV  A,31H
        MOVC A,@A+DPTR
        MOV  58H,A
        MOV  A,32H
        MOVC  A,@A+DPTR
        MOV  57H,A 
        MOV  A,33H
        MOVC  A,@A+DPTR
        MOV  56H,A
        MOV  A,TEMPLC
        MOVC  A,@A+DPTR
        MOV  5AH,A
        RET
  XIAN: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
  
  
;*************************************************
; 整数部分百位在R4,十位个位在A中
;*************************************************
 HEX2BCD1:MOV  B,#064H  ;十六进制转化为BCD
          DIV  AB   ;   B=A%100   
          MOV  R4,A  ;   R7=百位数
          MOV  A,#0AH
          XCH  A,B
          DIV  AB  ;     B=A%B
          SWAP  A
          ORL  A,B
          RET
;*****************************************************          
;小数部分码表
;******************************************************
TEMPD0TTAB:
           DB  00H,00H,01H,01H,02H,03H,03H,04H
           DB  05H,05H,06H,06H,07H,08H,08H,09H
           
;*****************************************************
;发送
;*****************************************************
FASHONG:
        MOV  R0,#50H
        MOV  7FH,#10H
    BTL:MOV  SCON,#60H
        MOV  TMOD,#20H
        MOV  TH1,#0E8H
        MOV  TL1,#0E8H
        SETB  TR1
     FA:MOV  A,@R0
        MOV  SBUF,A
        JNB  TI,$
        JBC  TI,FA1
        NOP
     FA1:INC  R0
         DJNZ 7FH,FA
         RET
;***********************************************         
; 延时
;***********************************************
 YANSHI:MOV  R7,#5
    D11:MOV  R6,#255
    D12:MOV  R5,#255
    D13:DJNZ R5,$
        DJNZ R6,D12
        DJNZ R7,D11
        RET
        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -