本帖最后由 lib6303c 于 2009-12-20 19:02 编辑
现使用此单片机已有的A/D转换功能来简单电压表功能功能,电压信号直接接入A/D接口:
我发现的问题:0电压和5V电压下能够正常转换,中间的电压值都不能准确的被转换,误差太大!
试问有更好的方法来解决吗?
我测试的程序如下:
LED_MCU_START BIT P1.7
P1M0 EQU 0091H
P1M1 EQU 0092H
ADC_CONTR EQU 00C5H
ADC_DATA EQU 00C6H
ADC_LOW2 EQU 00BEH
RESULT EQU 0030H
MSCNT EQU 0039H
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP SEC_INT
ORG 0100H
MAIN: MOV SP,#4FH
CLR LED_MCU_START ;MCU 工作指示灯
ACALL INIT_T0
ACALL INIT_UART
ACALL INIT_A_D
SJMP $
SEC_INT:
PUSH PSW
SETB PSW.3
MOV TH0,#0BH
MOV TL0,#0DCH
DEC MSCNT
MOV R1,MSCNT
CJNE R1,#0,EXIT
MOV MSCNT,#2
ACALL CONVERT
;ACALL SETDATA
ACALL DISPLAY
EXIT: POP PSW
RETI
INIT_T0:
ORL TMOD,#01H
MOV TH0,#0BH
MOV TL0,#0DCH
SETB EA
SETB ET0
SETB TR0
MOV MSCNT,#2
RET
INIT_UART:
ORL TMOD,#20H
MOV TL1,#0FDH
MOV TH1,#0FDH
SETB TCON.6
MOV SCON,#0D0H
MOV PCON,#00H
RET
INIT_A_D:
MOV P1M0,#00000001B ;设置P1.0为输入高阻
MOV P1M1,#00000000B
ORL ADC_CONTR,#00000000B ;选择A/D输入通道 P1.0口
ORL ADC_CONTR,#01000000B ;选择模数转换速度
ORL ADC_CONTR,#10000000B ;打开A/D转换器电源
ACALL DELAY1MS
RET
CONVERT:
MOV ADC_DATA,#0
ORL ADC_CONTR,#00001000B ;启动A/D转换器
;CLR P3.2
;CLR P3.3
ACALL DELAY1MS
WAIT:MOV A,#00010000B
ANL A,ADC_CONTR
JZ WAIT
ANL ADC_CONTR,#11101111B
MOV RESULT,ADC_DATA
RET
DISPLAY:
CLR TI
MOV SBUF,RESULT
WAIT1:JNB TI,WAIT1
CLR TI
RET
DELAY1MS:
MOV R7,#250
MOV R6,#250
DJNZ R7,$
DJNZ R6,$
RET
END |