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

📄 11.asm

📁 数字温度计程序设计汇编语言
💻 ASM
字号:
S1OK  EQU  5FH
TEMPUTER  EQU  39H
    TEMPH   EQU  5EH
    TEMPL  EQU  5DH
     MS50  EQU  5CH
SIGN  EQU  5BH
        S1   BIT  P1.0
        S2   BIT  P1.1
        S3   BIT  P1.2
      	 S4   BIT  P1.3                                                    
    	ORG   0000H
       	LJMP  MAIN     
       	ORG   000BH
       	LJMP  TOIT
        ORG   0030H
MAIN:  MOV   SP,  #60H 
        MOV   TMOD, #01H 
        MOV   TH0, #3CH  
        MOV   TL0, #0B0H    
        SETB  ET0        
        SETB  TR0
        SETB  EA        
        MOV  TEMPH, #30
        MOV  TEMPL, #9
        MOV  TEMPUTER, #15 ;     温度最始值
        MOV  S1OK,  #00H
        MOV  SIGN,  #00H
        MOV  38H,  #0BH
        MOV  36H,  #0BH
        MOV  37H,  #0CH
        ACALL DISP       
        ACALL T1S       

 
START: 

        ACALL  T12MS
        JB  S1,  NET1           ; 位条件转移
        JNB  S1,  $            ;位条件转移等待
        INC  SIGN
        MOV  A, SIGN
        CJNE  A, #1, TIAO        ;比较之后转移
        ACALL  TIAOTL
TIAO:   CJNE  A, #2, NET1         ; 比较之后转移
        MOV  SIGN, #0
        ACALL  TIAO
        NET1: MOV   A, S1OK
        CJNE  A, #1, START         ; 比较之后转移
        MOV   A, TEMPUTER
        SUBB  A,  TEMPH         
        JNB   ACC.7, ALEM         ; 位条件转移
        MOV   A, TEMPUTER
        SUBB  A,  TEMPL         
        JB    ACC.7, ALEM        ; 位条件转移
        SETB  P2.1               ; P2.1置1
        

        ACALL WENDU                     
       
 ACALL DISP                     
        MOV   S1OK,  #00H
        AJMP  START              ; 无条件转移
  ALEM: MOV   36H, #0CH
        MOV   37H, #0CH
        MOV   38H, #0CH
        CLR   P2.1              
         ACALL  DISP              
        ACALL  T1S
        LCALL  WENDU              
        LCALL  DISP             
        MOV   S1OK,  #00H
        SJMP  START               
TIAOTL:MOV  50H,    TEMPUTER
       MOV  37H,  TEMPL
       ACALL  BIN_BCD             
       ACALL  DISP
       ACALL  T12MS
       ACALL  T12MS 
       ACALL  T12MS
ACALL  T12MS
MOV   36H, #0AH
       MOV   37H, #0AH
       MOV   38H, #0AH
       ACALL  DISP                
       ACALL  T12MS
       ACALL  T12MS
       ACALL  T12MS
       ACALL  T12MS
       JB  S2,  ADD1             ; 位条件转移
       ACALL  T12MS
       JB  S2,  ADD1              ; 位条件转移
       JNB S2,  $                 ; 位条件转移等待
       INC  TEMPL                 ; 加1
       MOV  A, TEMPL
       CJNE  A, #100, ADD1         ; 比较之后转移
       MOV  TEMPL, #0
 ADD1: JB  S3,  ADD2              ; 位条件转移
       ACALL  T12MS               
       JB  S3,  ADD2              ; 位条件转移
       JNB  S3,   $               ; 位条件转移等待
       DEC  TEMPL
       MOV A, TEMPL
       CJNE A, #00 , ADD2         ; 比较之后转移
       MOV  TEMPL,#100
      ADD2: JB  S4, TIAOTL
       ACALL T12MS                
       JB  S4, TIAOTL             ; 位条件转移
       JNB S4, $                  ; 位条件转移等待
       MOV TEMPUTER, 50H
       LJMP START                 
 


 
TOIT:   PUSH   PSW               
        PUSH   ACC
        MOV   TH0,  #3CH
        MOV   TL0,  #0B0H
        INC   MS50            ; 加1
        MOV   A,  MS50
        CJNE  A, #14H, RETURN    ; 比较之后转移
        MOV   S1OK, #1
        MOV   MS50, #00H
 RETURN:POP   ACC
        POP   PSW            
        RETI                 
 

 
WENDU:   ACALL   INIT_1820  
        ACALL   RE_CONFIG   
        ACALL   GET_TEMPER
        ACALL   TEMPER_COV
        RET                 
 
; …………………………………DS18B20初始化程序……………………………………
      
 INIT_1820:
      SETB P2.0           ; P2.0置1
      NOP                  
      CLR P2.0            
      MOV  R0,#06BH
      MOV  R1,#03H
TSR1:
      DJNZ  R0,TSR1 ;         延时
      MOV  R0,#6BH
      DJNZ  R1,TSR1        
      SETB  P2.0         ; P2.0置1
      NOP                
      NOP
      NOP
      MOV  R0,#25H
