Arduino和C51之串口通信

发布时间:2018-12-18
技术: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

本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
手机上随时阅读、收藏该文章 ?请扫下方二维码