|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-4-21 11:28:13
|
显示全部楼层
本帖最后由 BDXing6 于 2012-4-21 11:34 编辑
先上485图
一共有6个。编号08~13.临时画的草图,下面ACC实际是地。
程序很简单。这个是发送程序
setb tr1 ;打开定时器一
clr ti ;清串口发送接收中断标志
clr ri
clr sm2 ;清地址桢接收响应位,自已作为主机,接收所有数据
setb tb8 ;第一个数据为地址桢
clr join ;连接标志复位
setb es ;开串口中断
mov sbuf,SSO_ToAdd ;发送握手信息
这个是接收
jb rb8,int_s2 ;是地址或命令广播(地址从1~32H,广播命令为80~0FFH),从机才能收到
;========从机接收数据桢=========
mov a,r5 ;R5用于保存接收数据的个数,开始时为零
jz int_s1 ;是接收的第一个数据
mov @r1,sbuf ;数据送缓冲区
inc r1
djnz r5,int_s_ret
mov a,#SSI_Add ;数据接收完成,进行校验和处理(第一个数据一直加到第n-1个数据应等于第n个数据)
call DataAdd
cjne a,sbuf,int_sp ;校验和不等转移
mov sbuf,#MyNum ;数据接收正确,回发本机编号,数据接收完成,等待广播命令
setb DataSSI ;数据到达标志置位
jmp int_s_ret
int_sp: mov sbuf,#Com_Err ;数据传输出错,回送错误信息,要求重发数据
jmp int_s_ret
int_s1: ;接收的第一个数据字节为数据个数
mov r5,sbuf ;第一个数据是以后的数据个数,送R5
mov r1,#SSI_Add ;接收缓冲区地址送R1,准备接收数据
mov @r1,sbuf ;数据个数也同时存入数据缓冲区,作为以后的校验用
inc r1 ;数据缓存区地址加一
dec r5 ;已接收一个数据
jmp int_s_ret
int_s2: ;=========从机地址或命令桢处理============
mov a,sbuf
jb acc.7,int_s5 ;是广播命令转移
cjne a,#MyNum,int_s_ret ;不是呼叫本机退出
clr tb8 ;清发送地址桢位
clr sm2 ;是呼叫本机,清SM2,准备接收数据
setb Join ;连接建立标志置位
mov r5,#0 ;R5用于存放应接收的数据个数,接收数据前清零
mov sbuf,a ;将本机编号发回发送方,确认连接。
jmp int_s_ret
int_s5:
;===========广播指令处理============
mov Com_Add,a ;收到广播指令不回复,命令保存在寄存器最后一个单元中(地址为0fh)
setb command ;广播命令到达标志置位
jmp int_s_ret
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|