;程序功能:上电开机:PIN5为高电平,绿灯亮;PIN2,PIN3为低电平,红灯灭;
; 轮流检测PIN6,PIN7脚电平,欠压3.9V,10V,红灯亮,绿灯灭,过压5.9V,15.9V
; 红灯亮,绿灯灭,alram为TTL高电平,过压锁死
LIST P=12F675
INCLUDE
__CONFIG(B'11000101110100')
;Highest band gap voltage,0,0,Data memory is not protected
;Program memory is code-protected,BOD enabled,MCLR pin is MCLR function
;PWRT enabled,WDT disabled,INTOSC oscillator
;**************************************
READH EQU 2Ah ;读到的高2位数据
READL EQU 2Bh ;读到的低8位数据
SOUH EQU 40h ;欠压设置,高2位存储地址
SOU EQU 41h ;欠压设置,低8位存储地址
RLTH EQU 42h ;过压设置,高2位存储地址
RLT EQU 43h ;过压设置,低8位存储地址
ORG 0000H
GOTO MAIN
ORG 0004H
GOTO ADBEGIN
ORG 0030H
MAIN
BCF STATUS,RP0 ;BANK 0
CLRF GPIO
MOVLW 07H
MOVWF CMCON ;关闭比较器
BSF STATUS,RP0 ;BANK 1
CALL 3FFH ; 读内部振荡出厂校准字,返回值在W寄存器内
MOVWF OSCCAL ;校准晶振
MOVLW B'00001011';TRISIO 三态控制器
MOVWF TRISIO ;设置TRISIO方向控制器,GP0,GP1,GP3为输入口
MOVLW B'00010011'
MOVWF ANSEL ;8分频晶振,AN0AN1为模拟口,AN2AN3为数字口
BANKSEL OPTION_REG
MOVLW B'00000000';将预分频器分配给TIMER0 模块,2分频
MOVWF OPTION_REG ;
BANKSEL INTCON
MOVLW B'10100000' ;允许全局中断,禁止外围中断,允许TRMO中断,禁止GP2/INT外部中断
MOVWF INTCON ;禁止GPIO端口电平变化中断,TMR0寄存器没有溢出,未发生GP2/INT中断
;GP5:GP0 引脚电平均未发生变化
MOVLW 02H
MOVWF 24H ;AD通道设置选择
MOVLW D'10'
MOVWF 25H ;过压后延时采样,10*90uS=900uS
;********************************************
;欠压设置2.5V,5V路对应值3.8V,15V路对应值10V
MOVLW 0002H
MOVWF SOUH
MOVLW 0000H
MOVWF SOU
;*********************************************
;过压设置值3.9V,5V路对应值5.9V,15V路对应15.9V
MOVLW 0003H
MOVWF RLTH
MOVLW 0020H
MOVWF RLT
MOVLW B'10000001'
MOVWF ADCON0 ;右对齐,参考电压Vdd,模拟通道0
BANKSEL TMR0
MOVLW D'242'
MOVWF TMR0
GOTO $
;*********************************************
;定时中断后开始AD转换
ADBEGIN
BTFSC INTCON,T0IF ;是否是定时器TMR0中断
BANKSEL ADCON0
BSF ADCON0,GO ;开始转换
ADWAIT
BTFSC ADCON0,GO
GOTO ADWAIT ;等待转换完成
;**********************************************
;AD转换后数据判断处理
READ
BANKSEL ADRESH ;自动设置存储地址bank
MOVF ADRESH,W ;读电压值高2位,
CLRF STATUS
MOVWF READH ;读到的高2位数据放到vrevh寄存器
BANKSEL ADRESL ;自动设置存储地址bank
MOVF ADRESL,w ;读电压低8位
CLRF STATUS
MOVWF READL
;*****************************************************
LOWPOWER
MOVF SOU,W
SUBWF READL,W
BTFSS STATUS,C;没有借位,跳过
GOTO JUMP1
MOVF SOUH,W
CONTIUE1
SUBWF READH,W
BTFSS STATUS,C ;没有借位,跳过
GOTO ALARM0
OVERPOWER
MOVF RLT,W
SUBWF READL,W
BTFSS STATUS,C ;没有借位,跳过
GOTO JUMP2
MOVF RLTH,W
CONTIUE2
SUBWF READH,W
BTFSS STATUS,C ;;没有借位,跳过
GOTO NORMAL
GOTO ALARM1
;*****************************************
;时间到,准备选择通道和赋值
LOOP
DECFSZ 24H,F
GOTO SKIP
BANKSEL ADCON0
MOVLW B'10000001'
MOVWF ADCON0 ;右对齐,参考电压Vdd,模拟通道0
MOVLW D'2'
MOVWF 24H
GOON
BCF INTCON,T0IF;恢复定时器继续判断
BANKSEL INTCON
BSF INTCON,7
BANKSEL TMR0
MOVLW D'242'
ADDWF TMR0,F
GOTO $
;***************************************************
;子程序
SKIP
BANKSEL ADCON0
MOVLW B'10000101'
MOVWF ADCON0 ;右对齐,参考电压Vdd,模拟通道0
GOTO GOON
JUMP1
INCFSZ SOUH,W
GOTO CONTIUE1
JUMP2
INCFSZ RLTH,W
GOTO CONTIUE2
NORMAL
BANKSEL GPIO
BTFSC 22H,0 ;为0跳过
GOTO BACK
BSF GPIO,2 ;绿灯亮
BCF GPIO,4 ;红灯灭
BACK
BCF 22H,0
GOTO LOOP
ALARM0
BSF 22H,0
BANKSEL GPIO
BCF GPIO,2 ;绿灯灭
BSF GPIO,4 ;红灯亮
GOTO LOOP
ALARM1
DECFSZ 25H,F ;为0则跳
GOTO LOOP
BANKSEL GPIO
BSF GPIO,5 ;关机
BCF GPIO,2 ;红灯亮
BSF GPIO,4 ;绿灯灭
GOTO $
END