我把我所有的程序贴出来看看:
;下面为用串口2发送仪表协议数据,用中断回收前面8个数放在37H~3EH,其它的数即使回来也不收
;**************************************************************
;==============================================================
YBs2con: ;用s2con发送数据到仪表中!r01234
mov dptr,#YBSEND ;装入发送数据列表
anl s2con,#11111101B ;#not s2ti ;屏蔽清空s2ti表示可发送!
mov r0,#00H ;指针设为0
mov r1,#08H ;总共送的字节数
sendagain:
mov A,r0 ;指针向下移一位
movc A,@A+dptr ;查找计列表的数据
lcall senddata
inc r0
djnz r1,sendagain ;没有发完则向再继续发送下一位
ret
;===============================
YBSEND: ;要发送的仪表的协议数据
;db 80H,80H,52H,00H,00H,00H,52H,00H
db 129,129,82,0,0,0,83,0 ;一号表一通道
;===============================
senddata: ;用到r234,引用R1
mov s2buf,A ;发送字节到串口2
;要加入防止编译检查时出现死循环的时间控制
mov R6,#05H ;这里约为0.3S
YBLOOP3:
MOV R5,#0ffH
YBLOOP2:
MOV R4,#0ffH
YBLOOP1:
;TI —— 串口发送中断标志位。
;发送完数据,硬件使TI置1,软件清0(CLR TI)
mov Acc,s2con ;将数据串口2的控制寄存器内容送到Acc中
jb acc.1,YBsended ;acc=s2con的第1位是s2ti,如是0则跳去重新检测
;s2ti等于0时,继续检查!直到是1
;则表示发送完成chks2ti
DJNZ R4,YBLOOP1 ;两周期
DJNZ R5,YBLOOP2
DJNZ R6,YBLOOP3
;按道理不会阻止加或缩短时间才对!
YBsended:
nop ;等一个空周期,一个软件清0的过程
anl s2con,#11111101B ;#not s2ti ;屏蔽清空s2ti为下次发送准备
;可能下机位反应不过来,要等一定的时间,约为10ms
;而最后一个就不用等
cjne r1,#01H,senddelay ;最后一个!不用等待,快快去开中断
sjmp send_exit
;300ms的时间按理论上讲实太长了,但可惜也不知多少是合适
;要加入延时才能处理?
senddelay: ;据说执行快几十倍,所以加长时间!
mov r3,#250 ;加长时间是为了仪表能接收并处理,要等实际测试定出
sendlop2:
mov r4,#250
sendlop1:
nop
djnz r4,sendlop1
djnz r3,sendlop2 ;
send_exit:
ret
;============================
[此贴子已经被作者于2011/12/28 17:20:18编辑过]