单片机双机通信实验程序

合集下载

51单片机实现双机通信

51单片机实现双机通信

左侧 1 号机,右侧 2 号机,,功能实现1号机程序#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit 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;while(y--)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; TR1=1;// 波特率 2400// 准时器 1 开始计时P2=0xc0;while(1){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号机程序。

实验四两个单片机之间双向通信实验

实验四两个单片机之间双向通信实验

实验四两个单片机之间双向通信实验一、实验目的1.了解MCS-51单片机串行口(UART)的结构、工作方式。

2.了解串行口通信的原理和数据交换过程。

3.掌握单片机之间进行串行口通信的编程方法。

二、实验内容将甲乙两台单片机串行口连接,即甲机的TXD与乙机的RXD相连;甲机的RXD与乙机的TXD相连;并实现双机共地。

整个系统实现双向通信。

具体是:1.甲机的K1按键可通过串行口分别控制乙机的LED1点亮;LED2点亮;LED1和LED2全亮或者全灭。

2.乙机的K2按键可通过串行口向甲机发送数字,甲机将接收到的数字显示在其P0端口的LED数码管显示器上。

三、实验程序甲机程序:ORG 0000HAJMP MAINORG 0003HAJMP SENDORG 0023HAJMP READYMAIN: MOV SCON,#90HMOV PCON,#80HSETB EASETB ESSETB IT0SETB EX0MOV SP,#40HMOV R0,#0MOV DPTR,#TAB HERE: SJMP HERESEND: CJNE R0,#04H,LP1 SHOW: MOV A,R0MOV C A,A+DPTRMOV C,PMOV TB8,CMOV SBUF,ACLR TIINC R0RETIREADY: JBC TI,RETURN RECEIVE:CLR RIMOV A,SBUFMOV P0,ARETURN: RETILP1:JC SHOWCLR CMOV A,R0SUBB A,#04HMOV R0,AAJMP SHOWTAB: DB 00H,01H,02H,03H END乙机程序:ORG 0000HAJMP MAINORG 0003HAJMP SENDORG 0023HAJMP READYMAIN: MOV SCON,#90H MOV PCON,#80HSETB EASETB ESSETB IT0SETB EX0MOV SP,#40HMOV R0,#0MOV DPTR,#TABHERE: SJMP HERESEND: CJNE R0,#09H,LP1 SHOW: MOV A,R0MOV C A,A+DPTRMOV C,PMOV TB8,CMOV SBUF,ACLR TIINC R0RETIREADY: JBC TI,RETURN RECEIVE:CLR RIMOV A,SBUFMOV P1,ARETURN: RETILP1: JC SHOWCLR CMOV A,R0SUBB A,#0AHMOV R0,AAJMP SHOWTAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH END四、实验原理图五、实验仿真及结果六、实验总结通过本次实验,掌握了单片机之间进行串行口通信的编程方法,对MCS-51单片机串行口(UART)的结构、工作方式都有了进一步的了解。

单片机单片机课程设计-双机串行通信

单片机单片机课程设计-双机串行通信

单片机单片机课程设计-双机串行通信单片机课程设计双机串行通信在当今的电子信息领域,单片机的应用无处不在。

而双机串行通信作为单片机系统中的一个重要环节,为实现设备之间的数据交换和协同工作提供了关键的技术支持。

一、双机串行通信的基本原理双机串行通信是指两个单片机之间通过串行接口进行数据传输的过程。

串行通信相较于并行通信,具有线路简单、成本低、抗干扰能力强等优点。

在串行通信中,数据是一位一位地按顺序传输的。

常见的串行通信协议有 UART(通用异步收发器)、SPI(串行外设接口)和 I2C(内部集成电路)等。

在本次课程设计中,我们主要采用 UART 协议来实现双机串行通信。

UART 协议包括起始位、数据位、奇偶校验位和停止位。

起始位用于标识数据传输的开始,通常为逻辑 0;数据位可以是 5 位、6 位、7 位或 8 位,具体取决于通信双方的约定;奇偶校验位用于检验数据传输的正确性,可选择奇校验、偶校验或无校验;停止位用于标识数据传输的结束,通常为逻辑 1。

二、硬件设计为了实现双机串行通信,我们需要搭建相应的硬件电路。

首先,每个单片机都需要有一个串行通信接口,通常可以使用单片机自带的UART 模块。

在硬件连接方面,我们将两个单片机的发送端(TXD)和接收端(RXD)交叉连接。

即单片机 A 的 TXD 连接到单片机 B 的 RXD,单片机 B 的 TXD 连接到单片机 A 的 RXD。

同时,还需要共地以保证信号的参考电平一致。

此外,为了提高通信的稳定性和可靠性,我们可以在通信线路上添加一些滤波电容和上拉电阻。

三、软件设计软件设计是实现双机串行通信的核心部分。

在本次课程设计中,我们使用 C 语言来编写单片机的程序。

对于发送方单片机,首先需要对 UART 模块进行初始化,设置波特率、数据位、奇偶校验位和停止位等参数。

然后,将要发送的数据放入发送缓冲区,并通过 UART 发送函数将数据一位一位地发送出去。

对于接收方单片机,同样需要对 UART 模块进行初始化。

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

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

51单片机双机串行通信设计51单片机是一款广泛应用于嵌入式系统中的微控制器,具有高性能和低功耗的特点。

在一些场景中,需要使用51单片机之间进行双机串行通信,以实现数据传输和协同工作。

本文将介绍51单片机双机串行通信的设计,包括硬件连接和软件编程。

一、硬件连接1.串行通信口选择:51单片机具有多个串行通信口,如UART、SPI 和I2C等。

在双机串行通信中,可以选择其中一个串行通信口作为数据传输的接口。

