谁能帮我解释一下这段程序?最好是逐条的。

2024年12月02日 12:50
有2个网友回答
网友(1):

P2.0~P2.2为通道选择线,P2.6为IC选择线;P1.0为转换结束信号线;P0.0~P0.8为数据线;P2口被配置为第二功能,即地址线的高8位(低8位忽略),所以通道选择线的地址范围为C0FFH~C7FFH,采集的数据存放在30H开始的外部ram中。
详细解释:
ORG 0030H; 定位程序在ROM中的开始存储地址为30H
MOV R1, #30H; R1=30H
MOV R2, #8H; R2=8

MOV TL0, #0H; 定时器0的低8位为0
MOV TH0, #0B8H; 定时器0的高8位为B8H
MOV TMOD, #1H; 定时器0的工作方式为1,功能为定时器方式, 软件控制
CLR ET0; 禁止定时器0的中断
SETB TR0; 启动定时器0

MOV SCON, #40H; 设定串口为工作方式1,不允许接受
MOV DPTR, #0C0FF; 设置DPTR为C0FFH——ADC0809的通道选择地址
LOOP:
MOV A, R2; A=R2=8H
SUBB A, R1; A=A-R1
JNZ LOOP2; A!=0,则跳转到LOOP2处执行
MOV R1,#0H; R1=0;
MOV DPTR, #0COFF; DPTR=C0FF;
MOV R1, #OH;
MOV DPTR, #0C0FF;
LOOP1:
JNB TFO, LOOP1; 如果TF0!=1,则等待(循环执行本指令)
CLR TF0; TF0=0
MOV TL0, #0H; 定时器0的低8位为0
MOV TH0, #0B8H; 定时器0的高8位为B8H

LOOP2:
MOVX @DPTR, A; (DPTR)=A;实际是一条空操作,目的只是为了选择转 换器AD0809的通道0并开始经行AD转换

LOOP3:
JB P1.0,LOOP3; 判断P1.0是否为高;实际是判断AD转换是否开始(开始转换则EOC输出高电平)
LOOP4:
JNB P1.0,LOOP4; 判断P1.0是否为低;实际是判断AD转化是否结束(转换结束,则EOC输出为低电平)

MOVX A, @DOTR; A=(DPTR);读取转换后的数据
MOV @R1,A; (R1)=A;将转换后的数据存入到R1指示的地址中
INC DPH; DPH++;即选择下一个转换通道
INC R1; R1++;
LJMP LOOP; 调到LOOP开始执行程序
END

30H-8H=28H=40;所以一共转换40次,每个ADC0809有8个通道,所以我估计在每个通道前还有5个选择开关——DPH最后要加40,也就是P2.3~P2.5应该是5选1的地址线。

网友(2):

楼上解释很详细