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

📄 单片机程序.asm

📁 单片机完成温度采集
💻 ASM
字号:
          TEMP_ZH   DATA  24H     ;实时温度值存放单元
          TEMPL     DATA  25H     ;
          TEMPH     DATA  26H     ;
          TEMP_TH   DATA  27H     ;高温报警值存放单元
          TEMP_TL   DATA  28H     ;低温报警值存放单元
          TEMPHC    DATA  29H     ;
          TEMPLC    DATA  2AH
          ZHFUBJ   EQU 20H.1
          flag1     equ  20H.0
          date_line equ p3.7
;*************************************************************
       org 00H
       AJMP MAIN
MAIN: MOV SP,60H

     clr F0

      MOV TMOD,#20H ; 定时器1工作于8位自动重载模式,用于产生波特率
      MOV TH1,#0F3H
      MOV TL1,#0F3H ; 波特率4800

      MOV SCON,#50H ; 设定串行口工作方式
      MOV PCON,#80H ; 波特率倍增

      clr ES ; 关闭串行中断
      SETB TR1 ; 启动定时器1

      MOV A,#00H
      MOV R0,#20H
      MOV R1,#0FH
CLR0: MOV @R0,A
      INC R0
      DJNZ R1,CLR0 ;20-2F清零

      LCALL resb1820 ;设定18b20为12为精度


L1:jnb RI,L2
call JIESHOU
L2:jnb F0,L1
call send
ajmp L1





;***********************************************************
resb1820:  CALL  RESET
        JNB flag1,WTHTL1   ;检测18b20是否存在,不存在转
        MOV  A,#0CCH       ;跳过ROM匹配
        LCALL  WRITE

        MOV  A,#7FH        ;12位精确度
        LCALL  WRITE
        CLR flag1          ;清存在标志
WTHTL1: RET
;**********************************************************
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
;**********************************************************
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
;********************************************************
caiji:

          CALL  RESET
          JNB  FLAG1,TUICHU    ;DS1820不存在
          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 DISPBCD

TUICHU:   RET
;*************************************************************
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


;*****************************************************
;  处理温度 BCD 码子程序
;****************************************************
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
               JMP  TEMPC11

TEMPC1:       SETB  20H.1              ;是正数,至正数标志
TEMPC11:       MOV  A,TEMPL
               ANL  A,#0FH              ;乘0.0625
               MOV  DPTR,#TEMPDOTTAB
               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
               LCALL  HEX2BCD1
               MOV  TEMPL,A
               ANL  A,#0F0H
               SWAP  A
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH
               SWAP  A                  ;TEMPLC HI = 个位数 BCD
               ORL  A,TEMPLC
               MOV  TEMPLC,A
               MOV  A,R4
               JZ  TEMPC12
               ANL  A,#0FH
               SWAP  A
               MOV  R4,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R4
               MOV  TEMPHC,A
TEMPC12:       RET
;---------------------------------------------------------------
HEX2BCD1:                                                     ;原理是用除法原理如:255/100=2百位数字BCD码,余数55/10=5十位数字BCD码余数5个位数字BCD码
              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
;-------------------------------------------------------------
;  小数部分码表
;-------------------------------------------------------------
TEMPDOTTAB:
         DB   00H,00H,01H,01H,02H,03H,03H,04H
         DB   05H,05H,06H,06H,07H,08H,08H,09H
;=====================================================
DISPBCD:

              MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
              MOV 71H,#'.'
              MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  72H,A                 ;个位
              MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  73H,A                 ;十位
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  74H,A                 ;百位


              JNB 20H.1,FU
              MOV 75H,#'+'               ;如果是正的温度,把“+”给75H
              JMP STAR
FU:           MOV 75H,#'-'                ;如果是负的温度,把“-”给75
STAR:         MOV A,74H
              JZ F1
              ADD A,#30H
              MOV 74H,A
              JMP M1
F1:           MOV 74H,75H
              MOV 75H,#' '

              MOV A,73H
              JZ F2
M1:           mov a,73h
              add a,#30H
              mov 73h,a
              JMP M2
F2:           MOV 73H,74H
              MOV 74H,#' '
M2:           mov a,72h
              add a,#30H
              mov 72h,a
              mov a,70h
              add a,#30H
              mov 70h,a
              RET








;*********************************************************************
SEND:  MOV R0,#75H
send1: mov a,@r0

       mov sbuf,a
       jnb TI,$
       clr TI
       dec r0
       cjne r0,#6fh,send1
       clr f0
       ret
;**********************************************************************
JIESHOU:
    clr ri
    mov a,sbuf
M0: cjne a,#30h,s1
    lcall C0
    jmp M8
s1: cjne a,#31h,s2
    lcall C1
    jmp M8
s2: cjne a,#32h,s3
    lcall C2
    jmp M8
s3: cjne a,#33h,s4
    lcall C3
    jmp M8


s4: clr F0
M8: ret


;***********************************************************************
C0:setb p1.0
   setb p1.1
   clr F0
   ret
C1:lcall caiji
   setb F0
   ret
C2:
   setb p1.0
   clr p1.1
   ret
C3:
   clr p1.0
   setb p1.1
   ret
C4:
   setb p1.1
   ret
C5:
   clr p1.1
   ret

⌨️ 快捷键说明

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