一般来说,UART是最常用的串行通信口之一,因为它的硬件接口简单且易于使用。

2.引脚连接:选定UART口作为串行通信口后,需要将两个单片机之间的TX(发送)和RX(接收)引脚相连。

具体的引脚连接方式取决于所使用的单片机和外设,但一般原则上是将两个单片机的TX和RX引脚交叉连接。

二、软件编程1.串行通信初始化:首先需要通过软件编程来初始化串行通信口。

在51单片机中,可以通过设置相应的寄存器来配置波特率和其他参数。

具体的初始化代码可以使用C语言编写,并根据所使用的开发工具进行相应的配置。

2.发送数据:发送数据时,可以通过写入相应的寄存器来传输数据。

在51单片机中,通过将数据写入UART的发送寄存器,即可将数据发送出去。

发送数据的代码通常包括以下几个步骤:(1)设置发送寄存器;(2)等待数据发送完成;(3)清除数据发送完成标志位。

3.接收数据:接收数据时,需要通过读取相应的寄存器来获取接收到的数据。

在51单片机中,可以通过读取UART的接收寄存器,即可获取到接收到的数据。

接收数据的代码通常包括以下几个步骤:(1)等待数据接收完成;(2)读取接收寄存器中的数据;(3)清除数据接收完成标志位。

4.数据处理:接收到数据后,可以进行相应的数据处理。

根据具体的应用场景,可以对接收到的数据进行解析、计算或其他操作。

数据处理的代码可以根据具体的需求进行编写。

5.中断服务程序:在双机串行通信中,使用中断可以提高通信的效率。

单片机双机通信实验报告

单片机双机通信实验报告

计算机与信息工程学院综合性实验报告专业:物联网年级/班级: 2015—2016学年第一学期课程名称单片机原理及应用指导教师学号姓名实验地点实验时间2015.11.14项目名称单片机双机通信实验类型综合性一、实验目的1.学习双机通信的基本使用方法。

2.学习双机通信程序的编程方法。

二、实验仪器或设备CPU挂箱、AT89S51CPU模块三、总体设计(设计原理、设计方案及流程等)1.设计原理:串行口工作方式1为波特率可变的8位UART方式。

主要用于单片机系统之间或单片机与PC之间的数据通信。

方式1通信时,一帧数据由10位组成:1个起始位、8个数据位和1个停止位。

这种方式常通过发送数据块的累加和实现数据校验。

2.设计方案:设有甲、乙两个AT89S51单片机应用系统,现需要将甲单片机外RAM 4000H~43FFH 单元的内容传送到乙单片机,并将数据存放到乙单片机从8000H开始的单元,电路图如下图所示。

如传送正确,图中发光二极管灭,否则发光二极管亮。

3.流程:使用查询方式进行通信,通信过程分为两步:第一步为握手,第二步为传输数据。

如果甲单片机收到乙单片机的应答为“A”,则重复上述发送过程,直到数据发送完成,并且置p1.3为1;否则,置P1.2为1,图中发光二极管亮,并退出。

四、实验步骤(包括主要步骤、代码分析等)五、结果分析与总结结果图:①结果分析程序作用为甲乙两台机器进行连接通讯,如果通讯成功则亮灯提示(Led1),在通讯成功以后开始发送数据,如果发送成功则乙机器会发送一个确认信息,在比对确认乙收到的是正确信息以后亮灯提示(Led3)。

②总结本次实验为双机通信实验,在本次实验中,我们使用给定的代码进行操作,但是在实验中却发现很多问题。

比如在设备连接好以后发现无法传输数据,我们发现错误发生在给定的代码上,两台计算机所使用的频率不同,导致无法传输数据。

在程序没有编写错误的时候,我们不会去找程序的错误,而是反复的查看和检测连接方面的问题,这反映了我们对错误应变能力太差,一味的去相信书中的程序,有时候正确的程序在不合适的设备上使用就会出现错误。

实验七_双机通信实验

实验七_双机通信实验

实验七、双机通信实验 一、实验目的掌握单片机串行口的工作原理及编程。

二、实验内容用两台单片机进行双机通讯,主控制器识别到按键按下,控制从机显示0-9字符。

三、实验接线图四、实验程序1、程序流程图如图7-1所示。

主机识别到键按下,向从机发送数据块长度、0-9数据及校验和。

从机接收到数据后,显示数据并向主机发应答码00H ,主机根据应答信号,显示通信状态代码。

2、波特率计算选fosc=11.0592MHz, 波特率=2400bps ,通信为方式1,(SMOD)为1,(TMOD)=0x20;( PCON) =0x80; 由波特率计算公式算得 (TH1)≈e8H 。

