单片机串行通信实验报告

时间:2024.4.21

实验六 串行通信

实验报告

班级:             

学号:             

姓名:             

教师:             

一、双机通信

由两套单片机试验装置(两个实验小组)共同完成该实验。我们U1为甲机,U2为乙机。甲机发送本机(学生本人)学号后8位给乙机,乙机接收该8位数据,并显示在8位数码管上。 电路如图1所示。

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

实验电路图:

1、C源程序清单

甲机(U1)代码:

#include<STC12C5A60s2.h>

#define uchar unsigned char

void delay(uchar i);

void send(uchar temp);

void init(void);

void main(void)

{

    init();

    delay(200);

    while(1)

    {

        send('^');

        send(1);

        send(2);

       send(1);

        send(3);

       send(2);

        send(2);   

        send(3);

        send(1);       

    }

}

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

void init(void)

{

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

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

     TH1=0xf4;        //波特率2400

     TL1=0xf4;

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

     TI=0;

     TR1=1;       //开定时中断

}

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

void send(uchar temp)

{

    SBUF=temp;

    while(TI==0);

    TI=0;

    delay(50);

}

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

void delay(uchar i)

{

     unsigned int j;

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

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

}

乙机(U2)代码:

#include<STC12C5A60s2.h>

#define uchar unsigned char

#define uint unsigned int

void init(void);

void delay(uchar t);

void xianshi(void);

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

//共阴数码管段码

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

uchar tab[9] = {0,0,0,0,0,0,0,0,0};

uchar i=0,temp;

uint a,b,c,d,e,f,g,h;

void main()

{

    init();

    while(1)

    {

        xianshi();

    }

}

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

void init(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;            //允许全局中断

}

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

void receive() interrupt 4

{

    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];

    }

}

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

void xianshi(void)

{

    uchar i,dm,wx;

    //m1:m0  00=标准;   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)    ;          //延时

        }

    }

    /*uchar k,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);

    }*/

}

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

void delay(uchar t )

