📄 多机通讯程序.txt
字号:
初学者:who can help me? [叮当] [61次] 01-5-24 上午 09:07:20
小妹我要完成一课题,单片机多机通信(89c51),现在时间快到了,而我却毫无头绪!!
(对这不感兴趣)哪位大哥能帮一下忙,提供程序(汇编),在这里我先谢过了!!
(具体要求:单片机一对多通信,主机用轮询方式与从机通信,演示以LED显示器演示,好像
是主机发送一个数字,从机接收并用LED显示(希望能说明89c51和LED的连接方法,我这也
不会)
98年做的多机通讯程序 [方塘] [51次] 01-5-24 上午 09:17:41
;98年做的多机通讯程序 ,我记得是调试通过的。不知对你能不能有帮助。
;-------发送,
TXDATA EQU 1000H
org 0h
main: LCALL SENTDATA
MOV R2, #05H ;R2存放从机地址
MOV R3, #00 ;R3存放控制代码
MOV DPTR,#TXDATA
MOV R4, #39
LCALL M_TXSUB
LJMP P_END
;通讯协议:
;1,系统允许接255台从机,其地址分别为00H--FEH
;2,地址FFH是对所有从机都起作用的一条控制命令,命令各从机恢复SM2=1状态
;3,主机和从机的联络过程为:主机首先发送地址帧,被寻址从机返回本机地址给
;主机,在判断地址相符后给被寻址从机发送控制命令,被寻址从机根据其命令向
;主机回送自己的状态,若主机开始发送或接收数据,发送或接收的第一个字节是
;数据块长度
;4,假定主机发送的控制命令代码为:
; 00:要求从机接收数据块
; 01:要求从机发送数据块 ;其它:非法命令
;5,从机状态字格式: |D7 |D6 |D5 |D4 |D3 |D2 |D1 | D0 |
; |ERR| 0 | 0 | 0 | 0 | 0 |TRDY| RRDY|
;其中,若 ERR=1, 从机接收到非法命令;
; 若 TRDY=1,从机发送准备就绪;
; 若 RRDY=1,从机接收准备就绪;
M_TXSUB: MOV TMOD, #20H
MOV TH1, #0E8H ;波特率为1200bit/s
MOV TL1, #0E8H
MOV PCON, #00
MOV SCON, #0D8H ;#11011000B串行方式3,允许接收,TB8=1
SETB TR1
CLR EA
mov r0, #7fh
mov a, #00001110b ;enable 232
movx @r0, a
mov a, #00001011b ;disable 422
movx @r0, a
MOV A, R2 ;R2存放从机地址
MOV SBUF, A
TX_ADD: JBC TI, RX_REPLY
SJMP TX_ADD
RX_REPLY: JBC RI, RX_ADD ;等待从机应答
SJMP RX_REPLY
RX_ADD: MOV A, SBUF
XRL A, R2 ;判断应答地址相符否?
JZ TX_COMM ;
ISNOT: MOV A, #0FFH ;不符,重新联络
SETB TB8
MOV SBUF, A
LOOP1: JNB TI, LOOP1
CLR TI
SJMP TX_ADD
TX_COMM: CLR TB8 ;地址符合,置TB8=0,准备发送命令
MOV A, R3 ;R3存放控制代码 #00:要求从机接收数据
MOV SBUF, A ;发送命令
TX_COMM1: JBC TI, RX_STATE
SJMP TX_COMM1
RX_STATE: JBC RI, RIGHT ;接收从机状态
SJMP RX_STATE
RIGHT: MOV A, SBUF
JNB ACC.7,GO_ON ;接收到命令继续
SJMP ISNOT ;否则,重新联络
GO_ON: CJNE R3, #00H,RECEIVE;要求从机发送就跳转
JNB ACC.0,ISNOT ;从机接收未准备就绪,返回重新联络
TX_BYTES: MOV A, R4 ;发送数据块长度, R4为入口参数
MOV SBUF, A
TX_WAIT1: JBC TI, TX_DATA
SJMP TX_WAIT1
TX_DATA: MOVX A, @DPTR ;发送数据块
MOV SBUF, A
TX_WAIT2: JBC TI, NEXTDATA
SJMP TX_WAIT2
NEXTDATA: INC DPTR
DJNZ R4, TX_DATA ;未完继续
SJMP SUBEND ;发送完数据,返回主程序
RECEIVE: JNB ACC.1,ISNOT ;从机发送未准备就绪,返回重新联络
RX_BYTES: JBC RI, RX_BYTES1 ;接收数据块长度
SJMP RX_BYTES
RX_BYTES1:MOV A, SBUF
MOV R4, A ;R4暂存数据块长度
MOVX @DPTR,A ;保存数据块长度
RX_DATA: JBC RI, RX_DATA1
SJMP RX_DATA
RX_DATA1: MOV A, SBUF
MOVX @DPTR,A
INC DPTR
DJNZ R4, RX_DATA ;未完继续
SUBEND: RET ;接收完数据,返回主程序
;**********************************************************
98年做的多机通讯程序---接收 [方塘] [38次] 01-5-24 上午 09:21:50
;98年做的多机通讯程序 ,我记得是调试通过的。不知对你能不能有帮助。
;-------接收,
RXBUF EQU 1000H
LJMP MAIN
ORG 0023H
LJMP S_RX_INT
MAIN:
LCALL INIT_COM
WAIT_INT:
CLR EA
CLR ES
MOV DPTR, #RXBUF
MOV R4, #36
SETB PSW.5
;CLR PSW.1
SETB PSW.1
SETB EA ;开中断
SETB ES ;允许串行口中断
LJMP WAIT_INT
;**********************************************************
;入口参数:DPTR:从机发送数据块首地址
; R4: 发送数据块长度
; R2: 从机地址
S_RX_INT: CLR RI ;等待主机联络(只有主机发来的是地址帧
PUSH ACC ;才激活RI)
PUSH PSW
CLR RS0
SETB RS1
MOV A, SBUF
XRL A, #05H ;判断是否本机地址,本机地址为:#05H
JZ ISME ;是本机地址,跳转
Return: POP PSW ;不是本机地址,中断返回等待主机联络
POP ACC
RETI ;中断返回
ISME: CLR SM2 ;清SM2,为接收主机命令作准备
MOV SBUF, #05H ;从机地址回送主机
TX_ADD: JNB TI, TX_ADD
CLR TI
RX_COMM: JBC RI, IS_RESET ;接收命令
SJMP RX_COMM
IS_RESET: JNB RB8, COMM_NUM ;是命令帧,则跳转
SETB SM2 ;是复位信号,置SM2=1后返回
LJMP Return
COMM_NUM: MOV A, SBUF
CJNE A, #02H, NOEQU
NOEQU: JC COMM_RIGH ;C=1,则A<02H,接收命令正确
MOV A, #80H ;非法命令,置Err=1,返回等待主机再联络
MOV SBUF, A
Return_WT:JNB TI, Return_WT
CLR TI
SJMP Return
COMM_RIGH:JZ Ready_RX ;是接收命令,跳转
Ready_TX: JB PSW.1,TX_TRDY
Return_ST:MOV SBUF, #00H ;未准备就绪,置TRDY=0,返回本机状态
TX_STATE: JNB TI, TX_STATE
CLR TI
SETB SM2
SJMP Return
TX_TRDY: MOV A, #02H
MOV SBUF, A
CLR PSW.1
TX_WAIT1: JBC TI, TX_Bytes
SJMP TX_WAIT1
TX_Bytes: MOV A, R4
MOV SBUF, A
TX_WAIT2: JBC TI, TX_DATA
SJMP TX_WAIT2
TX_DATA: MOVX A, @DPTR
MOV SBUF, A
TX_WAIT3: JNB TI, TX_WAIT3
CLR TI
INC DPTR
DJNZ R4, TX_DATA
SETB SM2
LJMP Return
Ready_RX: JB PSW.5,TX_RRDY ;PSW.5为接收准备就绪标志,在主程序中
SJMP Return_ST ;预置
TX_RRDY: MOV A, #01H
MOV SBUF, A
CLR PSW.5
TX_WAIT4: JNB TI, TX_WAIT4
CLR TI
RX_Bytes: JNB RI, RX_Bytes ;接收数据块长度
CLR RI
MOV A, SBUF
MOV R4, A ;暂存数据块长度
MOVX @DPTR,A ;保存数据块长度
INC DPTR
RX_DATA: JNB RI, RX_DATA ;接收数据
CLR RI
MOV A, SBUF
MOVX @DPTR,A
INC DPTR
DJNZ R4, RX_DATA
SETB SM2 ;数据接收完,置SM2=1后返回
;LCALL TEST_PRIN ;打印测试
LJMP Return
;**********************************************************
INIT_COM: MOV TMOD, #20H
MOV TH1, #0FDH ;波特率为9600bit/s
MOV TL1, #0FDH
ANL PCON, #7FH
MOV SCON, #0F0H ;#11011000B串行方式3,允许接收,SM2=1
SETB TR1
mov r0, #7fh
mov a, #00001110b ;enable 232
movx @r0, a
mov a, #00001011b ;disable 422
movx @r0, a
RET
哈哈,天大的消息,有mm向各位大虾求教了!我先来了.. [秋雨] [58次] 01-5-24 上午 09:28:52
你讲的通讯我没看明白,不过我是led专家,如果需要,尽管找我(如果是gg就不要找我了呀)
我的qq 2813877
线路图,软件都有
把波特率改回9600 [方塘] [13次] 01-5-24 上午 09:41:03
;M_TXSUB: MOV TMOD, #20H
; MOV TH1, #0E8H ;波特率为1200bit/s
; MOV TL1, #0E8H
M_TXSUB: MOV TMOD, #20H
MOV TH1, #0FDH ;波特率为9600bit/s
MOV TL1, #0FDH
看来我要改个MM的名字了`~~哈哈~~有很多资料啊~~爽呆 [碧云天] [6次] 01-5-24 上午 10:23:39
这么好的东西要共享嘛!发到上载区吧!! [golden] [3次] 01-5-24 下午 12:02:45
我不太好意思呀! [秋雨] [11次] 01-5-24 下午 03:12:22
说句实在话,电路到还可以,很有新意(5年前看),可程序太臭了!
我先把线路图发发试试,不过我还没发过东西,不知会不会!
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -