⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多机通讯程序.txt

📁 c51经典子程序代码全集
💻 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 + -