📄 源程序.asm
字号:
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 + -