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

📄 源程序.asm

📁 节能用水控制系统由微控制器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	MOVWF	SENDDATA
	CALL	SEND;向移位寄存器发送数据
	BCF		PORTA,1;XZADR,选中洗澡DA
	NOP
	BSF		PORTA,1
	NOP
	NOP
	BCF		PORTA,1
	NOP
	NOP
	BCF		PORTA,0;关闭移位寄存器
	CALL	DELAY10MS;延时10ms,等待稳定
	CALL	ADCONVERT;AD转换
	MOVF	ADTEMP,0
	MOVWF	XZMIN;存最低温
	MOVLW	0D5H;开热水;213
	MOVWF	SENDDATA
	CALL	SEND;向移位寄存器移位数据
	BCF		PORTA,1;XZADR
	NOP
	BSF		PORTA,1
	NOP
	NOP
	BCF		PORTA,1
	NOP
	NOP
	BCF		PORTA,0;关闭移位寄存器
	CALL	DELAY10MS;延时,等待稳定
	CALL	ADCONVERT;AD转换
	MOVF	ADTEMP,0
	MOVWF	XZMAX;存入最高温
	BCF		PORTA,3;关闭XZWK
	BSF		INTCON,RBIE;开启温度开关使能
	BCF		INTCON,RBIF
	MOVF	XZMAX,0
	SUBWF	XZMIN,0
	BTFSS	STATUS,C;判断冷热水阀是否装反
	GOTO	XZON	
	ADDWF	XZMAX,1;交换最大最小值,是MAX>MIN
	SUBWF	XZMIN,1
	INCF	XZEEROR,1
XZON;已经打开
	MOVF	XZTEMP,0
	SUBWF	XZMAX,0
	BTFSS	STATUS,C
	GOTO	MAXCH;设定温度>最高温度
	MOVF	XZTEMP,0
	GOTO	MAXEND
MAXCH
	MOVF	XZMAX,0
MAXEND
	MOVWF	CONTEMP;载入转换所需参数
	MOVWF	XZTEMP
	SUBWF	XZMIN,0
	BTFSC	STATUS,C
	GOTO	MINCH;设定温度<最低温度
	MOVF	XZTEMP,0
	GOTO	MINEND
MINCH
	MOVF	XZMIN,0
MINEND
	MOVWF	CONTEMP	
	MOVWF	XZTEMP
	MOVF	XZMAX,0
	MOVWF	CONMAX
	MOVF	XZMIN,0
	MOVWF	CONMIN
	CALL	DATACONVERT;将温度数据转换成DA电流控制数据
	MOVF	CONDATA,0
	MOVWF	SENDDATA
	MOVF	XZEEROR,1
	BTFSC	STATUS,Z
	GOTO	XZOK
	MOVF	SENDDATA,0
	SUBLW	0FFH
	MOVWF	SENDDATA
XZOK
	CALL	SEND;发送到移位寄存器
	BCF		PORTA,1;XZADR
	NOP
	BSF		PORTA,1
	NOP
	NOP
	BCF		PORTA,1;读入洗澡DA
	NOP
	NOP
	BCF		PORTA,0;关闭移位寄存器
XZCHEND
	RETURN
