双机通讯实验报告.docx

上传人:b****3 文档编号:3387818 上传时间:2022-11-22 格式:DOCX 页数:13 大小:163.43KB
下载 相关 举报
双机通讯实验报告.docx_第1页
第1页 / 共13页
双机通讯实验报告.docx_第2页
第2页 / 共13页
双机通讯实验报告.docx_第3页
第3页 / 共13页
双机通讯实验报告.docx_第4页
第4页 / 共13页
双机通讯实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

双机通讯实验报告.docx

《双机通讯实验报告.docx》由会员分享,可在线阅读,更多相关《双机通讯实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

双机通讯实验报告.docx

双机通讯实验报告

单片机实验报告

(自动化15级)

实验名称:

串行通讯实验

 

一、实验目的

1.掌握单片机串行口工作方式;

2.掌握双机通讯的接口电路设计及程序设计。

二、实验设备

1.PC机;

2.单片机最小系统教学实验模块;

3.数码管显示模块

三、实验内容

1.双机通信

由两套单片机试验装置(两个实验小组)共同完成该实验。

我们U1为甲机,U2为乙机。

甲机发送本机(学生本人)学号后8位给乙机,乙机接收该8位数据,并显示在8位数码管上。

电路如图1所示。

要求串行通信方式为方式1,波特率为2400bit/s,不加倍,单片机外部晶振频率为11.0592M。

图1双机通信原理示意图

附加要求:

乙机接收完毕后,将本机(乙机)的学号后8位发送回甲机,甲机显示在数码管上。

2.单片机与PC机通信

单片机向PC机发送数据。

单片机向PC机重复发送本机(学生本人)学号,发送波特率为1200,采用方式1,单片机外部晶振频率为11.0592M。

四、实验原理

4.1串行通讯的方式

在串行通讯中,有两种基本的通讯方式:

异步通讯,同步通讯。

异步串行通讯规定了字符数据的传送格式,既每个数据以相同的帧格式发送。

每个帧信息由起始位、数据位、奇偶校验位和停止位组成。

本实验主要学习异步通讯的实现方法。

在异步通讯中,每一个字符要用起始位和停止位作为字符开始和结束的标志,以至占用了时间。

所以在数据块传送时,为了提高通讯速度,常去掉这些标志,而采用同步通讯。

同步通讯不像异步通讯那样,靠起始位在每个字符数据开始时发送和接受同步。

而是通过同步字符在每个数据块传送开始时使收/发双方同步。

按照通讯方式,又可将数据传输线路分成三种:

单工方式、半双工方式、全双工方式。

(1)单工方式

在单工方式下,通讯线的一端联接发送器,另一端联接接收器,它们形成单向联接,只允许数据按照一个固定的方向传送。

(2)半双工方式

在半双工方式下,系统中的每个通讯设备都由一个发送器和一个接收器组成,通过收发开关接到通讯线路上,如图33-1所示。

在这种方式中,数据能从A站送到B站,也能从B站传送到A站,但是不能同时在二个方向上传送,即每次只能一个站发送,另一个站接收。

图2半双工通讯方式

图33-1中的收发开关并不是实际的物理开关,而是由软件控制的电子开关,由通讯线两端的半双工通讯协议进行功能切换。

(3)全双工(Full—duplex)方式

虽然半双工方式比单工方式灵活,但它的效率依然较低。

从发送方式切换到接收方式所需的时间一般大约为数毫秒,这么长的时间延迟在对时间较敏感的交互式应用(例如远程检测监视控制系统)中是无法容忍的。

重复线路切换所引起的延迟积累,正是半双工通信协议效率不高的主要原因。

半双工的这种缺点是可以避免的,而且方法很简单,即采用信道划分技术。

在图33-2的全双工连接中,不是交替发送和接收,而是可同时发送和接收。

全双工通讯系统的每一端都包含发送器和接收器,数据可同时在两个方向上传送。

图3全双工通讯方式

4.2单片机串行口工作方式

在静态数码管显示实验中,我们熟悉了单片机串口工作方式0;单片机串口还具有有3种工作方式。

