打印

pic16f946的低电压检测模块

[复制链接]
2367|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liht1634|  楼主 | 2009-12-15 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liht1634 于 2009-12-15 11:33 编辑

LIST        P=16F946         ; list directive to define processor
                #INCLUDE    <;P16F946.INC>    ; processor specific variable definitions
                __CONFIG    _FCMEN_OFF & _IESO_OFF & _CP_OFF & _WDT_OFF & _BOD_OFF & _MCLRE_ON & _PWRTE_OFF & _HS_OSC
;*******************************************
                ORG     00H
                NOP
                GOTO    START
;*******************************************
;注:PIC16F946器件在中断服务程序和主程序中使用GOTO,就必须在中断服务程序中保存和恢复PCLATH
                ORG     04H              ;进入中断;保护现场和恢复现场
                MOVWF   W_TEMP           ;复制W到它的临时备份寄存器W_TEMP中
                SWAPF   STATUS,W         ;将STATUS寄存器高低半字节交换后放入W
                CLRF    STATUS           ;不管当前处在哪个体,都设置体0作当前体
                MOVWF   STATUS_TEMP      ;保存STATUS到体0上的临时寄存器STATUS_TEMP
                MOVF    PCLATH, W        ;把寄存器PCLATH内容复制到W中
                MOVWF   PCLATH_TEMP      ;经W将PCLATH内容转到临时寄存器PCLATH_TEMP
                CLRF    PCLATH           ;不管当前处在哪页,都把PCLATH设置成指向页0(中断服务程序的核心部分)
                CALL    INT_SERV         ;调用中断服务子程序
                MOVF    PCLATH_TEMP,W    ;经过W转移
                MOVWF   PCLATH           ;恢复PCLATH内容
                SWAPF   STATUS_TEMP,W    ;将STATUS_TEMP寄存器高低半字节交换后放入W
                MOVWF   STATUS           ;把W内容移动到STATUS寄存器(同时也把当前体恢复到原先的体上)
                SWAPF   W_TEMP,F         ;将W_TEMP内容高低半字节交换后放回
                SWAPF   W_TEMP,W         ;再次将W_TEMP内容高低半字节交换后放入W
                RETFIE
;///////////////////////////////////////////
INT_SERV                                 ;中断服务判断
                BANKSEL PIR2             ;当使能PLVD模块后,应该使用软件延时以确保正确读取模块的状态
                BTFSC   PIR2,LVDIF       ;PLVD稳定时间预计小于50uS(当VDD=5V时)
                CALL    WRBYTES
                BTFSC   INTCON,T0IF      ;是TMR0中断吗?
                CALL    SVC_TMR0         ;是,转TMR0中断服务程序
                RETURN
;*******************************************
SVC_TMR0                                 ;TMR0子程序
                BCF     INTCON,T0IF      ;TMRO增1一次的时间=(晶振频率F÷4÷分频比)的倒数
                MOVLW   0ECH             ;中断时间T=(0FFH-TMRO)*128=(256-236)*128=2560uS=2.56mS
                MOVWF   TMR0
                BANKSEL PORTC
                BSF     PORTC,3         ;打开指示
                BANKSEL FLAG
                MOVLW 80H             ;死机RC1无输出脉冲
             XORWF FLAG,1
                BTFSC FLAG,7
             BSF     PORTC,1      ;RC1输出高电平
             BTFSS FLAG,7
             BCF     PORTC,1      ;RC1输出低电平
                CALL    SCANKEYS        ;键盘扫描
                CALL    DISPLAY         ;LED显示
                BANKSEL FLAG
                BTFSC   FLAG,7
                RETURN
;///////////////////////////////////////////
                BANKSEL TEMP_SW
                INCF    TEMP_SW
                BTFSS   TEMP_SW,2
                GOTO    TMR0_END1
                CLRF    TEMP_SW
TMR0_END1
                BANKSEL TEMP_SW
                MOVF    TEMP_SW,0
                ANDLW   0FFH
                MOVWF   PORTF
                BSF     PORTF,5
                BSF     PORTF,4
                BANKSEL PORTE
                BSF     PORTE,7
                RETURN
