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

📄 复件 (4) main.asm

📁 饮水机测温度原代码 用汇编语言写超过温度可以报警
💻 ASM
📖 第 1 页 / 共 3 页
字号:
       ACALL  DELAY          ;调用延时子程序
       JMP    A0             ;转移到A12
   ;――――――――――――――
   ;TL值调整(减少)
  A10: JB     K3, A13        ;按K3(TL值设定键),程序向下运行
       ACALL  SPK_BZ         ;蜂鸣器响一声
       DEC    TEMP_TL        ;TL值减1
       MOV    A,TEMP_TL      ;TH值送入A
       CJNE   A,#0FFH,A11    ;比较,若A=0FF,程序向下运行
       JMP    A12            ;转移到A12
  A11: ACALL  LOOK_ALARM     ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY          ;调用延时子程序
       JMP    A0             ;转移到A0
  A12: CPL    20H.1          ;UP/DOWN 标记反向
       JMP    A3             ;转移到A3 ,TH值调整(增加)
  A13: JMP    A7             ;转移到A7 ,确定调整 OK
       RET                   ;子程序返回

 ;---------- 显示信息区子程序	----------- 
  LOOK_ALARM:
       MOV    DPTR,#M_ALAX2  ;存表
       MOV    A,#2           ;显示在第二行
       ACALL  LCD_PRINT      ;调用显示字符子程序
       MOV    A,#0C6H        ;显示起始地址为第二行第7位
       ACALL  TEMP_BJ1       ;调用显示温度标记子程序
      MOV    A,TEMP_TH      ;加载TH数据
       MOV    X,#3           ;设置位置
       ACALL  SHOW_LINE2H    ;显示数据
 ;―――――――――――――
       MOV    A,#0CEH        ;设定显示起始地址为第二行第15位
       ACALL  TEMP_BJ1       ;调用显示温度标记子程序
       MOV    A,TEMP_TL      ;加载TL数据
       MOV    X,#12          ;设置位置
       ACALL  SHOW_LINE2L    ;显示数据
       RET
 ;――――――――――――――
  M_ALAX1:
     DB   " LOOK ALERT CODE",0
  M_ALAX2:
     DB   "TH:      TL:    ",0
;――――――――――――――
;――――――显示温度标记子程序―――――― 
  TEMP_BJ1:                  
       ACALL  WR_COMM        ;调用写指令子程序
       MOV    DPTR,#BJ2      ;存代码表
       MOV    R1,#0          ;使指针指到表中第一个码
       MOV    R0,#2          ;取码次数
  B0:  MOV    A,R1           ;A为0
       MOVC   A,@A+DPTR      ;读取码
       ACALL  WR_DATA        ;调用写数据子程序
       INC    R1             ;R1值加1
       DJNZ   R0,B0          ;判断是否将代码读取完?
       RET
 ;―――――――――――――
  BJ2:                       ;代码表
      DB  00H,"C"
 ;―――――――――――――

 ;―――――在 LCD 的第二行显示高温数字――――
  SHOW_LINE2H:              
 ;       MOV    B,#100       ;设置被除数,B为百位数
 ;      DIV    AB           ;除法运算,结果A存商数,B存余数
 ;     ADD    A,#30H       ;低半字节加30得到ASCII码(转换为字符)
 ;       PUSH   B            ;B放入堆栈暂存起来
 ;      MOV    B,X          ;设置LCD显示的位置
 ;      ACALL  LCDP2        ;由LCD显示出来
 ;―――――――――――――
 ;       POP    B            ;B由堆栈取出来
	
        MOV    B,#0AH       ;A赋值10
 ;       XCH    A,B          ;A、B数据互换,B为十位数
        DIV    AB           ;除法运算,结果A存商数,B存余数
        ADD    A,#30H       ;转换为字符
        INC    X            ;LCD显示位位置加1
        PUSH   B            ;B放入堆栈暂存起来
        MOV    B,X          ;设置LCD显示的位置
        ACALL  LCDP2        ;由LCD显示出来
 ;―――――――――――――
        POP    B            ;B由堆栈取出来
        INC    X            ;LCD显示位位置加1
        MOV    A,B          ;B为个位数
        MOV    B,X          ;设置LCD显示的位置
        ADD    A,#30H       ;转换为字符
        ACALL  LCDP2        ;由LCD显示出来
        RET

 ;―――――在 LCD 的第二行显示低温数字―――――
  SHOW_LINE2L:                
        MOV  B,#100          ;设置被除数
        DIV  AB              ;除法运算,结果A存商数,B存余数
        MOV  A,#0AH          ;A赋值10
        XCH  A,B             ;A、B数据互换,B为十位数
        DIV  AB              ;除法运算,结果A存商数,B存余数
        ADD  A,#30H          ;转换为字符
        PUSH  B              ;B放入堆栈暂存起来
        MOV  B,X             ;设置LCD显示的位置
        CALL  LCDP2          ;由LCD显示出来
 ;――――――――――――――
        POP  B               ;B由堆栈取出来
        INC  X               ;LCD显示位位置加1
        MOV  A,B             ;B为个位数
        MOV  B,X             ;设置LCD显示的位置
        ADD  A,#30H          ;转换为字符
        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

⌨️ 快捷键说明

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