图7-1 实验接线图[](TH1)-25612T1T1322osc SMOD⨯=⨯=f 溢出率溢出率,波特率3、源程序 1)主机源程序// 识别到按键按下,发送0-9数据给从机,并显示通信状态码 #include<reg51.h> #include<intrins.h>#define uint unsigned int #define uchar unsigned charsbit K=P3^2; //定义按键K ,用于控制U2void SEND(uchar s_data)//发送一个字节数据 {SBUF=s_data; while(TI==0); TI=0;}uchar RCV(void)//接收一个字节数据 {while(RI==0); RI=0; return(SBUF);}void D_1S(void) {uint N=500,i;while(N--) for(i=0;i<100;i++) _nop_();}void DIS(uchar dis)//显示dis 中字形码对应的字符 { P0=dis; D_1S(); P0=~0x00;}void MAIN(void){ uchar data SUM,LEN;// SUM,校验和;LEN ,数据块长度; uchar i,ans; //ans 接收的应答数据图7-2 主机程序流程图 图7-3 从机程序流程图SP=0x5f; P0=~0x00; //数码块消隐TMOD=0x20; //T1:8位自动重装定时器TL1=0xe8;TH1=0xe8;PCON=0x80;TR1=1;//F=11.0592MHz,BPS=2400SCON=0x40; //10位,禁止接收//-------扫描按键-------key0:K=1; if(K!=0) goto key0;//-------发送数据块和校验和-------S_0:SUM=0x00; LEN=10; SEND(LEN);for(i=0;i<LEN;i++){SEND(i); SUM+=i; }SEND(SUM);//-------接收从机发来的响应数据-------REN=1; ans=RCV(); REN=0;if(ans==0x00) //发送正常,显示“0”{ DIS(~0x3f); goto key0;}else //发送异常,显示“1”,并重新发送数据{ DIS(~0x06); goto S_0;}}2)从机源程序// 接收数据0-9,并用数码块显示,之后接收正常向主机发00H,否则发送01H#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar data LS0[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};void SEND(uchar s_data)//发送一个字节数据{SBUF=s_data; while(TI==0); TI=0;}uchar RCV(void)//接收一个字节数据{while(RI==0); RI=0; return(SBUF);}void D_1S(void){uint i,N=500;while(N--) for(i=0;i<100;i++) _nop_();}void DIS(uchar LEN,uchar r_data[11])//显示0-9{uchar data i;for(i=0;i<LEN;i++) {P0=LS0[r_data[i]]; D_1S(); P0=~0x00;}}void MAIN(void){ uchar data SUM,LEN; //SUM,校验和;LEN,数据块长度;ID,从站地址uchar data i,r_data[10],RSUM;//r_data接收的数据,RSUM接收的校验和SP=0x5f; P0=~0x00; TMOD=0x20;TL1=0xe8;TH1=0xe8;PCON=0x80;TR1=1; SCON=0x40;R_D:REN=1;SUM=0x00;LEN=RCV();for(i=0;i<LEN;i++){r_data[i]=RCV(); SUM+=r_data[i];}RSUM=RCV();if(RSUM==SUM){DIS(10,r_data);SEND(0x00);goto R_D;}else {SEND(0x01);goto R_D;}}五、实验步骤1、按图7-1接线;2、用keil软件编辑、编译源程序,生成两个hex文件。

单片机双机通信实验报告

单片机双机通信实验报告

单片机双机通信实验报告
实验目的:
1. 了解单片机之间的串口通信原理;
2. 掌握单片机之间的双机通信方法;
3. 实现单片机之间的数据互相传输。

实验器材:
1. 单片机开发板(两块);
2. USB转串口模块(两个);
3. 杜邦线若干;
4. 电脑。

实验步骤:
首先,将单片机开发板和USB转串口模块进行连接,具体的连接方法如下:
1. 将USB转串口模块的TXD引脚连接到单片机开发板的RXD引脚上;
2. 将USB转串口模块的RXD引脚连接到单片机开发板的TXD引脚上;
3. 将USB转串口模块的GND引脚连接到单片机开发板的GND引脚上;
4. 将USB转串口模块的VCC引脚连接到单片机开发板的VCC引脚上。

接下来的步骤如下:
1. 打开两台电脑上的串口调试助手软件,并分别将波特率设置为相同的数值(例如9600);
2. 在一台电脑上,发送数据给另一台电脑。

具体的操作是在串口调试助手软件上输入要发送的数据,然后点击发送按钮;
3. 在另一台电脑上,接收来自第一台电脑发送的数据。

具体的操作是在串口调试助手软件上点击接收按钮,然后可以看到接收到的数据。

实验结果:
通过实验可以看到,单片机之间成功地实现了数据的双向传输。

一台单片机发送的数据可以被另一台单片机接收到。

实验总结:
本实验通过串口通信的方式实现了单片机之间的双机通信。

通过这种方式,可以方便地实现单片机之间的数据互相传输,可以用于各种应用场景,如传感器与控制器之间的数据传输等。

同时要注意,串口通信的波特率要设置一致,否则数据将无法正确接收。

单片机实验三双机通信实验程序

单片机实验三双机通信实验程序

单片机实验三双机通信实验程序第一篇:单片机实验三双机通信实验程序实验三双机通信实验一、实验目的UART 串行通信接口技术应用二、实验实现的功能用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。

三、系统硬件设计实验所需硬件:电脑一台;开发板一块;串口通信线一根; USB线一根;四、系统软件设计实验所需软件:编译软件:keil uvision3;程序下载软件:STC_ISP_V480;试验程序:#include sbit W1=P0^0;sbit W2=P0^1;sbit W3=P0^2;sbit W4=P0^3;sbit D9=P3^2;sbit D10=P3^3;sbit D11=P3^4;sbit D12=P3^5;sbit DP=P1^7;code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sfr P1M1=0x91;sfr P1M0=0x92;sbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;unsigned char dat;unsigned char keynum;unsigned char keyscan();void display();void delay(void);L1=1;L2=1;L3=1;H1=0;if(L1==0)return 1;else if(L2==0)return 2;else if(L3==0)return 3;H1=1;H2=0;if(L1==0)return 4;else if(L2==0)return 5;else if(L3==0)return 6;H2=1;return 0;} unsigned char keyscan(){ static unsigned int ct=0;static unsigned char lastkey=0;unsigned char key;key=getkey();if(key==lastkey){ct++;if(ct==900){ct=0;lastkey=0;return key;} } else {第二篇:单片机串行通信实验实验四单片机串行通信实验一、实验目的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:感谢大家的阅读,本文由我司收集整编。

单片机双机串行实验报告

单片机双机串行实验报告

单片机双机串行通信实验报告班级:姓名:老师:一、实验名称:两个单片机之间串行接口通信二、实验原理:1单片机串行接口通信功能:图①AT89C51计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。

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

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

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

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

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

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

