电路设计,软件开发,专业项目团队承接电子产品开发!


ISPRO下载型编程器
火爆销售中

RS232/TTL转换器
全IC串口窃电

RS232/TTL转换线
全IC串口窃电

ByteBlasterMV Cable
CPLD/FPGA并口下载线

ByteBlaster II Cable ISPRO下载型编程器
支持S51/AVR/PIC
超级51开发板套件
前卫实用超值

PC/MCU/CPLD
三合一学习套件

全新万年历方案
AVR单片机开发板
 

Min51单片机仿真机
迷你型

ARM7开发板
仅售260元!
 

RS-232/RS-485双向接口电平转换器  

51单片机升级STM32
火爆销售中
MPLAB-ICD2
火爆销售中
LED51开发板
玩具又名图文显示棒

面板模块/开发板
经济危机明智决择

       

GSM MODEM GSM猫

SMS短信模块 工业级/全自动
火爆销售中

大功率数传电台

高速数传电台

您当前位置:电子技术资料 -> 外围驱动 -> 串口编程 ->

祝您阅读愉快!

ISPRO下载型编程器

RS232 TO TTL转换器
↑↑本文相关产品介绍↑↑

单片机多机通信例程


类别:技术文章
来源:未知
作者:未知
关键字:单片机多机通信
加入日期:2010-8-7

单片机多机通信例程
单片机一对多通信,主机用轮询方式与从机通信
;中国电子网www.ec66.com
;-------发送,
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 ;接收完数据,返回主程序
;**********************************************************

;-------接收,
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

把波特率改回9600
;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

您可能还会关注的相关技术资料:
暂无

中国电子网
www.EC66.com
QQ:34740080 EMAIL:iloveaoe@163.com
最佳浏览:1024*768
Copyright (C) 2001-2010 EC66.COM All Rights Reserved
Aoe/帝国 制作维护
粤ICP备18061901号