51单片机实现双机通信(自己整理的)

合集下载

51单片机的双击通信(分享借鉴)

51单片机的双击通信(分享借鉴)

一设计题目:双机通信系统二实验描述:设计一个双机通信系统,实现按键数据的互发及显示功能。

三实验要求:利用两片8051单片机完成双机通信(A机和B机),A、B机发至对方数据可用数码管显示,通信过程用按键控制,发送内容自定。

四实验元件:ST89C51(两片)、电容(30PF*4、10UF*4)、数码管(共阳)、晶振(11.059 2MHZ)、小按键等。

五具体设计:1:设计介绍1.1 串行通信介绍广义地讲,终端(如计算机等)与其他终端、终端与外部设备(如打印机、显示器等)之间的信息交换称为数据通信(Data Communication)。

数据通信方式有两种:串行通信和并行通信。

并行通信:数据的各位同时进行传送(接收和发送),其优点是传递速度快、效率高,多用在实时、快速的场合。

串行通信:数据逐位传送,优点是数据只需要一根数据线就能完成传送,联结介质简单,成本低。

1.2 8051简介51内部结构:8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,·中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。

·数据存储器(RAM):8051内部有128个8位用户数据存储单元8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

·程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。

·定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

MCS51系列单片机双机并行互连的实现方法

MCS51系列单片机双机并行互连的实现方法

MCS51系列单片机双机并行互连的实现方法介绍了在同一系统内,MCS51系列两单片机之间采用单向并行通信接口、主从双向并行通信接口、无主从双向并行通信操作实现双机互连的方法,分析了在每一种通信接口工作方式下数据传送的特点。

在三种并行通信接口为单片机应用系统扩充硬件资源的设计提供了新的途径。

由于MCS51系列单片机具有性能稳定、工作可*、价格低廉等特点,因此其应用相当广泛。

一个MCS51系列的单片机(如Atmel89cxx)内部包含有RAM、FLASH ROM、两个或者三个16位的定时器/计数器、一个通用异步串行通信控制器(UART)等多种资源。

但即便如此,在一些相对复杂的单片机应用系统中,仅仅一个单片机资源还是不够的,因此而常常需要扩充I/O接口、定时器/计数器、串行通信接口、RAM、ROM等。

采用通用的标准器件进行扩充是通常的做法,但将单片机本身作为一个通用的扩充器件来使用,也不失为一个好的方法。

在这种情况下,一个系统中就使用了两个或两个以上的单片机,而单片机之间就要通过互连来进行数据通信。

MCS51系列的单片机(以下简称单片机)都带有串口,利用串口进行互连通信极为方便,其各种连接方式在许多书籍和资料上都有介绍,在此不再重述。

但如果系统要求扩充的资源是对外连接的串口,或对相互之间的数据传送有一定的速度要求,则单片机的串口就不能用作系统内两单片机的通信接口了。

所幸的是,单片机的并行端口也能相互连接来进行数据通信。

根据单片机端口内部结构的特点,这些端口的端口线可以直接相连,从而使两单片机之间并行通信接口的实现不用另外的硬件电路设备。

基于这种情况,设计时,可根据不同的使用要求,来采用不同的并行连接方法。

下面介绍在两个单片机之间进行三种并行通信接口的实现方法。

1 单向并行通信接口的实现在应用中,如果只需一个单片机向另一个单片机传送数据,则可以采用单向并行通信接口方式,这种方式较为简单。

图1所示为单向并行通信接口的组成方法。

51单片机多机通信

51单片机多机通信

一、多机通信原理在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON 寄存器的SM2位来实现。

当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。

在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。

二、多机通信电路图此处,U1作为主机,U2为从机1,U3为从机2。

