MCS51汇编语言编程
AD转换实验时,将单片机的P1口经74LS240与发光二极管相连,用来输出转换结果(实验机内部P0口已经经74LS273与ADC0809相连)。并将ADC0809的EOC...
AD转换实验时,将单片机的P1口经74LS240与发光二极管相连,用来输出转换结果(实验机内部P0口已经经74LS273与ADC0809相连)。并将ADC0809的EOC(内部已经反向器)与单片机的INT0(P3.2)相连。单片机将ADC0809作为外部RAM来读取。实验时74LS273的CS/接8300H,ADC0809的CS/接8100H。W1接ADC0809的IN0。要求当二极管上的电压高于2.5时为红色灯亮,=2.5时橙色灯亮,<2.5时绿色灯亮,下面是我编的程序,不知道为什么运行时调节输入电压,灯不变色,接线保证没什么问题,求教程序哪里出错了,希望能指导我。
ADPORT EQU 8100H ;ADC0809的地址
ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0030H
START: MOV SP,#20H ;初始化
MOV R7,#00H
SETB EX0 ;INT0允许
SETB EA
AD:
MOV A,#0
MOV DPTR,#ADPORT;通道数0
MOVX @DPTR,A ;启动AD
CJNE R7,#00H,$ ;等待AD转换结束
MOVX A,@DPTR
MOV DPTR,#8300H
MOVX @DPTR,A ;数据输出
MOV R7,#0FFH ;清读数标志
SJMP AD
INT_0: MOV DPTR, #ADPORT
MOVX A, @DPTR
CJNE A, #80H,N1
MOV A,#00H
SJMP OUT
N1 :JNC N2
MOV A, #0F0H
SJMP OUT
N2 :MOV A,#0FH
OUT: MOV DPTR, #8300H
MOVX @DPTR, A
MOV R7,#00H
CLR c ;外部中断0----读AD数据
RET I
END
WAIT: MOV C,P3.2
JC WAIT
MOV R7,#00H ;AD转换结束置读数标志
RETI
END 展开
ADPORT EQU 8100H ;ADC0809的地址
ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0030H
START: MOV SP,#20H ;初始化
MOV R7,#00H
SETB EX0 ;INT0允许
SETB EA
AD:
MOV A,#0
MOV DPTR,#ADPORT;通道数0
MOVX @DPTR,A ;启动AD
CJNE R7,#00H,$ ;等待AD转换结束
MOVX A,@DPTR
MOV DPTR,#8300H
MOVX @DPTR,A ;数据输出
MOV R7,#0FFH ;清读数标志
SJMP AD
INT_0: MOV DPTR, #ADPORT
MOVX A, @DPTR
CJNE A, #80H,N1
MOV A,#00H
SJMP OUT
N1 :JNC N2
MOV A, #0F0H
SJMP OUT
N2 :MOV A,#0FH
OUT: MOV DPTR, #8300H
MOVX @DPTR, A
MOV R7,#00H
CLR c ;外部中断0----读AD数据
RET I
END
WAIT: MOV C,P3.2
JC WAIT
MOV R7,#00H ;AD转换结束置读数标志
RETI
END 展开
1个回答
展开全部
如果电路没问题的话,我觉得中断有点小问题,主要是因为你的中断程序中没有保存现场,所以从中断返回的时候,你又读,但是读的是8300的地方,所以输出有问题。我的HI在线,有问题再问我
ADPORT EQU 8100H ;ADC0809的地址
ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0030H
START: MOV SP,#20H ;初始化
MOV R7,#00H
SETB EX0 ;INT0允许
SETB EA
AD:
MOV A,#0
MOV DPTR,#ADPORT;通道数0
MOVX @DPTR,A ;启动AD
CJNE R7,#00H,$ ;等待AD转换结束
;MOVX A,@DPTR ;注意这里,这里是从中断返回的地方,
;这里的DPTRA已经是8300H
;MOV DPTR,#8300H ;由于你的中断中没有保存现场,
;所以中断到这里的时候会把寄存器的值改变
;MOVX @DPTR,A ;数据输出 ;一直到这里可以去掉
MOV R7,#0FFH ;清读数标志
SJMP AD
INT_0: MOV DPTR, #ADPORT
MOVX A, @DPTR
CJNE A, #80H,N1
MOV A,#00H
SJMP OUT
N1 :JNC N2
MOV A, #0F0H
SJMP OUT
N2 :MOV A,#0FH
OUT: MOV DPTR, #8300H ;你的中断程序中已经输出了
MOVX @DPTR, A
MOV R7,#00H
CLR c ;外部中断0----读AD数据
RET I
END
WAIT: MOV C,P3.2 ;运行不到这边
JC WAIT
MOV R7,#00H ;AD转换结束置读数标志
RETI
END
ADPORT EQU 8100H ;ADC0809的地址
ORG 0000H
LJMP START
ORG 0003H
LJMP INT_0
ORG 0030H
START: MOV SP,#20H ;初始化
MOV R7,#00H
SETB EX0 ;INT0允许
SETB EA
AD:
MOV A,#0
MOV DPTR,#ADPORT;通道数0
MOVX @DPTR,A ;启动AD
CJNE R7,#00H,$ ;等待AD转换结束
;MOVX A,@DPTR ;注意这里,这里是从中断返回的地方,
;这里的DPTRA已经是8300H
;MOV DPTR,#8300H ;由于你的中断中没有保存现场,
;所以中断到这里的时候会把寄存器的值改变
;MOVX @DPTR,A ;数据输出 ;一直到这里可以去掉
MOV R7,#0FFH ;清读数标志
SJMP AD
INT_0: MOV DPTR, #ADPORT
MOVX A, @DPTR
CJNE A, #80H,N1
MOV A,#00H
SJMP OUT
N1 :JNC N2
MOV A, #0F0H
SJMP OUT
N2 :MOV A,#0FH
OUT: MOV DPTR, #8300H ;你的中断程序中已经输出了
MOVX @DPTR, A
MOV R7,#00H
CLR c ;外部中断0----读AD数据
RET I
END
WAIT: MOV C,P3.2 ;运行不到这边
JC WAIT
MOV R7,#00H ;AD转换结束置读数标志
RETI
END
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询