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

📄 复件 main.asm

📁 饮水机测温度原代码 用汇编语言写超过温度可以报警
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;程序:LCD2402.ASM
 ; ―――――――――――――――――――――――――――――――
 ; 温度值存放单元
        TEMP_ZH   EQU   24H    ;实时温度值存放单元
        TEMPL     EQU   25H    ;低温度值存放单元
        TEMPH     EQU   26H    ;高温度值存放单元
        TEMP_TH   EQU   27H    ;高温报警值存放单元
        TEMP_TL   EQU   28H    ;低温报警值存放单元
        TEMPHC    EQU   29H    ;存十位数 BCD码
        TEMPLC    EQU   2AH    ;存个位数 BCD码
 ;―――――――――――――
 按键输入引脚定义        
        K1     EQU  P2.1
        K2     EQU  P2.2
        K3     EQU  P2.3
        K4     EQU  P2.4
 ;―――――――――――――
        SPK    EQU  P3.4       ;蜂鸣器引脚
        RELAY  EQU  P2.0       ;继电器引脚
        X      EQU  2FH        ;LCD 地址变量
 ;―――――――――――――         
 ;LCD控制引脚        
        RS     EQU  P3.5
        RW     EQU  P3.6
        E      EQU  P3.7
 ;―――――――――――――        
        FLAG   EQU  20H.0    ;DS18B20是否存在标记
        KEY_UD EQU  20H.1    ;设定 KEY 的UP与DOWN 标记
        DQ     EQU P2.5

 ;============= 主程序 ==============

  MAIN:     
        ACALL  SET_LCD       ;LCD初始化设置子程序
        ACALL  WR_THL        ;将报警上下线写入暂存寄存器子程序
  TOOP: ACALL  RESET_1820    ;调用18B20复位子程序
        JNB    FLAG,TOOP1    ;DS1820不存在转移TOOP1处
        ACALL  MEU_OK        ;调用显示"OK"信息子程序
        ACALL  RE_THL        ;把EEROM里温度报警值拷贝回暂存器
        ACALL  TEMP_BJ       ;显示温度标记"℃"
        JMP    TOOP2
  TOOP1: ACALL  MEU_ERROR    ;显示"ERROR"信息
        ACALL  TEMP_BJ       ;显示温度标记
        JMP    $             ;等待
 ;――――――――――――――
 TOOP2:
        ACALL  RE_TEMP       ;调用读取温度数据子程序
        ACALL   SET_DATA     ;调用处理显示温度数据子程序
        ACALL  TEMP_COMP     ;实际温度值与标记温度值比较子程序
        ACALL  P_KEY         ;调用按键扫描子程序
	      SJMP	   TOOP2         ;循环

 ;--------―― 读取温度数据子程序 --------――
  RE_TEMP:
        ACALL  RESET_1820    ;18B20复位子程序    
        JNB    FLAG,TOOP1    ;DS1820不存在
        MOV    A,#0CCH       ;跳过ROM匹配
        ACALL  WRITE_1820    ;写入子程序
        MOV    A,#44H        ;发出温度转换命令
        ACALL  WRITE_1820    ;调写入子程序     
        ACALL  RESET_1820    ;调复位子程序        
        MOV    A,#0CCH       ;跳过ROM匹配
        ACALL  WRITE_1820    ;写入子程序
        MOV    A,#0BEH       ;发出读温度命令
        ACALL  WRITE_1820    ;写入子程序      
        ACALL  READ_1820     ;调用读取子程序
        RET

 ;-------- 温度数据处理显示子程序----------
  SET_DATA:
        ACALL  CONV_TEMP     ;处理温度 BCD 码子程序
        ACALL  DISP_BCD      ;显示区 BCD 码温度值刷新子程序
        ACALL  CONV          ;LCD显示子程序        
        RET

