問題描述:用proteus仿真時,不管兩個變阻器怎么調(diào)節(jié),始終是兩個紅燈亮。求大神幫忙解答。
硬件描述:我用的是AT89C51,ADC0808,四個LED燈,兩個滑動變阻器代替模擬兩個傳感器。ADC0808接口:IN0接滑動變阻器RVI,IN1接滑動變阻器RV2,ADDA、B、C分別接P2.0、P2.1、P2.2,ALE和START接P0.6,CLOCK接單片機ALE經(jīng)過四分頻,EOC接P0.2,OE接P0.0,OUT1~OUT8接P3端口。P1.0和P1.2接紅燈,P1.1和P1.3接綠燈。硬件圖如下:
實現(xiàn)的功能:不停地將兩個滑動變阻器RV1和RV2的模擬電壓信號通過ADC0808轉(zhuǎn)換成數(shù)字信號輸出到單片機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轉(zhuǎn)換
SETB P0.6
CLR P0.6
JNB P0.2,$ //等待轉(zhuǎn)換結(jié)束
SETB P0.0 //轉(zhuǎn)換結(jié)束則將OE置1,允許輸出
MOV A,P3 //將ADC0808的輸出放到A
SUBB A,#80H //將其減去2.5V
ANL A,#80H //判斷余數(shù)是正數(shù)還是負數(shù)
JNZ YWZC //若為負數(shù)則模擬電壓小于2.5V,轉(zhuǎn)變阻器1正常顯示程序;否則順序執(zhí)行變阻器1不正常顯示程序
CLR P1.0 //紅燈1亮
SETB P1.1 //綠燈1滅
SJMP COCGQ //轉(zhuǎn)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轉(zhuǎn)換
CLR P0.6
JNB P0.2,$ //等待轉(zhuǎn)換結(jié)束
SETB P0.0 //轉(zhuǎn)換結(jié)束則將OE置1,允許輸出
MOV A,P3 //將ADC0808的輸出放到A
SUBB A,#80H //將其減去2.5V
ANL A,#80H //判斷余數(shù)是正數(shù)還是負數(shù)
JNZ COZC //若為負數(shù)則模擬電壓小于2.5V,轉(zhuǎn)變阻器2正常顯示程序;否則順序執(zhí)行變阻器2不正常顯示程序
CLR P1.2 //紅燈2亮
SETB P1.3 //綠燈2滅
SJMP COBZC //轉(zhuǎn)移
COZC: CLR P1.3 //紅燈2滅
SETB P1.2 //綠燈2亮
COBZC: SJMP CHONG //轉(zhuǎn)第一步,無限循環(huán)
|