单片机串行通信实验报告.docx

上传人:b****2 文档编号:159696 上传时间:2023-04-28 格式:DOCX 页数:16 大小:247.22KB
下载 相关 举报
单片机串行通信实验报告.docx_第1页
第1页 / 共16页
单片机串行通信实验报告.docx_第2页
第2页 / 共16页
单片机串行通信实验报告.docx_第3页
第3页 / 共16页
单片机串行通信实验报告.docx_第4页
第4页 / 共16页
单片机串行通信实验报告.docx_第5页
第5页 / 共16页
单片机串行通信实验报告.docx_第6页
第6页 / 共16页
单片机串行通信实验报告.docx_第7页
第7页 / 共16页
单片机串行通信实验报告.docx_第8页
第8页 / 共16页
单片机串行通信实验报告.docx_第9页
第9页 / 共16页
单片机串行通信实验报告.docx_第10页
第10页 / 共16页
单片机串行通信实验报告.docx_第11页
第11页 / 共16页
单片机串行通信实验报告.docx_第12页
第12页 / 共16页
单片机串行通信实验报告.docx_第13页
第13页 / 共16页
单片机串行通信实验报告.docx_第14页
第14页 / 共16页
单片机串行通信实验报告.docx_第15页
第15页 / 共16页
单片机串行通信实验报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机串行通信实验报告.docx

《单片机串行通信实验报告.docx》由会员分享,可在线阅读,更多相关《单片机串行通信实验报告.docx(16页珍藏版)》请在冰点文库上搜索。

单片机串行通信实验报告.docx

单片机串行通信实验报告

 

实验六串行通信

实验报告

 

班级:

学号:

教师:

 

一、双机通信

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

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

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

电路如图1所示。

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

实验电路图:

1、C源程序清单

甲机〔U1〕代码:

#include

#defineucharunsignedchar

voiddelay(uchari);

voidsend(uchartemp);

voidinit(void);

voidmain(void)

{

init();

delay(200);

while

(1)

{

send('^');

send

(1);

send

(2);

send

(1);

send(3);

send

(2);

send

(2);

send(3);

send

(1);

}

}

 

/***********初始化***********/

voidinit(void)

{

SCON=0x40;//串口模式1只发送不接收

TMOD=0x20;//T1工作模式2

TH1=0xf4;//波特率2400

TL1=0xf4;

PCON=0x00;//不加倍SMOD=0

TI=0;

TR1=1;//开定时中断

}

 

/*********发送函数**********/

voidsend(uchartemp)

{

SBUF=temp;

while(TI==0);

TI=0;

delay(50);

}

/**********延时函数**********/

voiddelay(uchari)

{

unsignedintj;

for(i;i>0;i--)

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

}

 

乙机〔U2〕代码:

#include

#defineucharunsignedchar

#defineuintunsignedint

voidinit(void);

voiddelay(uchart);

voidxianshi(void);

ucharcodedistable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//共阴数码管段码

ucharcodewi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchartab[9]={0,0,0,0,0,0,0,0,0};

uchari=0,temp;

uinta,b,c,d,e,f,g,h;

voidmain()

{

init();

while

(1)

{

xianshi();

}

}

/////////////初始化///////////////

voidinit(void)

{

PCON=0x00;//不加倍SMOD=0

SCON=0x50;//设置串口方式1且允许串口接收REN=1

TMOD=0x20;//设置T1为方式2

TH1=0xf4;

TL1=0xf4;//设置波特率2400

TR1=1;//开启定时器1

ES=1;//允许串行口中断

EA=1;//允许全局中断

}

 

////////////串口中断接收程序////////////

voidreceive()interrupt4

{

temp=SBUF;

while(RI==0);

RI=0;

if(temp=='^')

temp=0;

tab[i]=temp;

i++;

if(i==9)

{

i=0;

a=tab[1];

b=tab[2];

c=tab[3];

d=tab[4];

e=tab[5];

f=tab[6];

g=tab[7];

h=tab[8];

}

}

/////////////数码管显示/////////////

voidxianshi(void)

