单片机实验七串行通信_51单片机串行口通信实验 - CSDN
  • 串口通信基础1.串行通信 串行通信将数据字节分成一位一位的形式在一条传输线上逐个传送。单片机采用串行通信。特点是:传输线少,长距离传送成本低,但数据传送控制复杂。 串行通信的传输的传输方向:单工(数据传输...

    一.串口通信基础

    1.串行通信

    • 串行通信将数据字节分成一位一位的形式在一条传输线上逐个传送。单片机采用串行通信。特点是:传输线少,长距离传送成本低,但数据传送控制复杂。
    • 串行通信的传输的传输方向:单工(数据传输只能沿一个方向),半双工(传输数据和接受数据分布进行),全双工(传输和接受同步进行)。
    • 单片机采用异步通信,发送和接受设备使用各自的时钟频率,容易实现,但传输效率不高,数据格式
      异步通信

    2.MAX232

    • 实验通过MAX232电平转换芯片,可把计算机串口电平(-12V~+12V)转换为单片及TTL电平。电路原理图如下
      MAX232

    3.80C51串行口

    80C51
    向发送缓冲器SBUF写入数据,两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

    4.工作方式寄存器SCON

    D7 D6 D5 D4 D3 D2 D1 D0
    功能 SM0 SM1 SM2 REN TB8 RB8 T1 R1
    • 介绍
    • RI:接收中断标志位
      接收结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
    • TI:发送中断标志位
      发送结束时,会由硬件置1,向CPU发出中断请求。要由软件复位)
    • TB8:用来存放发送的第9位。
    • RB8:用来存放接收的第9位。
    • REN:是串行接收允许位
      0时:禁止串行接收
      1时:允许串行接收

    5.工作方式寄存器PCON

    • PCON是没有位寻址的,也就是说不能直接操作SMOD要直接操作PCON寄存器。
    • SMOD:是波特率是否加倍的选择位。
      0时:波特率不加倍。
      1时:波特率加倍。

    6.串口的操作步骤:

    第一步:设置波特率,设置定时器T1为工作方式2(设置TMOD寄存器),给计数器赋初值(工作方式2会自动重装)

    第二步:设置串口工作方式,设置SCON(如果允许)。

    第三步:如果使用中断方式,那么打开相应的中断和总中断。

    第四步:打开定时器T1,开始产生波特率。TCON设置TRx。


    二.实验例程

    1.说明:本实验通过使用串口调试助手向计算机发送数据,并返回,实验不需要接线。

    2.程序源代码如下:

    /**************************************
      > File Name: 串口通信实验
      > Author: pengshp
      > Mail: pengshp3@outlook.com
      > Date: 2015年 7 月 22 日
    ***************************************/
    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    
    uchar flag,i;
    /*串口初始化函数*/
    void init_uart()
    {
        SCON=0x50;  //设置为工作方式1 0101 0000
        TMOD=0x20;  //设置计数器工作方式2
        PCON=0x80;  //波特率加倍
        TH1=0xF3;   //计数器初始值,波特率为4800
        TL1=0xF3;
        EA=1;       //打开总中断
        ES=1;       //打开接受中断
        TR1=1;      //打开计数器
    }
    
    void main()
    {
        init_uart();
        while(1)
        {
            if(flag==1)
            {
                ES=0;      //关闭串口中断
                flag=0;
                SBUF=i;    //接受到的数据写入SBUF
                while(!TI);//判断是否发送完
                TI=0;
                ES=1;      //打开串口中断
             }
         }
    }   
    
    void serial() interrupt 4
    {
        RI=0;              //接受标志位清零
        i=SBUF;            //从SBUF读数据
        flag=1;            //说明接受到数据
    }

    串口效果

    波特率的计算和工作方式介绍略,常用的波特率为9600,晶振频率为11.0592MHZ,则误差为0%。我使用的晶振频率为12MHZ,有一定的误差。

    展开全文
  • 适用于AT89c51/52单片机串口通信例程,可根据实际需求更改发送的数据和发送波特率
  • 实验三:串口通信实验 内容: (1)利用电脑串口与实验台串口进行连接; (2)根据帧格式定义、波特率定义,编程配置串口,并编写控制程序; (3)实现从电脑上输入控制字符,由单片机通过串口接收,并控制LED...

    实验三:串口通信实验

     

    内容:

    (1)利用电脑串口与实验台串口进行连接;

    (2)根据帧格式定义、波特率定义,编程配置串口,并编写控制程序;

    (3)实现从电脑上输入控制字符,由单片机通过串口接收,并控制LED显示的功能;

    (4)对所编程序进行调试及验证。

     

    要求:

    (1)掌握波特率的概念、学会编程设置波特率和工作方式;

    (2)掌握串口通信的编程控制方法;

    (3)理解解MAX232串口通信的硬件电路结构。 注意实验三,需要同学们自己编写程序,实现从电脑串口助手(利用单片机下载软件提供的串口调试助手),发送一个字符给单片机,单片机通过中断方式接收,或通过查询方式接收后,把该字符的值送到8个LED显示 你的任务:编写主程序,串口初始化(要启动定时器),编写中断接收程序,和查询接收程序,接收到数据后,还要回送电脑显示,并驱动LED,当接收到的数据是88H时,驱动一个8个LED轮流点亮,当接收到的数据是99H时,停止8LED流水亮。当接收到的数据是11H时,LED全亮。当介绍到的数据是FFH时,全灭。 编程实现,明天实验课直接去调试。一定要提前编写程序,实验课只是去验证你的程序是否正确。

     1 #include <reg51.h>
     2 #include <intrins.h>
     3 unsigned char NewData,led,Count; 
     4 bit NewFlag ;
     5 void main( void ){
     6     TMOD = 0x21 ; 
     7     TH0 = ( 65536 - 10000 ) / 256 ;
     8     TL0 = ( 65536 - 10000 ) % 256 ;
     9     Count = 0 ;
    10     led = 0xFE ; 
    11     TH1 = 0xFD ; 
    12     TL1 = 0xFD ; 
    13     TR1 = TR0 = 1 ;
    14     SCON = 0x50 ;
    15     ES = EA = ET0 = 1 ;
    16     NewFlag = 0 ; 
    17     while ( 1 ){
    18         if( NewFlag ){
    19             if( NewData == 0x88 ){
    20                 ET0 = 1 ;
    21             }
    22             if( NewData == 0x99 ){
    23                 ET0 = 0;
    24             }
    25             TI = 0 ;
    26             SBUF = NewData ;
    27             while ( TI == 0 );
    28             NewFlag = 0 ;
    29         }
    30     }
    31 }
    32 void set0 ( void ) interrupt 4 {
    33     if( TI ) TI = 0 ;
    34     if( RI ) {
    35         RI = 0 ;
    36         NewData = SBUF ; 
    37         NewFlag = 1 ;
    38     }
    39 }
    40 void T0_INT () interrupt 1 {
    41     TH0 = ( 65536 - 10000 ) / 256 ; 
    42     TL0 = ( 65536 - 10000 ) % 256 ;
    43     Count ++  ;
    44     if( Count >= 50 ){
    45         Count = 0 ;
    46         led = _crol_(led , 1 );
    47         P1 = led ; 
    48         if( NewData == 0x11 ) P1 = 0 ;
    49         if( NewData == 0xFF ) P1 = 0xFF ;
    50     }
    51 }
    View Code

     

    转载于:https://www.cnblogs.com/Osea/p/11083538.html

    展开全文
  • 一、两种通信方式概念 1.并行通信 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输优点:并行通信速度快,传输的数据宽度可以是1~128位,甚至更宽缺点:并口上导线之间数据同步难处理,占用引脚...

    一、两种通信方式概念

    1.并行通信

    • 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输
    • 优点:并行通信速度快,传输的数据宽度可以是1~128位,甚至更宽
    • 缺点:并口上导线之间数据同步难处理,占用引脚资源多
    2.串行通信
    • 传输原理:串行通信的数据是一位一位地址进行传输的,在传输中每一位数据都占据一个固定的时间长度。
    • 优点:串行通信传输线少,占用引脚资源少,成本低,适合远距离传送
    • 缺点:速度相对较慢
    二、串行通信方式
    1.串行数据通信模式
    • 单工通信:数据仅能从一台设备到另一台设备进行单一方向的传输。
    • 半双工通信:数据可以从一台设备到另一台设备进行传输,也可以相反方向传输,但不能在同一时刻双向传输数据。
    • 全双工通信:数据可以在同一时刻从一台设备到另一台设备进行传输,也可以进行相反方向的传输,即可以同时双向传输数据。
    2.异步串行通信方式

           异步通信是指数据是以字符为单位i进行传送的,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。异步通信时,数据是一帧一帧传送的,每帧数据包含有起始位(“0”)、数据位、奇偶校验位和停止位(“1”),每帧数据的传送靠起始位来同步。

    3.同步串行通信方式

           同步通信是指同步传输采用字符块的方式,字符与字符之间、字符内部的位之间都同步,减少了每个字符的控制和错误检测数据位,因而可以具有较高的传输速率。

    三、串口编程实验

    1、SCON寄存器工作方式

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    功能

    SM0

    SM1

    SM2

    REN

    TB8

    RB8

    TI

    RI

    • RI:接收中断标志位——接收结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
    • TI:发送中断标志位——发送结束时,会由硬件置1,向CPU发出中断请求。要由软件复位)
    • TB8:用来存放发送的第9位。
    • RB8:用来存放接收的第9位。
    • REN:是串行接收允许位——0时:允许串行接收;1时:禁止串行接收

    2、串行口的工作方式

    SM0

    SM1

    方式

    说明

    波特率

    0

    0

    0

    移位寄存器

    fosc/12

    0

    1

    1

    10位异步收发(8位数据)

    可变

    1

    0

    2

    11位异步收发(9位数据)

    fosc/64或fosc/32

    1

    1

    3

    11位异步收发(9位数据)

    可变

    3、PCON寄存器工作方式

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    功能

    SMOD

    -

    -

    -

    -

    -

    -

    -

    • PCON是没有位寻址的,也就是说不能直接操作SMOD要直接操作PCON寄存器。
    • SMOD:是波特率是否加倍的选择位。——0时:波特率不加倍;1时:波特率加倍。
    4、代码实现
    #include <reg51.h>  
    #include <intrins.h>  
    #include "array.h"  
    #define uint unsigned int  
    #define uchar unsigned char  
    #define ulong unsigned long 
    
    /*******************************************************************************
    * 函数名         :UsartConfiguration()
    * 函数功能		   :设置串口
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void UsartConfiguration()
    {
    	SCON=0X50;			//设置为工作方式1
    	TMOD=0X20;			//设置计数器工作方式2
    	PCON=0X80;			//波特率加倍
    	TH1=0XF3;			//计数器初始值设置,注意波特率是4800的
    	TL1=0XF3;
    	ES=1;				//打开接收中断
    	EA=1;				//打开总中断
    	TR1=1;				//打开计数器
    }
    
    void main()
    {
    	UsartConfiguration();
    	while(1)
    	{
    	}
    }
    
    
    /*******************************************************************************
    * 函数名         :Delay(unsigned int i)
    * 函数功能		   : 延时函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void Usart() interrupt 4
    {
    	unsigned char receiveData;
    
    	receiveData=SBUF;	//出去接收到的数据
    	RI = 0;				//清除接收中断标志位
    	SBUF=receiveData;	//将接收到的数据放入到发送寄存器
    	while(!TI);			//等待发送数据完成
    	TI=0;				//清除发送完成标志位
    }
    




    展开全文
  • 单片机串口通信实验

    2009-06-10 12:02:00
    实验单片机串口通信实验姓 名:郑旅军 学 号:0656061指导老师:邹慧兰 成 绩:如有疑问,请zlj800800@163.com 探讨 一、实验目的1学习单片机串口工作方式的程序设计2学习串行通信的协议3学习串口通信的...

     

    实验四 单片机串口通信实验

        名:郑旅军       号:0656061

    指导老师:邹慧兰       绩:

    如有疑问,请zlj800800@163.com 探讨

     

    一、实验目的

    1学习单片机串口工作方式的程序设计

    2学习串行通信的协议

    3学习串口通信的中断方式的程序编写方法

    二、实验内容

    1利用单片机串口,实现两个实验台之间的串行通信。

    2一个试验箱自发自收

    三、实验预备知识

    四、程序框图:自己设计程序框图

     

    五、实验步骤

    1按要求编写相应的程序

    (1)自发自收程序

     zfzs.c

     

    #include "reg51.h"

    void init(void);

    void main(void)

    {

    P1=0x01;

    init();

       SBUF=0x88;

    while(1);

     

    }

     

    void init(void)

    {

    SCON=0x40;       //工作方式1 ,并置REN=1,接收使能

          REN=1;               //上命令可分写为SCON=0x40;REN=1

        TMOD=0x20;       //定时器1 ,工作模式2

        PCON=0x80;       //SMOD=1,串行口波特率倍增,自动重载;

        TH1=0xF3;       //设置波特率

        TL1=0xF3;

        EA=1;

         ET1=1;

        ES=1;       //串口中断使能

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

    }

     

    void serial() interrupt 4

    {

     

     

    if(RI)     //RI=1表示接收完成

    {

        RI=0;

     P1=SBUF;   //接收完立刻取走数据

     

    }

    else

        TI=0;

    }

    (2)双机通信程序

    发送端程序:

    f.c

    #include "reg51.h"

     

    void init(void);

    void delay();

    void main(void)

    {

    init();

     

    while(1)

    {

     

    SBUF=0x88;

    delay();

    }

     

    }

     

    void init(void)

    {

    SCON=0x40;       //工作方式1 ,并置REN=1,接收使能

          REN=1;               //上命令可分写为SCON=0x40;REN=1

        TMOD=0x20;       //定时器1 ,工作模式2

        PCON=0x80;       //SMOD=1,串行口波特率倍增,自动重载;

        TH1=0xF3;       //设置波特率

        TL1=0xF3;

        EA=1;

         ET1=1;

        ES=1;       //串口中断使能

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

    }

    void delay()

    {int j,k;

     for(k=10000;k>0;k--)

     for(j=5000;j>0;j--);

    }

     

    void serial(void) interrupt 4

    {

     

     

        TI=0;    //继续发

    }

    接收端程序:

    s.c

    #include "reg51.h"

     

    void init(void);

    void main(void)

    {

    init();

    P1=0X01;

    while(1);

    }

     

    void init(void)

    {

    SCON=0x40;       //工作方式1 ,并置REN=1,接收使能

          REN=1;               //上命令可分写为SCON=0x40;REN=1

        TMOD=0x20;       //定时器1 ,工作模式2

        PCON=0x80;       //SMOD=1,串行口波特率倍增,自动重载;

        TH1=0xF3;       //设置波特率

        TL1=0xF3;

        EA=1;

         ET1=1;

        ES=1;       //串口中断使能

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

    }

     

    void serial(void) interrupt 4

    {

    char i;

    if(RI)

    {

        RI=0;    //继续收

        i=SBUF;

        P1=i;

    }

     

    }

    2连接实验电路图

     

    3调试并运行程序,观察结果

    本次实验我是设计了先给P1口赋一个初值,使之有初状态(这里我使LED1灯亮),然后将一个数据(这里是0x8080H)送给SBUF,经TXD送出,再经RXD接收,数据接收完后,再次送到P1 口,这样就显示一个新的状态(LED3LED7灯亮)。

    六、实验总结

      本次实验花费了不少的时间,在没有去实验室上机实验前就已经按自己对串口中断过程的理解把程序写好了,但是没有想到我的思路有错,所以在实验箱上反复的修改、运行程序都没有得到期望的结果。后来在老师的指导下,对串口中断理解重归正确,得到了正确结果。

      接下来,我计划把程序完善,使程序能够发送一个字符串,并使LED灯循环点亮。

    Tr.c

    #include "reg51.h"

    #define uchar unsigned char

    unsigned int n;

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

    void init(void);

    void delay();

    void main(void)

    {

     

    init();

     

    while(1)

    {

     

    SBUF=a[n];

    n++;

    while(!TI);

    TI=0;

    if(n==7)

    n=0;

    delay();

    }

    }

     

     

     

    void init(void)

    {

    SCON=0x40;       //工作方式1 ,并置REN=1,接收使能

          REN=1;               //上命令可分写为SCON=0x40;REN=1

        TMOD=0x20;       //定时器1 ,工作模式2

        PCON=0x80;       //SMOD=1,串行口波特率倍增,自动重载;

        TH1=0xF3;       //设置波特率

        TL1=0xF3;

        EA=1;

     

        ES=1;       //串口中断使能

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

    }

    void delay()

    {int j,k;

     for(k=10000;k>0;k--)

     for(j=5000;j>0;j--);

    }

     

     

    void serial() interrupt 4

    {

     

    if(RI==1)

    {

     

    RI=0;

    P1=SBUF;

     

     

    }

    else

    TI=0;

    }

    展开全文
  • 51 单片机串行口是一个可编程的全双工的通信接口,具有 UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可以作为同步移位寄存器使用。51 单片机串行口主要有两个独立的串行数据缓冲寄存器 ...
  • 目的:通过电脑向单片机发送字符,单片机收到字符后,向电脑回应相同的字符。 开发板时钟频率为12MHz。程序设置波特率为4800,加倍。 #include&lt;reg52.h&gt; #define uc unsigned char void usartinit...
  • 单片机 串口编程之串口通信仿真实验 一、简述 记--简单的使能串口,串口收发数据的例子。(使用Proteus仿真+虚拟串口调试) 代码,仿真文件打包:链接: https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A 提取...
  • 一.实验目的 1. 掌握 51 单片机串口工作原理。 2. 掌握 51 单片机串口初始化编程。...(1)编程实现:编程实现:甲、乙双机串行通信,双机的 RXD 和 TXD 相互交叉相连,甲机的 P0 口接 8 个开关,乙机的 P...
  • 两片单片机之间的串行通信(仿真图+程序) AT89C51+MAX232
  • 串口通信的重要性和基础就不用我多讲了吧?基础不懂直接点链接:https://blog.csdn.net/weixin_45629315/article/details/105717414 这一次的重点是讲解几个串口的实验来加深自己对串口通信的理解。 实验一(将一...
  • 单片机 串行通信练习

    2018-06-09 11:19:44
    单片机 串行通信练习一、简述 简单的双单片机串行通信演示。 例子中有甲乙两片单片机系统构成一对单片机系统,每片单片机系统有2位数码管用来显示收到的数据,两片单片机系统之间进行串行通信。甲方发送1,乙方...
  • 关注【电子开发圈】微信公众号,一起学习吧!...电子DIY、Arduino、51单片机、STM32单片机、FPGA…… 电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机…… 点击链接,免费下载100G+电子设计学习资料! ...
  • /*************************************************************************************** 串口通信实验 *实现现象:通过串口向单片机发送 10 进制数字,将数字 16 进制显示在数码管上。...
  • 本文主要介绍串行通信串行通信的应用。目标是实现单片机之间的通信。 1.串行通信的基本概念串行是与并行想对应的,并行通信是指数据的各位同时被传送。串行通信是将要传送的数据一位位的依次顺序发送。 串行通信...
  •  作为第一个博客,首先谈谈我写的一个51单片机串口通信程序。  我用的是一款增强版51单片机,型号为STC12LE5A60S2。  串口通信的方式是查询方式,下面是我的源代码: /*====================================== ...
  • 实验串行通信实验

    2019-01-10 15:41:33
    – 实现PC机与单片机之间的串口通信,波特率为2400bits/s。PC机发送8个字节的数据给单片机单片机接收完数据后发送两个确认字节55H和AAH给PC机(使用查询方式)。本实验需用PC机上的串口调试助手(或超级终端)发送...
  • 单片机与PC机串口通信的仿真及虚拟串口软件单片机与PC机串口通信的仿真及虚拟串口软件单片机与PC机串口通信的仿真及虚拟串口软件单片机与PC机串口通信的仿真及虚拟串口软件
  • 本文详细讲述串口通信的基本原理,分析了51单片机串口协议。适合于入门。
1 2 3 4 5 ... 20
收藏数 4,808
精华内容 1,923
关键字:

单片机实验七串行通信