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

📄 noname1.asm

📁 水温控制系统/
💻 ASM
字号:
 TEMPERATURE_L DATA 31H 	;DS18B20低8位Buffer
        TEMPERATURE_H DATA 30H 	;DS18B20高8位Buffer

        TEMPERATURE_HC DATA 32H   ;计算后的百位和十位的BCD码存放BUFFER
        TEMPERATURE_LC DATA 33H   ;计算后的个位和小数位的BCD码存放BUFFER
        TEMPERATURE_ZH DATA 34H   ;计算后十位和个位HEX码的存放BUFFER

        DIS_BUF_X DATA 35H 	;数码管小数位Buffer
        DIS_BUF_G DATA 36H	;数码管个位Buffer
        DIS_BUF_S DATA 37H	;数码管十位Buffer
        DIS_BUF_B DATA 38H	;数码管百位Buffer

        KEY_BUF_G DATA 39H ;键盘输入后,的个位值
        KEY_BUF_S DATA 49H ;键盘输入后,的十位值
        KEY_BUF_B DATA 41H ;键盘输入后,的百位值

        K_UP EQU P1.5     ;上调按钮
        K_DOWN EQU P1.6   ;下调按钮
        K_ENTER EQU P1.7  ;输入数据确认按钮
        K_NOWATER EQU P1.4

        P_DS18B20 EQU P3.3  ;读取DS18B20的输入端口
        P_SWITCH EQU P1.3   ;继电器控制端口,1-风扇,0-电炉

        FLAG EQU 20H.0        ;标志位,确定是否存在DS18B20
        ENTER_FLAG EQU 20H.1  ;键盘输入的标志位,为0说明键盘正在输入,为1说明键盘输入退出

;程序开始执行
        ORG  0000H
        LJMP MAIN
        ORG 0100H
MAIN:  MOV SP,#60H           ;初始化
        MOV KEY_BUF_G,#00H   ;由于KEY_BUF是由用户输入的,所以先赋值初始化
        MOV KEY_BUF_S,#00H
        MOV KEY_BUF_B,#00H

NEXT:
        LCALL	READ_TEMP ;调用读温度子程序
        JB FLAG,NORMAL	  ;判断是否有DS18B20的存在
        CALL ERR			  ;不存在时显示错误信息
AJMP	NEXT
NORMAL: LCALL DATA_DEAL		;处理从DS18B20得到的数据
        LCALL SET_DIS_BUF		;赋值给DIS_BUF_X,G,S,B
        LCALL DISPLAY		;调用数码管显示子程序
        LCALL SCAN_KEY		;扫描键盘
        LCALL DISPLAY1
        LCALL SWITCH			;处理继电器
        AJMP	NEXT

;程序名称:ERR
;功能:程序出错处理,显示四个8,即8888
;入口参数:无
;出口参数:DIS_BUF_X,DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
ERR:	MOV DIS_BUF_X,#08H ;如果没有找到DS18B20,那么就显示错误,错误显示为888
        MOV DIS_BUF_G,#08H
        MOV DIS_BUF_S,#08H
        MOV DIS_BUF_B,#08H
        LCALL DISPLAY
        SETB P3.0
        RET

;程序名称:DATA_DEAL
;功能:处理采集后的的数据
;入口参数:TEMPERATURE_L
;出口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
DATA_DEAL:
TEMPC1: MOV  TEMPERATURE_HC,#0AH
TEMPC11:MOV  A,TEMPERATURE_HC
        SWAP  A
        MOV  TEMPERATURE_HC,A
        MOV  A,TEMPERATURE_L
        ANL  A,#0FH              ;取A低4位(小数位,单位是0.0625),得出来的数要乘以0.0625,通过查表来算出值
        MOV  DPTR,#TEMPDOTTAB
        MOVC  A,@A+DPTR          ;查表
        MOV  TEMPERATURE_LC,A    ;TEMPERATURE_LC  LOW=小数部分 BCD
        MOV  DIS_BUF_X,A         ;小数位的BCD码送入显示buffer中

        MOV  A,TEMPERATURE_L     ;整数部分
        ANL  A,#0F0H             ;得到个位'单个数值
        SWAP  A                  ;SWAP后就得到个位真正的个位
        MOV  TEMPERATURE_L,A
        MOV  A,TEMPERATURE_H
        ANL  A,#0FH
        SWAP  A
        ORL  A,TEMPERATURE_L
        MOV  TEMPERATURE_ZH,A     ;组合后的值存入TEMPERATURE_ZH
        LCALL  HtoB               ;转换HEx值成为BCD码
        MOV  TEMPERATURE_L,A      ;TEMPERATURE_L目前存入的是十位和个位的BCD编码
        ANL  A,#0F0H
        SWAP  A
        ORL  A,TEMPERATURE_HC     ;TEMPERATURE_HC LOW位 = 十位数 BCD
        MOV  TEMPERATURE_HC,A
        MOV  A,TEMPERATURE_L
        ANL  A,#0FH
        SWAP  A                   ;TEMPERATURE_LC HI位 = 个位数 BCD
        ORL  A,TEMPERATURE_LC
        MOV  TEMPERATURE_LC,A
        MOV  A,R7
        JZ  TEMPC12
        ANL  A,#0FH
        SWAP  A
        MOV  R7,A
        MOV  A,TEMPERATURE_HC      ;TEMPERATURE_HC HI = 百位数 BCD
        ANL  A,#0FH

        ORL  A,R7
        MOV  TEMPERATURE_HC,A
