找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8952|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机主机和多台从机之间通信串行通信汇编程序

[复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-26 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. ;主机和多台从机之间通信。通信协议如下:
  2. ;(1)系统中255台从机地址分别为00~FEH;
  3. ;(2)地址FFH是对所有从机都起作用的一条控制命令,命令各从机恢复SM2=2的状态;
  4. ;(3)主机发送的控制命令代码为:00—要求从机接收数据块,01—要求从机发送数据块;
  5. ;(4)数据块长度:16字节。
  6. ;(5)从机状态字格式为:
  7. ;D7    D6    D5    D4    D3    D2    D1    D0
  8. ;ERR   0     0     0     0     0     TRDY  RRDY
  9. ;其中:若ERR=1,表示从机接收到非法命令;若TRDY=1,表示从机发送准备就绪;
  10. ;若RRDY=1,表示从机接收准备就绪。

  11. ;编程方法:主机的串口通信以调用子程序方式进行;从机以串口中断的方式进行,
  12. ;若从机未做好接收或发送数据的准备,就从中断程序中返回,在主程序中做好准备。


  13. ;以下为主机串行通信程序
  14. ;入口参数:R0—主机发送的数据块首址;R1—主机接收的数据块首址;R2—被寻址从机地址;
  15. ;R3—主机命令;R4—数据块长度;

  16.         BITE EQU 9          ;串口发送9位数据
  17.         FSSZ EQU 40H        ;主机发送的数据块首址
  18.         JSSZ EQU 50H        ;主机接收的数据块首址

  19.         ORG  0000H     ;程序执行开始地址
  20.         LJMP KS        ;跳至KS
  21.         ORG  0003H     ;外中断0中断程序入口
  22.         RETI                ;中断返回
  23.         ORG  000BH          ;定时器T0中断程序入口
  24.         RETI                ;中断返回
  25.         ORG  0013H     ;外中断1中断入口
  26.         RETI             ;中断返回
  27.         ORG  001BH     ;定时器T1中断程序入口
  28.         RETI           ;跳至INTT1中断服务程序
  29.         ORG  0023H     ;串口中断入口地址
  30.         RETI             ;中断返回

  31.         ORG  0100H
  32. KS:     MOV SP,#1FH         ;设置堆栈指针

  33. ;此处可以插入其他程序

  34. COM:    MOV TMOD,#20H       ;设置T1工作方式为方式2
  35.         MOV SCON,#0D8H      ;置串行模式3,SM2=1,允许接收
  36.         MOV TH1,#0FDH       ;11.0592MHz 晶振,波特率=9600,时长0.6695   FD
  37.         SETB TR1            ;启动T1

  38. ;若主机向10号从机发送数据块,数据块放置在内部RAM区的40~4F单元中,
  39. ;则主程序调用子程序的入口条件如下:
  40.         MOV FSSZ,#0
  41.         MOV FSSZ+1,#1
  42.         MOV FSSZ+2,#2
  43.         MOV FSSZ+3,#3
  44.         MOV FSSZ+4,#4
  45.         MOV FSSZ+5,#5
  46.         MOV FSSZ+6,#6
  47.         MOV FSSZ+7,#7
  48.         MOV FSSZ+8,#8

  49. ;串口通信
  50.         MOV R2,#0AH         ;与10号从机通信
  51.         ;MOV R3,#00H         ;主机要求从机接收数据块
  52.         MOV R3,#01H         ;主机要求从机发送数据块

  53. ;占用资源:R0~R4,A、40H、50H
  54. COM1:   LCALL MS101         ;调用串口通信子程序
  55.         CJNE R4,#00H,COM1   ;查看是否发送接收数据完成
  56.         SJMP KS             ;实际中加入其他程序

  57. ;以下为主机串行通信子程序
  58. MS101:  MOV A,R2            ;发送地址帧
  59.         MOV SBUF,A
  60.         JNB TI,$
  61.         CLR TI
  62.         JNB RI,[        DISCUZ_CODE_1        ]nbsp;           ;等待从机应答
  63.         CLR RI
  64.         MOV A,SBUF
  65.         XRL A,R2
  66.         JZ MS103            ;判应答地址是否相符
  67.         RET
  68. MS102:  SETB TB8
  69.         MOV SBUF,#0FFH      ;不相符重新联络
  70.         JNB TI,$
  71.         CLR TI
  72.         SJMP MS101          ;转重发地址

  73. MS103:  CLR TB8             ;地址符合,准备发送命令
  74.         MOV SBUF,R3         ;发送命令
  75.         JNB TI,$
  76.         CLR TI
  77.         JNB RI,[        DISCUZ_CODE_1        ]nbsp;           ;等待从机应答
  78.         CLR RI
  79.         MOV A,SBUF          ;取应答信息
  80.         JNB ACC.7,MS104     ;判断是否出错
  81.         SJMP MS102          ;若从机接收命令出错,重新联络

  82. MS104:  CJNE R3,#00H,MS105  ;判是否要求从机接收数据
  83.         JNB ACC.0,MS102     ;从机接收数据准备就绪否?
  84.         MOV R0,#FSSZ        ;主机发送的数据块首址
  85.         MOV R4,#BITE        ;设数据块长度(9字节)
  86. LPTX:   MOV SBUF,@R0        ;主机发送数据块
  87.         JNB TI,[        DISCUZ_CODE_1        ]nbsp;           ;等待发送完1帧
  88.         CLR TI
  89.         INC R0              ;修改地址指针
  90.         DJNZ R4,LPTX        ;判数据块是否传完
  91.         RET                 ;返回主程序

  92. MS105:  JNB ACC.1,MS102     ;从机发送数据准备就绪否?
  93.         MOV R1,#JSSZ        ;主机接收的数据块首址
  94.         MOV R4,#BITE        ;设数据块长度(9字节)
  95. LPRX:   JNB RI,LPRX         ;等待接收完1帧
  96.         CLR RI
  97.         MOV A,SBUF          ;取出接收到的字符
  98.         MOV @R1,A
  99.         INC R1
  100.         DJNZ R4,LPRX        ;未接收完则继续
  101.         RET

  102.         END



  103. ;以下为从机串行通信程序
  104. ;从机的的串行通信采用中断控制启动方式,串行口中断服务程序利用1区工作寄存器。在串口通信启动后,
  105. ;仍采用查询方式来接收或发送数据块。从机的初始化程序中应包括定时器1和串口初始化以及开中断程序。
  106. ;程序中利用F0(PSW.5)作发送准备就绪标志,F1(PSW.1)作接收准备就绪标志。

  107.         SLAVE EQU 0AH     ;设定从机地址
  108.         BITE  EQU 9         ;串口发送9位数据
  109.         FSSZ  EQU 40H       ;主机发送的数据块首址
  110.         JSSZ  EQU 50H       ;主机接收的数据块首址

  111.         ORG  0000H     ;程序执行开始地址
  112.         LJMP KS        ;跳至KS
  113.         ORG  0003H     ;外中断0中断程序入口
  114.         RETI                ;中断返回
  115.         ORG  000BH          ;定时器T0中断程序入口
  116.         RETI                ;中断返回
  117.         ORG  0013H     ;外中断1中断入口
  118.         RETI             ;中断返回
  119.         ORG  001BH     ;定时器T1中断程序入口
  120.         RETI           ;跳至INTT1中断服务程序
  121.         ORG  0023H     ;中断返回
  122.         LJMP SS10           ;跳至串口中断服务程序


  123. KS:     MOV SP,#1FH         ;设置堆栈指针
  124.         MOV TMOD,#20H       ;设置T1工作方式为方式2
  125.         MOV SCON,#0F0H      ;置串行模式3,SM2=1,允许接收
  126.         MOV TH1,#0FDH       ;11.0592MHz 晶振,波特率=9600,时长0.6695
  127.         SETB TR1            ;启动T1
  128.         SETB EA             ;开总中断

  129.         MOV FSSZ,#0
  130.         MOV FSSZ+1,#1
  131.         MOV FSSZ+2,#2
  132.         MOV FSSZ+3,#3
  133.         MOV FSSZ+4,#4
  134.         MOV FSSZ+5,#5
  135.         MOV FSSZ+6,#6
  136.         MOV FSSZ+7,#7
  137.         MOV FSSZ+8,#8

  138.         SETB F0             ;作发送准备就绪标志
  139.         SETB F1             ;作接收准备就绪标志
  140.         SETB ES             ;允许串口通信

  141.         SJMP [        DISCUZ_CODE_1        ]nbsp;             ;可以插入其他程序

  142. ;串行口中断服务程序(由0023转来)
  143. ;占用资源:1区R0~R2,A、40H、50H、C
  144. SS10:   CLR RI
  145.         PUSH A              ;保护现场
  146.         PUSH PSW
  147.         SETB RS0            ;选1区工作寄存器
  148.         CLR RS1
  149.         MOV A,SBUF
  150.         XRL A,#SLAVE        ;SLAVE为本从机地址
  151.         JZ SSI01            ;判地址是否符合
  152. RETU:   POP PSW             ;恢复现场
  153.         POP A
  154.         RETI

  155. SSI01:  CLR SM2             ;地址符合,准备接收数据
  156.         MOV SBUF,#SLAVE     ;从机地址送主机,准备核对
  157.         JNB TI,[        DISCUZ_CODE_1        ]nbsp;           ;等待发送完1帧
  158.         CLR TI
  159.         JNB RI,[        DISCUZ_CODE_1        ]nbsp;           ;等待接收完1帧
  160.         CLR RI
  161.         JNB RB8,SSI02       ;是数据帧跳转
  162.         SETB SM2            ;复位信号,把SM2置“1”
  163.         SJMP RETU

  164. SSI02:  MOV A,SBUF          ;取命令
  165.         CLR C
  166.         CJNE A,#02H,SS1     ;检查命令是否合法,如果A<2,则C=1,否则C=0
  167. SS1:    JC SSI03            ;A<02H则继续
  168.         MOV SBUF,#08H       ;非法命令,置ERR=1
  169.         JNB TI,[        DISCUZ_CODE_1        ]nbsp;           ;等待发送完1帧
  170.         CLR TI
  171.         SJMP RETU           ;返回

  172. SSI03:  JZ CMD0             ;A=00H,准备接收数据块
  173.         JB F0,SSI04         ;发送准备就绪否
  174.         MOV SBUF,#00H       ;回答未准备就绪
  175.         JNB TI,[        DISCUZ_CODE_1        ]nbsp;           ;等待发送完1帧
  176.         SJMP RETU

  177. SSI04:  MOV SBUF,#02H       ;发送准备就绪,置TRDY=1
  178.         JNB TI,$
  179.         CLR TI
  180.         CLR F0              ;清发送准备标志
  181.         MOV R0,#FSSZ
  182.         MOV R2,#BITE        ;发送或接收字节数送1区工作寄存器R2,现设定为9字节
  183. LP1:    MOV SBUF,@R0        ;发送数据块
  184.         JNB TI,$
  185.         CLR TI
  186.         INC R0              ;修改数据指针
  187.         DJNZ R2,LP1
  188.         SETB SM2            ;发送完,置SM2=1
  189.         SJMP RETU

  190. CMD0:   JB F1,SSI05         ;判接收准备就绪否?
  191.         MOV SBUF,#00H       ;回答未准备就绪
  192.         JNB TI,$
  193.         CLR TI
  194.         SJMP RETU

  195. SSI05:  MOV SBUF,#01H       ;接收准备就绪,置RRDY=1
  196.         JNB TI,$
  197.         CLR TI
  198.         CLR F1
  199.         MOV R1,#JSSZ        ;接收缓冲区首址送1区工作寄存器R1,现设定为50~5FH
  200.         MOV R2,#BITE
  201. LP2:    JNB RI,LP2          ;等待1帧接收完
  202.         CLR RI
  203.         MOV @R1,SBUF
  204.         INC R1
  205.         DJNZ R2,LP2
  206.         SETB SM2            ;接收完,置SM2=1
  207.         SJMP RETU

  208.         END
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:248274 发表于 2017-11-11 12:01 | 只看该作者
可以请教您问题吗
回复

使用道具 举报

板凳
ID:309627 发表于 2018-4-25 09:54 | 只看该作者
偷一手代码,溜了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表