串行接口工作方式特点见下表SM0 SM1 工作方式功能波特率0 0 0 8位同步移位寄存器(用于I/O扩展)f ORC/120 1 1 10位异步串行通信(UART)可变(T1溢出率*2SMOD/32)1 02 11位异步串行通信(UART)f ORC/64或f ORC/321 1 3 11位异步串行通信(UART)可变(T1溢出率*2SMOD/32)SM2:多机通信控制位。

REN:接收允许控制位。

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

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

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

STC89C52双机通信实验

STC89C52双机通信实验

单片机课程实验报告实验名称:双机通信实验实验学时专业电子信息技术与仪器班级姓名学号指导教师日期实验成绩一、实验目的UART 串行通信接口技术应用二、实验原理图三、实验程序/*妨碍本次实验成果的最大障碍是键盘扫描部分,由于未使用P×口直接赋值形式,而是用H1=0 H2=0的形式为及时关闭H1;导致键盘扫描只能扫描K、K2、K3,解决办法:在条件允许的情况下避免使用H1、H2的检测方式或者以后使用时直接复制,而非自己敲写*/#include <reg52.h>/**/#define uint unsigned int#define uchar unsigned char/*f0为单片机晶振*/#define N 46080 /*N=50000*f0/12,定时50ms*/#define M 20 /* 定时M*0.05s */sbit W1=P0^0;sbit H1=P3^6;sbit H2=P3^7;sbit LED=P2^0;uchar key=0;uchar rxd;uchar code duanxuan[]={0x3f,/*显示0*/0x06,/*显示1*/0x5b,/*显示2*/0x4f,/*显示3*/0x66,/*显示4*/0x6d,/*显示5*/0x7d,/*显示6*/};sfr P1M1=0x91;//和后面的main函数中的sfr P1M0=0x92;//P1M1 P1M0合在一起增加亮度void delay_ms(uint x) //*延时子函数程序{uint i,j;for(i=x;i>0;i--)for(j=250;j>0;j--); //*该层循环延时约1ms*/}/************数码管显示函数ok******************/void displays(uchar key_num2){W1=0;P1=duanxuan[key_num2];}/****************************************************/void send(uchar key_num1){SBUF=key_num1; //sbuf接收串口中的数据,串口发送数据while(!TI);//串口中的数据发送完毕后TI自动由0变为1TI=0; //置零,打开发送中断允许,为下一次发送做准备}/************矩阵键盘扫描,同时可进行数码管各位的+-***********/ void keyscan()//如何确定时间设定时数码管显示的数字是否会自动+1 { /*当两行H1、H2重新赋值时存在冲突,解决办法为:H1=1时H2=0,H2=1时H1=0*/ uchar temp;/***扫描第一行**/H1=0;H2=1;//扫描第一行temp=P0;temp=temp|0x1f;//读取L1、L2、L3的状态/***判断哪个键摁下***/if(temp!=0xff)//判断是否有键摁下{delay_ms(10);//延时H1=0;H2=1;//扫描第一行//重新读取temp=P0;temp=temp|0x1f;//读取L1、L2、L3的状态if(temp!=0xff)//消抖{switch(temp)//判断哪个键摁下{case 0x7f:key=3;break;case 0xbf:key=2;break;case 0xdf:key=1;break;} //键1 2 3 分别摁下while(temp!=0xff)//按键释放才会跳出循环{H1=0;H2=1;//扫描第一行//重新读取temp=P0;temp=temp|0x1f;//读取L1、L2、L3的状态}}} /***扫描第二行**/H2=0;H1=1;//扫描第二行temp=P0;temp=temp|0x1f;//读取L1、L2、L3的状态/***判断哪个键摁下***/if(temp!=0xff)//判断是否有键摁下{delay_ms(10);//延时H2=0;H1=1;//扫描第二行//重新读取temp=P0;temp=temp|0x1f;//读取L1、L2、L3的状态if(temp!=0xff)//消抖{switch(temp)//判断哪个键摁下{case 0x7f:key=6;break;case 0xbf:key=5;break;case 0xdf:key=4;break;} //键4 5 6 分别摁下while(temp!=0xff)//按键释放才会跳出循环{H2=0;H1=1;//扫描第二行//重新读取temp=P0;temp=temp|0x1f;//读取L1、L2、L3的状态}}}send(key);}/****************************************************/void main(){P1M1=0X00;P1M0=0XFF;EA=1;/*对寄存器进行操作,产生的9600bps,故不打开ET1*/ TMOD=0X20;TH1=0xfd;TL1=0xfd;TR1=1;/*SCON控制寄存器设置*/ES=1;SM0=0; //工作方式SM1=1; //SM0 SM1 10步异位收发器REN=1; //串行接收数据允许位while(1) /*等中断满足的条件*/{keyscan();}}/*在中断1中的while(!TI)中起作用*/ //识别码看时序图void S_serial()interrupt 4 //串口接收数据{ES=0;RI=0;rxd=SBUF;//串口接收一个字节的数据displays(rxd);//ES=1;} 四、调试过程与结果分析1、暂称双机分别为甲乙,甲单片机无按键摁下时,数码管显示0;有按键摁下,将按键编号发送到乙单片机,并由乙显示,但甲单片机数码管不显示按下的数值。

单片机双机之间的串行通信设计

单片机双机之间的串行通信设计

单片机双机串行实验报告实验报告:单片机双机串行通信实验一、实验目的本实验旨在通过单片机实现双机间的串行通信,包括数据的发送和接收,并利用这种通信方式完成一定的任务。

二、实验原理1.串行通信:串行通信是将数据一个个位发送或接收的方式。

