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

📄 wcon.asm

📁 用PIC16C54来实现汽车空调的动作控制(扫风、除霜、点火、循环扫风。。。)
💻 ASM
字号:
;******************************************************
; 功 能:车载空调除霜通风控制  具体见原理图
; 硬 件: PIC16C54C
; 时 钟: XT 4MHz, WDT_OFF      
; 作 者;whaul	 
; 日 期: 07.05.16
; 版 本: V1.00 
;******************************************************	
	LIST P=16C54C
	#include P16C5x.inc

AC_OUT      	EQU   0    		;  AC输出口	(PA0)
YS_OUT      	EQU   2    		;  电机延时输出口(PA2)
GD_OUT      	EQU   1    		;  电机正反转输出口(PA1)
AC_IN        	EQU   0   		;  AC输入口,通过SW1这一按钮取其脉冲信号(PB0)
CS_IN        	EQU   1   		;  除霜口,它为1时,GD-OUT为0,YS-OUT为1并延时7秒后回到0(PB1)
MC_IN        	EQU   2    		;  循环请求,通过SW2这一按钮取其脉冲信号(PB2)
XH_IN        	EQU   3    		;  熄火信号,它为0时,AC-OUT=1,GD-OUT=0,YS-OUT=1并延时7秒后回到0(PB3)
GF_IN        	EQU   4    		;  鼓风机分档信号,0档时,AC-OUT=1(PB4)
FLAGA		 	EQU   0FH	
F_KEYCYC_EN	 	EQU	  0			;CYC按键有效标志
FLAG         	EQU   10H  		;(SW1标志位)
F_KEY_AC        EQU   0			;AC按键标志;
F_KEY_CYC       EQU   1			;CYC按键标志
F_YS7S		 	EQU   2			;delay 7S enable?	
F_DH			EQU   3			;点火标志
KEY_AC_ENABLE 	EQU   4			;AC按键按下标志
F_CS			EQU	  5			;除霜标志
KEY_CYC_ENABLE	EQU   6			;CYC按键按下标志
F_KEYAC_EN		EQU	  7			;AC按键有效标志

COUNT        	EQU   11H		;每计时溢出一次,此寄存器加1,到250时即计时1S;
COUNT7S		 	EQU   12H		;7S延时计时寄存器
ACCOUNT	 	 	EQU   13H		;AC按键延时计时寄存器
CSCOUNT		 	EQU   14H		;CS按键延时计时寄存器,延时:3*4ms
COMP_REG	 	EQU   15H		;放置定时比较值
;---------------------------------
         	ORG   1FFH
         	GOTO  START
;----------------------------------------
			org	 000H
;----------------------------------------
START       nop
;			BTFSC	3,NOT_PD			;WHEN /PD=1:POWER_UP RESET ; WHEN /PD=0:/MCLR WAKE_UP RESET; 
;			GOTO	WAKEUP		  
            MOVLW   00H
            MOVWF   FLAG				;清标志位
			MOVWF	COUNT
			MOVWF	COUNT7S
			MOVWF	COMP_REG
;WAKEUP	
			MOVLW   00H
            TRIS    5
            MOVLW   0FFH
            TRIS    6	
			MOVLW	06H					;N = 256-6 =250,
			MOVWF	TMR0				;主程跑一圈必须在2ms以内,否则定时误差就可能超过4ms
			MOVLW	03H					;PRESCALE = 16, TIMER =16US * N(=250) =2000US =4MS
			OPTION						;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
			
			BSF     5,AC_OUT
            BCF     5,GD_OUT
            BSF     5,YS_OUT
			BSF		FLAG,F_YS7S
			CLRF	COUNT				;清此位,使7S定时误差控制在4ms左右.
INITSTATE	NOP
			CALL	TIMOVER
			MOVLW	06H					;大于6才循环结束,所以实际定时7S
			MOVWF	COMP_REG
			MOVF	COUNT7S,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0			;定时>=7S,则初始化结束
			GOTO	INITSTATE			;不到7S,继续检测延时,判断
			CLRF	COUNT7S
			BCF		FLAG,F_YS7S			
            BCF     5,YS_OUT
;***********初始化结束,判断点火信号****************
			BTFSC	6,XH_IN				;点火信号判断
			GOTO	MAIN
			BSF     5,AC_OUT			;熄火处理
            BCF     5,GD_OUT
            BSF     5,YS_OUT
			BCF		FLAG,F_DH
			BSF		FLAG,F_YS7S			;开标志位,开始定时
			CLRF	COUNT
