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

上传人:b****6 文档编号:5154057 上传时间:2022-12-13 格式:DOCX 页数:16 大小:251.52KB
下载 相关 举报
单片机串行通信实验报告.docx_第1页
第1页 / 共16页
单片机串行通信实验报告.docx_第2页
第2页 / 共16页
单片机串行通信实验报告.docx_第3页
第3页 / 共16页
单片机串行通信实验报告.docx_第4页
第4页 / 共16页
单片机串行通信实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

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

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

单片机串行通信实验报告

单片机串行通信实验报告

 

实验六串行通信

实验报告

 

班级:

学号:

姓名:

教师:

 

{

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,单片机外部晶振频率为11.0592M。

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即可

11.0592MHZ的晶振

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

1501500X41

2002000X70

3003000XA0

6006000XD0

120012000XE8

240024000XF4

480048000XFA

720072000XFC

960096000XFD

14400144000XFE

28800288000XFF

 

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

当前位置:首页 > 高等教育 > 艺术

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

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