;*******************************************
START
                BANKSEL PORTA            ;BANK0
                CLRF    PORTA            ;PORTA-F寄存器初始化
                CLRF    PORTB
                CLRF    PORTC
                CLRF    PORTD
                CLRF    PORTE
                BANKSEL PORTF
                CLRF    PORTF
                CLRF    PORTG
                CALL    TRIS_INIT        ;TRISA-F初始化
                BANKSEL PORTE
                BSF     PORTE,7          ;显示初始化关闭显示RE7
                CLRF    ADCON0           ;AD结果格式左对齐;参考电压VSS/VDD;初始通道AN0
                CLRF    FLAG             ;清标志寄存器
                CLRF    PIR2
                CLRF    INTCON
                MOVLW   0ECH
                MOVWF   TMR0
                BANKSEL PORTF
                BSF     PORTF,4          ;显示初始化关闭显示RF4
                BSF     PORTF,5          ;显示初始化关闭显示RF5
                BCF     PORTF,0
                BCF     PORTF,1
                CLRF    FLAG_SW5
                CLRF    FLAG_SW4
                CLRF    FLAG_SW
                CLRF    TEMP_SW
                BSF     FLAG_SW5,1       ;水温设定
                BSF     FLAG_SW4,1       ;温度设定
                BSF     FLAG_SW,4        ;打开电源灯
                              
                BANKSEL LVDCON           ;使能低电压检测(VPLD)模块
                MOVLW   07H
                MOVWF   LVDCON
                BANKSEL PIE2
                BCF     INTCON,PEIE
                BCF     PIE2,LVDIE
                BANKSEL LVDCON
                BSF     LVDCON,LVDEN
;///////////////////////////////////////////
                BANKSEL START_DEL_BUF    ;上电延时100mS
                MOVLW   .100             ;此段程序不可以去掉,用于使能低电压检测模块后
                MOVWF   START_DEL_BUF    ;确保能正确读取模块的状态
START1
                CALL    DELAY500uS
                CLRWDT
                DECFSZ  START_DEL_BUF,1
                GOTO    START1
;///////////////////////////////////////////
START2
                CALL    RDBYTES
                BSF     INTCON,GIE
                BSF     INTCON,T0IE     ;允许T0中断
;*******************************************
LOOP
                CALL    TRIS_INIT       ;TRIS_INIT初始化
                CLRWDT              
                GOTO    LOOP
;*******************************************
TRIS_INIT
                BANKSEL CMCON0
                MOVLW   07h              ;Set RA<2:0> to digital I/O,关闭比较器
                MOVWF   CMCON0
                CLRF    ANSEL            ;Make all PORTA I/O
                MOVLW   0FFh
                MOVWF   TRISA
               
                MOVLW   00H
                MOVWF   TRISB
                MOVLW   0C0H
                MOVWF   TRISC
                BANKSEL LCDCON
                CLRF    LCDCON           ;Disable VLCD<3:1> inputs on RC<2:0>
                BANKSEL TRISD
                MOVLW   00H
                MOVWF   TRISD
                MOVLW   3FH
                MOVWF   TRISE
                CLRF    ANSEL
                BANKSEL TRISF
                MOVLW   0C0H
                MOVWF   TRISF
                BANKSEL ANSEL
                CLRF    ANSEL
                BANKSEL TRISG
                MOVLW   00h
                MOVWF   TRISG   
                MOVLW   B'11000111'      ;禁止PORTB上拉功能;RB0/INT引脚上升沿触发中断
                MOVWF   OPTION_REG       ;预分频器分配给Timer0模块;分频比1:256
                RETURN
;*******************************************
DELAY500uS                         ;延时500uS子程序;1条指令0.5uS
                BANKSEL DEL500uS_BUF
                MOVLW   0C8H       ;(4+(1+1+1+2)*200-1)*0.5=501.5uS
                MOVWF   DEL500uS_BUF
DELAY500uS_1
                CLRF    INTCON
                BANKSEL PIE2
                BCF     PIE2,LVDIF
                DECFSZ  DEL500uS_BUF,1
                GOTO    DELAY500uS_1
;*******************************************
WRBYTES                             ;向I2C写入N字节,写入的起始地址在ADDR中,源数据起始地址指针在W中
                CLRF    INTCON
                BANKSEL PIE2
                BCF     PIE2,LVDIE               
                RETURN
;*******************************************
RDBYTES
                RETURN
;*******************************************
                END
程序执行到BSF     LVDCON,LVDEN后,就使能了低电压检测模块,这时PIR2,LVDIF就被置1了,程序进入低电压检测中断,我己经禁止了此中断。大家帮忙看看是哪里的问题,不甚感激!!!

相关帖子

沙发
liht1634|  楼主 | 2009-12-16 08:01 | 只看该作者
本帖最后由 liht1634 于 2009-12-16 08:10 编辑

己解决,怎么发贴都没人知道呢?还是不想回呢?
在后面加入延时循环:
                BANKSEL PIR2
                BTFSC   PIR2,LVDIF
                BCF     PIR2,LVDIF
直到VCC稳定为+5V。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

178

主题

365

帖子

1

粉丝