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所示为单向并行通信接口的组成方法。

单片机实现双机通信自己的

单片机实现双机通信自己的

单片机实现双机通信自己的单片机是一种集成电路芯片,可以实现各种功能。

双机通信是指两台或多台计算机通过网络或其他方式进行数据传输和通信的过程。

在很多应用中,需要使用单片机实现双机通信,以实现数据传输和信息交换等功能。

单片机实现双机通信的基本原理是通过通信端口(例如串口或网络接口等)进行数据的发送和接收。

在这个过程中,需要使用一些通信协议来规定数据的格式和传输的方式。

下面是一种基于串口通信的单片机双机通信的实现方法。

首先,我们需要确定通信的硬件配置。

通常情况下,可以通过串口连接两台单片机,其中一台设置为发送方,另外一台设置为接收方。

发送方将待发送的数据通过串口发送出去,接收方则接收这些数据。

在单片机程序代码的编写方面,我们需要首先配置串口的通信参数,例如波特率、数据位、停止位、奇偶校验等。

这些参数需要在发送方和接收方进行一致配置,以保证数据的正确传输。

接下来,我们需要实现发送和接收的程序。

首先,发送方需要将待发送的数据存储在发送缓冲区中,然后通过串口将数据发送出去。

接收方则需要实时监听串口接收缓冲区中是否有数据到达,并将接收到的数据存储在接收缓冲区中。

另外,为了保证数据的正确传输,通常还要实现一些数据校验机制,例如奇偶校验、循环冗余校验(CRC)等。

这些校验机制可以用于检测和纠正数据传输中的错误。

在程序编写的过程中,还需要考虑到程序的稳定性和容错性。

例如,在发送方发送数据时,可能会遇到发送缓冲区已满的情况,此时需要实现相应的处理机制,例如等待一段时间后再次发送。

同样,在接收方接收数据时,也可能会遇到接收缓冲区溢出的情况,此时需要及时处理,以避免数据的丢失。

最后,在实际应用中,还需要考虑一些高级的功能,例如数据压缩、加密、数据传输速度的控制等。

这些功能可以根据具体的需求进行实现。

总之,单片机实现双机通信是一项复杂的任务,需要考虑到硬件和软件两个方面的因素。

在程序编写的过程中,需要考虑到通信参数的配置、发送和接收的程序编写、数据校验、稳定性和容错性等方面的问题。

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)提高系统的扩展性:通过多机通信,可以实现系统的模块化设计,从而提高系统的扩展性。

51单片机串口多机通信的实现和编程

51单片机串口多机通信的实现和编程

51 单片机串口多机通信的实现和编程
一、51 单片机的主从模式,首先要设定工作方式3:(主从模式+波特率可变)
SCON 串口功能寄存器:SM0=1;SM1=1(工作方式3)
注:主机和从机都要为工作方式3。

【工作方式2 (SM0 SM1 :1 0):串行口为11 位异步通信接口。

发送或接收
一帧信息包括1 位起始位0、8 位数据位、1 位可编程位、1 位停止位1。


送数据:发送前,先根据通信协议由软件设置TB8 为奇偶校验位或数据标识位,然后将要发送的数据写入SBUF,即能启动发送器。

发送过程是由执行任何一条以SBUF 为目的寄存器的指令而启动的,把8 位数据装入SBUF,
同时还把TB8 装到发送移位寄存器的第9 位上,然后从TXD(P3.1)端口输出
一帧数据。

接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI 清0。

然后再根据SM2 的状态和所接收到的RB8 的状态决定此串行口在
信息到来后是否置R1=1,并申请中断,通知CPU 接收数据。

当SM2=0 时,
不管RB8 为0 还是为1,都置RI=1,此串行口将接收发送来的信息。


SM2=1 时,且RB8=1,表示在多机通信情况下,接收的信息为地址帧, 此时
置RI=1,串行口将接收发来的地址。

当SM2=1 时,且RB8=0,表示在多机通
信情况下,接收的信息为数据帧, 但不是发给本从机的,此时RI 不置为1,。

51单片机 双机 双工 及 CH451芯片显示 通信 C程序

51单片机 双机 双工 及 CH451芯片显示 通信 C程序

/************************************************************//*51单片机双机双工及CH451芯片显示通信C程序*//*************************************************************/#include<reg51.h>sbit DIN=P1^0;sbit DCLOK=P1^1;sbit LOAD=P1^2;sbit DOUT=P3^3;unsigned char t,r,re,K;void InitUart();send (unsigned int s);unsigned int receive();/******** 主函数************/void main(){InitUart(); //初始化串口send(0x0403); //设定系统参数,关闭键盘扫描,开启显示扫描驱动send(0x500); //设定显示参数EX1=1;EA=1;while(1); //等待串口发来数据}/******* 键盘中断函数*********/void intr_int2() interrupt 2{EA=0;send(0x700); //发送读键码命令EA=1;t=receive(); //接收并判断键码,将键码结果放入SBUF中发送TI=0; //发送数据SBUF=t;while(!TI);TI=0;}/******* 串口中断函数*********/void intr_int4() interrupt 4{ EA=0;RI=0; //清除串口接收中断标志re=SBUF; //收到的数据送数码管显示if(re!=0){send(0x300); //左移1位send(0x800|re);}EA=1;}/****** 发送数据函数******/ send (unsigned int s){unsigned char i,t;LOAD=0;for(i=0;i<12;i++){t=s&0x001;DIN=t;DCLOK=0;DCLOK=1;s=s>>1;}LOAD=1;}/******* 接收数据函数******/ unsigned int receive(){unsigned char i;unsigned char r=0;for(i=0;i<7;i++) //接收键码{r=r<<1;r=r|DOUT;DCLOK=1;DCLOK=0;}switch(r) //判断键码{case 0x53:K=0x3f;break;case 0x52:K=0x06;break;case 0x4A:K=0x5b;break;case 0x42:K=0x4f;break;case 0x51:K=0x66;break;case 0x49:K=0x6d;break;case 0x41:K=0x7d;break;case 0x50:K=0x07;break;case 0x48:K=0x7f;break;case 0x40:K=0x6f;break;default:K=0x00;break;}return (K);}/******* 串口初始化函数******/void InitUart(){SCON=0X50; //串口工作在方式1,波特率9600bit/s,允许接收TMOD=0x20; //定时器T1,工作在方式1PCON=0x0;TH1=0xfd;TL1=0xfd;TR1=1;ES=1;}。

