一下是汇编程序
;此程序运用汇编调用c言语(因为ad转化出来的数据用汇编核算十分费事)
;在proteus中,数码管显现从0-5的电压值,保存小数点后2位
EXTRN code(cAlu) ;声明外部函数
LED_0 EQU 36H ;寄存三个数码管的段码
LED_1 EQU 37H
LED_2 EQU 38H
ADC EQU 35H ;寄存转化后的数据
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 ;发动转化
JNB EOC,$ ;等候转化完毕
SETB OE ;答应输出
MOV ADC,P1 ;暂存转化成果
CLR OE ;封闭输出
lcall delay
lcall cAlu ;跳转到c言语中
lcall DISP ;显现AD转化成果
SJMP WAIT
DISP: mov dptr,#table
MOV A,LED_0 ;数码显现子程序
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 ;最高位,显现的时分加上小数点
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 ;延时函数(延时大约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;
}