• 51系列—基于51单片机的RS232通信示例


    一、目录

    1、51单片机串口通信的应用
    2、PC控制单片机IO口输出
    3、51单片机控制实训指导及综合应用实例
    4、51单片机给计算机发送数据

    二、实验任务

    单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机系统接收后,用LED显示接收到的数据和向上位机发回原样数据。

    三、硬件电路图

    在这里插入图片描述

    四、实验原理

    RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。

    RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为20kBps。RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。 我们是用MAX232芯片将RS232电平转换为TTL电平的。 一个完整的RS-232接口有22根线,采用标准的25芯插头座。我们在 这里使用的是简化的9芯插头座。注意我们在这里使用的晶振是11.0592M的,而不是12M。因为波特率的设置需要11.0592M的。

    “串口调试助手V2.1.exe” 软件的使用很简单,只要将串口选择‘CMO1’波特率设置为‘9600’ 数据位为 8 位。打开串口(如果关闭)。然后在发送区里输入要发送的数据,单击手动发送就将数据发送出去了。
    注意,如果选中‘十六进制发送’那么发送的数据是十六进制的,必须输入两位数据。如果没有选中,则发送的是ASCLL码,那么单片机控制的数码管将显示ASCLL码值。
    在这里插入图片描述

    ASCII常用代码表
    在这里插入图片描述

    五、C语言源程序(完整代码资源见文末链接)

    初始化宏定义

    #include "reg52.h" //包函8051 内部资源的定义
    unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
    sbit gewei=P2^4; //个位选通定义
    sbit shiwei=P2^5; //十位选通定义
    sbit baiwei=P2^6; //百位选通定义
    unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //1~10
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    LED数码管显示收到的数据

    void LED() //LED显示接收到的数据(十进制)
    {
    gewei=0; P0=table[dat%10]; Delay(10); gewei=1;
    shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1;
    baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    主函数

    /主程序功能:实现接收数据并把接收到的数据原样发送回去///
    void main()
    {
    Init_Com();//串口初始化
    while(1)
    {                      
    if ( RI ) //扫描判断是否接收到数据,
    {
    dat = SBUF; //接收数据SBUF赋与dat
    RI=0; //RI 清零。
    SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
    }
    LED(); //显示接收到的数据
    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    拓展实验一:PC控制单片机IO口输出

    /主程序功能:实现接收数据并把接收到的数据原样发送回去///
    void main()
    {
    Init_Com();//串口初始化
    while(1)
    {                      
    if ( RI ) //扫描判断是否接收到数据,
    {
    dat = SBUF; //接收数据SBUF赋与dat
    if(dat==0x00)	//如果PC发送十六进制00,单片机P1口全亮。
    P1=0x00;
    else if(dat==0x01)
    P1=0x01;
    else if(dat==0x02)
    P1=0x02;
    else if(dat==0x03)
    P1=0x03;
    else if(dat==0x04)
    P1=0x04;
    RI=0; //RI 清零。
    SBUF = dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
    } 
    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    拓展实验二:单片机给计算机发送数据

    #include "reg52.h" //包函8051 内部资源的定义
    unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
    unsigned char fan;
    int i,j;
    void Delay() //延时程序
    {
    for(i=0; i<100; i++)
    for(j=0; j<100; j++);
    }
    void delays()
    {
    int k;
    for (k=0;k<1200;k++);
    }
    ///功能:串口初始化,波特率9600,方式1/
    void Init_Com(void)
    {
    TMOD = 0x20;
    PCON = 0x00;
    SCON = 0x50;
    TH1 = 0xFd;
    TL1 = 0xFd;
    TR1 = 1;
    }
    /主程序功能:实现接收数据并把接收到的数据原样发送回去///
    void main()
    {
    Init_Com();//串口初始化
    while(1)
    { 
                     
    if ( RI ) //扫描判断是否接收到数据,
    {
    dat = SBUF; //接收数据SBUF赋与dat
    if(dat==0x30)	//如果PC发送十六进制00,单片机P1口全亮。
    {P1=0x00;
    Delay();   }
    else if(dat==0x31)
    {P1=0x01;
    Delay();}
    else if(dat==0x32)
    {P1=0x03;
    Delay();}
    else if(dat==0x33)
    {P1=0x07;
    Delay(); }
    else if(dat==0x34)
    {P1=0x0f;
    Delay(); }
    else if(dat==0x35)
    {P1=0x1f;
    Delay();}
    else if(dat==0x06)
    {P1=0x3f;
    Delay(); }
    else if(dat==0x07)
    {P1=0x7f;
    Delay();}
    else if(dat==0x08)
    {P1=0xff;
    Delay(); }
    else if(!(P2&0x01))
    { delays();
    while(!(P2&0x01));
    fan = 0x36;}
    else if(!(P2&0x02))
    { delays();
    while(!(P2&0x02));
    fan = 0x37;}
    else if(!(P2&0x04))
    { delays();
    while(!(P2&0x04));
    fan = 0x38;}
    else if(!(P2&0x08))
    { delays();
    RI=0; //RI 清零。
    SBUF =dat; //在原样把数据发送回去(接收数据为发送数据的ASCII码,如发送q显示为113)
    } 
    }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    附:完整资源获取链接

    百度网盘链接: https://pan.baidu.com/s/1v0aFjvj7UAvuClykv1lYXg?pwd=rnqq
    提取码: rnqq

  • 相关阅读:
    [附源码]java毕业设计医院档案管理系统
    JAVA高级教程-Java List(2)
    〔001〕Java 基础之环境安装和编写首个程序
    qt程序中,如何做才能用到OpenGL ES图形api
    SpringBoot+Vue+Redis实现验证码功能、一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis
    服务访问质量
    字符串反转
    Oracle故障案例 | 19C动态监听无法注册实例的处理
    C++多线程编程:其六、unique_lock的使用
    精读《算法题 - 二叉树中的最大路径和》
  • 原文地址:https://blog.csdn.net/u011816009/article/details/133841769