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

📄 wcon.sdi

📁 用PIC16C54来实现汽车空调的动作控制(扫风、除霜、点火、循环扫风。。。)
💻 SDI
字号:
,,,        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
,,,FLAG         EQU   10H  ;   (SW1标志位)
,,,F_KEY_AC        EQU   0
,,,F_KEY_CYC       EQU   1
,,,F_YS7S                  EQU   2
,,,F_DH                    EQU   3
,,,KEY_AC_ENABLE   EQU   4
,,,F_CS                    EQU       5
,,,KEY_CYC_ENABLE  EQU   6
,,,F_KEYAC_EN              EQU       7
,,,
,,,COUNT        EQU   11H
,,,COUNT7S          EQU   12H
,,,ACCOUNT          EQU   13H
,,,CSCOUNT          EQU   14H
,,,COMP_REG         EQU   15H
,,,;REGA         EQU   15H         ;REGA  = 6
,,,;REGB         EQU   16H         ;REGB = 250
,,,;REGC         EQU   17H         ;REGC = 7       KEY DELAY = 7S
,,,;REGD            EQU   18H              ;REGD = 3       KEY DELAY TIME = 3 * 4mS
,,,
,,,;PIC54        EQU   1FFH
,,,;SUB          EQU   0
,,,;---------------------------------
,,,
000001FF,,,         ORG   1FFH
000001FF,0A00,,         GOTO  START
,,,;----------------------------------------
,,,;               org      0x000
,,,;               goto    START
00000000,,,                org      000H
,,,;----------------------------------------
00000000,0000,START,START       nop
,,,;                       BTFSC   3,NOT_PD                ;WHEN /PD=1:POWER_UP RESET ; WHEN /PD=0:/MCLR WA
,,,;                       GOTO    WAKEUP
00000001,0C00,,            MOVLW   00H
00000002,0030,,            MOVWF   FLAG                ;清标志位
00000003,0031,,                        MOVWF   COUNT
00000004,0032,,                        MOVWF   COUNT7S
00000005,0035,,                        MOVWF   COMP_REG
,,,;WAKEUP
00000006,0C00,,                        MOVLW   00H
00000007,0005,,            TRIS    5
00000008,0CFF,,            MOVLW   0FFH
00000009,0006,,            TRIS    6
0000000A,0C06,,                        MOVLW   06H                     ;N = 256-6 =250,
0000000B,0021,,                        MOVWF   TMR0            ;主程跑一圈必须在2ms以内,否则定时误差就可能超过4ms
0000000C,0C03,,                        MOVLW   03H                     ;PRESCALE = 16, TIMER =16US * N(=250) =2000US =4
0000000D,0002,,                        OPTION                          ;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
,,,
0000000E,0505,,                        BSF     5,AC_OUT
0000000F,0425,,            BCF     5,GD_OUT
00000010,0545,,            BSF     5,YS_OUT
00000011,0550,,                        BSF             FLAG,F_YS7S
00000012,0071,,                        CLRF            COUNT           ;清此位,使7S定时误差控制在4ms左右.
00000013,0000,INITSTATE,INITSTATE       NOP
00000014,097D,,                        CALL    TIMOVER
00000015,0C07,,                        MOVLW   07H
00000016,0035,,                        MOVWF   COMP_REG
00000017,0212,,                        MOVF    COUNT7S,0
00000018,0095,,                        SUBWF   COMP_REG,0
00000019,0623,,                        BTFSC   STATUS,1        ;定时>=7S,则初始化结束
0000001A,0A13,,                        GOTO    INITSTATE       ;不到7S,继续检测延时,判断
0000001B,0072,,                        CLRF    COUNT7S
0000001C,0450,,                        BCF             FLAG,F_YS7S
0000001D,0445,,            BCF     5,YS_OUT
,,,;***********初始化结束,判断点火信号****************
0000001E,0666,,                        BTFSC   6,XH_IN         ;点火信号判断
0000001F,0A26,,                        GOTO    MAIN
00000020,0505,,                        BSF     5,AC_OUT        ;熄火处理
00000021,0425,,            BCF     5,GD_OUT
00000022,0545,,            BSF     5,YS_OUT
00000023,0470,,                        BCF             FLAG,F_DH
00000024,0550,,                        BSF             FLAG,F_YS7S     ;开标志位,开始定时
00000025,0071,,                        CLRF    COUNT
00000026,097D,MAIN,MAIN        CALL        TIMOVER         ;放于此处,循环一次即判断一次.
00000027,0666,,                        BTFSC   6,XH_IN
00000028,0A3D,,            GOTO    DHENABLE    ;点火有效
00000029,0770,,                        BTFSS   FLAG,F_DH
0000002A,0A33,,                        GOTO    YSENABLE
0000002B,0470,,                        BCF             FLAG,F_DH
0000002C,0505,,            BSF     5,AC_OUT    ;熄火处理
0000002D,0425,,            BCF     5,GD_OUT
0000002E,0545,,            BSF     5,YS_OUT
0000002F,0550,,                        BSF             FLAG,F_YS7S     ;开标志位,开始定时
00000030,0071,,                        CLRF    COUNT
00000031,0072,,                        CLRF    COUNT7S
00000032,0A26,,                        GOTO    MAIN
00000033,0C07,YSENABLE,YSENABLE        MOVLW   07H
00000034,0035,,                        MOVWF   COMP_REG
00000035,0212,,                        MOVF    COUNT7S,0
00000036,0095,,                        SUBWF   COMP_REG,0
00000037,0623,,                        BTFSC   STATUS,1        ;定时>=7S,则延时结束
00000038,0A26,,                        GOTO    MAIN    ;不到7S,继续检测延时,判断
00000039,0072,,                        CLRF    COUNT7S
0000003A,0450,,                        BCF             FLAG,F_YS7S
0000003B,0445,,            BCF     5,YS_OUT
,,,;***********************************************
,,,;此处可插入进入睡眠态设置
,,,;***************************************************
0000003C,0A26,,                        GOTO    MAIN
0000003D,0570,DHENABLE,DHENABLE        BSF             FLAG,F_DH       ;置点火有效标志位.
,,,;                       BTFSS   FLAG,F_YS7S
,,,;                       GOTO    A1
,,,;                       MOVLW   07H
,,,;                       MOVWF   REGC
,,,;                       MOVF    COUNT7S,0
,,,;                       SUBWF   REGC,0
,,,;                       BTFSC   STATUS,1        ;定时>=7S,则延时结束
,,,;                       GOTO    A1      ;不到7S,继续检测延时,判断
,,,;                       CLRF    COUNT7S
,,,;                       BCF             FLAG,F_YS7S
,,, ;           BCF     5,YS_OUT
,,,;***************鼓风机档位判断****************************
0000003E,0686,,                        BTFSC   6,GF_IN         ;点火有效,判断鼓风档位信号
0000003F,0A42,,                        GOTO    GFENABLE
00000040,0505,,                        BSF             5,AC_OUT        ;0档,AC关闭,AC_OUT = 1
00000041,0A4A,,                        GOTO    CS_DETECT
00000042,0999,GFENABLE,GFENABLE        CALL    KEY_AC
00000043,07F0,,                        BTFSS   FLAG,F_KEYAC_EN
00000044,0A4A,,                        GOTO    CS_DETECT               ;无键,则跳过动作
00000045,0690,,                        BTFSC   FLAG,KEY_AC_ENABLE  ;有键判断是关还是开
00000046,0A49,,                        GOTO    C1
00000047,0505,,                        BSF             5,AC_OUT                ;关
00000048,0A4A,,                        GOTO    CS_DETECT
00000049,0405,C1,C1                      BCF             5,AC_OUT        ;按键有效,AC开启,AC—OUT = 0
,,,;***********************除霜判断*************************************
0000004A,0726,CS_DETECT,CS_DETECT       BTFSS   6,CS_IN
0000004B,0A5F,,                        GOTO    CYC_DETECT
0000004C,06B0,,                        BTFSC   FLAG,F_CS
0000004D,0A55,,                        GOTO    CS_DLYOK
0000004E,05B0,,                        BSF             FLAG,F_CS
0000004F,0425,,                        BCF             5,GD_OUT
00000050,0545,,                        BSF             5,YS_OUT
00000051,0550,,                        BSF             FLAG,F_YS7S
00000052,0071,,                        CLRF    COUNT
00000053,0072,,                        CLRF    COUNT7S
00000054,0A26,,                        GOTO    MAIN            ;开始定时,回到MAIN
00000055,0C07,CS_DLYOK,CS_DLYOK        MOVLW   07H                     ;已在定时中,判断定时到否
00000056,0035,,                        MOVWF   COMP_REG
00000057,0212,,                        MOVF    COUNT7S,0
00000058,0095,,                        SUBWF   COMP_REG,0
00000059,0623,,                        BTFSC   STATUS,1
0000005A,0A5E,,                        GOTO    BK0
0000005B,0072,,                        CLRF    COUNT7S         ;定时大于7S,则清延时标志,置低AC—OUT
0000005C,0450,,                        BCF             FLAG,F_YS7S
0000005D,0445,,            BCF     5,YS_OUT
0000005E,0A26,BK0,BK0             GOTO    MAIN
,,,;**************循环键判断*****************************
0000005F,04B0,CYC_DETECT,CYC_DETECT      BCF     FLAG,F_CS
00000060,09B2,,                        CALL    KEY_CYC
00000061,070F,,                        BTFSS   FLAGA,F_KEYCYC_EN
00000062,0A71,,                        GOTO    DISCYCKEY
00000063,06D0,,                        BTFSC   FLAG,KEY_CYC_ENABLE    ;FALG.6
00000064,0A6B,,                        GOTO    CYCEN
00000065,0425,,                        BCF             5,GD_OUT                ;新风态
00000066,0545,,                        BSF             5,YS_OUT
00000067,0550,,                        BSF             FLAG,F_YS7S
00000068,0071,,                        CLRF    COUNT
00000069,0072,,                        CLRF    COUNT7S
0000006A,0A26,,                        GOTO    MAIN
0000006B,0525,CYCEN,CYCEN           BSF             5,GD_OUT                ;循环风
0000006C,0545,,                        BSF             5,YS_OUT
0000006D,0550,,                        BSF             FLAG,F_YS7S
0000006E,0071,,                        CLRF    COUNT
0000006F,0072,,                        CLRF    COUNT7S
00000070,0A26,,                        GOTO    MAIN
00000071,0750,DISCYCKEY,DISCYCKEY       BTFSS   FLAG,F_YS7S
00000072,0A7C,,                        GOTO    E1
00000073,0C07,,                        MOVLW   07H                     ;处于延时中,判断延时到否
00000074,0035,,                        MOVWF   COMP_REG
00000075,0212,,                        MOVF    COUNT7S,0
00000076,0095,,                        SUBWF   COMP_REG,0
00000077,0623,,                        BTFSC   STATUS,1
00000078,0A7C,,                        GOTO    E1
00000079,0450,,                        BCF             FLAG,F_YS7S
0000007A,0072,,                        CLRF    COUNT7S
0000007B,0445,,                        BCF             5,YS_OUT
0000007C,0A26,E1,E1                      GOTO    MAIN
,,,
,,,
,,,;************************************************************************
,,,;TIMER0定时子程,总定时1秒,COUNT7S加一;
,,,;prescale = 16 ; initial value = (256-250);
,,,;************************************************************************
0000007D,0C05,TIMOVER,TIMOVER         MOVLW   05H
0000007E,0035,,                        MOVWF   COMP_REG
0000007F,0201,,                        MOVF    TMR0,0
00000080,0095,,                        SUBWF   COMP_REG,0
00000081,0723,,                        BTFSS   STATUS,1        ;C=1,计数值比6小,即已计满重新开始
00000082,0A98,,                        GOTO    W1                      ;C=0,计数值比6大,即正常计数,返回,
00000083,0C06,,                        MOVLW   06H                     ;计到256后溢出处理,置初值,重置分频设置
00000084,0021,,                        MOVWF   TMR0
00000085,0C03,,                        MOVLW   03H                     ;PRESCALE = 16, TIMER = 16US * N(=250) =4000US =
,,,4MS
00000086,0002,,                        OPTION                          ;INTERNAL CLOCK,PRESCAL FOR WDT AND WDT IS DISAB
00000087,02B1,,                        INCF    COUNT,1
00000088,0710,,                        BTFSS   FLAG,F_KEY_AC
00000089,0A8B,,                        GOTO    NX2
0000008A,02B3,,                        INCF    ACCOUNT,1
0000008B,0730,NX2,NX2                     BTFSS   FLAG,F_KEY_CYC
0000008C,0A8E,,                        GOTO    NX3
0000008D,02B4,,                        INCF    CSCOUNT,1
0000008E,0CFA,NX3,NX3                     MOVLW   0FAH
0000008F,0035,,                        MOVWF   COMP_REG
00000090,0211,,                        MOVF    COUNT,0
00000091,0095,,                        SUBWF   COMP_REG,0
00000092,0623,,                        BTFSC   STATUS,1        ;C=0,计数值比250大,即1S定时到
00000093,0A98,,                        GOTO    W1                      ;C=1,计数值比250小,即1S定时未到,
00000094,0071,NX4,NX4                     CLRF    COUNT
00000095,0750,,                        BTFSS   FLAG,F_YS7S
00000096,0A98,,                        GOTO    W1
00000097,02B2,,                        INCF    COUNT7S,1
00000098,0800,W1,W1                      RETLW   0
,,,;**************************************************************************
,,,;KEY IN
,,,;BUG:当一直按键不放,直到keycount值从256变为小于3的值时释放,则被误认为按键无效
,,,;********************************************************************
00000099,0606,KEY_AC,KEY_AC          BTFSC   6,AC_IN
0000009A,0AA0,,                        GOTO    BACK0
0000009B,0610,,                        BTFSC   FLAG,F_KEY_AC
0000009C,0AB0,,                        GOTO    BACK                            ;按住键不放的过程,继续延时计时,不动作

⌨️ 快捷键说明

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