zoukankan      html  css  js  c++  java
  • Arduino和C51之串口通信

    技术:51单片机、Arduino、串口通信
     

    概述

    本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助

    详细

    一、串口通信

    串口通信(Serial CommunicaTIons)的概念非常简单,串口按位(bit)发送和接收字节。串口用于ASCII码字符的传输,通信使用3根线完成,分别是地线、发送线、接收线.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据,其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须要匹配。

    二、51单片机串口通信

    51单片机实现串口通信时会用到的寄存器:SCON、TMOD、PCON

    • SCON:特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志

    SCON寄存器中位的定义:

    图片1.png

    设置SM0和SM1确定串行口工作方式:

    1544959796475054171.png

    • TMOD:用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1

    TMOD寄存器中位的定义:

    1544959804936011385.png

    定时/计数器的工作方式主要有以下四种:

    1544959813646032836.png

    • PCON:电源管理寄存器

    PCON寄存器中位的定义:

    1544959820506069548.png

    在串口通信时,我们主要使用SMOD位将波特率翻倍,当:

    1. SMOD=0:串口方式1,2,3时,波特率正常。

    2. SMOD=1:串口方式1,2,3时,波特率翻倍。

    三、51单片机串口控制LED灯

    //UsartInit()对串口进行初始化
    void UsartInit()        //设置串口
    {
        SCON=0X50;   //设置为工作方式1
        TMOD=0X20;   //设置计数器工作方式2
        PCON=0X80;   //波特率加倍
        TH1=0XF4;    //计数器初始值设置,波特率:4800
        TL1=0XF4;
        ES=1;      //打开接收中断
        EA=1;      //打开总中断
        TR1=1;     //打开计数器
    }

    这里TH1和TL1的初始值,使用了软件进行计算:

    图片6.png

    void Usart() interrupt 4 //进入中断服务函数
    {
        char receiveData;
                 
        receiveData=SBUF;//出去接收到的数据,此时SBUF存放接收数据
        RI = 0;//清除接收中断标志位
        if(receiveData=='1') 
        {
            led=0;    //接收1时,打开LED灯
        }
        if(receiveData=='0') 
        {
            led=1;    //接收0时,关闭LED灯
        }
        SBUF=receiveData;
        while(!TI);    //等待发送数据完成
        TI=0;       //清除发送完成标志位
    }

    打开串口调试助手 -- 修改波特率、停止位、数据位等

    1544959857982038113.png

    接着,通过串口调试助手,你可以发送任意你想发送的东西给单片机,这里:

    1. 输入1 ----- LED灯亮

    2. 输入0 ----- LED灯灭

    四、Arduino串口控制LED灯

    • 设置波特率:Serial.begin(9600);

    • 发送数据到串口:Serial.println(data);

    • 从串口接收数据:Serial.read();

    测试代码如下:

    char var;
    void setup() 
    {
      pinMode(13, OUTPUT);  //设置IO口13输出模式
      Serial.begin(9600);  //设置波特率
      Serial.println("Hello!PC,I'm arduino!"); //发送数据到串口
    }
    void loop() 
    {
        if (Serial.available())
        {
            var = Serial.read(); //从串口接收数据
            if (var == '1') 
            {
                digitalWrite(13, HIGH);
                Serial.println("LED is on!"); 
            }
            if (var == '0') 
            {
                digitalWrite(13, LOW);
                Serial.println("LED is off");
            }
        }
    }

    打开右上角--->串口调试器 -- 修改波特率等

    1544959866684079160.png

    1. 发送1 ----- LED灯亮

    2. 发送0 ----- LED灯灭

    五、总结

    本文通过串口点灯实验介绍了51单片机和Arduino串口的使用,后续文章会讲解传感器的使用,并使用串口打印传感器信息,感谢你的支持。

    六、项目结构图

    图片9.png

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    Triggering effects when a container is resized
    Flex2:无边框透明背景MenuBar实现
    Using the isBranch() method to determine if a Tree item is a branch or leaf
    Flex3 Style 编辑工具
    Displaying a Tree control as a pop up for a Flex PopUpButton control
    Using a CheckBox control as a list item renderer in Flex
    Creating a ControlBar container in Flex using ActionScript
    .NET下的多线程编程4利用thread.Start()传递参数
    委托使用的实例
    算法大全—1冒泡排序法
  • 原文地址:https://www.cnblogs.com/demodashi/p/10503354.html
Copyright © 2011-2022 走看看