谁能帮我解释一下这个单片机程序!急要!!!谢谢!!!

2024-11-10 00:44:46
推荐回答(4个)
回答1:

;由于没有电路,只能猜一下,大概是个智能传感器,通过MAX1240模拟量入口测量某个数据,转换成数字量(2字节)后通过单片机串口以9600波特发送出去。
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:CLR C
MOV SP;#60H;设置堆栈
MOV SCON,#50H;串口方式1,允许接收
MOV PCON,#80H;SMOD=1
MOV TCON,#0
MOV TMOD,#26H;T1定时方式2,T0计数方式2
MOV TL1,#0FAH;波特率9600
MOV TH1,#0FAH
SETB TR1
SETB EA
CLR TI
MAX1240:MOV A,#00H;MAX1240是12位串行接口ADC,8脚。
MOV R7,#08H;8位
CLR P1.0;应该是接了MAX1240的/CS
CLR P1.1;应该是接了MAX1240的SCLK
NOP
JNB P1.2,$;应该是接了MAX1240的DOUT,此时等待接收数据
SETB P1.0
MSB: CLR P1.0;以下程序段MSB开始接收第一个字节保存在R3
NOP
SETB P1.0
MOV C,P1.2
MOV P1.3,C
RLC A
DJNZ R7,MSB
MOV R3,A
MOV R7,#08H
MOV A,#00H
LSB: CLR P1.0;以下程序段LSB开始接收第二个字节保存在R2
NOP
SETB P1.0
MOV C,P1.2
RLC A
DJNZ R7,LSB
MOV R2,A
NOP
SETB P1.1
MOV 41H,R3;收到的测量模拟量转换值转存到41H,40H
MOV 40H,R2
LOOP: MOV A,41H;两字节数据41H40H通过串口发送出去
MOV SBUF,A
ACALL WAIT
ACALL Delay
MOV A,40H;这句你没有,似乎是少写了
MOV SBUF,A
ACALL WAIT
AJMP MAX1240
WAIT: JNB T1,$
CLR T1
RET

回答2:

;这个程序涉及到串口通信过程:应该是从外部采集信息,再由单片机经串口发送至
;显示电路显示吧。由于看不到你的仿真电路图,故不能清楚知道单片机接的外围电
;路,所以只能帮你单单地解释下程序了,不过相信该说的都说得很清楚了,希望给
;你带来帮助!

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:CLR C;清零位累加器C
MOV SP;#60H;初始化堆栈,指示栈底为61H
MOV SCON,#50H;设置串口工作在方式一,且允许接收
MOV PCON,#80H;置PCON的SMOD位为1,波特率增加一倍
MOV TCON,#0;配置定时器控制寄存器TCON
MOV TMOD,#26H;设置定时/计数器1工作为模式2,即自动重装载的8位计数器
MOV TL1,#0FAH;预设定时/计数器1的计数寄存器低8位为FAH
MOV TH1,#0FAH;预设定时/计数器1的计数寄存器高8位为FAH(这两步与T1溢出率有关,
;而串口通信的波特率=(2^SMOD/32)*T1溢出率)

SETB TR1;启动定时/计数器1
SETB EA;开总中断
CLR TI;清零串行口发送中断请求标志位
MAX1240:MOV A,#00H
MOV R7,#08H
CLR P1.0
CLR P1.1
NOP
JNB P1.2,$;P1.2口为0则一直等待
SETB P1.0
MSB: CLR P1.0
NOP
SETB P1.0
MOV C,P1.2
MOV P1.3,C
RLC A;累加器连进位标置位循环左移
DJNZ R7,MSB;循环执行MSB到这个位置8次,最终将8位二进制数从P1.2口送至A累加器
MOV R3,A;将A累加器中的数送至寄存器R3
MOV R7,#08H
MOV A,#00H
LSB: CLR P1.0
NOP
SETB P1.0
MOV C,P1.2
RLC A;累加器连进位标置位循环左移
DJNZ R7,LSB;循环执行LSB到这个位置8次,最终将8位二进制数从P1.2口送至A累加器
MOV R2,A;将A累加器中的数送至寄存器R2
NOP
SETB P1.1
MOV 41H,R3;将寄存器R3中的数送40H单元
MOV 40H,R2;将寄存器R2中的数送40H单元
LOOP: MOV A,41H
MOV SBUF,A;将A寄存器中的内容送串行收发缓冲器SBUF
ACALL WAIT;调用等待函数,其实WAIT函数也就是等待串口发送完成
;并将串行口发送中断请求标志位清零
ACALL Delay;DELAY是延时函数吧,没看到啊,如果有必要还是要加上
;这里似乎少了一句MOV A,40H吧???
MOV SBUF,A
ACALL WAIT
AJMP MAX1240
WAIT: JNB T1,$;等待串口发送完成
CLR T1;清零串行口发送中断请求标志位
RET;函数返回

回答3:

难道还有人用汇编?用C吧。学校学的东西,哎……

回答4:

中断