MAIN	    CALL	TIMOVER				;放于此处,循环一次即判断一次.
			BTFSC   6,XH_IN
            GOTO    DHENABLE			;点火有效
			BTFSS	FLAG,F_DH
			GOTO	YSENABLE	
			BCF		FLAG,F_DH
            BSF     5,AC_OUT			;熄火处理
            BCF     5,GD_OUT
            BSF     5,YS_OUT
			BSF		FLAG,F_YS7S			;开标志位,开始定时
			CLRF	COUNT
			CLRF	COUNT7S
			GOTO 	MAIN			
YSENABLE	MOVLW	06H
			MOVWF	COMP_REG
			MOVF	COUNT7S,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0			;定时>=7S,则延时结束
			GOTO	MAIN				;不到7S,继续检测延时,判断
			CLRF	COUNT7S
			BCF		FLAG,F_YS7S			
            BCF     5,YS_OUT
;***********************************************
;此处可插入进入睡眠态设置
;***************************************************
			GOTO    MAIN
DHENABLE	BSF		FLAG,F_DH			;置点火有效标志位.
;***************鼓风机档位判断****************************
			BTFSC	6,GF_IN				;点火有效,判断鼓风档位信号
			GOTO	GFENABLE			
			BSF		5,AC_OUT			;0档,AC关闭,AC_OUT = 1
			GOTO	CS_DETECT
GFENABLE	CALL	KEY_AC
			BTFSS	FLAG,F_KEYAC_EN
			GOTO	CS_DETECT			;无键,则跳过动作			
			BTFSC	FLAG,KEY_AC_ENABLE  ;有键判断是关还是开
			GOTO	C1
			BSF		5,AC_OUT			;关
			GOTO	CS_DETECT
C1			BCF		5,AC_OUT			;按键有效,AC开启,AC—OUT = 0		
;***********************除霜判断*************************************
CS_DETECT	BTFSS	6,CS_IN
			GOTO	CYC_DETECT
			BTFSC	FLAG,F_CS
			GOTO	CS_DLYOK
			BSF		FLAG,F_CS
			BCF		5,GD_OUT
			BSF		5,YS_OUT
			BSF		FLAG,F_YS7S
			CLRF	COUNT
			CLRF	COUNT7S
			GOTO	MAIN				;开始定时,回到MAIN
CS_DLYOK	MOVLW	06H					;已在定时中,判断定时到否
			MOVWF	COMP_REG
			MOVF	COUNT7S,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0
			GOTO	BK0
			CLRF	COUNT7S				;定时大于7S,则清延时标志,置低AC—OUT
			BCF		FLAG,F_YS7S			
            BCF     5,YS_OUT
BK0 		GOTO	MAIN
;**************循环键判断*****************************
CYC_DETECT	BCF     FLAG,F_CS
			CALL	KEY_CYC
			BTFSS	FLAGA,F_KEYCYC_EN
			GOTO	DISCYCKEY
			BTFSC	FLAG,KEY_CYC_ENABLE    ;FALG.6
			GOTO	CYCEN
			BCF		5,GD_OUT				;新风态
			BSF		5,YS_OUT
			BSF		FLAG,F_YS7S
			CLRF	COUNT
			CLRF	COUNT7S
			GOTO 	MAIN
CYCEN		BSF		5,GD_OUT				;循环风
			BSF		5,YS_OUT
			BSF		FLAG,F_YS7S
			CLRF	COUNT
			CLRF	COUNT7S
			GOTO	MAIN
DISCYCKEY	BTFSS	FLAG,F_YS7S
			GOTO	E1
			MOVLW	06H						;处于延时中,判断延时到否
			MOVWF	COMP_REG
			MOVF	COUNT7S,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0
			GOTO 	E1
			BCF		FLAG,F_YS7S
			CLRF	COUNT7S
			BCF		5,YS_OUT