数据通过一个线路逐位发送或接收,可以减少通信所需的线路数目。

2. UART串口通信:UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的简称,是一种最常用的串口通信方式,通常用于单片机与计算机、单片机与单片机之间的通信。

3.串口模块:串口模块是负责将数据转变为串行传输的硬件模块,包括发送端和接收端。

通过设置波特率、数据位、校验位和停止位等参数,可以实现数据的可靠传输。

4.单片机串口通信:单片机内部集成了UART串口通信接口,只需要通过相应的寄存器配置,可以实现串口通信功能。

5.双机串行通信:双机串行通信是通过串口将两台单片机进行连接,一台单片机作为发送端,负责将数据发送出去;另一台单片机作为接收端,负责接收并处理发送的数据。

三、实验器材与软件1.实验器材:两台单片机、USB转TTL模块、杜邦线若干。

2. 实验软件:Keil C51集成开发环境。

四、实验内容与步骤1.配置发送端单片机(1)连接单片机和USB转TTL模块,将USB转TTL模块的TXD端连接到单片机的P3口,将GND端连接到单片机的地线。

(2)在Keil C51环境下创建新工程,编写发送端程序。

(3)配置串口通信的波特率、数据位、校验位和停止位,并打开串口发送中断。

(4)循环发送指定的数据。

2.配置接收端单片机(1)连接单片机和USB转TTL模块,将USB转TTL模块的RXD端连接到单片机的P3口,将GND端连接到单片机的地线。

(2)在Keil C51环境下创建新工程,编写接收端程序。

(3)配置串口通信的波特率、数据位、校验位和停止位,并打开串口接收中断。

单片机温度测量及双机通信

单片机温度测量及双机通信

(1)主机程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar table[30]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x3F,0x40,0x06,0x37,0x5c,0x1c,0x78}; //0-9, 数码管代码//a-f,//0,-,16,17//in, 18,19//out, 20,21,22ulong saved_data[10]={0,0,0,0,0,0,0,0,0,0}; //保存的十个四位数据,默认为零uchar display[6]; //分别保存六位数码管的数值uchar s_diplay[6]; //保存串口通信时显示值//uchar dis_buf; //显示缓存uchar temp1; //uchar key; //键顺序码uchar keydown_flag = 0; //有键按下标志uchar back_flag = 0; //返回菜单标志,为1时返回菜单/* 延时子程序*/void delay(uchar x){uchar j;while((x--)!=0){for(j=0;j<125;j++);}}/*键扫描子程序*/void keyscan(void){uchar temp; //临时保存端口值P1=0x0F; //低四位输入delay(1);temp=P1; //读P1口temp=temp&0x0F;temp=~(temp|0xF0);if(temp==1)key=0;else if(temp==2)key=4;else if(temp==4)key=8;else if(temp==8)key=12;elsekey=16;P1=0xF0; //高四位输入delay(1);temp=P1; //读P1口temp=temp&0xF0;temp=~((temp>>4)|0xF0);if(temp==1)key=key+0;else if(temp==2)key=key+1;else if(temp==4)key=key+2;else if(temp==8)key=key+3;elsekey=16;}/*判断键是否按下*/void keydown(void){uchar ktemp;keydown_flag=0;P1=0xF0;ktemp=P1;if(ktemp!=0xF0){delay(20); //去抖ktemp=P1;if(ktemp!=0xF0){keyscan();keydown_flag=1;while(P1!=0xF0); //等待键释放}}}void menu(void); //函数声明/*显示函数*/void lcd_display(uchar a[6]){uchar i;uchar b[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};for(i=0;i<6;i++){P2=b[i]; //各位轮流置低电平P0=table[a[i]];delay(2);P0=0x00; //消影}}/*数据输入函数*/void data_input(void){uchar i,number; //循环变量,序号display[0]=18;display[1]=19;display[2]=17;display[3]=17;display[4]=17;display[5]=17;while(keydown_flag==0){lcd_display(display); //显示“in-----”keydown(); //等待输入数据序号或返回菜单}keydown_flag=0;if(key != 12 && key<10) //序号必须在0——9内{number=key; //保存序号display[0]=key;display[1]=17;display[2]=0;display[3]=0;display[4]=0;display[5]=0;keydown_flag=0;while(keydown_flag==0){lcd_display(display); //显示“序号-0000”keydown(); //等待输入数据或清除键或返回菜单}keydown_flag=0;if(key != 12 && key != 14) //按菜单键返回菜单,按清除键重新输入{for(i=0;i<4;i++){if(key==13) //输入回车,保存数据{saved_data[number]=display[5]+10*display[4]+100*display[5]+1000*display[5];}else if(key==14); //输入清除键,重新输入else if(key<10){display[2]=display[3];display[3]=display[4];display[4]=display[5];display[5]=key;while(keydown_flag==0){lcd_display(display); //显示“序号-000x”“序号--00xx”...keydown(); //等待输入数据, 清除键或回车键}keydown_flag=0;}}if(key!=14) //输完四位若没有按清除键,则保存数据{saved_data[number]=display[5]+10*display[4]+100*display[3]+1000*display[2];}if(key==13) //输入回车{; //进入下次循环,重新输入序号}if(key==12){back_flag = 1; //返回主菜单}}else if (key == 12) //返回主菜单{back_flag = 1;}else if(key == 14) //重新输入{;}}else back_flag = 1;}/*数据输出函数*/void data_output(void){uchar number; //保存输入的序号display[0]=20;display[1]=21;display[2]=22;display[3]=17;display[4]=17;display[5]=17;while(keydown_flag==0){lcd_display(display); //显示“out----”keydown(); //等待输入数据序号}keydown_flag=0;if(key!=12 && key<10){number=key; //保存序号display[0]=key;display[1]=17;display[2]=saved_data[number]/1000; //取千位display[3]=(saved_data[number]/100)%10; //取百位display[4]=(saved_data[number]/10)%10; //取十位display[5]=saved_data[number]%10; //取个位while(keydown_flag==0){lcd_display(display); //显示“序号-xxxx”keydown(); //继续输出或返回主菜单}keydown_flag=0;if(key==13) //输入回车,重新输入序号{;}else back_flag = 1; //若不是回车,返回主菜单}else back_flag = 1;}/*串口初始化函数*/void init_usart(void){SCON =0x50; //REN=1允许串行接受状态,串口工作模式2TMOD =0x20; //定时器工作方式2PCON =0x80; //波特率提高一倍//TH1=0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。