三、C语言程序(1)主机程序#include<reg51.h>#include<string.h>#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; unsigned char Buff[20]; //数据缓冲区unsigned char temp=0xff;sbit KEY1=P1^6;sbit KEY2=P1^7;//unsigned char addr;//延时1ms函数void delay_1ms(unsigned int t){unsigned int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//缓冲区初始化void Buff_init(){unsigned char i; //将Table里的数据放到缓冲区里for(i=0;i<9;i++){Buff[i]= Table[i];delay_1ms(100);}}//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//发送数据函数void SEND_data(unsigned char *Buff){unsigned char i;unsigned char lenth;unsigned char check;lenth=strlen(Buff); //计算数据长度check=lenth;TI=0; //发送数据长度TB8=0; //发送数据帧SBUF=lenth;while(!TI);TI=0;for(i=0;i<lenth;i++) //发送数据{check=check^Buff[i];TB8=0;SBUF=Buff[i];while(!TI);TI=0;}TB8=0; //发送校验字节SBUF=check;while(!TI);TI=0;}//向指定从机地址发送数据void ADDR_data(unsigned addr){while(temp!=addr) //主机等待从机返回其地址作为应答信号{TI=0; //发送从机地址TB8=1; //发送地址帧SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}temp=_ERR_; //主机等待从机数据接收成功信号while(temp!=_SUCC_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=0;}}void main(){Buff_init();serial_init();while(1){if(KEY1==0){delay_1ms(5);if(KEY1==0){while(!KEY1);ADDR_data(0x01);}}if(KEY2==0){delay_1ms(5);if(KEY2==0){while(!KEY2);ADDR_data(0x02);}}}}(2)从机1程序#include<reg51.h>#include<string.h>#define addr 0x01//从机1的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff) {unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己的地址作为应答,等待接收数据 TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[1]; //查看接收到的数据}}(3)从机2程序#include<reg51.h>#include<string.h>#define addr 0x02//从机2的地址#define _SUCC_ 0x0f//数据传送成功#define _ERR_ 0xf0//数据传送失败unsigned char aa=0xff;//主机与从机之间通信标志unsigned char Buff[20];//数据缓冲区//串口初始化函数void serial_init(){TMOD=0x20; //定时器1工作于方式2TH1=0xfd;TL1=0xfd; //波特率为9600PCON=0;SCON=0xd0; //串口工作于方式3TR1=1; //开启定时器TI=0;RI=0;}//接收数据函数unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;RI=0; //接收数据长度while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i<lenth;i++) //接收数据{while(!RI);if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;Buff[i]=SBUF;check=check^(Buff[i]);RI=0;}while(!RI); //接收校验字节if(RB8==1) //若接收到地址帧,则返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff {TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}void main(){serial_init();while(1){SM2=1; //接收地址帧while(aa!=addr) //从机等待主机请求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}TI=0; //一旦被请求,从机返回自己地址作为应答,等待接收数据TB8=0;SBUF=addr;while(!TI);TI=0;SM2=0; //接收数据帧aa=0xff; //从机接收数据,并将数据保存到数据缓冲区while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[2]; //查看接收到的数据}}。

51单片机的多机通信原理

51单片机的多机通信原理

51单片机的多机通信原理1. 什么是51单片机的多机通信?51单片机的多机通信是指在多个51单片机之间进行数据传输和通信的过程。

通过多机通信,可以实现不同单片机之间的数据共享和协作,从而实现更加复杂的功能。

2. 多机通信的原理是什么?多机通信的原理是通过串口进行数据传输。

在多个单片机之间,可以通过串口进行数据的发送和接收。

通过定义好的协议,可以实现数据的传输和解析,从而实现多机之间的通信。

3. 多机通信的步骤是什么?多机通信的步骤包括以下几个方面:(1)定义好通信协议:在多机通信之前,需要定义好通信协议,包括数据的格式、传输方式等。

(2)设置串口参数:在单片机中,需要设置好串口的参数,包括波特率、数据位、停止位等。

(3)发送数据:在发送数据之前,需要将数据按照协议进行格式化,然后通过串口发送出去。

(4)接收数据:在接收数据之前,需要设置好串口的中断,然后在中断中接收数据,并按照协议进行解析。

(5)处理数据:在接收到数据之后,需要对数据进行处理,包括数据的存储、显示等。

4. 多机通信的应用场景有哪些?多机通信的应用场景非常广泛,包括以下几个方面:(1)智能家居系统:通过多机通信,可以实现智能家居系统中不同设备之间的数据共享和协作。

(2)工业控制系统:在工业控制系统中,多机通信可以实现不同设备之间的数据传输和控制。

(3)智能交通系统:在智能交通系统中,多机通信可以实现不同设备之间的数据共享和协作,从而实现更加智能化的交通管理。

(4)机器人控制系统:在机器人控制系统中,多机通信可以实现不同机器人之间的数据传输和控制,从而实现更加复杂的任务。

5. 多机通信的优缺点是什么?多机通信的优点包括以下几个方面:(1)实现数据共享和协作:通过多机通信,可以实现不同设备之间的数据共享和协作,从而实现更加复杂的功能。

(2)提高系统的可靠性:通过多机通信,可以实现数据的备份和冗余,从而提高系统的可靠性。

(3)提高系统的扩展性:通过多机通信,可以实现系统的模块化设计,从而提高系统的扩展性。

单片机双机通信(C51程序)

单片机双机通信(C51程序)

单片机双机通信(C51程序)/*发送程序连线:两个单片机用3 根线连起来,要共地,rxd,txd 要交叉连接程序效果:通过主机发送,从机接收在主机中通过记下按键按下的次数,主机中显示最后按下的六个数值,并发送给从机,从机也显示这六个数值*/#includereg52.h //头文件#includeintrins.h //循环移位文件#define uchar unsigned char//宏定义#define uint unsigned intsbit key1=P3 ; //位声明uchar code table[] ={0X00,0x3f,0x06,0x5b,//数码管显示的数值0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar table_tr[6];//暂存最后按下的六个数值uchar count,cnt;//延时子函数,用于数码管显示void delay(uchar i){ uchar x,y; for(x=i;x0;x--) for(y=110;y0;y--);}//初始化子函数void init(){ TMOD=0x20;//T1 工作在方式2 TH1=0XF4;//波特率为4.8kbit/s TL1=0XF4; TR1=1;//启动定时器1 SCON=0X50;//串口工作在方式1,允许接收}//显示子函数void display(){ uchar i,j;//定义局部变量j=0x7f; //赋初值for(i=0;i6;i++) { P2=j; //点亮最右边的数码管P0=table[table_tr[i]]; //显示该数值delay(10); //延时,便于眼睛看清j=_cror_(j,1);//循环右移一位}}//按键扫描子函数void key_scan(){ if(key1==0) //判断是否有按键按下{ while(!key1) //等待按键松手{ display();//防止掉显} cnt++; //加1,用于显示SBUF=cnt;//送给缓冲区,发送while(!TI); //等待发送完TI=0; //发送完了,标志位清零for(count=0;count5;count++) //用于保存最后按下的六个按键数值{ table_tr[count] =table_tr[count+1]; } table_tr[5]=cnt; //把最后按下的按键数值赋给table_tr【5】if(cnt==10) //按键按下的次数有没有等于10 cnt=0;//等于,则清零}}void main() { init(); //调用初始化子函数P0=0x00; while(1) { key_scan(); //调用键盘扫描子函数display();//调用显示子函数} }tips:感谢大家的阅读,本文由我司收集整编。