E1			GOTO    MAIN

           
;************************************************************************
;TIMER0定时子程,总定时1秒,COUNT7S加一;
;prescale = 16 ; initial value = (256-250);
;************************************************************************
TIMOVER		MOVLW	05H
			MOVWF	COMP_REG
			MOVF	TMR0,0
			SUBWF	COMP_REG,0	
			BTFSS	STATUS,0			;C=1,计数值比6小,即已计满重新开始	
			GOTO	W1					;C=0,计数值比6大,即正常计数,返回,
			MOVLW	06H					;计到256后溢出处理,置初值,重置分频设置
			MOVWF	TMR0
			MOVLW	03H					;PRESCALE = 16, TIMER = 16US * N(=250) =4000US =4MS
			OPTION						;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
			INCF	COUNT,1
			BTFSS	FLAG,F_KEY_AC
			GOTO	NX2
			INCF	ACCOUNT,1
NX2			BTFSS	FLAG,F_KEY_CYC
			GOTO	NX3	
			INCF	CSCOUNT,1
NX3			MOVLW	0F9H				;249(修正后的值)
			MOVWF	COMP_REG
			MOVF	COUNT,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0			;C=0,计数值比250大,即1S定时到		
			GOTO	W1					;C=1,计数值比250小,即1S定时未到,
NX4			CLRF	COUNT
			BTFSS	FLAG,F_YS7S
			GOTO	W1
			INCF	COUNT7S,1
W1			RETLW	0
;**************************************************************************
;KEY IN
;BUG:当一直按键不放,直到keycount值从256变为小于3的值时释放,则被误认为按键无效
;********************************************************************
KEY_AC		BTFSC	6,AC_IN
			GOTO	BACK0
			BTFSC	FLAG,F_KEY_AC
			GOTO	BACK				;按住键不放的过程,继续延时计时,不动作。
			BSF		FLAG,F_KEY_AC		;刚判断到有键,置有键标志,同时清键延时寄存器keycount
			CLRF	ACCOUNT
B1			GOTO	BACK
BACK0		BTFSS	FLAG,F_KEY_AC		;检测到无键,是无键态还是释放态
			GOTO	BACK				;无键态,则不动作返回
			MOVLW	03H					;是释放态,判断延时时间是否大于12ms
			MOVWF	COMP_REG
			MOVF	ACCOUNT,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0
			GOTO	BACK1				;延时小于12ms,则认为是抖动态,不动作。
			MOVLW	10H					;FLAG.4与1异或,即取反,其它位与0异或,值不变
			XORWF	FLAG,1      		;KEYCOUNT > 3, 即按键定时到,取反有键标志位
			BSF		FLAG,F_KEYAC_EN
			CLRF	ACCOUNT		        ;延时大于12ms,按键有效,取反AC键
			BCF		FLAG,F_KEY_AC
			GOTO	BACK2	
BACK1		BCF		FLAG,F_KEY_AC
			CLRF	ACCOUNT
BACK		BCF		FLAG,F_KEYAC_EN
BACK2		RETLW	0
;******************************************************************************************
KEY_CYC		BTFSC	6,MC_IN			
			GOTO	BCK0
			BTFSC	FLAG,F_KEY_CYC
			GOTO	BCK					;按住键不放的过程,继续延时计时,不动作。
			BSF		FLAG,F_KEY_CYC		;刚判断到有键,置有键标志,同时清键延时寄存器keycount
			CLRF	CSCOUNT
D1			GOTO	BCK
BCK0		BTFSS	FLAG,F_KEY_CYC		;检测到无键,是无键态还是释放态
			GOTO	BCK					;无键态,则不动作返回
			MOVLW	03H					;是释放态,判断延时时间是否大于12ms
			MOVWF	COMP_REG
			MOVF	CSCOUNT,0
			SUBWF	COMP_REG,0
			BTFSC	STATUS,0
			GOTO	BCK1				;延时小于12ms,则认为是抖动态,不动作。
;			CLRF	CSCOUNT				;延时大于12ms,按键有效,取反AC键
			MOVLW	40H					;FLAG.6与1异或,即取反,其它位与0异或,值不变
			XORWF	FLAG,1      		;KEYCOUNT > 3, 即按键定时到,取反有键标志位
			BSF		FLAGA,F_KEYCYC_EN
			BCF		FLAG,F_KEY_CYC
			CLRF	CSCOUNT
			GOTO	BCK2
BCK1		BCF		FLAG,F_KEY_CYC
			CLRF	CSCOUNT
BCK			BCF		FLAGA,F_KEYCYC_EN
BCK2	    RETLW	0
			END
			
			
			
			        	

⌨️ 快捷键说明

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