单片机双机通讯实验程序

单片机双机通讯实验程序

双机通信#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d}; //0~6的共阴极字段码表sfr P1M1=0x91;sfr P1M0=0x92;sbit P3_6=P3^6; //位定义sbit P3_7=P3^7;sbit P0_3=P0^3;uchar n;//==================================延时10毫秒======================void Delay10ms() //@11.0592MHz{unsigned char i, j;_nop_();_nop_();i = 108;j = 144;do{while (--j);} while (--i);}//================确定定时器和串行口工作方式以及波特率计算===========void UartInit(void) //9600bps@11.0592MHz{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xFD; //设定定时初值TH1 = 0xFD; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1ES=1; //开串口EA=1; //开总中断}//====================================键盘扫描=======================void Scan_Key(void){uchar m,i;bit FLAG0=0;P3_6=0;P3_7=1;for(i=0;i<2;i++){P0=0xf7; //设置P0口,P0^3位是0,即最右边的数码管显示键值m=P0;Delay10ms(); //延时10毫秒,给按键消抖switch(m&0xf0){case 0xd0: n=i*3+1; //检测第一列按键是否被按下,如果有则是table[i*3+1]键FLAG0=1; //表示有按键被按下break;case 0xb0: n=i*3+2; //检测第二列按键是否被按下,如果有则是table[i*3+2]键FLAG0=1;break;case 0x70: n=i*3+3; //检测第三列按键是否被按下,如果有则是table[i*3+3]键FLAG0=1;break;default: break;}P3_6=1;P3_7=0;}}//================================串行口发送========================void send(){SBUF=table[n];while(!TI);TI=0;}//================================串行口接收=========================void receive(){if(RI==1){P1=SBUF;RI=0;}}//===============================主函数=============================main(){UartInit();P1M0=0xFF;P1M1=0x00;P1=0x3F;while(1){Scan_Key();send();receive();}}。

51单片机 双机通信

51单片机 双机通信

