;********************************************************
;########################################################
OE BIT P3.0 ;ADC0808的OE端
EOC BIT P3.1 ;ADC0808的EOC端
ST BIT P3.2 ;ADC0808的START和ALE端
ADD0 BIT P3.4 ;ADC0808的模擬輸入選擇端
ADD1 BIT P3.5
ADD2 BIT P3.6
LED_0 DATA 30H ;顯示緩沖區
LED_1 DATA 31H
LED_2 DATA 32H
LED_3 DATA 33H
ADC DATA 34H ;存放轉換後的數據
;//////主程序開始////////////////////////////////////////
ORG 0000H
AJMP START
ORG 0030H
;------初始化-----------------------------------
START: MOV SP,#60H ;設置堆棧
MOV LED_0,#00H ;清空顯示緩沖區
MOV LED_1,#00H
MOV LED_2,#00H
MOV LED_3,#00H
MOV DPTR,#TABLE ;送字型碼表首地址
SETB ADD0
SETB ADD1
CLR ADD2 ;選擇ADC0808的通道3
;------ADC0808轉換------------------------------
WAIT: CLR ST
SETB ST
CLR ST ;啟動轉換
JNB EOC,$ ;等待轉換結束
SETB OE ;允許輸出
MOV ADC,P1 ;暫存轉換結果
CLR OE ;關閉輸出
;------數據處理,已備顯示------------------------
MOV A,ADC ;將AD轉換結果轉換成BCD碼
MOV B,#0C3H ;乘以19.5MV
MUL AB
MOV R7,A
MOV R6,B
HB2: CLR A ;BCD碼初始化
CLR C
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙字節十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的壹位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當於乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3
MOV A,R5
SWAP A
ANL A,#0FH
MOV LED_0,A
MOV A,R4
ANL A,#0FH
MOV LED_1,A
MOV A,R4
SWAP A
ANL A,#0FH
MOV LED_2,A
MOV A,R3
ANL A,#0FH
MOV LED_3,A
LCALL DISP ;調用顯示子程序
AJMP WAIT
;//////數碼管顯示子程序///////////////////////////////////////////////
DISP: MOV A,LED_0 ;數碼顯示子程序
MOVC A,@A+DPTR
CLR P2.3
MOV P0,A
LCALL DELAY
SETB P2.3
MOV A,LED_1
MOVC A,@A+DPTR
CLR P2.2
MOV P0,A
LCALL DELAY
SETB P2.2
MOV A,LED_2
MOVC A,@A+DPTR
CLR P2.1
MOV P0,A
LCALL DELAY
SETB P2.1
MOV A,LED_3
MOVC A,@A+DPTR
CLR P2.0
MOV P0,A
SETB P0.7
LCALL DELAY
SETB P2.0
RET
;//////延時子程序////////////////////////////////////
DELAY: MOV R6,#0AH ;延時5毫秒
D1: MOV R7,#0FAH
DJNZ R7,$
DJNZ R6,D1
RET
;//////數碼管字形碼表/////////////////////////////////
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
;/////程序結束////////////////////////////////////////
END