;*****************************************
;***^_^*****洗手初始及变化程序*****^_^***
;*****************************************
XSCHANG
	CLRWDT
	MOVF	XSFLAG,1
	BTFSC	STATUS,Z
	GOTO	XSCHEND
	;洗手处有人时
	MOVF	XSSTATE,1
	BTFSS	STATUS,Z
	GOTO	XSON;洗手阀已经打开
	;洗手阀尚未打开
	INCF	XSSTATE,1
	BSF		PORTA,2;温度传感器电源开关打开
	BSF		PORTC,1;洗手电阀打开
	MOVLW	2AH;42;开冷水
	MOVWF	SENDDATA
	CALL	SEND;送入移位寄存器
	BCF		PORTC,4;XSADR
	NOP
	BSF		PORTC,4
	NOP
	NOP
	BCF		PORTC,4;读入洗手DA
	NOP
	NOP
	BCF		PORTA,0;关闭移位寄存器
	CALL	DELAY10MS;延时,等待稳定
	CALL	ADCONVERT;AD转换
	MOVF	ADTEMP,0
	MOVWF	XSMIN
	MOVLW	0D5H;开热水,213
	MOVWF	SENDDATA
	CALL	SEND;送往移位寄存器
	BCF		PORTC,4
	NOP
	BSF		PORTC,4
	NOP
	NOP
	BCF		PORTC,4;锁入洗手DA
	NOP
	NOP
	BCF		PORTA,0;关闭移位寄存器
	CALL	DELAY10MS;延时,等待稳定
	CALL	ADCONVERT;AD转换
	MOVF	ADTEMP,0
	MOVWF	XSMAX
	BCF		PORTA,2;关闭温度传感器电源
	BSF		INTCON,RBIE
	BCF		INTCON,RBIF
	MOVF	XSMAX,0;判断冷热洗手阀是否接反
	SUBWF	XSMIN,0
	BTFSS	STATUS,C
	GOTO	XSON	;未接反
	;接反,交换最大最小值
	ADDWF	XSMAX,1
	SUBWF	XSMIN,1
	INCF	XSEEROR,1
XSON
	MOVF	XSTEMP,0
	SUBWF	XSMAX,0
	BTFSS	STATUS,C
	GOTO	MAXCH1;设定值高于最高温
	MOVF	XSTEMP,0;正常
	GOTO	MAXEND1
MAXCH1
	MOVF	XSMAX,0
MAXEND1
	MOVWF	CONTEMP
	MOVWF	XSTEMP
	SUBWF	XSMIN,0
	BTFSC	STATUS,C
	GOTO	MINCH1;设定值低于最低温
	MOVF	XSTEMP,0;正常
	GOTO	MINEND1
MINCH1
	MOVF	XSMIN,0
MINEND1
	MOVWF	CONTEMP	
	MOVWF	XSTEMP
	MOVF	XSMAX,0
	MOVWF	CONMAX
	MOVF	XSMIN,0
	MOVWF	CONMIN
	CALL	DATACONVERT;转换为电流控制信号
	MOVF	CONDATA,0
	MOVWF	SENDDATA
	MOVF	XSEEROR,1
	BTFSC	STATUS,Z
	GOTO	XSOK
	MOVF	SENDDATA,0
	SUBLW	0FFH
	MOVWF	SENDDATA
XSOK	
	CALL	SEND;送往移位寄存器
	BCF		PORTC,4
	NOP
	BSF		PORTC,4
	NOP
	NOP
	BCF		PORTC,4;锁入洗手DA
	NOP
	NOP
	BCF		PORTA,0;关闭移位寄存器
XSCHEND
	RETURN
;*****************************************
;***^_^*********AD转换子程序*******^_^***
;************20MS~41MS***********
;RA0,数据转换为0-100数据,出口:ADTEMPH:ADTEMP	
ADCONVERT
	CLRWDT
	CLRF	ADTEMP
	CLRF	ADTEMPH
	MOVLW	03H
	MOVWF	GTEMP
ADC	MOVLW	0C1H;FRC,CH0(RA0),DONE,ADON打开AD
	MOVWF	ADCON0
	MOVLW	8EH;DDDDDDA,VDD,VSS,1/0,右对齐
	BSF		STATUS,RP0		
	MOVWF	ADCON1
	BSF		TRISA,0
	BCF		STATUS,RP0
	BSF		PORTA,0
	BCF		PIR1,ADIF
	BSF		INTCON,ADIE
	BCF		INTCON,RBIE
	BCF		INTCON,INTE
	BSF		INTCON,PEIE
	BSF		INTCON,GIE
	CALL	DELAY10MS;延时,等待AD捕获
	CLRWDT
	BSF		ADCON0,GO;AD WORK,只允许一个语句,否则AD失败
	SLEEP;等待AD中断2~6US,TYPICAL=4uS
	MOVF	ADTEMP,1
	BTFSS	STATUS,Z
	GOTO	FINISH
	MOVF	ADTEMPH,1
	BTFSS	STATUS,Z
	GOTO	FINISH
	MOVLW	04H
	MOVWF	GTEMP