实验三双机通信实验一、实验目的a)UART 串行通信接口技术应用二、实验实现的功能a)甲机向乙机发送按键的键值,同时将乙机发送的键值在数码管上显示并且LED相应的闪烁b)乙机接收甲机发送的键值并在数码管上显示,同时也能向甲机发送键值三、系统硬件设计甲机和乙机的连接一样,将甲机的RXD和乙机的TXD连接,甲机的TXD和乙机的RXD连接,再将两个单片机的GND连接四、系统软件设计甲机发送程序:#include <stc10.h>#define uchar unsigned char#define uint unsigned int#define N 50ucharcodevalue[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0 X5E,0X79,0X71};//0--F的共阴极字段码表uchar codetab[]={0XFD,0X3F,0XFA,0X3F,0XF7,0X1F,0XEF,0X2F,0XDF,0X37,0XBF,0X3B,0X7F,0X3F}; //花型显示uchar ptr=0;sbit P36=P3^6;sbit P37=P3^7;void delay(uint x) //延时函数{uchar i;while(x--){for(i=0;i<120;i++);}}void display(uchar n) //显示函数{P0=0XF7;P1=codevalue[n];delay(N/2);}uchar scan_key()//按键扫描{uchar i,m;P36=0;P37=1;for(i=0;i<2;i++){m=P0;switch(m&0xe0){case 0xc0: ptr=i*3+1;return ptr;break;case 0xa0: ptr=i*3+2;return ptr;break;case 0x60: ptr=i*3+3;return ptr;break;}P36=1;P37=0;}}void shun() //顺时针转{int a,b,i;a=0x01;b=0x04;for(i=0;i<8;i++){P2=~a;a<<=1;delay(5N);}P2=0XFF;for(i=0;i<4;i++){P3&=(~b);b<<=1;delay(5N);}P3=0X3f;}void ni() //逆时针转{int a,b,i;a=0x80;b=0x20;for(i=0;i<4;i++){P3&=(~b);b>>=1;delay(5N);}P3=0X3F;for(i=0;i<8;i++){P2=~a;a>>=1;delay(5N);}P2=0XFF;}void shan() //绿黄红依次点亮{P2=0XB6;P3=0X37;delay(10N);P2=0X6D;P3=0X2F;delay(10N);P2=0XDB;P3=0X1B;delay(10N);P2=0XFF;P3=0X3F;delay(10N);}void hua(){int t;for(t=0;t<7;t++){P2=tab[t*2];P3=tab[t*2+1];delay(20N);}}void sent()//串口发送{SBUF=ptr;while(!TI);TI=0;}void receive() //串口接收并在led上显示{while(!RI);RI=0;switch(SBUF){case 1: display(SBUF);shun();break;case 2: display(SBUF);ni();break;case 3: display(SBUF);shan();break;case 4: display(SBUF);hua();break;case 5: display(SBUF);P2=0x00;P3=0x03;break;case 6: display(SBUF);P2=0xff;P3=0xff;break;}}void main(void){P1M0=0XFF;P1M1=0X00;TMOD=0X20; //T1工作模式2TH1=0XF4; //波特率2400TL1=0XF4;SCON=0XD0; //串口模式3,允许接收PCON=0X00; //波特率不倍增TR1=1;while(1){scan_key();sent();receive();}}乙机接收程序:#include <stc10.h>#define uchar unsigned char#define uint unsigned int#define N 10uchar codevalue[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71};//0--F的共阴极字段码表uchar Num_Buffer[]={0,0,0,0};//缓冲区初始化uchar keyvalue=0,ptr=0;void delay(uint x) //延时函数{uchar i;while(x--){for(i=0;i<120;i++);}}void display(uchar n) //显示函数{Num_Buffer[3]=n/1000;Num_Buffer[2]=n/100%10;Num_Buffer[1]=n/10%10;Num_Buffer[0]=n%10;P0=0XFE;P1=codevalue[Num_Buffer[3]];delay(N/2);P0=0XFD;P1=codevalue[Num_Buffer[2]];delay(N/2);P0=0XFB;P1=codevalue[Num_Buffer[1]];delay(N/2);P0=0XF7;P1=codevalue[Num_Buffer[0]];delay(N/2);}uchar scan_key() //按键扫描函数{uchar a=0x40,i,m;for(i=0;i<2;i++){P3=~a;delay(N);m=P0;switch(m&0xe0){case 0xc0: ptr=i*3+1;return ptr;break;case 0xa0: ptr=i*3+2;return ptr;break;case 0x60: ptr=i*3+3;return ptr;break;}a=a<<1;}}void sent()//串口发送{SBUF=ptr;while(!TI);TI=0;}void receive()//串口接收{while(!RI){display(keyvalue);}RI=0;keyvalue=SBUF;}void main(void){P1M0=0XFF;P1M1=0X00;TMOD=0X20; //T1工作模式2TH1=0XF4; //波特率2400TL1=0XF4;SCON=0XD0; //串口模式3,允许接收PCON=0X00; //波特率不倍增TR1=1;while(1){scan_key(); //获取键值sent();receive();}}五、实验过程中遇到的问题及解决方法问题1:和实验一一样,按键扫描时对P3口赋值会影响LED的显示解决:将按键扫描程序改为uchar scan_key()//按键扫描{uchar i,m;P36=0;P37=1;for(i=0;i<2;i++){m=P0;switch(m&0xe0){case 0xc0: ptr=i*3+1;return ptr;break;case 0xa0: ptr=i*3+2;return ptr;break;case 0x60: ptr=i*3+3;return ptr;break;}P36=1;P37=0;}}问题2:甲机在接收到5后12个LED全亮,然后无论乙机发送什么,甲机都是12个LED 全亮,不会改变状态解决:反复调试检查发现P3口的最低两位为发送与接收端口,在最开始的程序中接收5的程序为case 5: display(SBUF);P2=0x00;P3=0x00;break;,此时P3的最低两位清零,使发送和接收位都无效,所以在以后无论乙机发送什么甲机都无法接收,将其改为case 5:display(SBUF);P2=0x00;P3=0x03;break;后正常问题3:怎样让乙机在开始的时候显示0,解决:开始时写的程序为void receive()//串口接收{while(!RI) ;RI=0;keyvalue=SBUF;display(keyvalue);}这时运行后上电后数码管不显示,分析得出开始时SBUF为空,所以不显示,应当把显示函数放在while后面显示即程序改为void receive()//串口接收{while(!RI){display(keyvalue);}RI=0;keyvalue=SBUF;}指导老师签字:日期:。

单片机双机通讯

单片机双机通讯

天津机电职业技术学院单片机实训报告指导老师:王哲班级:09应电(1)班姓名:陈明煌学号:200913003日期;2010-12-24(一)单片机双机通讯一.单片机双机通讯程序1.单片机发送程序2.单片机接收程序二.单片机双机通讯的硬件搭建将两单片机中的P3.0(RXD)和P3.1(TXD)分别短接,再将两单片机的接地端短接。

三.调试过程与问题在调试过程中在使用12MHZ晶振时出现乱码现象改用11.0592MHZ晶振进行调试,解决了出现的问题。

(二)PC机与单片机通讯一.通讯程序二.PC机与单片机通讯硬件搭建使用MAX232电平转换模块单片机的TXD接MAX232电平转换模块RXD,RXD接MAX232电平转换模块TXD。

连接好硬件电路打开串口调试窗口三.调试过程与问题连接好硬件电路打开串口调试窗口进行调试,看到窗口接收到单片机发送回的数据,在调试过程中在使用12MHZ晶振时出现乱码现象改用11.0592MHZ晶振进行调试,实验结果完全符合预想。

(3)逻辑分析仪的使用一.开启逻辑分析仪并设定相关参数1:打开逻辑分析软件后,如视图所示2:选择采样端3:选择好自己采样的连接端后,修改采样频率4:采样频率选择好后,电机开始采样按键采样结果如图所示5:点击调节键,进行对视图进行调节调节后如图所示二;信号采样1:当工作在方式1时,帧格共有十位,分别是1个起始位、8个数据位及1个终止位2:当工作在方式2时,帧格共有十位,分别是1个起始位、8个数据位、1个奇偶校验位及1个终止位3;不同数据的传输A:00001111B:01010101。

单片机双机通讯试验

单片机双机通讯试验

单片机双机通讯试验实验名称:双机通讯实验目的:熟悉单片机串行口工作原理;掌握通信程序设计的一般方法实验要求:按照实验安排准时参加实验,按照实验步骤操作,仔细观察及记录实验过程及结果,回答实验相关问题,最终根据实验结果撰写实验指导书。

