问题描述:用proteus仿真时,不管两个变阻器怎么调节,始终是两个红灯亮。求大神帮忙解答。
硬件描述:我用的是AT89C51,ADC0808,四个LED灯,两个滑动变阻器代替模拟两个传感器。ADC0808接口:IN0接滑动变阻器RVI,IN1接滑动变阻器RV2,ADDA、B、C分别接P2.0、P2.1、P2.2,ALE和START接P0.6,CLOCK接单片机ALE经过四分频,EOC接P0.2,OE接P0.0,OUT1~OUT8接P3端口。P1.0和P1.2接红灯,P1.1和P1.3接绿灯。硬件图如下:
实现的功能:不停地将两个滑动变阻器RV1和RV2的模拟电压信号通过ADC0808转换成数字信号输出到单片机P3端口,当RV1的输出电压超过2.5V时,P1.0红灯亮,否则P1.1绿灯亮;当RV2的输出电压超过2.5V时,P1.2红灯亮,否则P1.3绿灯亮。
汇编程序:
ORG 0000H //开始
CHONG: CLR P0.0 //OE置0
MOV P2,#0 //选择IN0端口
CLR P0.6 //启动A/D转换
SETB P0.6
CLR P0.6
JNB P0.2,$ //等待转换结束
SETB P0.0 //转换结束则将OE置1,允许输出
MOV A,P3 //将ADC0808的输出放到A
SUBB A,#80H //将其减去2.5V
ANL A,#80H //判断余数是正数还是负数
JNZ YWZC //若为负数则模拟电压小于2.5V,转变阻器1正常显示程序;否则顺序执行变阻器1不正常显示程序
CLR P1.0 //红灯1亮
SETB P1.1 //绿灯1灭
SJMP COCGQ //转RV2判断
YWZC: CLR P1.1 //红灯1灭
SETB P1.0 //绿灯1亮
COCGQ: CLR P0.0 //OE置0,以下程序判断RV2
MOV P2,#01 //选择IN1端口
SETB P0.6 //启动A/D转换
CLR P0.6
JNB P0.2,$ //等待转换结束
SETB P0.0 //转换结束则将OE置1,允许输出
MOV A,P3 //将ADC0808的输出放到A
SUBB A,#80H //将其减去2.5V
ANL A,#80H //判断余数是正数还是负数
JNZ COZC //若为负数则模拟电压小于2.5V,转变阻器2正常显示程序;否则顺序执行变阻器2不正常显示程序
CLR P1.2 //红灯2亮
SETB P1.3 //绿灯2灭
SJMP COBZC //转移
COZC: CLR P1.3 //红灯2灭
SETB P1.2 //绿灯2亮
COBZC: SJMP CHONG //转第一步,无限循环
|