FINISH
	DECFSZ	GTEMP,1;三次AD转换是否完成
	GOTO	ADC
	BCF		ADCON0,ADON;关AD
	BCF		INTCON,ADIE
	MOVLW	06H;DDDDDDDD,VDD,VSS;
	BSF		STATUS,RP0
	MOVWF	ADCON1
	BCF		TRISA,0;将RA0设为移位寄存器电源控制
	BCF		STATUS,RP0
	BSF		INTCON,RBIE
	BSF		INTCON,INTE
;将所加数据除以3;适合10~12位数据处理
	CLRF	CARRYL
	CLRF	CARRYH
	MOVLW	3H
	INCF	ADTEMPH,1
LOOP
	SUBWF	ADTEMP,1
	BTFSC	STATUS,C
	GOTO	ADDC
	DECF	ADTEMPH,1
	MOVF	ADTEMPH,1
	BTFSC	STATUS,Z
	GOTO	LOOPEND
ADDC
	INCF	CARRYL,1;不改变STATUS,C
	MOVF	CARRYL,1
	BTFSC	STATUS,Z
	INCF	CARRYH
	GOTO	LOOP
LOOPEND;余数丢弃,三次AD转换的数据和除以3,平均值数字滤波
	BCF		STATUS,C
	RLF		CARRYL,0
	MOVWF	CARRYL
	MOVWF	ADTEMP
	RLF		CARRYH,0;X2
	MOVWF	ADTEMPH
	MOVWF	CARRYH
	BCF		STATUS,C
	RLF		CARRYL,1
	RLF		CARRYH,1;X4
	BCF		STATUS,C
	RLF		CARRYL,1
	RLF		CARRYH,1;X8
	MOVF	ADTEMP
	ADDWF	CARRYL,1
	BTFSC	STATUS,C
	INCF	CARRYH,1
	MOVF	ADTEMPH,0
	ADDWF	CARRYH,1;X2+X8=X10	
	INCF	CARRYH,1
	MOVLW	6CH
	SUBWF	CARRYL,1
	BTFSC	STATUS,C
	GOTO	MINH
	DECF	CARRYH,1
	MOVF	CARRYH,1
	BTFSS	STATUS,Z
	GOTO	MINUS
MINH
	DECF	CARRYH,1
	MOVLW	57H
	SUBWF	CARRYH,1;CARRYH:CARRYL-22380;
	BTFSC	STATUS,C
	GOTO	MINCOM
MINUS;如果转换值小于0
	CLRF	CARRYH
	CLRF	CARRYL
MINCOM	;>8200->=8200
	MOVF	CARRYH,0
	MOVWF	CSSTATEH
	MOVF	CARRYL,0
	MOVWF	CSSTATE
	MOVLW	20H
	MOVWF	CARRYH
	MOVLW	08H
	MOVWF	CARRYL
	CALL	COMCSSTATE;比较大小,CARRYH=0表明CSSTATEH:CSSTATE<CARRYH:CARRYL
	MOVF	CARRYH,1
	BTFSC	STATUS,Z
	GOTO	SUBCH
	CLRF	CARRYH
	CLRF	CARRYL
	INCF	CARRYH,1
	GOTO	SUB
SUBCH
	MOVF	CSSTATEH,0
	MOVWF	CARRYH
	INCF	CARRYH,1
	MOVF	CSSTATE,0
	MOVWF	CARRYL
