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

📄 复件 main.asm

📁 饮水机测温度原代码 用汇编语言写超过温度可以报警
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        ACALL  LCDP2         ;由LCD显示出来
        RET

 ;----------- 温度值比较子程序------------

 ;实际温度值与标记温度值比较
  TEMP_COMP:
        MOV   A,TEMP_TH      ;高温报警值送入A
        SUBB  A,TEMP_ZH      ;减数>被减数,则
        JC    TCL1           ;借位标志位C=1,转TCL1
        MOV   A,TEMP_ZH      ;实时温度送入A
        SUBB  A,TEMP_TL      ;减数>被减数,则
       JC    TCL2            ;借位标志位C=1,转TCL2
       MOV   DPTR,#BJ5       ;存表BJ5
       ACALL TEMP_BJ3        ;调用显示高、低温度及加热标记子程序
       CLR   RELAY           ;继电器吸合
       RET
 ;――――――――――――― 
  TCL1:    ;实时温度>高温报警值的处理程序
       MOV   DPTR,#BJ3       ;存入#BJ3表
       ACALL TEMP_BJ3        ;调用显示高、低温度及加热标记子程序
       SETB  RELAY           ;继电器关闭
       ACALL SPK_BZ          ;调用鸣响子程序
       RET  
 ;―――――――――――――- 
  TCL2:   ;实时温度<高温报警值的处理程序
      MOV    DPTR,#BJ4      ;存入#BJ4表    
       ACALL  TEMP_BJ3       ;调用显示高、低温度及加标记子程序      
       ACALL  SPK_BZ         ;调用鸣响子程序
       RET

 ;--- 显示高、低温度及加热标记程序----
  TEMP_BJ3:
       MOV    A,#0CEH        ;设定显示位置
       ACALL  WR_COMM        ;调用写指令子程序
       MOV    R1,#0          ;使指针指到表中第一个码
       MOV    R0,#2          ;取码次数
  BJJ: MOV    A,R1           ;A为0 
       MOVC   A,@A+DPTR      ;读取码
       ACALL  WR_DATA        ;调用写数据子程序
       INC    R1             ;R1值加1
       DJNZ   R0,BJJ         ;判断是否将代码读取完?
       RET
 ;―――――――――――――
  BJ3:
         DB  ">H"
  BJ4:
         DB  "<L"
  BJ5:
         DB  " !"
 ;―――――――――――――

 ;--------- 报警上下线写入暂存器子程序 --------
  WR_THL:
       JB   FLAG,WR_T       ;FLAG=1,表示DS18B20存在,转WR_T 处
       RET
 ;―――――――――――――
  WR_T:
        ACALL  RESET_1820    ;调用18B20复位子程序
        MOV    A,#0CCH       ;跳过ROM匹配
        LCALL  WRITE_1820    ;调用写入子程序
        MOV    A,#4EH        ;写暂存寄存器
        LCALL  WRITE_1820    ;调用写入子程序
        MOV    A,TEMP_TH     ;TH(报警上限)
        LCALL  WRITE_1820    ;调用写入子程序
        MOV    A,TEMP_TL     ;TL(报警下限)
        LCALL  WRITE_1820    ;调用写入子程序
        MOV    A,#7FH        ;12位精确度
        LCALL  WRITE_1820    ;调用写入子程序
        RET

;--------- 报警值拷贝到EEROM子程序 -----------
  WRITE_E2:
        ACALL  RESET_1820    ;调用18B20复位子程序
        MOV    A,#0CCH       ;跳过ROM匹配
        LCALL  WRITE_1820    ;调用写入子程序 
        MOV    A,#48H        ;[48H]为拷贝到EEROM的指令代码
        LCALL  WRITE_1820    ;调用写入子程序
        RET

 ;---------- 报警值拷贝回暂存器子程序 ----------
  RE_THL:
        ACALL  RESET_1820     ;调用18B20复位子程序
        MOV    A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE_1820     ;调用写入子程序
        MOV    A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器
        ACALL  WRITE_1820     ;调用写入子程序
        RET

 ;----------  处理温度 BCD 码子程序 ----------
  CONV_TEMP:    
       MOV  A,TEMPH       ;判温度是否零下
       ANL  A,#80H
        JZ   TC1           ;温度零转TC1处
       CLR  C             ;C=0
        MOV  A,TEMPL       ;二进制数求补(双字节)
        CPL  A             ;取反加1
        ADD  A,#01H
        MOV  TEMPL,A
        MOV  A,TEMPH
        CPL  A
       ADDC  A,#00H
        MOV  TEMPH,A
        JMP  TC2
 ;―――――――――――――
  TC1:  MOV  TEMPHC,#0AH     
  TC2:  MOV  A,TEMPHC
        SWAP  A              ;高、低位交换
        MOV  TEMPHC,A
        MOV  A,TEMPL
        ANL  A,#0FH          ;乘0.0625
        MOV  DPTR,#DOTTAB
        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              ;高、低位交换
        ORL  A,TEMPLC        ;TEMPLC HI = 个位数 BCD
        MOV  TEMPLC,A
        MOV  A,R4
        JZ   TC3
        ANL  A,#0FH          ;取出低四位
        SWAP  A              ;高、低位交换
        MOV  R4,A
        MOV  A,TEMPHC        ;TEMPHC HI = 百位数 BCD
        ANL  A,#0FH          ;取出低四位
        ORL  A,R4
        MOV  TEMPHC,A
  TC3:           RET
