单片机串行通信实验报告.docx
- 文档编号:591869
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:16
- 大小:272.47KB
单片机串行通信实验报告.docx
《单片机串行通信实验报告.docx》由会员分享,可在线阅读,更多相关《单片机串行通信实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
单片机串行通信实验报告
单片机串行通信实验报告
LT
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,单片机外部晶振频率为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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 串行 通信 实验 报告