51系列单片机双CPU系统通信方法

51系列单片机双CPU系统通信方法

51系列单片机双CPU系统通信方法引言本文介绍一种新颖的方法来实现51系列单片机双CPU系统。

该方法灵活地运用了51单片机的ID工作方式,使没有HOLD功能的51单片机能够直接通过片外RAM进行数据通信。

不但硬件和软件的实现都比较简单,数据传输速度快,而且不涉及高成本特殊器件。

对一般51单片机系统的设计有一定的参考意义。

1 实现双处理器的一般方法① 使用双口RAM。

这种方法方便地实现了CPU之间的通信,在选择CPU接口时具有较大的灵活性;但这种方法会增加电路设计的难度和成本。

② 利用I/O口进行并行通信。

这种方法既要用I/O口传送数据,又要用I/O口来进行传送的控制,因此占用较多的I/O口;而且控制过程涉及进行通信的两个CPU,软件设计比较复杂。

③ 利用串口进行通信。

使用UART或I2C 总线来联系CPU也是常用的方法。

这种方法实现简单,只是传输速度较慢。

④共享内存。

共享内存实际上又有两种不同实现。

第一种如LON网络的Neuron节点芯片,利用不同时序实现共享内存。

这种方法必须制成专用芯片,把CPU和RAM封装在一起,一般情况下实现困难。

第二种如96系列单片机,使用HOLD线先挂起其中一单片机的总线,以使用其内存。

这种方法简单而且传输速度快,在具有HOLD功能的CPU系统中经常使用这种方法实现双CPU。

2 使用共享内存法实现双CPU通信由于51单片机没有HOLD功能,一般不能使用共享内存法实现双CPU通信。

这里介绍一种方法,使一般51单片机能够用共享内存实现双CPU通信。

该方法电路简单,软硬件实现容易;数据传输速度快,而且占用系统资源少(不使用I/O口传递数据,而用一部分地址空间作为数据传送的媒体),能充分发挥双CPU的作用。

下面具体介绍这种方法。

2.1 基本设计方案首先,甲机划出一部分片外RAM的地址空间作为数据传输的专门通道(一般可用高端地址空间);同时,把这个地址空间映射到接收数据的乙机端的相同大小片外RAM 地址空间(乙机端可以直接访问到)。

MCS-51系列单片机双机串行通信

MCS-51系列单片机双机串行通信

RS232是应用最早,最广泛的双机异步串行通信总线标准。是美国电 子工业协会的推荐标准 RS = recommended standard
标准规定了数据终端设备(DTE)和数据通信设备(DCE)间串行通信接 口的物理(电平)、信号和机械连接标准
RS232C
DTE
DCE
电话线
RS232C
DCE
DTE
计算机
8
5
CTS DCE 控制
9
22
RI DCE 控制
描述
载波信号检测 接收数据 发送数据 终端准备好 信号地
数据机准备好 请求发送
清除以便发送 振铃信号
计算机间RS232C通信的常用连接方法
TXD 计算机 RXD
GND
TxD RxD RTS CTS DTR DSR
CD RI GND
无握手 全握手
TXD RXD 计算机 GND
在方式 1 处于接收时,若 SM2=1,则只有收到有效的停止位后,RI =1。
在方式 0 中,SM2 应为 0。
REN: 允许接收。 REN=0 时,禁止接收。由软件置位或清零。 TB8: 发送数据的第 9 位。
在方式 2 和方式 3 中,由软件设置,可做奇偶校验位。 在多机通信中,可作为区别地址帧或数据帧的标识位。一般约定地址 帧时,TB8 为 1,数据帧时,TB8 为 0。 RB8: 接收数据的第 9 位。功能同 TB8。 TI: 发送中断标志位。发送完一帧数据的标志,由硬件置位, 软件清除, 可触发CPU中断。 RI: 接收中断标志位。接收完一帧数据的标志,由硬件置位, 软件清除, 可触发CPU中断。
6. 串行通讯及其接口
6-1 串行通讯的一般概念
6-1-1 并行通信和串行通信

基于51单片机的双机串行通信设计组单片机课程设计

基于51单片机的双机串行通信设计组单片机课程设计

基于51单片机的双机串行通信设计一、设计任务设计要求:两个AT89C51单片机使用串口进行通信。

1)1机发送,二机接收时。