TSR2:
     JNB  P2.0,TSR3            ; 位条件转移
     DJNZ  R0,TSR2            ; 循环转移
     LJMP  TSR4 ;             延时
TSR3:
     SETB 20H.1 ;              置标志位,表示DS1820存在
     LJMP TSR5
TSR4:
 CLR  20H.1 ;                  清标志位,表示DS1820不存在
     LJMP TSR7                
TSR5:
     MOV  R0,#06BH
     MOV  R1,#03H
TSR6:DJNZ  R0,TSR6 ;           延时
     MOV  R0,#6BH
     DJNZ  R1,TSR6
TSR7:SETB  P2.0               ; P2.0置1
     RET                      

 


 
RE_CONFIG:JB 20H.1,RE_CONFIG1 ;   若DS18B20存在,转RE_CONFIG1
      RET                  
RE_CONFIG1:
      MOV  A,#0CCH ;             发SKIP ROM命令
      LCALL  WRITE_1820
      MOV  A,#4EH ;              发写暂存存储器命令
      LCALL  WRITE_1820          
      LCALL  WRITE_1820
      MOV  A,#1FH ;              选择9位温度分辨率
      LCALL  WRITE_1820
      RET                      ; 子程序返回 


GET_TEMPER:
      SETB  P2.0 ;                定时入口
      LCALL INIT_1820            
      JB 20H.1,TSS2              ; 位条件转移
      RET ;                       若DS18B20不存在则返回
TSS2:
      MOV  A,#0CCH ;             跳过ROM匹配
      LCALL  WRITE_1820          
      MOV  A,#0BEH ;             发出读温度命令
      LCALL  WRITE_1820          
      LCALL  READ_18200          
      MOV   37H,A ;               将读出的温度数据保存
      RET                        ; 子程序返回 
 

WRITE_1820:
      MOV  R2,#8
      CLR  C                 
WR1: CLR  P2.0        
     NOP                 
     NOP
     NOP
     RRC  A             
     MOV  P2.0,C
     MOV  R3,#35
     DJNZ  R3,$          ; 循环转移等待
     SETB  P2.0          ; P2.0置1
     NOP                 
     DJNZ  R2,WR1        ; 循环转移
     SETB  P2.0          ; P2.0置1
     RET                  ; 子程序返回
 

READ_18200:
     MOV R4,#2 ;                 将温度高位和低位DS18B20中读  
RE00:MOV  R2,#8
RE01:CLR  C                
     SETB  P2.0           ; P2.0置1
     
NOP                  
     NOP
     CLR  P2.0           
     NOP
     NOP
     NOP
     
SETB  P2.0           
NOP                  
     NOP
     MOV  C,P2.0
     MOV  R3,#35
RE20:
     DJNZ  R3,RE20           ; 循环转移
     RRC  A                  
     DJNZ  R2,RE01          ; 循环转移
     MOV  @R1,A
     DEC R1                  
     DJNZ  R4,RE00          ; 循环转移
     RET                    ; 子程序返回
 


 
TEMPER_COV:
     MOV  A,#0F0H
     ANL  A,36H ;                 舍去温度低位中小数点
     SWAP  A                     
     MOV  37H,A
   MOV   36H,A
     JNB ACC.3,TEMPER_COV1 ;     四舍五入去温度值
     INC 37H                      ; 加1
TEMPER_COV1:
MOV  A,35H
     ANL  A,#07H                   
     SWAP  A                       ;将累加器A的高、低两半字节交换
     ADD  A,37H                    ;将37H中的内容与A中内容相加送A
     MOV 37H,A                  
     LCALL  BIN_BCD                
       RET                         ; 子程序返回
 




BIN_BCD:
MOV    39H,37H
     MOV    A,37H
     MOV    B,#100
     DIV    AB                 ; A除B,   A为商,B为余数
     MOV    38H,A
     MOV    37H,B
     XCH    A,B               ;将A和B中的内容相互交换
     MOV    B,#10
     DIV    AB                 ;A除B,   A为商,B为余数
     MOV    37H,A
     MOV    36H,B
     RET                       ; 子程序返回

DISP: SETB RS0                 
       MOV   R0, #36H
       MOV   R7, #3
LOOPP:MOV   A,  @R0
       MOV DPTR, #TAB         
       MOVC A,   @A+DPTR       
       MOV  SBUF, A
       JNB  TI, $              ; 位条件转移等待
       CLR  TI                
       INC  R0                  ;加1
       DJNZ R7,  LOOPP         ; 循环转移
       CLR  RS0               
       RET                    
TAB:  DB 11H, 0D7H, 32H, 92H, 0D4H, 98H, 18H, 0D1H, 10H, 90H  ,0FFH, 070H, 0FEH





 
T12MS: SETB  RS1           
       MOV      R7, #18H
   TM: MOV  R6,  #0FFH
   TM6: DJNZ  R6, TM6      ; 循环转移
        DJNZ  R7, TM
        CLR  RS1           
        RET                 ; 子程序返回


 


   
T1S: SETB  RS1            
        MOV   R6, #3
    LSP:ACALL T12MS
        DJNZ  R6, LSP       ;循环转移
        CLR  RS1            
        RET                 ; 子程序返回
        END  

⌨️ 快捷键说明

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