如下表所示:

这3种工作方式,均用于串行异步通讯。

在异步串行通讯的一个字节的传送中,必须包括了起始位(0)和停止位

(1)。

除此之外,方式1具有8位(1个字节)的数据位(低位在先),方式2、3则除这8位之外,还具有一个可编程的第9位,这个第9位编程通常被编程为奇偶校验位。

我们将在下一个实验中用到它。

串口工作方式在特殊寄存器SCON中设置。

其中的SM0和SM1位确定了串口工作方式。

要使通讯双方能够通讯成功,必须具有相同的串口工作模式;REN为允许接收位,本实验中因为双方都要进行接收,因此REN也都应设为1。

TB8和RB8这里暂不涉及。

利用以下语句来设置SCON:

MOVSCON,#50H

4.3波特率的设置

在异步串口通讯中,一个很重要的工作就是进行串口波特率的设置。

波特率是指串口通讯中每秒传送的位数,单位为BPS,它反映了串行口通讯的速度;同时,通讯双方的速度必须一致,才能够顺利进行通讯。

在串口工作方式1、3中,传送波特率都是可变的。

单片机内部通过定时器T1来提供发送与接收缓存器的内部移位时钟。

也就是说,要确定串行通讯的波特率,必须对T1进行相关设置。

51单片机系统对此时T1的设置有以下固定的规定:

(1)必须工作在定时器状态;

(2)必须工作在“8位自动重载”工作模式;

这必须在特殊寄存器TMOD中进行设置。

关于TMOD的详细内容,我们在实验十七已经讲过。

可以利用以下语句来设置TMOD:

MOVTMOD,#20H

除了对TMOD的设置外,还必须设置定时器T1的定时值,也就是保存在TH1中的8位重载值。

这直接影响到波特率的大小:

它通过以下公式进行计算:

其中的SMOD为特殊寄存器PCON的最高位。

当它置1时,可以将波特率增大1倍。

在双机通讯中,只要双方的波特率一致就能够完成通讯了;但是,在标准的异步通讯协议中,只有几种波特是适用的。

例如1200bps,2400bps,4800bps,9600bps……等等。

而通过这个公式可以看出,并不是所有的晶振频率都能够得到准确的上述波特率。

比如采用12MHz晶振,代入公式进行运算,就无法得到4800bps的准确波特率(TH1必须为小数了)。

在这种情况下,过去人们都使用软件补偿的方法,尽量得到准确的波特率;而现在,市场上有很多通讯专用的晶振,例如3.6864MHz、11.0592MHz……的晶振,都能够直接得到准确的波特率。