SUB;/82=52H
	MOVLW	52H
	SUBWF	CARRYL,1
	BTFSS	STATUS,C
	DECF	CARRYH,1
	MOVF	CARRYH,1
	BTFSS	STATUS,Z
	GOTO	SUBD	
	INCF	ADTEMP,1
	MOVF	ADTEMP,1
	BTFSC	STATUS,Z
	INCF	ADTEMPH,1
	GOTO	SUB
SUBD
	;完成算法:((ADTEMPH:ADTEMP/3)*10-22380)/82
	;大于100的数=100,小于0的数=0
	RETURN
;*****************************************
;***^_^*******发送数据子程序*******^_^***
;****************122uS******************
;入口参数:SENDDATA,输出至RC2:DATA,RC3:CLK
SEND
	CLRWDT
	BSF		STATUS,RP0
	BCF		TRISC,2;DATA
	BCF		TRISC,3;CLK
	BCF		STATUS,RP0
	BSF		PORTA,0;开启移位寄存器电源
	MOVLW	08H
	MOVWF	GTEMP
SHIFT
	NOP
	BCF		PORTC,3;CLK,8uS
	RLF		SENDDATA,1
	BTFSS 	STATUS,C
	GOTO	CLR
	BSF		PORTC,2;C=1,DATA7...0
	GOTO	CLR1
CLR
	BCF		PORTC,2;C=0,DATA7...0
CLR1
	NOP
	NOP
	BSF		PORTC,3;CLK,5uS
	DECFSZ	GTEMP,1
	GOTO	SHIFT
	BSF		STATUS,RP0
	BSF		TRISC,2;YL
	BSF		TRISC,3;手动冲水
	BCF		STATUS,RP0
	BSF		PORTC,2
	BSF		PORTC,3
	RETURN
;*****************************************
;***^_^******DATACONVERT子程序*****^_^***
;*****************************************	
;入口:CONMIN,CONMAX,CONTEMP出口:CONDATA
;公式:{[171*(CONMAX-CONTEMP)]/(CONMAX-CONMIN)}+42
DATACONVERT
	CLRWDT
	MOVF	CONTEMP,0
	SUBWF	CONMAX,0
	MOVWF	CONDATA;CONDATA=CONMAX-CONTEMP
	MOVLW	0ABH;171
	MOVWF	SUBT
	CLRW
	CLRF	CARRYH
MUXLOOP;CARRYH:CONDATA=171*CONDATA
	ADDWF	CONDATA,1
	BTFSC	STATUS,C
	INCF	CARRYH
	DECFSZ	SUBT,1
	GOTO	MUXLOOP
	MOVF	CONMIN,0
	SUBWF	CONMAX,0;W=CONMAX-CONMIN
	CLRF	SUBT
	INCF	CARRYH,1
DIVLOOP;SUBT=CARRYH:CONDATA/W
	SUBWF	CONDATA,1
	BTFSS	STATUS,C
	DECF	CARRYH,1
	MOVF	CARRYH,1
	BTFSC	STATUS,Z
	GOTO	DIVEND
	INCF	SUBT,1
	GOTO	DIVLOOP
DIVEND;CONDATA=SUBT+42
	MOVF	SUBT,0
	ADDLW	2AH;42
	MOVWF	CONDATA
	RETURN
;****************************************
;***^_^******DELAY10MS子程序*****^_^***
;******************************	***********
;2+1*6+90*6+90*105+2-182=10000-182
DELAY10MS;2
	CLRWDT;+1
	NOP;+1
	MOVLW	5AH;90;+1
	MOVWF	DELAYH;+1
	NOP;+1
	NOP;+1
DELAY2
	NOP;1*90
	NOP;1*90
	MOVLW	23H;35;+1*90
	MOVWF	DELAYL;+1*90
	NOP;+1*90
DELAY1
	DECFSZ		DELAYL,1;+1*90*35
	GOTO		DELAY1;+2*90*34
	DECFSZ		DELAYH,1;+1*90
	GOTO		DELAY2;+2*89
	NOP;+1
	NOP;+1
	RETURN;+2
