是不是ADC坏掉了,ADC很容易坏的,要不就要看看时序有没有高错,这是我用汇编写的,成功了ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV 70H,#00H ;显示百位清零
MOV 71H,#00H ;十位清零
MOV 72H,#00H ;个位清零
MOV 73H,#00H ;采集数据缓存清零
SATAT1:
MOV P1,#0FFH ;数据口初始化,数据输入口
START:MOV P3,#13H ;控制口初始化,并选择0通道
SETB P3.2 ;发出地址锁存脉冲和启动转换脉冲
NOP
CLR P3.2
L0 :JNB P3.4,L0 ;判断转换结束了没有
SETB P3.3 ;打开0809输出缓冲器
MOV A,P1 ;接收转换的数据
CLR P3.3 ;关闭0809输出缓冲器
LCALL DSP ;对接收的数据进行处理
LCALL DSP1
MOV R2,#110
L00: LCALL DISPLAY ;显示转换的数据
DJNZ R2,L00
LJMP SATAT1
DSP: MOV B,#196
MUL AB
MOV R7,B
MOV R6,A
MOV R3,#00H
MOV R2,#00H
MOV R5,#27H
MOV R4,#10H
LCALL DIV2BY
MOV 73H,R6 ;千位电压值
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV R5,#03H
MOV R4,#0E8H
MOV R3,#00H
MOV R2,#00H
LCALL DIV2BY
MOV 72H,R6 ;百位电压值
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV R5,#00H
MOV R4,#64H
MOV R3,#00H
MOV R2,#00H
LCALL DIV2BY
MOV 71H,R6 ;十位电压值
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV R5,#00H
MOV R4,#0AH
MOV R3,#00H
MOV R2,#00H
LCALL DIV2BY
MOV 70H,R6 ;个位电压值
RET
DIV2BY: MOV 20H,#16 ;双字节除法
DIV2B:CLR C ;商存在R7R6,余数存R3R2
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R2
SUBB A,R4
MOV R0,A
MOV A,R3
SUBB A,R5
JC NEXT
CLR C
MOV R3,A
MOV A,R0
MOV R2,A
MOV A,R6
ADD A,#01H
MOV R6,A
MOV A,R7
ADDC A,#00H
MOV R7,A
NEXT:DJNZ 20H,DIV2B
RET
DSP1: MOV R0,#70H
MOV A,@R0
CLR C
SUBB A,#05H
JC EXIT1 ;为1则小于5,退出
INC R0 ;指向十位
MOV A,@R0
INC A ;十位加1
MOV @R0,A
CJNE A,#10,EXIT1 ;十位加1等于10?等于10,是则十位清零
CLR A
MOV @R0,A
INC R0 ;指向百位
MOV A,@R0
INC A ;百位加1
MOV @R0,A
CJNE A,#10,EXIT1 ;百位加1等于10?等于10,是则百位清零
CLR A
MOV @R0,A
INC R0 ;指向千位
MOV A,@R0
INC A ;千位加1
MOV @R0,A
CJNE A,#06,EXIT1 ;千位等于6,是则清零
CLR A
MOV @R0,A
EXIT1:RET
DISPLAY:
MOV R1,#73H ;指向数据显示缓冲区
MOV R5,#0FEH ;显示位选择
PLAY: MOV A,#0FFH
MOV P2,A
MOV A,R5
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
CJNE R1,#73H,POW
ORL A,#80H
POW:MOV P0,A
LCALL DL1MS
DEC R1
MOV A,R5
JNB ACC.2,ENDOUT
RL A
MOV R5,A
AJMP PLAY
ENDOUT:RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DL1MS:MOV R6,#20
DL1:MOV R7,#50
DL2:DJNZ R7,DL2
DJNZ R6,DL1
RET
END |