ad轉(zhuǎn)換(匯編加c)
一下是匯編程序
;此程序使用匯編調(diào)用c語言(由于ad轉(zhuǎn)換出來的數(shù)據(jù)用匯編計算非常麻煩)
;在proteus中,數(shù)碼管顯示從0-5的電壓值,保留小數(shù)點后2位
EXTRN code(cAlu) ;聲明外部函數(shù)
LED_0 EQU 36H ;存放三個數(shù)碼管的段碼
LED_1 EQU 37H
LED_2 EQU 38H
ADC EQU 35H ;存放轉(zhuǎn)換后的數(shù)據(jù)
ST BIT P3.2
OE BIT P3.0
EOC BIT P3.1
ORG 00H
START: MOV LED_0,#00H
MOV LED_1,#00H
MOV LED_2,#00H
MOV DPTR,#TABLE ;送段碼表首地址
SETB P3.4
SETB P3.5
CLR P3.6 ;選擇ADC0808的通道3
WAIT: CLR ST
SETB ST
CLR ST ;啟動轉(zhuǎn)換
JNB EOC,$ ;等待轉(zhuǎn)換結(jié)束
SETB OE ;允許輸出
MOV ADC,P1 ;暫存轉(zhuǎn)換結(jié)果
CLR OE ;關(guān)閉輸出
lcall delay
lcall cAlu ;跳轉(zhuǎn)到c語言中
lcall DISP ;顯示AD轉(zhuǎn)換結(jié)果
SJMP WAIT
DISP: mov dptr,#table
MOV A,LED_0 ;數(shù)碼顯示子程序
MOVC A,@A+DPTR
CLR P2.3
MOV P0,A
LCALL DELAY
SETB P2.3
mov dptr,#table
MOV A,LED_1
MOVC A,@A+DPTR
CLR P2.2
MOV P0,A
LCALL DELAY
SETB P2.2
mov dptr,#table ;最高位,顯示的時候加上小數(shù)點
MOV A,LED_2
MOVC A,@A+DPTR
setb acc.7
CLR P2.1
MOV P0,A
LCALL DELAY
SETB P2.1
RET
delay: mov r4,#5 ;延時函數(shù)(延時大概5*255*2=25ms)
l1: mov r5,#0ffh
l2: djnz r5,$
djnz r4,l1
ret
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END
//下面是c51語言片段,由于不能使用long行,int型還是不夠,因此真實的只能保留一位(最后兩位相同)
#pragma code small
#include
#include //定義絕對地址
#define NCIRCLE DBYTE[0x35]
#define NCIRCLE1 DBYTE[0x38]
#define NCIRCLE2 DBYTE[0x37]
#define NCIRCLE3 DBYTE[0x36]
void cAlu()
{ //計算出電壓的0-5v真實值
int data temp;
temp= NCIRCLE*50/256 ;
NCIRCLE1=temp/10;
NCIRCLE2=temp%10;
NCIRCLE3=temp%10;
}
評論