使用1机发送一个数字0xAA给2机。

2)如果2机收到数据后要给1机回复,回复0xBB。

3)1机收到回复后要下发数据,下发的同时要将数据显示出来,下发的数据通过4*4的矩阵键盘产生,可以由用户进行控制。

4)2机收到后将这些数值显示出来,一次传输完毕要回复0x00。

可以使用点阵显示或者数码管显示或者 LCD显示。

二、硬件设计1、单片机串行通信功能AT89C51计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。

51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。

串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。

51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。

51单片机串行接口的结构如下:(1)数据缓冲器(SBUF)接受或发送的数据都要先送到SBUF缓存。

有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;接收时用指令将SBUF中接收到的数据取出。

(2)串行控制寄存器(PCON)SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下:SM0,SM1:串行接口工作方式选择位,这两位组合成00,01,10, 11对应于工作方式0、1、2、3。

串行接口工作方式特点见下表SM2:多机通信控制位。

REN:接收允许控制位。

软件置1允许接收;软件置0禁止接收。

TB8:方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。

RB9:在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。

51单片机多机通信程序

51单片机多机通信程序

51单片机多机通信程序(主机部分) /* multi_m.c *//* 多机通信的主机部分*/#ifndef __MULTI_M_C__#define __MULTI_M_C__#include <AT89X51.H>#include <STRING.H>#define __MAX_LEN_ 64 // 数据最大长度#define _MHZ_ 11 // 设置单片机使用的晶振频率(11.0592MHz) /* 以下为程序协议中使用的握手信号*/#define __SUCC_ 0x0f // 数据传送成功#define __ERR_ 0xf0 // 数据传送错误void init_serial(); // 串口初始化void send_data(unsigned char *buf); // 发送数据void delay10ms(unsigned int count); // 延时子程序(10ms) void main(){char buf[__MAX_LEN_];unsigned char i = 0;unsigned char tmp;unsigned char addr; // 该字节用于保存要通信的从机地址/* 为缓冲区赋初值*/P0 = 0xff;while(P1 != 0) // 每隔100ms从P0口读取,若读取到0则表明数据采集结束{*(buf+i) = P0;delay10ms(10); // 延时100msP0 = 0xff;i++;}*(buf+i) = 0; // 缓冲区最后一个字节为0表示数据结束/* 读要访问的分机地址*/P0 = 0xff;addr = P0;/* 串口初始化*/init_serial(); // 初始化串口EA = 0; // 关闭所有中断/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧*/tmp = addr-1;while(tmp != addr){/* 发送从机地址*/TB8 = 1; // 发送地址帧SBUF = addr;while(!TI);TI = 0;/* 接收从机应答*/RI = 0;while(!RI);tmp = SBUF;RI = 0;}/* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接收成功,否则将重新发送该组数据*/tmp = __ERR_;while(tmp != __SUCC_){send_data(buf); // 发送数据RI = 0;while(!RI);tmp = SBUF;RI = 0;}while(1); // 程序结束,进入死循环}/* 初始化串口*/void init_serial(){TMOD = 0x20; //定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0xd0; //工作方式3,9位数据位,波特率9600bps,允许接收}/* 发送数据*/void send_data(unsigned char *buf){unsigned char len; // 保存数据长度unsigned char ecc; // 保存校验字节len = strlen(buf); // 计算要发送数据的长度ecc = len; // 开始进行校验字节计算/* 发送数据长度*/TB8 = 0; // 发送数据帧SBUF = len; // 发送长度while(!TI);TI = 0;/* 发送数据*/for(i=0; i<len; i++){ecc = ecc^(*buf); // 计算校验字节TB8 = 0; // 发送数据帧SBUF = *buf; // 发送数据buf++;while(!TI);TI = 0;}/* 发送校验字节*/TB8 = 0; // 发送数据帧SBUF = ecc; // 发送校验字节while(!TI);TI = 0;}/* 延时10ms,精度较低,参数count为延时时间*/ void delay10ms(unsigned int count){unsigned int i, k;unsigned char j;unsigned int tmp;tmp = (int)((100*_MHZ_)/12);for(i=0; i<count; i++)for(j=0; j<100; j++)for(k=0; k<tmp; k++);}#endif51单片机多机通信程序(从机部分)/* multi_s.c *//* 多机通信的从机部分*/#ifndef __MULTI_S_C__#define __MULTI_S_C__#include <AT89X51.H>#include <STRING.H>#define __MAX_LEN_ 64 // 数据最大长度#define _MHZ_ 11 // 设置单片机使用的晶振频率(11.0592MHz)/* 以下为程序协议中使用的握手信号*/#define __SUCC_ 0x0f // 数据传送成功#define __ERR_ 0xf0 // 数据传送错误void init_serial(); // 串口初始化unsigned char recv_data(unsigned char *buf); // 接收数据void Beep_ok(); // 蜂鸣表示数据接收ok,该函数代码未给出void main() {char buf[__MAX_LEN_];unsigned char i = 0;unsigned char tmp = 0xff;unsigned char addr; // 保存本机地址/* 从P1口读取本机地址*/P1 = 0xff;addr = P1;/* 串口初始化*/init_serial(); // 初始化串口EA = 0; // 关闭所有中断/* 进入设备应答阶段*/while(1){SM2 = 1; // 只接收地址帧/* 如果接收到的地址帧不是本机地址,则继续等待*/ tmp = addr-1;while(tmp != addr){RI = 0;while(!RI);tmp = SBUF;RI = 0;}/* 发送应答信号,并做好接收数据的准备*/TI = 0;TB8 = 0; // 主机不检测该位SBUF = addr;while(!TI);TI = 0;SM2 = 0; // 允许接收数据信息/* 数据接收*/tmp = 0xff;while(tmp == 0xff) // 如果数据校验失败则重新接收数据{tmp = recv_data(buf); // 校验失败返回0xff,检测到地址帧则返回0xfe,接收成功则返回0}if(tmp == 0xfe) // 在数据接收过程中,如果发现地址帧,则重新开始整个接收过程continue;Beep_ok(); // 蜂鸣表示数据接收成功}}/* 初始化串口*/void init_serial(){TMOD = 0x20; //定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0xd0; //工作方式3,9位数据位,波特率9600bps,允许接收}/* 接收数据,注意该函数使用buf指向的缓冲区保存数据,在数据末尾使用’\0’表示数据结束* 返回值为0,数据校验成功,返回值为0xfe,接受过程中接收到地址帧,返回值为0xff,数据校验失败*/unsigned char recv_data(unsigned char *buf){unsigned char len; // 该字节用于保存数据长度unsigned char ecc; // 该字节用于保存校验字节unsigned char i,tmp;/* 接收数据长度*/RI = 0;while(!RI);if(RB8 == 1) // 若当前接收为地址帧则返回0xfereturn 0xfe;len = SBUF;RI = 0;/* 使用len的值为校验字节ecc赋初值*/ecc = len;/* 接收数据*/for(i=0; i<len; i++){while(!RI);if(RB8 == 1) // 若当前接收为地址帧则返回0xfe return 0xfe; *buf = SBUF; // 接收数据ecc = ecc^(*buf); // 进行字节校验RI = 0;buf++;}*buf = 0; // 表示数据结束/* 接收校验字节*/while(!RI);if(RB8 == 1) // 若当前接收为地址帧则返回0xfe return 0xfe; tmp = SBUF;RI = 0;/* 进行数据校验*/ecc = tmp^ecc;if(ecc != 0) // 校验失败{*(buf-len) = 0; // 清空数据缓冲区TI = 0; // 发送校验失败信号TB8 = 0;SBUF = __ERR_;while(!TI);TI = 0;return 0xff; // 返回0xff表示校验错误} TI = 0; // 校验成功TB8 = 0;SBUF = __SUCC_;while(!TI);TI = 0;return 0; // 校验成功,返回0}#endif。

