完整程序下载:
PIC12F675两通道的AD转换的汇编程序.zip
(1.81 KB, 下载次数: 50)
- ;程序功能:上电开机:PIN5为高电平,绿灯亮;PIN2,PIN3为低电平,红灯灭;
- ; 轮流检测PIN6,PIN7脚电平,欠压3.9V,10V,红灯亮,绿灯灭,过压5.9V,15.9V
- ; 红灯亮,绿灯灭,alram为TTL高电平,过压锁死
- LIST P=12F675
- INCLUDE <P12F675.INC>
- __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
复制代码
|