单片机串行通信实验报告.docx
《单片机串行通信实验报告.docx》由会员分享,可在线阅读,更多相关《单片机串行通信实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
单片机串行通信实验报告
实验六串行通信
实验报告
班级:
学号:
姓名:
教师:
一、双机通信
我们U1为甲机,U2为乙机。
8位数据,并显示在8位数码管上。
由两套单片机试验装置(两个实验小组)共同完成该实验。
甲机发送本机(学生本人)学号后8位给乙机,乙机接收该电路如图1所示。
不加倍,单片机外部晶振频率为
要求串行通信方式为方式1,波特率为2400bit/s,
11.0592M。
实验电路图:
1、C源程序清单
甲机(U1)代码:
#include
#defineucharunsignedcharvoiddelay(uchari);
voidsend(uchartemp);
voidinit(void);
voidmain(void)
{
init();
delay(200);while
(1){
send('A');
send
(1);
send
(2);send
(1);
send(3);send
(2);
send
(2);
send(3);
send
(1);
/***********初始化***********/voidinit(void)
{
SCON=0x40;
TMOD=0x20;
TH1=0xf4;//
TL1=0xf4;
PCON=0x00;//
TI=0;
TR1=1;
}
//
//T1
不加倍
串口模式1只发送不接收
工作模式2
波特率2400
SMOD=0
//开定时中断
/*********发送函数**********/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#defineuintunsignedintvoidinit(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){
////////////串口中断接收程序////////////
voidreceive()interrupt4{
temp=SBUF;while(RI==0);RI=0;
if(temp=='A')
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=OXff;//设定P1,P2推挽输出
while
(1)
{
for(i=1;i<9;i++)
{
//取显示段码
//取位选码
//ram[i]=tab[i];dm=distable[tab[i]];wx=wi[i-1];
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、仿真结果
JI
p:
*vd
n:
mips^an-SMT:
ram*r2L>«
UC-
4br>MJ
ndPH'-f,
F日Efl
■fxiri-rr-
ravin
■aarTTi
pJm-IhliilTWIPTTT
逼一;.住器迹■…对詩丘■■■
■■
—'■・■5
.;■jj-g
*"Ht~~I~1—ui
re
■HN-BrzarII
22Q
ri-Z7u--ri
nA
qva时W.AT-—
4
—也
JiU/u
E-
■iq
»1.1
■IZ
扒*3
*Hj*
"IJ-
"UK-a
•Mr
■3IiWTn
MHTT
P3E
PUTl
"沁*
■aj-^
•LrtB--•
■■Il
5t._..
FB
A
.f£._、_IH■"
3、问题分析
在数码管显示这块,刚开始是这样写的
rajklO'
工丄r>=a
raniC1'
=b
UaJTL
[2[
=c
rain..
[31
二d
Lam..
⑷
=e
ram.
【51
二f
ram.
【6]
二S
rant.
[7]
二h
ajR⑻;
fora=0:
kk++)
P2=dista.bleLramEk]]:
Pl=wiEk];
P£=OhOO:
ilelayCl);
}*
在Proteus上仿真的时候是没有任何问题的,但是后来在实验板上数码管显示特别暗,
几乎看不出来有显示数字,想了想可能是没有加推挽输出,然后就将推挽输出代码加入,然后重新下载,但是结果和之前没什么不同。
//mltiaO0口二标:
隹*01二览担!
10=输入;11二开掃辅出
P1M1=OKOO;
piwa=OKff;
P2M1=OHOO;
P2Ma=OSf£:
//iS^PbP24e^输出
后来想既然这样的话,那就不是推挽的问题了,是这段显示代码有问题,于是将显示代码改为数码管的动态扫描。
I"""/"""数码管显示"A//////■uchaui,远収;
U
i
/Al:
TiiOou=标准for推挽;IB输几:
11二开捅输出
Fimi=0X00;
flW=QX理;
P2mi=OXDO:
理IW=OXff;〃设定Fl,F2推换输出
■whileCl)
这样的话,在Proteus上仿真和实验板上都能出来结果了。
二、单片机与PC机通信
单片机向PC机发送数据。
单片机向PC机重复发送本机(学生本人)学号,发送波特率为1200,采用方式1,单片机外部晶振频率为11.0592M。
Proteus仿真电路:
razLOdra.PAhlrana
E.wr
Ti-
P7HM■』I'i*rirua
P2Ti1P程5*1a
PJWAI-b
pzrxiE
-g-
运
TT
rZJHKhHJFfl-aarraraamrpj*inrjrrn
n.-TT
HIP
■-rtrr
I1H
II
H-b.汁
W
TTh
TXiT
PXhl
4I
Wfr
c
0
g
A*
-Tz^r-
Cl■
-fl-
'tA--
并ft标i1
兀rr塑号
►™aal
二1|Nid=Al
J
-e^isrftatB-
OnAGrs:
二1[HideAl
T
Fai敢
NONE
〒||TilL削
J
EkipRih-
1
d[彳心炖
I
SerwJXJWMl■卜
No
讨1Titter
J
PC0■科0
[NJt5pe?
riecl
J
AdminoedRcp«rti*j;
Pcldii'v
T1NHindi
d
OtherH-Dp?
rties:
肛消
flI*
71H
Pioir-
T2H
■TTII""
Ch
:
IJ2
Ticir
Rill
TObT
当前云件不亜弓仿胃-当版ft不用于PCEUJife一債服$方盘融所有国准
14
13
一'…计
■■f■gijg-gE|rI1:
■I・II
£d匸H
1、C源程序清单
#include
#defineucharunsignedcharvoiddelay(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);
/*********发送函数**********/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仿真:
Pld^ll
PIwl
Pli-H■l*h->l«niiA-a
卵丄■
rrKt
p-iBTni巧ElniMK
论黑扇亘.
宀亠:
"專噩-罠——
--U-
萨二.
PC机:
I程序文件EEFEDM交件I畧口助手嗅订仿畀设盍:
|范例程序迭型/怕格/样品I,II,
接收響冲区
文玮:
複武「砸頤式〕;^空接收区I[保存核收埶据]
1213^23112132231
1£132231
121:
3££31
1£1^££31
1213空31
1213££3112悟22311£13223112132231TEldESdl121322
12132231
12132231
12132231
12132231
12132231
1?
13££31
12132231
1Z13E231
12132231
1Z13££^1
绘送送冲点I文不複武"应工樟式
[青空芨送区]I傑存境送数
多学串发送
发送HEJT
E=4
叵二E
GZ
H二
叵二
武二
0二=Eh
〕发送文件]|[S送敎据11自动能J周期血)100
「«空全部埶据I]自动猫开岌送]间偏□ms
ASCII码。
串口1良特姿1校验位[无检验T
…侄口I□嗝程完成
天团串」□将ir/U7-5般畫対标准USB捋串口
3、问题分析
这个程序其实和上一个的甲机程序大同小异,需要注意的是,发送的是
三、问题解答
1、在该实验中,单片机串行口工作在什么工作方式下?
说明该工作方式的特点。
答:
串行口是工作在方式1。
方式1特点:
(1)、8位UART接口。
(2)、帧结构为10位,包括起始位(为0),8位数据位,1位停止位。
(3)、波特率由指令设定,由T1的溢出率决定。
2、波特率是什么?
怎样设置单片机串口通讯的波特率?
如果实验要求通讯波特率为
4800bps,怎样修改程序?
答:
模拟线路信号的速率,以波形每秒的振荡数来衡量。
如果数据不压缩,波特率等
于每秒钟传输的数据位数,如果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。
在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数
称为码元传输速率,简称波特率。
波特率是指数据信号对载波的调制速率,它用单位时间内
载波调制状态改变的次数来表示(也就是每秒调制的符号数),其单位是波特
(Baud,symbol/s)。
波特率是传输通道频宽的指标。
波特率设置:
串行口的四种工作方式对应三种波特率。
由于输入的移位时钟的来源不
如果是4800的波特率,将初始化程序里的TH1、TL1的值改为0xfa即可
水********初贻化**#**:
<*****/
Voidinit(void)
3COIT=0=c4O.BDD二血20:
THl=0ixf4;TLl=0Kf4;PCOIT=OhOO:
Tr=o:
TR1=1;
"串口模式1//Tl工作槿弍2Z/*tl$24OO
//不加倍SFOD=0
11.0592MHZ的晶振
标准波特率实际波特率
150
150
0X41
200
200
0X70
300
300
0XA0
600
600
0XD0
1200
1200
0XE8
2400
2400
0XF4
4800
4800
0XFA
7200
7200
0XFC
9600
9600
0XFD
14400
14400
0XFE
28800
28800
0XFF
定时器预置数