TEMPC12:RET
;  小数部分码表
TEMPDOTTAB:  DB   00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H
;0.0625->00H
;0.0625*2 = 0.125->01H
;0.0625*3 = 0.1875->01H
;0.0625*4 = 0.25->02H
;0.0625*5 = 0.3125->03H
;以此类推..........

;程序名称:HtoB
;功能:十六进制转 BCD
;入口参数:A
;出口参数:R7
HtoB:   MOV  B,#064H  ;100
        DIV  AB       ;a/100
        MOV  R7,A     ;
        MOV  A,#0AH
        XCH  A,B
        DIV  AB
        SWAP  A
        ORL  A,B
        RET

;程序名称:INIT_TEMP
;功能:初始化DS18B20,确定DS18B20是否是存在的
;入口参数:无
;出口参数:FLAG
INIT_TEMP:
    	SETB	P_DS18B20
    	NOP
    	CLR	P_DS18B20	             ;主机发出延时537微秒的复位低脉冲
    	MOV	R0,#7BH
    	MOV	R1,#03H
TSR1:   DJNZ	R0,$
    	MOV 	R0,#7BH
    	DJNZ 	R1,TSR1
    	SETB	P_DS18B20	            ;然后拉高数据线,释放总线进入接受状态
    	NOP
    	NOP
    	NOP
    	MOV	R0,#32H
TSR2:   JNB 	P_DS18B20,TSR3	     ;等待DS18B20回应
        DJNZ	R0,TSR2
        LJMP	TSR4				;延时
TSR3:   SETB	FLAG				;置标志位,表示DS1820存在
        LJMP	TSR5
TSR4:   CLR	FLAG				;清标志位,表示DS1820不存在
        LJMP	TSR7
TSR5:   MOV	R0,#06BH
TSR6:   DJNZ	R0,TSR6			;时序要求延时一段时间
TSR7:   SETB	P_DS18B20
        RET

;程序名称:READ_TEMP
;功能:读取DS18B20的数据
;入口参数:TEMPERATURE_L,TEMPERATURE_H
;出口参数:无
READ_TEMP:
        SETB	P_DS18B20
        LCALL	INIT_TEMP	  ;先复位DS18B20
        JB	FLAG,TSS2
        RET	                  ;判断DS1820是否存在?若DS18B20不存在则返回

TSS2:	MOV	A,#0CCH	          ;跳过ROM匹配
        LCALL	WRITE_18B20
        MOV	A,#44H	          ;发出温度转换命令
        LCALL	WRITE_18B20
        MOV R7 ,#200
        DJNZ R7,$
        MOV R7 ,#175
        DJNZ R7,$	      ;等待AD转换结束,12位的话750微秒
        LCALL	INIT_TEMP	  ;准备读温度前先复位
        MOV	A,#0CCH	          ;跳过ROM匹配
        LCALL	WRITE_18B20
        MOV	A,#0BEH	          ;发出读温度命令
        LCALL	WRITE_18B20
        LCALL	READ_18B20	  ;将读出的温度数据保存到35H/36H
        RET

;具体的步骤:初始化完后当拉低电平开始产生写时隙-》15微妙之内送入一位数据-》15~60微妙1820来
;采样读取它

;程序名称:WRITE_18B20
;功能:将A保存的数值写入DS1820中,有具体的时序要求,详细参考附图的说明
;入口参数:A 寄存器
;出口参数:无
WRITE_18B20:
        MOV	R2,#8			;一共8位数据,串行通讯
        CLR	C
