ad转换(汇编加c)
一下是汇编程序
;此程序使用汇编调用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;
}
ad转换汇编加 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)