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

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:CLR C
MOV SP;#60H
MOV SCON,#50H
MOV PCON,#80H
MOV TCON,#0
MOV TMOD,#26H
MOV TL1,#0FAH
MOV TH1,#0FAH
SETB TR1
SETB EA
CLR TI
MAX1240:MOV A,#00H
MOV R7,#08H
CLR P1.0
CLR P1.1
NOP
JNB P1.2,$
SETB P1.0
MSB: CLR P1.0
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
NOP
SETB P1.0
MOV C,P1.2
RLC A
DJNZ R7,LSB
MOV R2,A
NOP
SETB P1.1
MOV 41H,R3
MOV 40H,R2
LOOP: MOV A,41H
MOV SBUF,A
ACALL WAIT
ACALL Delay
MOV SBUF,A
ACALL WAIT
AJMP MAX1240
WAIT: JNB T1,$
CLR T1
RET

;由于没有电路,只能猜一下,大概是个智能传感器,通过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
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-01
;这个程序涉及到串口通信过程:应该是从外部采集信息,再由单片机经串口发送至
;显示电路显示吧。由于看不到你的仿真电路图,故不能清楚知道单片机接的外围电
;路,所以只能帮你单单地解释下程序了,不过相信该说的都说得很清楚了,希望给
;你带来帮助!

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;函数返回
第2个回答  2011-06-01
难道还有人用汇编?用C吧。学校学的东西,哎……追问

我设计就得用这个!

第3个回答  2011-06-01
中断追问

能不能 说的细点 每段是控制什么的?我做的设计是有关脉搏波电路的设计

谁能帮我解释一下这个单片机程序!急要!!!谢谢!!!
;由于没有电路,只能猜一下,大概是个智能传感器,通过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...

帮解释一下这个单片机的程序
sbit key=P1^3;\/\/一个延时函数 void delay(unsigned int z){ while(z--);} \/\/按键扫描函数 void key_scan(){ if(key==0) \/\/当key按下时,key既端口P1^3 { delay(10); \/\/延时 if(key==0) \/\/在检测端口P1^3是否为低 { \/ 到这里你发现你程序有问题 \/ } } switch (...

求大神解释单片机程序。不会啊
\/\/程序写一半想起了输入端口忘了定义。。定义一下。define keyport P1 void keyscan(){\/\/这个就是传说中的按键扫描。。。uchar Tmp,i;\/\/定义两只跑龙套的。keyport = 0xf0;\/\/没有硬件。。不懂在做啥。。if (keyport != 0xf0)\/\/逻辑上看基本是把四个按键搞到了高四位。哪只键按下了就出...

那位大虾给我解释下这个单片机程序吧!!看不懂!!俺是菜鸟!!谢谢了!!!
这个程序写得有够臭的:void int0() interrupt 1 \/\/<<<从名字看是外部中断1的,从中断号上看是TIME0的 void delayms(unsigned char a) \/\/<<<最大能接收255,可是调用时有个 delayms(1000);两个延时函数且体能延多少时间都直接依赖于晶振频率,不知MCU型号和晶振时根本不能知道这些数字到底延时...

各位单片机高手,哪位帮我分析一下下面这个程序,问题出在哪儿?谢谢
回答:首先给你解释一下“<<”位移符的作用: 因为你的P1=0xfe,二进制数据就是11111110,左移一位之后为11111100,0往左移了一位,但是最低位系统自动以0补齐,而0x7f的二进制数据位01111111,所以if语句是永远进入不了的。 当然,针对此问题,C51给出了一个解决方案: 使用_crol_()函数可解决此问题...

请各位高手回答一下下面的单片机程序问题!谢谢!
机器周期 = 12\/Fosc = 12\/(12x10^6Hz) =1μs 执行 DJNZ Rn, rel 指令耗用2个机器周期,即2μs 该段程序执行该类指令总次数=250x200x10=500000 耗用时间 = 500000x2μs = 10^6μs =1s 若改为延时0.1 第三行指令改为 LOOP1: MOV R1, #01 若改为延时0.5s, 第三行指令改为...

一段单片机汇编程序看不懂,哪位能帮忙分析下,谢谢!
AJMP IT0P ;这时的指令内容是转到IT0P的程序(T0中断处理程序)去工作。地址是000BH ORG 0100H ;声明现在的是地址0100H,之前没用到的保留。编译器认为是内容是00H MAIN: MOV SP,#60H ;设堆栈指针.复位时是07H。系统中如用不到堆栈将占用的寄存器可以不重新设置。例如在这个程序中可以不设置堆栈...

求大神帮我看一下这个单片机延时程序呗
TIME: MOV TL0, #00H MOV TH0, #06H \/\/设置定时器0的初值 SETB TR1 \/\/开启定时器 \/\/以下程序逻辑不对,大体意思应该是判断定时器溢出标志TF0,如果溢出,r7减一,直到r7为0,循环判断。LOOP1: JBC TF0, LOOP2 JMP LOOP1 LOOP2: DJNZ R7, TIME Ret 估计这个程序的思路是利用定时...

求解释下下面单片机程序的每一步是什么意思,谢谢了
既然你还没学汇编,我就不用专业术语给你解释了,用好理解的方法帮你简单解释下,如果有必要我们再讨论 org 0000h ;表示下一条指令的地址是0000h ljmp 0030h ;跳转到30h处的指令 org 0030h cword:mov a,#0c5h ;cword:人为定义的标号,mov a,#0c5h :把0c5h放入a寄存器里 ...

谁能给我解释一下以下的单片机程序
LJMP MAIN ;没有键按下返回主程序循环 P10: MOV R7,#00H ;方波波形,R7为特征码,放00,表示方波 LCALL SQU ;调用方波波形函数 LJMP MAIN ;调用完返回主程序循环 P11: MOV R7,#01H ;01表示SAW波 LCALL SAW LJMP MAIN P12: MOV R7,#02H LCALL TRI LJMP M...

相似回答