;*****************************************
;***^_^**********PUSH子程序********^_^***
;**************11US******************
;保护中断现场,保护W,STATUS,PCLATH
PUSH;
	MOVWF		KEEPW
	SWAPF		STATUS,0
	CLRF		STATUS
	MOVWF		KEEPF
	MOVF		PCLATH,0
	MOVWF		KEEPPC
	CLRF		PCLATH
	RETURN
;*****************************************
;***^_^**********POP子程序********^_^***
;**************10US******************
;保护中断现场,保护W,STATUS,PCLATH
POP;
	MOVF	KEEPPC,0
	MOVWF	PCLATH
	SWAPF	KEEPF,0
	MOVWF	STATUS
	SWAPF	KEEPW,1
	SWAPF	KEEPW,0
	RETURN
;*****************************************
;***^_^********AD转换中断程序******^_^***
;***************40uS****************
;出口在ADTEMPH:ADTEMP中
ADDILL
	BCF		INTCON,GIE
	CALL	PUSH;保护现场
	CLRWDT
	NOP
	BTFSS	PIR1,ADIF
	GOTO	ADEND1
	MOVLW	03H
	ANDWF	ADRESH,0;读转换数据的高2位
	ADDWF	ADTEMPH,1;将三次和加在一起
	BSF		STATUS,RP0
	MOVF	ADRESL,0;读转换数据的低8位
	ADDWF	ADTEMP,1;将三次结果加在一起
	BTFSC	STATUS,C
	INCF	ADTEMPH
	GOTO	ADEND
ADEND1;AD中断出错,重新转换
	CLRF	ADTEMP
	CLRF	ADTEMPH
ADEND
	BCF		PIR1,ADIF
	CALL	POP;恢复现场
	RETFIE
;*****************************************
;***^_^******红外接收中断程序******^_^***
;*************2480US*****************
;RECV有信号时为1;结果在IFVALUE中
IFREC;第一个红外信号使进入中断
	BCF		INTCON,GIE
	CALL	PUSH;保护现场
	CLRWDT
	CLRF	IFVALUE;清除信号标志位
	NOP
	BTFSS	INTCON,INTF
	GOTO	IFEND
	MOVLW	06H
	MOVWF	DELAYL
ONEIF
	MOVLW	09H
	MOVWF	IFTIME
	CALL	IFSEND;红外发射
	CALL	IFANSWER;红外接收
	MOVLW	03H
	SUBWF	RECDATA,1
	BTFSC	STATUS,C;仅接收到1,2个或没有信号
	INCF	IFVALUE,1
	DECFSZ	DELAYL,1
	GOTO	ONEIF
IFEND
	BCF		INTCON,INTF
	CALL	POP;恢复现场
	RETFIE
;*****************************************
;***^_^*****PORTB按键中断程序******^_^***
;*****************************************
KEYSTATE
	BCF		INTCON,GIE
	CALL	PUSH;保护现场
	CLRWDT
	BTFSS	INTCON,RBIF
	GOTO	RBEND
	BTFSS	PORTB,5;XZIC洗澡升温
	GOTO	JWEN
	CALL	DELAY10MS;防抖
	BTFSC	PORTB,5
	INCF	XZTEMP
	CALL	XZCHANG;调温
	GOTO	ONEKEY
JWEN
	BTFSS	PORTB,4;XZDC洗澡降温
	GOTO	XSKEY
	CALL	DELAY10MS;防抖
	BTFSS	PORTB,4
	GOTO	XSKEY
	DECF	XZTEMP,1
	BTFSS	PORTB,1;是否是手动冲水信号
	GOTO	SHUTCS
	CALL	DELAY10MS;防抖
	BTFSS	PORTB,1
	GOTO	SHUTCS		
	CALL	XZCHANG;调温
	GOTO	ONEKEY
XSKEY
	BTFSS	PORTB,6;XSDC;洗手降温
	GOTO	SWEN	
	CALL	DELAY10MS;防抖
	BTFSS	PORTB,6
	GOTO	SWEN
	DECF	XSTEMP
	CALL	XSCHANG;调温
	GOTO	ONEKEY