单片机双机通信(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 地址空间(乙机端可以直接访问到)。

单片机双机通信实验程序

单片机双机通信实验程序

P0|=0xe0; if((P0&0xe0)!=0xe0)
{ P3|=0xc0; P3&=0x7f; switch(P0&0xe0) {
case 0xe0: break; case 0x60: k=6;break; case 0xa0: k=5;break; case 0xc0: k=4;break; }
}
void ser() interrupt 4
{ RI=0;
//软件清零
a=SBUF; a=a-0x30;
//ASCII 码值转换
//W1=0;
flag=1;
}
unsigned char key() { unsigned char k=0; P0|=0xe0; P3&=0x3f; if((P0&0xe0)!=0xe0) { DelayMS(100);
while(!TI);
TI=0;
//软件清零
ES=1;
}
void main()
{
a=0; init(); while(1) {
Display1(); kk=key(); switch(kk) {
case 1: sendchar('1'); break; case 2: sendchar('2'); break; case 3: sendchar('3'); break; case 4: sendchar('4'); break; case 5: sendchar('5'); break; case 6: sendchar('6'); break; default:Display1(); break; } }

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。

proteus仿真51单片机串口双机通讯

proteus仿真51单片机串口双机通讯

51单片机的串口双机通讯一、什么是串口串口是串行发送数据的接口,是相对于并口来说的,是一个广泛的定义。

本期我们说的串口指的是指UART或是RS232。

二、什么是波特率波特率是指串行端口每秒内可以传输的波特位数。

这里所指的波特率,如标准9600不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位。

一个字节需要8个二进位,如用串口模式1来传输,那么加上起始位和停止位,每个数据字节就要占用10个二进位。

9600bps用模式1传输时,每秒传输的字节数是9600÷10=960个字节,发送一个字节大概需要1ms时间。

三、51单片机串口相关寄存器1、SCON串口控制寄存器(1)SM0和SM1:方式选择寄存器SM0 SM1 工作方式功能波特率0 0 方式0 8位同步移位寄存器晶振频率/ 120 1 方式1 10位UART 可变1 0 方式2 11位UART 晶振频率/32或晶振频率/64 1 1 方式3 11位UART 可变多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。

当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。

(3)REN:允许接收位REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收数据。

(4)TB8:要发送的第9位数据位在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址。

(5)RB8:接收到的第9位数据位当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到RB8中。

方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。

(6)TI:发送中断标志位方式0中,不用管他。

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所示为单向并行通信接口的组成方法。

MCS-51单片机的多机通信方式

MCS-51单片机的多机通信方式

多机通信原理
每台从机一个地址(编号) 系统中的通信总是由主机发起 主机向从机发送的信息分为地址字节和数据字节两种。地址字
节用于寻址从机,数据字节为发给从机的实际数据,二者可以 使用第9位来区分。地址字节帧的第9位为1,数据字节帧的第9 位为0 系统初始化时,将所有从机的SM2位置为1,并允许串行口接收 中断。这样,只有主机送来的地址帧才会被接收
单片机原理与应用
MCS-51单片机的多机通信方式
SCON中的SM2位可以作为多处理机通信位,使单片机方便地 应用于集散式分布系统中
集散式分布系统,或者称为分布式控制系统(DCS),是相对于 集中式控制系统而言的一种新型计算机控制系统,它是在集中 式控制系统的基础上发展、演变而来的。这种系统中,有一台 主机和多台从机。主机负责全局运行情况的监视、统计、控制 等,各从机负责本地信号的采集处理、本地资源的控制。主机 和从机通过通信线路相联系
1.2 通信协议的设计
通信协议中,除规定命令、数据的格式,还有以下一些方面需 要特别考虑
命令的顺序 差错处理 超时处理
单片机原理与应用
ห้องสมุดไป่ตู้
1.1 多机通信原理
主从式多机通信连接方式
多机通信原理
当串行口工作在方式2或3时 若SM2=1,则只有接收到的第9位数据(RB8)为1时,才将数据
送入接收缓冲器SBUF,并置位RI,申请中断,否则丢弃接收 到的数据 若SM2=0,则无论第9位数据(RB8)是1还是0,都将数据装入 SBUF,置位RI,申请中断
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机实现双机通信(自己整理的)
左边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};
void delay_ms(uchar y)
{
uchar i;
for(i=0;i<120;i++)
;
}
void put(uchar x) //发送函数
{
SBUF=x; //SBUF:串行口数据缓冲器while(TI==0); //等待发送结束
TI=0;
}
void main()
{
uchar j;
SCON=0x40; //串行口工作方式1,8位通用异步发送器
TMOD=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增
TH1=0xf4;
TL1=0xf4; //波特率2400
TR1=1; //定时器1开始计时
P2=0xc0;
{
if(p10==0&&j==0) {
delay_ms(15);
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;
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)
{
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); 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);
number=(number+1)%4;
}
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;
}
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;
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
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)
{
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);
}
}
/**************************************** *****************
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;}
}
***************************************** *****************/。

相关文档
最新文档