有关PIC16F876单片机A/D实验问题请教!!!
[复制链接]
大家好,我是单片机初学者,刚学汇编程序,用PIC16F876A-A/SP做了块实验板,调A/D模块部分快一个星期了,没调试成功,想借助宝地请各位老师指点下。
下面是相关的实验板原理图
此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。该程序通过单片机的RA5模拟通道送入一直流电压,当送入的直流电压大于2.5V时,继电器1(RCO口输出高电平),当送入的直流电源低于2.5V,继电器1(RC0口输出低电平)。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结果用间接寻址的方式存取。
INCLUDE "P16F876A.INC"
TIMES EQU 0X20 DEY EQU TIMES+1 ACCALO EQU TIMES+2 ;存放加数或减数低8位 ACCAHI EQU TIMES+3 ;存放加数或减数高8位 ACCBLO EQU TIMES+4 ;存放被加数或被减数低8位 ACCBHI EQU TIMES+5 ;存放被加数或被减数高8位 FLAG EQU TIMES+6 DEYH EQU TIMES+7 DEYL EQU TIMES+8 BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出) ORG 0000H ;直接执行主程序 NOP GOTO MAIN ;无条件跳转到主程序 ORG 0004H NOP GOTO INTSERVE ;转向中断服务子程序 RETFIE ;中断返回 ORG 0100H
;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB*** D_sub CALL NEG_A ;求ACCA的补码 ;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB*** D_ADD MOVF ACCALO,0 ;ACCB和ACCA低半字节相加 ADDWF ACCBLO BTFSC STATUS,C ;有进位否? INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHI MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加 ADDWF ACCBHI RETURN ;子程序返回 ;************** ACCA取补子程序***************** NEG_A COMF ACCALO ;ACCALO取反加1 INCF ACCALO BTFSC STATUS,Z ;低8位有进位吗? DECF ACCAHI ;有,ACCAHI减1,再取反 COMF ACCAHI ;否则ACCAHI直接取反 RETURN ;子程序返回 ;*********初始化子程序*************** INITIAL BSF STATUS,RP0 ;选1页 BCF STATUS,RP1 MOVLW 03FH ;0011 1111 MOVWF TRISA ;设置RA口为输入方式
MOVLW 81H ;1000 0001 MOVWF TRISB ;设置RB口 RB1 RB2 RB3 RB4 RB5为口输出方式 ;RB0口输入方式 RB6 RB7口为三态 MOVLW 00H MOVWF TRISC ;设置RC口为输出方式 MOVLW 80H ;1000 0000 MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6位为0, ;且把RA0 RA1 RA2 RA3 RA4 RA5设置成模拟量 ;输入口 BSF PIE1,ADIE ;允许A/D中断 BCF STATUS,RP0 ;选0页 MOVLW 34H ; MOVWF PORTB ;设置RB口输出电平为 0011 0100 ,关闭LED发 ;光管,关闭输出控制继电器 MOVLW 00H MOVWF PORTC ;设置RC口输出电平为 0000 0000 ,关闭主继电 ;器 电流、电压给定输出为0 MOVLW 0A9H ;1010 1001 MOVWF ADCON0 ;选择A/D转换通道RA5,且打开A/D工作状态, ;并使A/D转换时钟位32tosc CLRF INTCON ;总中断禁止 BSF INTCON,PEIE ;外围中断允许 把寄存器INTCON中PEIE位置1 CLRF PIR1 ;清除A/D转换标志位 CLRF FLAG RETURN
;*********软件延时子程序**************** DELAY MOVLW 0XFF MOVWF DEYH AGAIN1 MOVLW 0XFF MOVWF DEYL AGAIN2 NOP DECFSZ DEYL GOTO AGAIN2 DECFSZ DEYH GOTO AGAIN1 RETURN
;*************** A/D中断服务子程序***************** INTSERVE BCF PIR1,ADIF ;清除A/D转换标志 MOVF ADRESH,W MOVWF INDF ;读取并存储A/D转换结果的高2位 INCF FSR BANKSEL ADRESL MOVF ADRESL,W MOVWF INDF INCF FSR ;读取并存储A/D转换结果的低8位 BCF STATUS,RP0 DECF TIMES,1 ;A/D转换次数减1 MOVLW 0X02 MOVWF DEY LOOP13 DECFSZ DEY,1 GOTO LOOP13 ;给予一定的延时,保证两次A/D转换期间 ;2tAD的间隔时间和电容的采样时间 BSF ADCON0,2 ;启动下一次A/D转换 RETFIE ;中断返回 ;********** 主电源开关继电器控制************* K1
BSF PORTC,0 RETURN K2 BCF PORTC,0 RETURN
;**************************************** MAIN NOP CALL INITIAL ;初始化 LOOP BCF STATUS,RP0 ;选1页 MOVLW BEGFSR MOVWF FSR ;给出间接寻址时FSR的初值 MOVLW 0X0A MOVWF TIMES ;每一轮A/D连续采样10次 BSF INTCON,GIE ;总中断打开,可以进行A/D转换中断 MOVLW 19H MOVWF 31H DELAY15US DECFSZ 31H GOTO DELAY15US BSF ADCON0,2 ;启动A/D转换 LOOP1 MOVF TIMES,W BTFSS STATUS,Z GOTO LOOP1 ;等待A/D转换中断 BCF INTCON,GIE ;A/D转换次数到10次,关闭中断 NOP CLRF ACCBHI CLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备 MOVLW 0X0A MOVWF TIMES MOVLW BEGFSR MOVWF FSR LOOP15 MOVF INDF,W MOVWF ACCAHI INCF FSR MOVF INDF,W MOVWF ACCALO INCF FSR CALL D_ADD DECFSZ TIMES GOTO LOOP15 NOP ;计算得到10次A/D转换的和
BANKSEL ACCAHI MOVLW 0X14 MOVWF ACCAHI CLRF ACCALO CALL D_sub ;通过双精度减判断模拟量是否达到报警限 ;度(1400H=200H*0AH,200H与2.5V对应) BTFSS ACCBHI,7 CALL K1 ;若ACCBHI的最高位为1,则证明减法结 ;果为负,即直流电压值超过2.5V,RC0置1 NOP BTFSC ACCBHI,7 CALL K2 ;若ACCBHI的最高位为1,则证明减法结 ;果为正负,即直流电压值低于超过2.5V, ;RC0清零 CALL DELAY ;软件延时,使电压检测不要过于频繁 GOTO LOOP ;重复检测输入的直流电压值
END
cdq1.rar
(2.03 KB, 下载次数: 4)
kk2.rar
(18.16 KB, 下载次数: 4)
这段程序在MPLAB IDE中软仿是可以运行的,用PICKIT3硬仿一直停留在A/D打开后,不能检测到A/D完成中断标记位,一直循环在
LOOP1 MOVF TIMES,W BTFSS STATUS,Z GOTO LOOP1 ;等待A/D转换中断
跳不出去,请大家指点下,在线期待大家的回复!我的QQ:179755240,和大家交个朋友
|