SWEN
	BTFSS	PORTB,7;XSIC;洗手升温
	GOTO	ONEKEY
	CALL	DELAY10MS;防抖
	BTFSS	PORTB,7
	GOTO	ONEKEY
	INCF	XSTEMP,1
	CALL	XSCHANG;调温
ONEKEY
	MOVLW	31H;49
	MOVWF	KEEPG
ONEKEY1
	CALL	DELAY10MS;延时,0.5s后返回,避免频繁更改温度
	DECFSZ	KEEPG,1
	GOTO	ONEKEY1
	GOTO	RBEND
SHUTCS;手动冲水
	BTFSS	PORTB,4
	INCF	XZTEMP,1	
	MOVF	SDFLAG,1
	BTFSS	STATUS,Z
	GOTO	NO0
	CALL	CSOPEN;手动冲水开启脉冲阀
	INCF	SDFLAG,1	
	GOTO	RBEND
NO0	
	MOVF	SDFLAG,1
	BTFSC	STATUS,Z
	GOTO	RBEND
	CALL	CSSHUT;手动冲水关闭脉冲阀
	CLRF	SDFLAG	
RBEND
	BCF		INTCON,RBIF
	CALL	POP;恢复现场
	RETFIE	
;*****************************************
;***^_^********TIME1定时中断程序*****^_^***
;*************40US~2294US****************
TIMEOUT;
	MOVWF	TIMEW
	SWAPF	STATUS,0
	CLRF	STATUS
	MOVWF	TIMEF
	MOVF	PCLATH,0
	MOVWF	TIMEPC
	CLRF	PCLATH
	;保护现场
	CLRWDT
	BCF		INTCON,GIE
	NOP
	BTFSS	PIR1,TMR1IF
	GOTO	TIMEIFEND
	BCF		PIR1,TMR1IF
	MOVLW	0BH
	MOVWF	TMR1H
	MOVLW	0DEH
	MOVWF	TMR1L	
	MOVF	USEFLAG,1;厕所有人计数标志
	BTFSC	STATUS,Z
	GOTO	COUNT
	DECF	TIMETEP,1;一般时间定时
	GOTO	TIMEIFEND
COUNT;计数
	INCF	XSISCS
	MOVLW	09H
	MOVWF	IFTIME
	BSF		INTCON,GIE
	BSF		INTCON,INTE;允许INT中断
	CALL	IFSEND;厕所红外发送
	CLRWDT
	SLEEP
	BCF		INTCON,GIE
	BCF		INTCON,INTE
	MOVF	IFVALUE,1
	BTFSC	STATUS,Z
	GOTO	YLTEST
	INCF	CSSTATE,1
	MOVF	CSSTATE,1
	BTFSC	STATUS,Z
	INCF	CSSTATEH,1
YLTEST;测试压力传感器(力敏电阻)
	BCF		PORTC,7;YLSW
	NOP
	NOP
	BTFSC	PORTC,2;YL
	GOTO	TIMEIFEND
	BSF		PORTC,7
	NOP
	NOP
	BTFSS	PORTC,2
	GOTO	TIMEIFEND
	BCF		PORTC,7
	NOP
	NOP
	BTFSC	PORTC,2
	GOTO	TIMEIFEND
	INCF	YLFLAG,1
	MOVF	YLFLAG,1
	BTFSC	STATUS,Z
	INCF	YLFLAGH,1	
TIMEIFEND	
	BSF		STATUS,RP0
	BSF		T1CON,TMR1IE
	BSF		STATUS,RP0
	MOVF	TIMEPC,0
	MOVWF	PCLATH
	SWAPF	TIMEF,0
	MOVWF	STATUS
	SWAPF	TIMEW,1
	SWAPF	TIMEW,0
	;恢复现场
	RETFIE
;程序结束	
	END

⌨️ 快捷键说明

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