;―――――――――――――
  HEX2BCD1:
        MOV  B,#064H         ;十六进制-> BCD
        DIV  AB              ;B= A % 100
        MOV  R4,A            ;R4 = 百位数
        MOV  A,#0AH
        XCH  A,B
        DIV  AB              ;B = A % B
        SWAP  A              ;高、低位交换
        ORL  A,B
        RET
 ;―――――――――――――
 ; 小数部分码表
  DOTTAB:
    DB   00H,00H,01H,01H,02H,03H,03H,04H
    DB   05H,05H,06H,06H,07H,08H,08H,09H
 ;―――――――――――――

 ;-------- 显示区BCD 码温度值刷新子程序 --------
  DISP_BCD:
        MOV  A,TEMPLC        ;个位数BCD码送入A
        ANL  A,#0FH          ;取低位码
        MOV  70H,A           ;小数位
        MOV  A,TEMPLC
        SWAP  A              ;高、低位交换
        ANL  A,#0FH          ;取结果数的高位
        MOV  71H,A           ;个位
        MOV  A,TEMPHC
        ANL  A,#0FH          ;取低位码
        MOV  72H,A           ;十位
        MOV  A,TEMPHC
        SWAP  A              ;高、低位交换
        ANL  A,#0FH          ;取结果数的高位
        MOV  73H,A           ;百位
        MOV  A,TEMPHC
        ANL  A,#0F0H         ;取低位码
        CJNE  A,#010H,DI0
        JMP  DI2
 ;―――――――――――――
  DI0:  MOV  A,TEMPHC
        ANL  A,#0FH          ;取低位码
        JNZ  DI2             ;十位数是0
        MOV  A,TEMPHC
        SWAP  A              ;高、低位交换
        ANL  A,#0FH          ;取结果数的高位
        MOV  73H,#0AH        ;符号位不显示
        MOV  72H,A           ;十位数显示符号
  DI2:  RET

 ;―――――――― DS18B20复位初始化子程序 ――――――――――
  RESET_1820:                ;复位(有具体的时序要求)                       
       SETB  DQ       
       NOP
       CLR   DQ       
 ;―――――――――――――
 ;主机发出延时537微秒的复位低脉冲
       MOV   R1,#3
 DLY: MOV   R0,#107
       DJNZ  R0,$
       DJNZ  R1,DLY
 ;―――――――――――――
 ;然后拉高数据线
       SETB  DQ        
       NOP
       NOP
       NOP
 ;―――――――――――――  
 ;等待DS18B20回应
       MOV   R0,#25H        
  T2:  JNB   DQ ,T3      
       DJNZ  R0, T2
       JMP   T4          
 ;―――――――――――――
 ;置标志位FLAG=1,表示DS1820存在 
  T3:  SETB  FLAG      
       JMP  T5
 ;―――――――――――――
 ;清标志位FLAG=0,表示DS1820不存在
  T4:  CLR   FLAG          
       JMP  T7
 ;―――――――――――――
 ;时序要求延时一段时间
  T5:  MOV  R0,#117
  T6:  DJNZ R0,T6           
 ;――――――――――――――
  T7:  SETB   DQ        
       RET                                           
       
;―――――――――― 写入DS18B20子程序 ―――――――――――
 ;写入DS18B20(有具体的时序要求)
  WRITE_1820: 
       MOV  R2,#8           ;一共8位数据
       CLR  C               ;C=0
    WR1:
       CLR  DQ              ;总线低位,开始写入  
       MOV  R3,#6
       DJNZ R3,$            ;保持16微秒以上
       RRC  A               ;把字节DATA分成8个BIT环移给C
       MOV  DQ, C           ;写入一个BIT
       MOV  R3,#23
       DJNZ R3,$            ;等待
       SETB DQ              ;重新释放总线
       NOP
       DJNZ R2,WR1          ;写入下一个BIT
      SETB DQ              ;释放总线
       RET                                       

 ;―――――――――― 读出DS18B20子程序 ―――――――――――
 ;将温度值从DS18B20中读出(有具体的时序要求)
  READ_1820:    
       MOV  R4,#4                
       MOV  R1,#TEMPL       ;存入25H、26H、27H、28H      
   RE0:
       MOV R2,#8            ;数据一共有8位

⌨️ 快捷键说明

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