;----------- 按键键扫描子程序 ----------
  P_KEY:   ;按键K1处理                            
	      JB     K1, PK1		   ;K1键未按,转到PK1处	
        ACALL  SPK_BZ        ;K1键按下,一声鸣响
        JNB    K1,$          ;等按键放开
        MOV    DPTR,#M_ALAX1 ;存M_ALAX1表
        MOV    A,#1
        ACALL  LCD_PRINT     ;显示字符
        ACALL  LOOK_ALARM    ;显示信息区子程序
        JB     K3, $         ;等待K3按下
        ACALL  SPK_BZ        ;一声鸣响
        JMP    PK2           ;转到标号 PK2处 
  PK1:                       ; 按键K2处理
        JB     K2, PK3       ;K2键未按,转到PK3处             
        ACALL  SPK_BZ        ;K2键按下,一声鸣响               
        JNB    K2,$          ;等按键放开                
        MOV    DPTR, #TA1    ;存#TA1表           
        MOV    A,#1                             
        ACALL  LCD_PRINT     ;显示字符           
        ACALL  SET_ALARM     ;设定报警值 TH、TL          
        ACALL  WR_THL         ;将设定的TH,TL值写入DS18B20内
        ACALL  WRITE_E2       ;调用报警值拷贝EEROM子程序
  PK2:
        ACALL  MEU_OK         ;显示"OK"信息子程序
        ACALL  TEMP_BJ        ;显示温度标记子程序          
 PK3:
       RET
 ;―――――――――――――
  TA1:                       ;菜单表
     DB  "RESET ALERT CODE"
 ;―――――――――――――

 ;--------- 设定报警值 TH、TL子程序 --------
  SET_ALARM:
       ACALL  LOOK_ALARM    ;调用显示信息区子程序
  A0:  JB     K1,A2         ;按下K1(查看键),程序向下运行
       ACALL  SPK_BZ        ;蜂鸣器响一声
       JNB    K1,$          ;等放开
       CPL    20H.1         ;UP/DOWN 标记反向
  A2:  JB     20H.1,A3      ;20H.1=1,UP,转移到A3。
       JMP    A8            ;20H.1=0,DOWN,转移到A8
 ;―――――――――――――
 ; TH值调整(增加)
  A3:  JB     K2, A5        ;按下K2(设定键),程序向下运行    
       ACALL  SPK_BZ        ;蜂鸣器响一声
       INC    TEMP_TH       ;TH值调整(增加)
       MOV    A,TEMP_TH     ;TH值送入A
       CJNE   A,#120,A4     ;TH值增到120,程序向下运行
       MOV    TEMP_TH,#0    ;TH值清0
  A4:  ACALL  LOOK_ALARM    ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY         ;调用延时程序
       JMP    A3            ;循环
 ;―――――――――――――
 ;TL值调整(增加)
  A5:  JB     K3,A7          ;按下K3(TL值设定键)程序向下运行
       ACALL  SPK_BZ         ;蜂鸣器响一声
       INC    TEMP_TL        ;TL值增加1
       MOV    A, TEMP_TL     ;TL值送入A
       CJNE   A,#99,A6       ;比较,若A=99,程序向下运行
       MOV    TEMP_TL,#00H   ;TL值清0
  A6:  ACALL  LOOK_ALARM     ;调用显示信息区子程序
       MOV    R5, #10
       ACALL  DELAY          ;调用延时程序
       JMP    A5             ;程序转移到A5,循环
 ;―――――――――――――
 ;确定调整 OK
  A7:  JB     K4, A0         ;按下K4(调整确定键),程序向下运行
       ACALL  SPK_BZ         ;蜂鸣器响一声
       JNB    K4, $          ;等放开
       RET                   ;程序返回
 ;―――――――――――――
 ;TH值调整 (减少)
  A8:  JB     K2, A10        ;按下K2(设定键),程序向下运行   
       ACALL  SPK_BZ         ;蜂鸣器响一声
       DEC    TEMP_TH        ;TH值减1
       MOV    A,TEMP_TH      ;TH值送入A
       CJNE   A,#0FFH,A9     ;比较,若A=0FF,程序向下运行
       JMP    A12            ;转移到A12
  A9:  ACALL  LOOK_ALARM     ;调用显示信息区子程序
       MOV    R5, #10
       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    A,#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          ;转换为字符

⌨️ 快捷键说明

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