基于51单片机的双机通信

基于51单片机的双机通信

5.1.1、机械特性: 、机械特性
RS-232C接口规定使用 针连接 接口规定使用25针连接 接口规定使用 器,连接器的尺寸及每个插针的排列位 置都有明确的定义。 置都有明确的定义。
5.1.2、功能特性 、
5.1.3、过程特性 、 过程特性规定了信号之间的时序关系, 过程特性规定了信号之间的时序关系,以便正确地 接收和发送数据 。
4、波特率的计算 波特率的计算
方式0的波特率 = fosc/12 方式 的波特率 方式2的波特率 ( 方式 的波特率 =(2SMOD/64)· fosc ) 方式1的波特率 ( 溢出率) 方式 的波特率 =(2SMOD/32)·(T1溢出率) ) ( 溢出率 方式3的波特率 ( 溢出率) 方式 的波特率 =(2SMOD/32)·(T1溢出率) ) ( 溢出率
异步通信的数据格式 :
异步通信的特点: 异步通信的特点:不要求收发双方时钟的 严格一致,实现容易,设备开销较小, 严格一致,实现容易,设备开销较小,但 每个字符要附加2~ 位用于起止位 位用于起止位, 每个字符要附加 ~3位用于起止位,各帧 之间还有间隔,因此传输效率不高。 之间还有间隔,因此传输效率不高。
双 机 通 信
●计算机串行通信基础 ● 80C51的串行口 ●单片机串行口编程应用举例
一、计算机串行通信基础
● 计算机通信是指计算机与外部设备或计算机与 计算机之间的信息交换。 计算机之间的信息交换。 通信有并行通信和串行通信两种方式。 ● 通信有并行通信和串行通信两种方式。
1.1并行通信: 并行通信: 并行通信
TXD SBUF
TH1 TL1 1
控制门 发送控制器
÷16
TI
去串口中断
≥1
A

51单片机双机串行通信设计

51单片机双机串行通信设计

51单⽚机双机串⾏通信设计******************实践教学*******************XXXXX⼤学计算机与通信学院2013年秋季学期通信系统综合训练课程设计题⽬:51单⽚机双机串⾏通信设计专业班级:通信⼯程x班姓名:xx学号:xx指导教师:xx成绩:摘要双机通信的实质就是解决两单⽚机串⾏通信问题。

针对于89C51单⽚机全双⼯异步串⾏通信⼝,我们采⽤单⽚机直接交叉互连的串⾏通信⽅式。

考虑到本设计应⽤于短距离传输、两单⽚机具有相同的数据格式及电平且为使设计简单,我们最终决定本系统采⽤⽅式⼀单⽚机直接交叉连接的串⾏通信⽅式,上位机发送的数据由串⾏⼝TXD端输出,直接由下位机的串⾏⼝数据接收端RXD接收。

本设计的硬件电路分为数码管显⽰模块、单⽚机⼯作的基本复位电路以及晶振模块。

编程采⽤C语⾔加以实现。

通信的结果使⽤数码管进⾏显⽰,数码管采⽤查表⽅式显⽰,两个单⽚机之间采⽤RS-232进⾏双向通信。

关键字:51单⽚机串⾏通信 RS-232接⼝标准前⾔ (1)1 基本原理 (2)1.1 串⾏通信概述 (2)1.2 串⾏通信的分类 (2)1.3 串⾏通信技术标准 (2)1.4串⾏通信协议 (3)1.5串⾏通信与并⾏通信区别 (4)1.6MCS-51串⾏接⼝的基本特点 (5)1.7波特率选择 (7)1.8通信协议的使⽤ (7)1.951单⽚机的结构和作⽤ (7)1.10双机通信 (8)2 系统分析 (9)2.1汇编语⾔和C语⾔的特点及选择 (9)2.2并⾏通信与串⾏通信的⽐较 (9)2.3串⾏通信程序设计的⽐较 (9)2.4同步通信与异步通信的区别 (9)3 系统设计 (11)3.1设计要求 (11)3.2设计⽅案 (11)3.3硬件设计 (11)3.4软件设计 (14)4 系统调试 (20)总结 (21)参考⽂献 (22)致谢 (26)随着电⼦技术的飞速发展,单⽚机也步如⼀个新的时代,越来越多的功能各异的单⽚机为我们的设计提供了许多新的⽅法与思路。

51单片机多机通信过程

51单片机多机通信过程

51单片机多机通信过程51单片机具有多机通信的功能,可实现一台主机于多台从机的通信。

多机通信充分利用了单片机内部的多机通信控制位SM2。

当从机SM2,1时,从机只接收主机发出的地址帧(第九位为1),对数据帧(第九位为0)不予理睬;而当SM2=0时,可接收主机发送过来的所有信息。

多机通信的过程如下:(1)所有从机SM2均置1,处于只接收地址帧状态。

(2)主机先发送一个地址帧,其中前8位数据表示地址,第9位为1表示该帧为地址帧。

(3)所有从机接收到地址帧后,进行中断处理,把接收到的地址与自身地址相比较。

地址相符时将SM2清成0,脱离多机状态,地址不相符的从机不作任何处理,即保持SM2,1。

(4)地址相符的从机SM2=0,可以接收到主机随后发来的信息,即主机发送的所有信息。

收到信息TB8=0,则表示是数据帧,而对于地址不符的从机SM2=1,收到信息TB8=0,则不予理睬,这样就实现了主机与地址相符的从机之间的双机通信。

(5)被寻址的从机通信结束后置SM2=1,恢复多机通信系统原有的状态。

主机:设置为SM2=0。

这是双机通信的形式,可以任意的发送和接收发送:以TB8=1发送,将发送到所有SM2=1的分机。

这是呼叫某个从机。

以TB8=0发送,将发送到SM2=0的分机。

这是双机通信的形式。

------从机:先设置为SM2=1。

这是多机通信的形式,只能收到RB8=1的。

接收:仅能收到RB8=1的数据,确认是呼叫本机时,令SM2=0。

设置为SM2=0后,是双机通信的形式。

追问那从机的RB8要怎么设,是需要软件设置还是单片机自己识别,在编程的时候要怎么写, 回答从机的RB8,不需要编程。

从机的RB8,是接收到的,它是主机发送出来的TB8。

想要对TB8进行控制,需要在主机中编程。

单片机多机通讯说明:该程序为多机通讯程序,最多可以挂255个从机。

该程序主机发送端与多个从机的接收端相接,主机的接收端与多个从机的发送端相接。

最新-MCS51系列单片机双机并行互连的实现方法 精品

最新-MCS51系列单片机双机并行互连的实现方法 精品

MCS51系列单片机双机并行互连的实现方法摘要介绍了在同一系统内,51系列两单片机之间采用单向并行通信接口、主从双向并行通信接口、无主从双向并行通信操作实现双机互连的方法,分析了在每一种通信接口工作方式下数据传送的特点。

在三种并行通信接口为单片机应用系统扩充硬件资源的设计提供了新的途径。

关键词单片机并行通信接口数据传送由于51系列单片机具有性能稳定、工作可靠、价格低廉等特点,因此其应用相当广泛。

一个51系列的单片机如89内部包含有、、两个或者三个16位的定时器计数器、一个通用异步串行通信控制器等多种资源。

但即便如此,在一些相对复杂的单片机应用系统中,仅仅一个单片机资源还是不够的,因此而常常需要扩充接口、定时器计数器、串行通信接口、、等。

采用通用的标准器件进行扩充是通常的做法,但将单片机本身作为一个通用的扩充器件来使用,也不失为一个好的方法。

在这种情况下,一个系统中就使用了两个或两个以上的单片机,而单片机之间就要通过互连来进行数据通信。

51系列的单片机以下简称单片机都带有串口,利用串口进行互连通信极为方便,其各种连接方式在许多书籍和资料上都有介绍,在此不再重述。

但如果系统要求扩充的资源是对外连接的串口,或对相互之间的数据传送有一定的速度要求,则单片机的串口就不能用作系统内两单片机的通信接口了。

所幸的是,单片机的并行端口也能相互连接来进行数据通信。

根据单片机端口内部结构的特点,这些端口的端口线可以直接相连,从而使两单片机之间并行通信接口的实现不用另外的硬件电路设备。

基于这种情况,设计时,可根据不同的使用要求,来采用不同的并行连接方法。

下面介绍在两个单片机之间进行三种并行通信接口的实现方法。

1单向并行通信接口的实现在应用中,如果只需一个单片机向另一个单片机传送数据,则可以采用单向并行通信接口方式,这种方式较为简单。

图1所示为单向并行通信接口的组成方法。

51单片机双机串行通信设计

51单片机双机串行通信设计

*******************实践教学*******************XXXXXX大学XXXXXXX学院XXXX年XXX季学期XXXXX课程设计题目:51单片机双机串行通信设计专业班级:姓名:学号:指导教师:成绩:前言在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。

单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。

同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。

各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。

串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。

在通信过程中,使用通信协议进行通信。

关键字:51单片机串行通信RS-232接口标准目录前言 0目录 (1)1 基本原理 (3)1.1串行通信与并行通信 (3)1.2串行接口的基本特点 (3)1.3波特率选择 (5)1.4通信协议的使用 (6)1.551单片机的结构和作用 (6)1.6双机通信 (7)2 系统分析 (8)2.1汇编语言和C语言的特点及选择 (8)2.2并行通信与串行通信的比较 (8)2.3串行通信程序设计的比较 (8)2.4同步通信与异步通信的区别 (8)3 系统设计 (10)3.1设计要求 (10)3.2设计方案 (10)3.3硬件设计 (10)3.4软件设计 (13)4 系统调试 (22)总结 (24)参考文献 (25)1 基本原理1.1 串行通信与并行通信计算机与外界的信息交换称为通信。

基于51单片机的双机串行通信课程设计-1000110061

基于51单片机的双机串行通信课程设计-1000110061

基于51单片机的双机串行通信课程设计-1000110061基于AT89C51单片机的双机串行通信设计姓名:杨应伟学号:100110061专业:机械设计制造及其制动化班级:机电二班前言单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域随着计算机技术的发展及工业自动化水平的提高, 在许多场合采用单机控制已不能满足现场要求,因而必须采用多机控制的形式,而多机控制主要通过多个单片机之间的串行通信实现。

串行通信作为单片机之间常用的通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一的标准, 因此其在工业控制领域得到了广泛的应用。

在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。

单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。

同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。

各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。

串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。

在通信过程中,使用通信协议进行通信。

在测控系统和工程应用中,常遇到多项任务需同时执行的情况,因而主从式多机分布式系统成为现代工业广泛应用的模式。

单片机功能强、体积小、价格低廉、开发应用方便,尤其具有全双工串行通讯的特点,在工业控制、数据采集、智能仪器仪表、家用电器方面都有广泛的应用。

同时,IBM-PC机正好补充单片机人机对话和外围设备薄弱的缺陷。

各单片机独立完成数据采集处理和控制任务,同时通过通信接口将数据传给PC机,PC机将这些数据进行处理、显示或打印,把各种控制命令传给单片机,以实现集中管理和最优控制。

51单片机双机通信仿真

51单片机双机通信仿真

51单片机双机通信仿真
51单片机双机通信仿真需要使用仿真软件,例如Proteus等,同时还需要掌握51单片机的通信协议。

一般而言,可以通过串口通信、I2C总线、SPI总线等方式实现双机通信。

以下是基于串口通信的示例:
1. 确定双方的串口通信参数,例如波特率、数据位、校验位和停止位等。

2. 编写发送和接收程序,根据协议制定消息格式并进行数据打包和解析。

发送程序中将消息通过串口输出到对应的接收端口。

3. 在仿真软件中添加串口模块,设置对应的参数并连接发送端口和接收端口。

4. 运行仿真程序,可以使用oscilloscope等工具查看串口状态和数据传输情况。

以上仅为简单示例,具体实现还需考虑实际应用场景和通信需求。

MCS51系列单片机双机互连方法探讨

MCS51系列单片机双机互连方法探讨

MCS51系列单片机双机互连方法探讨摘要:介绍了MCS51系列两单片机之间采用单向并行通信接口、主从双向并行通信接口、无主从双向并行通信操作实现双机互连的方法,分析了在每一种并行通信接口方式下数据传送的特点,为单片机系统互连提供了新的方法。

关键词:单片机;并行通信;接口;数据传送中图分类号:TP368.1文献标识码:A文章编号:16723198(2009)21028001?お?MCS51系列单片机具有性能稳定、工作可靠、价格低廉等优点。

以8051为例,其包含有256B的RAM、4KB的ROM、5个中断源、四个并行I/O口和一对通用串行通信接口等资源。

但即便如此,在一些复杂的单片机应用系统中,常常需要两个以上的单片机同时工作,并要求他们之间能够进行数据通信。

MCS51系列单片机都带有串口,利用串口进行通信极为方便,但如果系统要求通过串口扩展其他系统资源,或对单片机之间的数据传送有一定的速度要求时,串口就不能再用作多个单片机间的通信接口了,这时我们可以利用单片机的并行端口来进行数据通信。

根据单片机并行接口的特点,这些端口可以不用其他外设而直接相连,并可以按照不同的通信要求,采用以下三种连接方式进行数据通信。

1 单向并行通信在应用中,如果只需单方向传送数据,则可以采用单向并行通信接口方式,这种方式较为简单。

根据接收机工作原理的不同又可分为中断方式和查询方式。

由于查询方式下单片机工作效率低,所以一般均采用中断工作方式。

图1所示即为中断工作方式下单向并行通信接口的组成方法。

图中,单片机A为数据发送方,单片机B为数据接收方,8位端口可以使用P0口。

数据传送的流程是:单片机A将数据送到端口后,通过STB信号中断单片机B,单片机B进入中断并从端口读取数据,读完后,利用BUSY信号进行应答,单片机A在检查到端口线CLK上的应答信号后,就可以发送下一个数据了。

2 主从双向并行通信主从双向并行通信接口的特点是两单片机都能够将数据发送到对方,但这种方法必须有一个单片机处在主机状态,另一个单片机处在从机状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
case'A':L1=~L1;L2=0;P1=0xf9;break;
case'B':L1=~L1;L2=~L2;P1=0xa4;break;
case'C':L1=0;L2=0;P1=0xb0;break;
}
}
delay_ms(100);
}
}
/*********************************************************
左边1号机,右边2号机,,功能实现
1号机程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit p10=P1^0;
uchar a,b,kk;
//uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
sbit L1=P2^0;
sbit L2=P2^1;
//uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void delay_ms(int x)
{
uchar i;
while(x--)
for(i=0;i<120;i++)
;
}
void main()
{
SCON=0x50;//串行口工作方式1,8位通用异步发送器
TMOD=0x20;//定时器1工作方式2
PCON=0x00;//波特率不倍增
TH1=0xf4;
TL1=0xf4;
TR1=1;
P1=0xc0;
L1=L2=0;
while(1)
{
if(RI)
{
RI=0;
switch(SBUF)
void delay_ms(uchar y)
{
uchar i;
while(y--)
for(i=0;i<120;i++)
;
}
void put(uchar x) //发送函数
{
SBUF=x;//SBUF:串行口数据缓冲器
while(TI==0);//等待发送结束
TI=0;
}
void main()
{
uchar j;
j=0;
}
if(kk==1)
put('A');
if(kk==2)
put('B');
if(kk==3)
put('C');
delay_ms(10);
}
}
/*
**********************************************************************
if(p10==0&&j==0)
while(p10==0);
kk=1;
P2=0xf9;
j=1;
}
if(p10==0&&j==1)
{
delay_ms(15);
while(p10==0);
kk=2;
P2=0xa4;
j=2;
}
if(p10==0&&j==2)
{
delay_ms(15);
while(p10==0);
kk=3;
P2=0xb0;
}
delay_ms(10);
********************************************************************
if(p10==0)
{
delay_ms(15);
while(p10==0);
j=(j+1)%3;
}
switch(j)
{
case 0:put('A');P2=~0xf9;break;
if(RI)
{
RI=0;
if(SBUF=='A')
{L1=~L1;P1=0xf9;}
if(SBUF=='B')
{L1=~L1;L2=~L2;P1=0xa4;}
if(SBUF=='C')
{L1=0;L2=0;P1=0xc0;}
}
**********************************************************/
case 1:put('B');P2=~0xa4;break;
case 2:put('C');P2=~0xc0;break;
}
delay_ms(10);
*/
2号机程序。
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
{
delay_ms(15);
while(p10==0);
kk=0;
P2=~0xf9;
j=1;
}
if(p10==0&&j==1)
{
delay_ms(15);
while(p10==0);
kk=1;
P2=~0xa4;
j=2;
}
if(p10==0&&j==2)
{
delay_ms(15);
while(p10==0);
SCON=0x40; //串行口工作方式1,8位通用异步发送器
TMOD=0x20;//定时器1工作方式2
PCON=0x00;//波特率不倍增
TH1=0xf4;
TL1=0xf4;//波特率2400
TR1=1;//定时器1开始计时
P2=0xc0;
while(1)
{
if(p10==0&&j==0)
{
delay_ms(15);
kk=2;
P2=~0xc0;
j=0;
}
if(kk==0)
put('A');
if(kk==1)
put('B');
if(kk==2)
put('C');
delay_ms(100);
***********************************************************
if(p10==0)
{
delay_ms(15);
while(p10==0);
;
}
switch(oper)
{
case 0:break;
case 1:put('A');P2=~0xf9;break;
case 2:put('B');P2=~0xa4;break;
case 3:put('C');P2=~0xc0;break;
相关文档
最新文档