实验内容:编写一个双机通信程序,一个作为主机,一个作为从机,主机对从机发送控制命令,当主机发送turn on 时,从机如果接收正确,则向主机发送on 用于应答,并使LED 灯亮(从机任选1LED 灯来控制),当主机发关turn off 时,从机如果接收正确,则使LED 灯灭。

如果不是这两个命令,则从机向主机发送error 作为应答。

实验步骤:1、连接两台单片机开发板的串行通信线,注意共地连接2、设定A 机为发送方3、设定B 机为接收方4、设定双方接收与发送波特率5、各自编制收发程序6、发送数据调试录入程序:#include/*命令定义*/#define TurnOn 1#define TurnOff 2/*应答定义*/#define On 3#define Off 4#define Error 4/////////////////显示sbit k1=P1;/* 第1 位数码管共阴端*/sbit k2=P1 ;/*第2 位数码管共阴端*/sbit k3=P1;/*第3 位数码管共阴端*/sbit k4=P1;/*第4 位数码管共阴端*/unsigned char rd=0;//串口数据接收暂存变量void RxdInterrupt() interrupt 4 using 2//串口中断函数{rd=SBUF;//接收数据存储到变量rdif(rd==TurnOn)//是亮灯命令{P0=255;//LED亮SBUF=On;//应答Onwhile(TI==0);TI=0; //等待发送完毕}else if(rd==TurnOff)// 是关灯命令{P0=0;//LED 灭SBUF=Off;//应答Offwhile(TI==0);TI=0; //等待发送完毕}else {SBUF=Error;//应答Offwhile(TI==0);TI=0; //等待发送完毕}RI=0;}void InitEs()//串口初始化函数{TMOD=0x21; TH1=0xF3;//波速率设置为2400TR1=1; SCON=0XD0; ES=1;//串口中断允许}main(){InitEs();//串口初始化EA=1; k1=k2=k3=k4=0;//关闭数码管P0=0;//LED 灭while(1){}} 程序参考及鸣。

单片机双机通信实验报告

单片机双机通信实验报告

单片机双机通信实验报告《单片机双机通信实验报告》摘要:本实验通过使用两台单片机,利用串口通信实现双机之间的信息传输。

在实验过程中,先分别对两台单片机进行初始化设置,并分别确定了波特率和通信协议。

随后,通过串口线连接两台单片机,并编写发送和接收程序,实现了双机之间的信息传输。

实验结果表明,双机通信实验成功,信息传输准确可靠。

关键词:单片机、双机通信、串口通信、波特率、信息传输1.引言:单片机是一种集成电路,内包含了处理器、存储器和各种外设,广泛应用于嵌入式系统中。

双机通信是指两个单片机之间通过一定的通信方式实现信息的传递和交换。

利用双机通信,可以实现多个单片机之间的协同工作,提高系统的性能和可靠性。

本实验旨在通过串口通信方式,实现双机之间的信息传输。

2.实验原理:串口通信是一种常用的通信方式,将信息按照一定的协议格式转换成串行的数据,通过串口线传输。

串口通信需要设置波特率和通信协议。

波特率是指每秒钟传输的位数,通信协议是指发送和接收的数据格式和规则。

本实验使用两台单片机,每台单片机通过串口线连接。

其中一台单片机作为发送机,另一台单片机作为接收机。

发送机将要传输的信息按照通信协议和波特率发送出去,接收机按照相同的通信协议和波特率接收信息。

接收机接收到信息后,进行处理。

3.实验步骤:(1)初始化设置:分别对发送机和接收机进行初始化设置,包括引脚的设置和串口通信设置。

设置引脚为串口通信模式,并确定波特率和通信协议。

(2)连接单片机:将两台单片机通过串口线连接,发送机的发送引脚连接到接收机的接收引脚,接收机的接收引脚连接到发送机的发送引脚。

(3)编写发送程序:在发送机上编写发送程序,将要发送的信息按照通信协议和波特率发送出去。

(4)编写接收程序:在接收机上编写接收程序,按照相同的通信协议和波特率接收信息,并进行处理。

(5)测试实验:将发送机和接收机分别接入电源,观察实验现象。

4.实验结果:通过实验测试,发送机成功将信息发送给接收机,并在接收机上进行了处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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; } }
sbit W1 = P0^0;
//位操作定义
sbit W2 = P0^1;
sbit W3 = P0^2;
sbit W4 = P0^3;
void DelayMS(uint xms); void Display1();
void init()
{ TMOD=0x20; //设定 T1 定时器 工作方式 2 TH1=0xfd; //T1 定时器装初值
TL1=0xfd; TR1=1;
// //启动 T1 定时器
REN=1; SM0=0;
//允许串口接收 //设定串口工作方式 1
SM1=1; EA=1;
//同上 //使能总中断
ES=1;
//使能串口中断
}
void uchar dat)
{
ES=0; //禁止串口中断 SBUF=dat; //一次只能发送一个字节
#include <reg51.h> #define uchar unsigned char #define uint unsigned int
uchar flag,a,i,Seg; uchar kk; uchar key();
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0-9
}
while((P0&0xe0)!=0xe0) {
P0&=0xe0 ; }
//等待按键释放
P3|=0xc0; P3&=0xbf; switch(P0&0xe0)
{ case 0xe0: break; case 0x60: k=3;break; case 0xa0: k=2;break; case 0xc0: k=1;break;
}
while((P0&0xe0)!=0xe0) {
P0&=0xe0 ; } }
} return k;
}
void DelayMS(uint xms) {
uint i,j;
for(i=xms;i>0;i--) for(j=300;j>0;j--);
}
void Display1() {
Seg=tab[a%10];//显示值编码 P1=Seg; W1 = 0;W2 = 0;W3 = 0;W4 = 0; DelayMS(100); //短暂延时
相关文档
最新文档