{

    uchar x,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<reg51.h>

#define uchar unsigned char

void delay(uchar i);

void send(uchar temp);

void init(void);

void main(void)

{

    init();

    //delay(50);

    while(1)

    {

       

        send(0x31);

        send(0x32);

       send(0x31);

        send(0x33);

       send(0x32);

        send(0x32);

        send(0x33);

        send(0x31);

        send(0x20);    

    }

}

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

void init(void)

{

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

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

     TH1=0xe8;        //波特率1200

     TL1=0xe8;

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

     TI=0;

     TR1=1;       //开定时中断

}

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

void send(uchar temp)

{

    SBUF=temp;

    while(TI==0);

    TI=0;

    delay(50);

}

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

void delay(uchar i)

{

     unsigned int j;

     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的晶振

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

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    

                                


第二篇:单片机串口通信实验报告


信息工程学院实验报告

实验项目名称:串口通信实验 实验时间:20xx.5课程名称:单片机原理及接口

一、实 验 目 的:

1.了解什么是串口,串口的作用等。

2、了解串口通信的相关概念

3、利用keil软件,熟悉并掌握中串口通信的使用

4、通过实验,熟悉串口通信程序的格式,串口通信的应用等

二、实 验 原 理

1、串口通信概念:

单片机应用与数据采集或工业控制时,往往作为前端机安装在工业现场,远离主机,现场数据采用串行通信方式发往主机进行处理,以降低通信成本,提高通信可靠性。如下图所示。

2、串口数据通信方式及特点

★ 数据通信方式有两种:并行通信与串行通信

★并行通信: 所传送数据的各位同时发送或接收,

数据有多少位就需要多少根数据线。

特点: 速度快,成本高,适合近距离传输

如计算机并口,打印机,8255 。

★串行通信:所传送数据的各位按顺序一位一位

地发送或接收。

只需一根数据,一根地线,共2 根

特点:成本低,硬件方便,适合远距离通信,

传输速度低。

串行通信与并行通信示意图如下:

3、串行通信基本格式

①单工通信:数据只能单向传送。

②半双工通信:通信是双向的,但每一时刻,数据流通的方向是单向的。

③全双工通信:允许数据同时在两个方向流动,即通信双方的数据发送和接收是同时进行的。

4、异步串行通信/同步串行通信

①异步串行通信:

异步串行通信采用如下的帧结构:

起始位 + 8位数据位 + 停止位 或 起始位 + 9位数据位 + 停止位

其中:起始位为低电平,停止位为高电平。

优点:硬件结构简单

缺点:传输速度慢

②同步串行通信:

在同步通信中,发送方在数据或字符开始处就用同步字符(常约定1~2个字节)指示一帧的开始 ,由时钟来实现发送端和接收端同步,接收方一旦检测到与规定的同步字符符合,下面 就连续按顺序传送若干个数据 ,最后发校验字节。见下图:

5、串行通信过程与UART

基本的计算机异步串行通信系统中,两台计算机之间通过三根信号线TxD、RxD和GND连接起来,TxD与GND构成发送线路,RxD与GND构成接收线路。一台计算机的TxD、RxD线分别与另一台计算机的RxD、TxD线相连。

由于在串行通信过程中的并串转换、串并转换、线路检测、采样判决、组帧、拆帧、发送和接收等操作需消耗CPU大量时间,以至CPU无法处理其它工作,因而开发出专用于处理异步串行通信发送和接收工作的芯片UART(通用异步串行通信接收发送器)。

CPU只需将要发送的一个字节数据交给UART,其它发送工作由UART自动完成,当UART将一帧数据发送完毕,会通知CPU 已发送完,可提交下一个字节 。

UART自动监测线路状态并完成数据接收工作,当接收到一个字节数据后,UART会通知CPU来读取。采用UART后,CPU的负担大大减轻了。

6、MCS—51的串行通信接口

MCS-51单片机内部集成有一个UART,用于全双工方式的串行通信,可以同时发送、接收数据。它有两个互相独立的接收、发送缓冲器,这两个缓冲器同名SBUF,共用一个地址号(99H)。

发送SBUF:只能写,不能读; SBUF = a;

接收SBUF:只能读,不能写。 a = SBUF;

串行接口有四种工作方式,有的工作方式时其波特率是可变的。用户可以用软件编程的方法在串行控制寄存器SCON中写入相应的控制字就可改变串行口的工作方式。

串行口结构图如下:

串行通信的传送过程说明:

甲方发送时,CPU执行指令 SBUF =A 启动了发送过程,数据并行送入SBUF ,在发送时钟 shift的控制下由低位到高位一位一位发送,乙方在接收时钟 shift 的控制下由低位到高位 顺序进入移位寄存器SBUF ,甲方一帧数据发送完毕,置位发送中断标志TI,该位可作为查询标志(或引起中断),CPU可再发送下一帧数据 。乙方一帧数据到齐即接收缓冲器满,置位接收中断标志RI,该位可作为查询标志(或引起接收中断),通过A=SBUF CPU将这帧数据并行读入。

由上述可知:

1.甲、乙方的移位时钟频率应相同,即应具有相同的波特率,否则会造成数据丢失。

2.发送方是先发数据再查标志,接收方是先查标志再收数据。

通信过程图如下:

7、串行接口的控制寄存器:

串行接口的控制寄存器有两个,串行控制寄存器SCON和能改变波特率的特殊功能寄存器PCON。其作用如下:

(1)SCON,字节地址98H,(可位寻址)

SCON用于确定串行通道的操作方式和控制串行通道的某些功能。也可用于发送和接收第九个数据位(TB8、RB8),并有接收和发送中断标志( RI及 TI)位。SCON各位的意义如下:

此处,SM0、SM1指定了串行通信的工作方式,若设振荡器频率为fosc,则规定如下图:

SM2:在方式2、3时,多机通信的控制位。

方式0:SM2=0;

方式1:①若SM2=0,只要接收到8位数据,就激发中断标志(RI=1);

②若SM2=1,则只有在接收到有效停止位时才能激发中断标志(RI=1),否则接收数据无效,且RI仍为0。

8、串行口波特率计算方式:

9、串行口的波特率有两种方式:固定波特率和可变波特率

10、串行通信编程方式:查询方式和中断方式。

查询方式:查TI或Ri是否为“1”。

中断方式:如果预先开了中断,当TI、RI为“1”,会自动产生中断。

注意:两种方式中当发送或接受数据后都要注意清Ti或RI。

查询方式发送程序: (先发后查)

发送一个数据→查询TI →发送下一个数据

查询方式接收程序:(先查后收)

查询RI→读入一个数据→查询RI→读下一个数据

中断方式发送程序:

发送一个数据→等待中断,在中断中再发送下一个数据。

中断方式接收程序:

等待中断,在中断中再接收一个数据。

查询方式发送流程图以及接收流程图:

中断方式发送流程图以及接收流程图如下:

三、实 验 内 容 与 步 骤

实验内容:

1,验证开发板例程中的电脑通过串口助手发送数据给开发板,单片机收到后返回电脑的例子。

2,、修改例程,实现上课串口例子中,第一个发送字符串的程序。

四、实 验 结 果 及 分 析:

程序如下:

#include<reg51.h>

#include<string.h>

char s[]="陈玮老师最帅";

char a=0,b=0;

void main()

{

TMOD=0x20;

SCON=0x50;

PCON=0x80;

TH1=0xf3;

TL1=0xf3;

TR1=1;

ET1=0;

a=strlen(s);

for(b=0;b<a;b++)

{

SBUF=s[b];

while(!TI) ;

TI=0;

}

while(1) ;

}

五、实 验 总 结:

通过本次实验,了解并掌握串口通信的方式,以及数据传输的两种方式——查询方式和中断方式。

更多相关推荐:
单片机串口通讯实验报告

实验十单片机串行口与PC机通讯实验报告实验目的1掌握串行口工作方式的程序设计掌握单片机通讯的编制2了解实现串行通讯的硬环境数据格式的协议数据交换的协议3了解PC机通讯的基本要求实验器材1G6W仿真器2MCS51...

单片机-实验三-串行口通信实验

实验三串行口通信实验一实验目的1掌握单片机串行口的工作原理及工作方式2掌握单片机串行口波特率的设置方法3掌握单片机串行口查询方式程序的设计方法二实验内容及要求1单片机的串行口经RS232电平变换后和PC机相连2...

单片机串口通讯实验报告

单21选题背景在国内外以PC机作为上位机单片机作为下位机的控制系统中PC机通常以软件界面进行人机交互以串行通信方式与单片机进行积极交互而单片机系统根据被控对象配置相应的前向后向信息通道工作时作为主控机测对象作为...

单片机与PC机串口通信实验报告

单片机与PC机串口通讯学生何绍金学号专业班级自动化1202指导老师杨东勇20xx年12月一实验目的学习PC机的串口通讯原理二实验设备统一电子开发平台三实验要求单片机与电脑串口通讯将单片机与电脑相连借助串口调试助...

单片机串行通信实验报告

单片机实验报告三实验名称姓名学号班级时间串行通信张昊110404247通信2班20xx11南京理工大学紫金学院电光系一实验目的1理解单片机串行口的工作原理2学习使用单片机的TXDRXD口3了MAX232解芯片的...

串行通信实验,南京理工大学紫金学院单片机实验报告

单片机实验报告实验名称姓名学号班级时间串行通信实验通信20xx11南京理工大学紫金学院电光系一实验目的1理解单片机串行口的工作原理2学习使用单片机的TXDRXD口3了解MAX232芯片的作用二实验原理MCS51...

单片机实验报告串行口

单片机实验报告实验名称姓名学号班级实验时间串行通信实验魏冶090402105光电一班20xx1129南京理工大学紫金学院电光系一实验目的1理解单片机串行口的工作原理2学习使用单片机的TXDRXD口3了解MAX2...

单片机与PC机串口通讯实验报告

单片机与PC机串口通讯实验报告自动化1003徐磊20xx03120xx51电路图2程序流程图3程序清单ORG0000HAJMPMAINORG0023HAJMPINTRP串口中断入口地址MAINMOVSCON50...

单片机课程设计实验---单片机间串行通信

单片机原理及应用课程设计报告课程设计题目单片机间串行通信原理专业班级20xx级电子信息科学与技术学生姓名罗滨志学号120xx20xx051成绩20xx年12月27日目录摘要11设计任务111功能要求212总体方...

51单片机串口通信实例

51系列单片机串口通信实例教程单片机的串口通信看起来是很复杂的主要是因为他用到了更多的寄存器与前面的知识相比他更具综合能力写起来考虑的问题自然也变多了而前面学习过的定时器与中断将是单片机通信的基础单片机的中断系...

实验六 单片机串行口通讯实验

实验六单片机串行口通讯实验一实验要求利用单片机串行口实现两个实验台之间的串行通讯其中一个实验台作为发送方另一侧为接收方发送方读入按键值并发送给接收方接收方收到数据后在LED上显示二实验目的1掌握单片机串行口工作...

浙大 串行口通讯实验报告

实验报告课程名称微机原理与接口技术指导老师彭勇刚成绩实验名称串行口通讯实验实验类型同组学生姓名一实验目的和要求必填二实验内容和原理必填三主要仪器设备必填四操作方法和实验步骤五实验数据记录和处理六实验结果与分析必...

单片机串口通信实验报告(19篇)