winnie 发表于 2009-3-21 16:52:45

12f675的 D/A转换问题

本人写了一段程序,要求6.7脚作为输入,3.5脚作为输出,但工作时,3.5脚始终是低电压,请问各位高手是不是软件问题,非常感谢.程序如下:
#define TMR0 01H                     
#define PCL 02H
#define STATUS 03H
#define FSR 04H
#define GPIO 05H
#define PCLATH 0AH
#define INTCON 0BH
#define ADRES 1EH
#define PIR1 0CH
#define ADCON0 1FH
#define OPTION 81H
#define PIE1 8CH
#define ADCON1 9FH
#define TRIS 85H
#DEFINE CMCON 19H
#define TEMP_WIMAGE 20H
#define WIMAGE 21H
#define TEMP_PCLATH 22H
#define TEMP_FSR 23H
#define TEMP_STATUS 24H
#define TEMP_WREG 25H
#define UPLIMT 26H
#define TWOH 27H
#define THREEH 28H
#define FOURH 29H
#define SIXH 2AH
#define EIGHTH 2BH
#define DSHI1 2CH
#define DSHI2 2DH
#define DSHI3 2EH
#define DFLAG 2FH
#define QUED30H
#define DELAYTEMP 31H
#DEFINE FLAG 32H
#define ADREH 1EH
#define ADBUF 33H
#define DELAYTEMP134H

      ORG 000H
CLRF PCLATH
GOTO INITSYS
INITSYS:

BSF STATUS, 5                     ;选择寄存器体1
MOVLW B'11000111'               ;设置选项寄存器
MOVWF OPTION                                                   
MOVLW B'00100011'
MOVWF ADCON1                      ; 设置7脚和6脚为A/D信号
movlw 03H                     ;
movwf TRIS                      ;设置6、7为输入引脚
BCF STATUS, 5                  ;选择寄存器体0
movlw 0ffH                         ;初始化输出寄存器
MOVWf GPIO               
CALL WAIT_AD                     
MOVLW B'00000000'               
MOVWF FLAG
LOOP:
CALL WAIT
BCF GPIO,2
MOVLW B'00000000'            ;选择模拟信号输入通道为第7脚      
MOVWF ADCON0
CALL WAIT
BSF ADCON0,1                  ;启动A/D
WAIT11:
BTFSC ADCON0,1
GOTO WAIT11
;BCF PIR1,6
MOVF ADREH,0H               ;取高位比较(舍去低位),比较结果控制第5脚电平,观察二极管的熄灭察看转换结果。   
suBLW 040H
BTFSS STATUS,0            
GOTO SHURU
BCF GPIO,4
CALL WAIT
CALL WAIT
GOTO OK
SHURU:
BSF GPIO,4
CALL WAIT
CALL WAIT
OK:
BSF GPIO,2
CALL WAIT
CALL WAIT
GOTO LOOP
WAIT_AD:                            ;延时子程序
BCF STATUS,5
MOVLW 0
MOVWF DELAYTEMP   
WAITAD:
DECFSZ DELAYTEMP,1
GOTO WAITAD
RETURN
WAIT:                              ;延时子程序
BCF STATUS,5
MOVLW 0
MOVWF DELAYTEMP1   
WAIT1:
CALL WAIT_AD
DECFSZ DELAYTEMP1,1
GOTO WAIT1
RETURN
END

winnie 发表于 2009-3-21 16:53:12

ANSEL 寄存器没有设置,这个寄存器是配置I/O口为模拟口还是数字口,

初始化
bcf STATUS,RP0   ;选择bank0
       clrf GPIO      ;init GPIO
       bsf STATUS,RP0   ;选择bank1
       call 0x3ff       ;读晶振校准值->W
       movwf OSCCAL   ;内部振荡器校准
       ;
       bcf STATUS,RP0   ;选择BANK0
       movlw 07h      ;
       movwf CMCON      ;关掉内部比较器
       movlw 00001101B;
       movwf ADCON0   ;AD结果左对齐,VDD参考电压,选择AN3【GP4端口】为模拟通道
       ;
       bsf STATUS,RP0   ;选择BANK1
       movlw 00011011B;
       movwf ANSEL      ;AD采用FOSC/8,GP0,GP1,GP4为模拟口,其它为数字口
       movlw 00011011B;端口方向置有效
       movwf TRISIO   ;SET GP5&GP2为输出,GP4,GP0,GP1,3路模拟输入,GP3空没用置数字输入
       ;
       bcf STATUS,RP0   ;选择BANK0
       ;端口值置无效×××××××××××
       movlw 0x24      ;主要是保证LED&继电器无效
       movwf GPIO       ;端口初值全部置无效,安全
页: [1]
查看完整版本: 12f675的 D/A转换问题