因此在进行本实验时,必须使用通讯专用晶振(如果使用仿真器,则设置为使用仿真头的外接晶振,并将11.0592M的晶振插入仿真头。

当波特率已经确定,就可以反向推导出TH1的取自大小,例如,在本次实验中,我们要求波特率为4800bps,在晶振采用11.0592MHz的情况下,推出TH1=0F4H。

五、实验步骤

1.参考图1并进行电路设计,画出电路图,并用导线正确连接两套装置的单片机最小系统实验模块,并连接最小系统模块与数码管显示模块。

2.照实验要求编写程序流程图,然后编写程序,对编写的程序进行仿真调试,直至通讯成功。

六、实验报告

1.在该实验中,单片机串行口工作在什么工作方式下?

说明该工作方式的特点。

工作在工作方式1。

8位数据通讯,波特率可变。

2.波特率是什么?

怎样设置单片机串口通讯的波特率?

如果实验要求通讯波特率为4800bps,怎样修改程序?

特率是指串口通讯中每秒传送的位数,单位为BPS,它反映了串行口通讯的速度。

单片机内部通过定时器T1来提供发送与接收缓存器的内部移位时钟。

必须工作在定时器状态;必须工作在“8位自动重载”工作模式。

3.详细说明本次实验采用的通讯协议。

甲机发送本机(学生本人)学号后8位给乙机,乙机接收该8位数据,并显示在8位数码管上。

乙机接收完毕后,将本机(乙机)的学号后8位发送回甲机,甲机显示在数码管上。

4.给针对实验要求编写本机的程序流程图、程序清单并给予适当注释,并说明合作单片机(合作同学)。

这里有两个程序,一个是先接受,一个是先发送。

#include

#defineucharunsignedchar

voidinit(void);

voidsend(void);

voiddelay(unsignedinti);

ucharxuehao[8]={6,6,6,6,6,6,6};

voidmain(void)

{

init();

send();

while

(1);

}

 

voidinit(void)

{

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

SCON=0x50;

PCON=0x00;

TR1=1;

}

 

voidsend(void)

{

uchari;

do

{

delay(200);

SBUF=0xaa;

while(TI==0);TI=0;

while(RI==0);RI=0;

}while(SBUF!

=0xbb);

//----------------------------------?

?

?

?

?

delay(80);

for(i=0;i<=7;i++)

{

SBUF=xuehao[i];

while(TI==0);TI=0;

delay(5);

}

SBUF=9;

delay(10);

}

 

///////////////////////////////////////////////////////////

voiddelay(unsignedinti)

{

unsignedcharj;

for(;i>0;i--)

for(j=0;j<125;j++)

{;}

}

 

#include

#defineucharunsignedchar

voidinit(void);

voidreceive(void);

voiddelay(unsignedinti);

voiddisplay(ucharA,ucharB);

voidduanxuan(ucharc);

ucharxuehao[8]={0};

voidmain(void)

{

init();

receive();

while

(1)

{

display(1,xuehao[0]);

delay(3);

P0=0x00;

display(2,xuehao[1]);

delay(3);

P0=0x00;

display(3,xuehao[2]);

delay(3);

P0=0x00;

display(4,xuehao[3]);

delay(3);

P0=0x00;

display(5,xuehao[4]);

delay(3);

P0=0x00;

display(6,xuehao[5]);

delay(3);

P0=0x00;

display(7,xuehao[6]);

delay(3);

P0=0x00;

display(8,xuehao[7]);

delay(3);

P0=0x00;

}

//

}

 

voidinit(void)

{

P0M1=0X00;

P0M0=0Xff;

P2M1=0x00;

P2M0=0xff;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

SCON=0x50;

PCON=0x00;

TR1=1;

}

 

voidreceive(void)

{

ucharenpty;

ucharj=0;

do

{

while(RI==0);RI=0;

}while(SBUF!

=0xaa);

SBUF=0xbb;

while(TI==0);TI=0;

enpty=SBUF;//while(RI==0);RI=0;

//-------------------------------?

?

delay(10);

for(j=0;j<=7;j++)

{

xuehao[j]=SBUF;

while(RI==0);RI=0;

}

}

////////////////////////////////////////?

?

?

?

//////////////////////////////////////////////////

voiddisplay(ucharA,ucharB)

{

ucharcodeinfo[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//

0xff,

0xbf};//-

duanxuan(A);

switch(B)

{

case0:

P0=~info[0];

break;

case1:

P0=~info[1];

break;

case2:

P0=~info[2];

break;

case3:

P0=~info[3];

break;

case4:

P0=~info[4];

break;

case5:

P0=~info[5];

break;

case6:

P0=~info[6];

break;

case7:

P0=~info[7];

break;

case8:

P0=~info[8];

break;

case9:

P0=~info[9];

break;

case10:

P0=~info[10];

break;

case11:

P0=~info[11];

break;

}

}

voidduanxuan(ucharc)

{

switch(c)

{

case1:

P2=0x01;

break;

case2:

P2=0x02;

break;

case3:

P2=0x04;

break;

case4:

P2=0x08;

break;

case5:

P2=0x10;

break;

case6:

P2=0x20;

break;

case7:

P2=0x40;

break;

case8:

P2=0x80;

break;

default:

break;

}

}

/////////////////////////////////////////////////////////////////////////////////////////////

voiddelay(unsignedinti)

{

unsignedcharj;

for(;i>0;i--)

for(j=0;j<125;j++)

{;}

}

5.实验心得。

(必须)

.。

6.附能说明实验原理的实验照片。

(必须)

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1