WR1:	CLR	P_DS18B20
        MOV	R3,#6
        DJNZ	R3,$
        RRC	A				;循环右移
        MOV	P_DS18B20,C
        MOV	R3,#23
        DJNZ	R3,$				;23*2 = 46微妙
        SETB	P_DS18B20
        NOP
        DJNZ	R2,WR1			;A里面一共是8位,所以要送8次
        SETB	P_DS18B20		;释放总线
        RET

;程序名称:READ_18B20
;功能:读取18B20中的数据,由于是串行通讯,每次读取一个,循环8次读取
;入口参数:TEMPRATURE_L
;出口参数:无
READ_18B20:
        MOV	R4,#4				;将温度高位和低位从DS18B20中读出
        MOV	R1,#TEMPERATURE_L
RE00:	MOV R2,#8				;数据一共有8位
RE01:	CLR C
        SETB 	P_DS18B20
        NOP
        NOP
        CLR	P_DS18B20
        NOP
        NOP
        NOP
        SETB	P_DS18B20
        MOV	R3,#09
RE10:	DJNZ R3,RE10
        MOV	C,P_DS18B20
        MOV	R3,#3CH
RE20:	DJNZ R3,RE20
        RRC	A
        DJNZ R2,RE01
        MOV	@R1,A
        DEC	R1
        DJNZ R4,RE00
        RET

;程序名称:SCAN_KEY
;功能:扫描键盘
;入口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
;出口参数:KEY_BUF_G,KEY_BUF_S,kEY_BUF_B
SCAN_KEY:
      JNB K_NOWATER,NOWATER
      JB K_ENTER,QUIT			;如果有Enter键入,则开始键盘输入
      LCALL K_DELAY
      JB K_ENTER,QUIT
      CLR ENTER_FLAG				;每次进来都赋值输入标志,设置为0
      MOV KEY_BUF_G,DIS_BUF_G ;将当前的温度赋值给KEY_BUF,也就是说是以当前温度为基准,进行加减的
      MOV KEY_BUF_S,DIS_BUF_S
      MOV KEY_BUF_B,DIS_BUF_B
K_LOOP:
      JB ENTER_FLAG,QUIT;如果输入完成,ENTER_FLAG则为1,退出键盘程序
      JB K_ENTER,KUP
      CALL PRO_ENTER
KUP:  JB K_UP,KDOWN
      CALL PRO_UP
KDOWN:JB K_DOWN,LOOPA
      CALL PRO_DOWN
LOOPA:LCALL DISPLAY
      SJMP K_LOOP
QUIT: RET


;程序名称:无水报警子程序
NOWATER:
       CALL K_DELAY
       JB  K_NOWATER,SCAN_KEY
       CLR P3.0
       call err
       CLR P1.3
       RET


;程序名称:PRO_ENTER
;功能:确认键盘输入和退出键盘输入
;入口参数:ENTER_FLAG
;出口参数:ENTER_FLAG
PRO_ENTER:
      CALL K_DELAY
      JB K_ENTER,K_LOOP ;按键抖动处理
      SETB ENTER_FLAG
      CALL K_DELAY
      RET

;程序名称:PRO_UP
;功能:数值上调处理
;入口参数:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_UP:
      CALL K_DELAY
      JB K_UP,K_LOOP    ;按键抖动处理
      INC KEY_BUF_G     ;个位增一
      MOV A,KEY_BUF_G
      CJNE A,#0AH,UPNEXT;个位增加到10,回0
      MOV KEY_BUF_G,#00H
      INC KEY_BUF_S     ;十位加一
      MOV A,KEY_BUF_S
      CJNE A,#0AH,UPNEXT;十位超过99,溢出了
      MOV R0,#200
ERROR1:LCALL ERR        ;出错,显示8888
      DJNZ R0,ERROR1
      DEC KEY_BUF_S     ;退回99
      MOV KEY_BUF_G,#09H
UPNEXT:
      MOV DIS_BUF_G,KEY_BUF_G
      MOV DIS_BUF_S,KEY_BUF_S
      MOV DIS_BUF_B,KEY_BUF_B
      CALL K_DELAY
      RET

;程序名称:PRO_DOWN
;功能:数值下调处理
;入口参数:KEY_BUF_G,KEY_BUF_S,KEY_BUF_B
;出口参数:DIS_BUF_G,DIS_BUF_S,DIS_BUF_B
PRO_DOWN:
      CALL K_DELAY
      JB K_DOWN,K_LOOP    ;按键抖动处理
      DEC KEY_BUF_G       ;个位减一
      MOV A,KEY_BUF_G
      CJNE A,#0FFH,DOWNNEXT;个位减到0,回到9
      MOV KEY_BUF_G,#09H
      DEC KEY_BUF_S        ;十位减一
      MOV A,KEY_BUF_S
      CJNE A,#0FFH,DOWNNEXT;十位低于0,溢出了
      MOV R0,#200
