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

📄 复件 (4) 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码
	KEYBUF    EQU	2BH    ;存放键值
	KEYBUFL   EQU	2CH    ;存放设置的最低温值
	KEYBUFH   EQU	2DH    ;存放设置的最高温值
	KEYMODE   EQU	2EH    ;状态模式,显示当前温度0、设置报警最高温度1和最低温度2
 ;―――――――――――――
 ;按键输入引脚定义      
	KK     EQU  P2	  
        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 标记
	BUFFLAG	EQU  20H.2
	KEYFULL EQU  20H.3    ;		
        DQ     	EQU  P3.0
 ;============= 主程序 ==============

  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       ;显示温度标记"℃"

	MOV KEYMODE,#00H
	CLR	BUFFLAG
	CLR 	KEYFULL
        JMP    TOOP2
  TOOP1: ACALL  MEU_ERROR    ;显示"ERROR"信息
        ACALL  TEMP_BJ       ;显示温度标记
        JMP    $             ;等待
 ;――――――――――――――
 TOOP2:
        ACALL  RE_TEMP       ;调用读取温度数据子程序
       ACALL  SET_DATA      ;调用处理显示温度数据子程序
        ACALL  TEMP_COMP     ;实际温度值与标记温度值比较子程序
;        ACALL  P_KEY         ;调用按键扫描子程序
	ACALL  KEYSCAN	
	ACALL 	SHOW_DATA	;显示按键的数值
	
	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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描子程序
KEYSCAN:
	MOV KK,#0FH
	NOP
	NOP
	MOV A,KK
	ANL A,#0FH
	CJNE A,#0FH,KEYSCAN1
	AJMP KEYSCAN	
KEYSCAN1:	
	MOV B,#00H
	SETB	C
	MOV R3,#0EFH
KEYSCAN2:
	MOV A,R3
	JNB ACC.0, KEYSCAN8		;一次循环结束
	MOV KK,A
	RL    A
	MOV R3,A
	NOP
	MOV A,KK
	ANL A,#0FH
	CJNE A,#0FH,KEYSCAN4		;检测到按键按下则转KEYSCAN4
	INC 	B
	INC 	B
	INC	B
	AJMP KEYSCAN2
KEYSCAN4:	
	MOV R4,#04H
KEYSCAN5:
	RRC	A
	JNC 	KEYSCAN6
	INC 	B
	DJNZ R4,KEYSCAN7		;计数达到4次则出错返回
	AJMP KEYSCAN8
KEYSCAN7:
	AJMP 	KEYSCAN5
KEYSCAN6:
	INC 	B
	ACALL   C_BUF
KEYSCAN8:			;判断按键是否释放
	MOV KK,#0FH
	NOP
	NOP
	MOV A,KK
	ANL A,#0FH
	CJNE A,#0FH,KEYSCAN8
	RET	
	
;------------更新显示存储单元
C_BUF:
	MOV A,B
	CJNE A,#0AH,C_BUF1
	INC 	KEYMODE
	MOV A,KEYMODE
	CJNE A,#03H,C_BUF1
	MOV KEYMODE,#00H
	RET
C_BUF1:	MOV R5,KEYMODE
	CJNE A,#0BH,C_BUF2
	MOV B,#00H
	AJMP   C_BUF3
C_BUF2:	CJNE A,#0CH,C_BUF3
	CJNE R5,#02H,C_BUF4	;'#'号(确定键)按下
	MOV A,KEYBUF
	MOV TEMP_TL,A		;将设定的温值设置为最低温值
	AJMP C_BUF5		;
C_BUF4:	CJNE R5,#01H,C_BUF8
	MOV A,KEYBUF		;将设定的温值设置为最高温值
	MOV TEMP_TH,A
C_BUF5: CLR  BUFFLAG
	CLR  KEYFULL
	MOV A,KEYBUF
	MOV P0,A
	MOV KEYBUF,#00H	
	RET
C_BUF3:	CJNE R5,#00H,C_BUF6	;处理按键值
	RET
C_BUF6:	JB KEYFULL,C_BUF8	;超过两位数不做处理
	JB BUFFLAG,C_BUF7
	MOV KEYBUF,B
	SETB BUFFLAG
	RET
C_BUF7: MOV A,KEYBUF
	ANL A,#0FH
	PUSH	B		;将上一个数值*10加上这个数值
	MOV B,#0AH
	MUL	AB	
	POP	B
	ADD A,B
	MOV KEYBUF,A
	CLR BUFFLAG
	SETB KEYFULL
C_BUF8:
	RET
		

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

;------------------------------------------------------------
SHOW_DATA:
	MOV R5,KEYMODE
	CJNE R5,#00H,SHOW_DATA1
	ACALL  MEU_OK         ;显示"OK"信息子程序
        ACALL  TEMP_BJ        ;显示温度标记子程序  
	RET	
SHOW_DATA1:
	CJNE R5,#01H,SHOW_DATA2
	MOV    DPTR,#M_ALAXTH ;存M_ALAX1表
        MOV    A,#1
        ACALL  LCD_PRINT     ;显示字符
	MOV DPTR,#SET_TH
	MOV A,#2
	ACALL  LCD_PRINT
;	ACALL  TEMP_BJ1       ;调用显示温度标记子程序
      	MOV    A,TEMP_TH      ;加载TH数据
       	MOV    X,#3           ;设置位置
       	ACALL  SHOW_LINE2H    ;显示数据
;       ACALL  LOOK_ALARM    ;显示信息区子程序          
;       ACALL  SET_ALARM     ;设定报警值 TH、TL          

	AJMP SHOW_DATA3
SHOW_DATA2:
	MOV    DPTR,#M_ALAXTL ;存M_ALAX1表
        MOV    A,#1
        ACALL  LCD_PRINT     ;显示字符
	MOV DPTR,#SET_TH
	MOV A,#2
	ACALL  LCD_PRINT
	MOV A,TEMP_TL
	MOV X,#3
	ACALL SHOW_LINE2H
SHOW_DATA3:
        ACALL  WR_THL         ;将设定的TH,TL值写入DS18B20内
        ACALL  WRITE_E2       ;调用报警值拷贝EEROM子程序
       	RET
M_ALAXTH:
	DB " RESET ALARM TH",0
M_ALAXTL:
	DB " RESET ALARM TL",0
SET_TH:
	DB " TH:          ",0
SET_TL: 
	DB " TL:          ",0

;----------- 按键键扫描子程序 ----------
  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

⌨️ 快捷键说明

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