{

uchari,dm,wx;

//m1:

m000=标准;01=推挽;10=输入;11=开漏输出

P1M1=0X00;

P1M0=0Xff;

P2M1=0X00;

P2M0=0Xff;//设定P1,P2推挽输出

while

(1)

{

for(i=1;i<9;i++)

{

//ram[i]=tab[i];

dm=distable[tab[i]];//取显示段码

wx=wi[i-1];//取位选码

P1=0x00;//关显示

P2=dm;//段码赋给P2口

P1=wx;//点亮位选的那个数码管

delay

(1);//延时

}

}

/*uchark,ram[8];

ram[0]=a;

ram[1]=b;

ram[2]=c;

ram[3]=d;

ram[4]=e;

ram[5]=f;

ram[6]=g;

ram[7]=h;

for(k=0;k<8;k++)

{

P2=distable[ram[k]];

P1=wi[k];

P2=0x00;

delay

(1);

}*/

}

//////////////延时函数/////////////

voiddelay(uchart)

{

ucharx,y,z;

for(x=t;x>0;x--)

for(y=25;y>0;y--)

for(z=100;z>0;z--);

}

 

2、仿真结果

3、问题分析

在数码管显示这块,刚开始是这样写的

在proteus上仿真的时候是没有任何问题的,但是后来在实验板上数码管显示特别暗,几乎看不出来有显示数字,想了想可能是没有加推挽输出,然后就将推挽输出代码加入,然后重新下载,但是结果和之前没什么不同。

后来想既然这样的话,那就不是推挽的问题了,是这段显示代码有问题,于是将显示代码改为数码管的动态扫描。

这样的话,在Proteus上仿真和实验板上都能出来结果了。

二、单片机与PC机通信

单片机向PC机发送数据。

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

Proteus仿真电路:

由于是1200的波特率,需要注意的是:

将这里要改为1200

1、C源程序清单

#include

#defineucharunsignedchar

voiddelay(uchari);

voidsend(uchartemp);

voidinit(void);

voidmain(void)

{

init();

//delay(50);

while

(1)

{

send(0x31);

send(0x32);

send(0x31);

send(0x33);

send(0x32);

send(0x32);

send(0x33);

send(0x31);

send(0x20);

}

}

 

/***********初始化***********/

voidinit(void)

{

SCON=0x40;//串口模式1只发送不接收

TMOD=0x20;//T1工作模式2

TH1=0xe8;//波特率1200

TL1=0xe8;

PCON=0x00;//不加倍SMOD=0

TI=0;

TR1=1;//开定时中断

}

 

/*********发送函数**********/

voidsend(uchartemp)

{

SBUF=temp;

while(TI==0);

TI=0;

delay(50);

}

/**********延时函数**********/

voiddelay(uchari)

{

unsignedintj;

for(i;i>0;i--)

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

}

 

2、运行结果

Proteus仿真:

 

PC机:

3、问题分析

这个程序其实和上一个的甲机程序大同小异,需要注意的是,发送的是ASCll码。

 

三、问题解答

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

说明该工作方式的特点。

答:

串行口是工作在方式1。

方式1特点:

〔1〕、8位UART接口。

  

〔2〕、帧结构为10位,包括起始位〔为0〕,8位数据位,1位停止位。

  

〔3〕、波特率由指令设定,由T1的溢出率决定。

2、波特率是什么?

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

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

答:

模拟线路信号的速率,以波形每秒的振荡数来衡量。

如果数据不压缩,波特率等于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。

在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。

波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示(也就是每秒调制的符号数),其单位是波特〔Baud,symbol/s〕。

波特率是传输通道频宽的指标。

波特率设置:

串行口的四种工作方式对应三种波特率。

由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

方式0的波特率=fosc/12

方式2的波特率=(〔2^SMOD〕/64〕•fosc

方式1的波特率=(〔2^SMOD〕/32〕•〔T1溢出率〕

方式3的波特率=(〔2^SMOD〕/32〕•〔T1溢出率〕

注意:

SMOD为PCON寄存器的最高位〔即PCOM<7>〕。

T1溢出率=fosc/{12×[256-〔TH1〕]}--将该公式代人方式1或3

最后推出公式:

TH1=256-(fosc*2^SMOD)/(baudrate*12*32)

如果你用方式2(波特率=(〔2^SMOD〕/64〕•fosc)的话,12M的晶振就不能得到9600波特率了(除非你改变你的晶振),所以你只能选择方式1或3。

而且12M的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点,TH1又只能是整数的,所以传输时会有误差。

如果是4800的波特率,将初始化程序里的TH1、TL1的值改为0xfa即可

标准波特率实际波特率定时器预置数

1501500X41

2002000X70

3003000XA0

6006000XD0

120012000XE8

240024000XF4

480048000XFA

720072000XFC

960096000XFD

14400144000XFE

28800288000XFF

 

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2