ERROR2:LCALL ERR           ;出错,显示8888
      DJNZ R0,ERROR2
      INC KEY_BUF_S        ;退回00
      MOV KEY_BUF_G,#00H
DOWNNEXT:
      MOV DIS_BUF_G,KEY_BUF_G ;增加完成后,赋值退出,然后DISPLAY显示出来
      MOV DIS_BUF_S,KEY_BUF_S
      MOV DIS_BUF_B,KEY_BUF_B
      CALL K_DELAY
      RET




K_DELAY:			;键盘抖动延时子程序
	MOV R6,#250
DL20MS_1:
	MOV R7,#200
	DJNZ R7,$
	DJNZ R6, DL20MS_1
	RET

;继电器控制
SWITCH:
        MOV A,KEY_BUF_G		;三个Buffer都是0的话,说明还没有输入数值,直接退出
        JNZ SNEXT
        MOV A,KEY_BUF_S
        JNZ SNEXT
        MOV A,KEY_BUF_B
        JZ  SQUIT
SNEXT:	CALL SET_DIS_BUF
	MOV A,KEY_BUF_S
	SUBB A,DIS_BUF_S
	JC COOL
	JNZ HOT					;十位如果相等,那么继续比较个位
	MOV A,KEY_BUF_G
	SUBB A,DIS_BUF_G
	JC COOL
HOT:  CLR P_SWITCH				;P_SWITCH 为0说明当前温度小于设定温度,要升温,所以接电炉
	  SJMP SQUIT
COOL: SETB P_SWITCH         ;P_SWITCH 为1说明当前温度大于设定温度,要降温,所以接风扇
SQUIT:RET

;程序名称:SET_DIS_BUF
;功能:赋值给DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;入口参数:TEMPERATURE_LC,TEMPERATURE_HC
;出口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
SET_DIS_BUF:
	 MOV  A,TEMPERATURE_LC
         ANL  A,#0FH
         MOV  DIS_BUF_X,A                 ;小数位
         MOV  A,TEMPERATURE_LC
         SWAP  A
         ANL  A,#0FH
         MOV  DIS_BUF_G,A                 ;个位
         MOV  A,TEMPERATURE_HC
         ANL  A,#0FH
         MOV  DIS_BUF_S,A                 ;十位
         MOV  A,TEMPERATURE_HC
         SWAP  A
         ANL  A,#0FH
         MOV  DIS_BUF_B,A                 ;百位
  	 RET


;程序名称:DISPLAY
;功能:显示数据到数码管中。
;入口参数:DIS_BUF_G, DIS_BUF_S, DIS_BUF_B
;出口参数:无
DISPLAY:
        MOV DPTR,#DISTAB
        MOV R3,#0FEH
        MOV R1,#DIS_BUF_B
DPLOP:	MOV A,@R1
        MOVC A,@A+DPTR
        MOV P2,R3
        MOV P0,A
        CJNE R3,#0FBH,DPNEXT
        SETB  P0.7
DPNEXT:	MOV A,R3
        RL A
        MOV R3,A
        DEC R1
	CALL DS1M
        CJNE R3,#0EFH,DPLOP
        MOV  P0,#00H            ;一次显示结束,P0口复位
        MOV  P2,#0FFH            ;P2口复位
        CLR P0.7
        RET
DS1M:
        MOV R7,#0FFH
        DJNZ R7,$
        RET

DISPLAY1:
        MOV DPTR,#DISTAB
        MOV R3,#0EFH
        MOV R1,#DIS_BUF_B
DPLOP1:	MOV A,@R1
        MOVC A,@A+DPTR
        MOV P2,R3
        MOV P0,A
        CJNE R3,#0BFH,DPNEXT1
        SETB  P0.7
DPNEXT1:	MOV A,R3
        RL A
        MOV R3,A
        DEC R1
	CALL DS1M1
        CJNE R3,#0EFH,DPLOP1
        MOV  P0,#00H            ;一次显示结束,P0口复位
        MOV  P2,#0FFH            ;P2口复位
        CLR P0.7
        RET
DS1M1:
        MOV R7,#0FFH
        DJNZ R7,$
        RET

;数码管TAB
DISTAB:
        DB	03FH ;0
        DB	006H ;1
        DB	05BH ;2
        DB	04FH ;3
        DB	066H ;4
        DB	06DH ;5
        DB	07DH ;6
        DB	007H ;7
        DB	07FH ;8
        DB	06FH ;9
        DB	00H ;NONE
END

⌨️ 快捷键说明

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